From 69c0d094371225ed803d686cab2c39dde48350d2 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Tue, 25 Feb 2025 15:18:14 -0500 Subject: [PATCH 001/127] feat: simplify column prefs (#11390) Transforms how column prefs are stored in the database. This change reduces the complexity of the `columns` property by removing the unnecessary `accessor` and `active` keys. This change is necessary in order to [maintain column state in the URL](https://github.com/payloadcms/payload/pull/11387), where the state itself needs to be as concise as possible. Does so in a non-breaking way, where the old column shape is transformed as needed. Here's an example: Before: ```ts [ { accessor: "title", active: true } ] ``` After: ```ts [ { title: true } ] ``` --- packages/payload/src/admin/functions/index.ts | 4 +-- packages/payload/src/index.ts | 1 + .../payload/src/preferences/migrateColumns.ts | 19 ++++++++++ .../src/preferences/preferencesCollection.ts | 9 +++++ packages/payload/src/preferences/types.ts | 6 +++- .../src/elements/RelationshipTable/index.tsx | 10 +++--- .../TableColumns/buildColumnState.tsx | 24 +++++-------- .../buildPolymorphicColumnState.tsx | 22 +++++------- .../TableColumns/getInitialColumns.ts | 9 +++-- .../ui/src/elements/TableColumns/index.tsx | 35 +++++++------------ packages/ui/src/utilities/renderTable.tsx | 14 ++++---- packages/ui/src/views/List/index.tsx | 1 + test/fields/collections/Text/e2e.spec.ts | 7 +--- tsconfig.base.json | 2 +- 14 files changed, 84 insertions(+), 79 deletions(-) create mode 100644 packages/payload/src/preferences/migrateColumns.ts diff --git a/packages/payload/src/admin/functions/index.ts b/packages/payload/src/admin/functions/index.ts index 6a127de063..94f930d466 100644 --- a/packages/payload/src/admin/functions/index.ts +++ b/packages/payload/src/admin/functions/index.ts @@ -1,7 +1,7 @@ import type { ImportMap } from '../../bin/generateImportMap/index.js' import type { SanitizedConfig } from '../../config/types.js' import type { PaginatedDocs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, ColumnPreference } from '../../index.js' import type { PayloadRequest, Sort, Where } from '../../types/index.js' export type DefaultServerFunctionArgs = { @@ -50,7 +50,7 @@ export type ListQuery = { export type BuildTableStateArgs = { collectionSlug: string | string[] - columns?: { accessor: string; active: boolean }[] + columns?: ColumnPreference[] docs?: PaginatedDocs['docs'] enableRowSelections?: boolean parent?: { diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index d955eab676..b2581d18d2 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1374,6 +1374,7 @@ export { restoreVersionOperation as restoreVersionOperationGlobal } from './glob export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, + ColumnPreference, DocumentPreferences, FieldsPreferences, InsideFieldsPreferences, diff --git a/packages/payload/src/preferences/migrateColumns.ts b/packages/payload/src/preferences/migrateColumns.ts new file mode 100644 index 0000000000..bcf6727cd9 --- /dev/null +++ b/packages/payload/src/preferences/migrateColumns.ts @@ -0,0 +1,19 @@ +/** + * @todo remove this function and subsequent hooks in v4 + * They are used to transform the old shape of `columnPreferences` to new shape + * i.e. ({ accessor: string, active: boolean })[] to ({ [accessor: string]: boolean })[] + * In v4 can we use the new shape directly + */ +export const migrateColumns = (value: Record) => { + if (value && typeof value === 'object' && 'columns' in value && Array.isArray(value.columns)) { + value.columns = value.columns.map((col) => { + if ('accessor' in col) { + return { [col.accessor]: col.active } + } + + return col + }) + } + + return value +} diff --git a/packages/payload/src/preferences/preferencesCollection.ts b/packages/payload/src/preferences/preferencesCollection.ts index c6b0d4d5c0..a72389be46 100644 --- a/packages/payload/src/preferences/preferencesCollection.ts +++ b/packages/payload/src/preferences/preferencesCollection.ts @@ -2,6 +2,7 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Access, Config } from '../config/types.js' +import { migrateColumns } from './migrateColumns.js' import { deleteHandler } from './requestHandlers/delete.js' import { findByIDHandler } from './requestHandlers/findOne.js' import { updateHandler } from './requestHandlers/update.js' @@ -76,6 +77,14 @@ const getPreferencesCollection = (config: Config): CollectionConfig => ({ { name: 'value', type: 'json', + /** + * @todo remove these hooks in v4 + * See `migrateColumns` for more information + */ + hooks: { + afterRead: [({ value }) => migrateColumns(value)], + beforeValidate: [({ value }) => migrateColumns(value)], + }, validate: (value) => { if (value) { try { diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index 1405841675..c3686006bd 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -28,8 +28,12 @@ export type DocumentPreferences = { fields: FieldsPreferences } +export type ColumnPreference = { + [key: string]: boolean +} + export type ListPreferences = { - columns?: { accessor: string; active: boolean }[] + columns?: ColumnPreference[] limit?: number sort?: string } diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index e45d2ecfeb..0e4111d474 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -2,6 +2,7 @@ import type { CollectionSlug, Column, + ColumnPreference, JoinFieldClient, ListQuery, PaginatedDocs, @@ -25,7 +26,6 @@ import { useServerFunctions } from '../../providers/ServerFunctions/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { hoistQueryParamsToAnd } from '../../utilities/mergeListSearchAndWhere.js' import { AnimateHeight } from '../AnimateHeight/index.js' -import './index.scss' import { ColumnSelector } from '../ColumnSelector/index.js' import { useDocumentDrawer } from '../DocumentDrawer/index.js' import { Popup, PopupList } from '../Popup/index.js' @@ -33,6 +33,7 @@ import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' import { TableColumnsProvider } from '../TableColumns/index.js' import { DrawerLink } from './cells/DrawerLink/index.js' import { RelationshipTablePagination } from './Pagination.js' +import './index.scss' const baseClass = 'relationship-table' @@ -123,11 +124,10 @@ export const RelationshipTable: React.FC = (pro newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOptions) } - // map columns from string[] to ListPreferences['columns'] - const defaultColumns = field.admin.defaultColumns + // map columns from string[] to ColumnPreference[] + const defaultColumns: ColumnPreference[] = field.admin.defaultColumns ? field.admin.defaultColumns.map((accessor) => ({ - accessor, - active: true, + [accessor]: true, })) : undefined diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index 8eaacb507d..909490fdc5 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -4,10 +4,10 @@ import type { ClientComponentProps, ClientField, Column, + ColumnPreference, DefaultCellComponentProps, DefaultServerCellComponentProps, Field, - ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -39,8 +39,8 @@ type Args = { beforeRows?: Column[] clientCollectionConfig: ClientCollectionConfig collectionConfig: SanitizedCollectionConfig - columnPreferences: ListPreferences['columns'] - columns?: ListPreferences['columns'] + columnPreferences: ColumnPreference[] + columns?: ColumnPreference[] customCellProps: DefaultCellComponentProps['customCellProps'] docs: PaginatedDocs['docs'] enableRowSelections: boolean @@ -99,10 +99,10 @@ export const buildColumnState = (args: Args): Column[] => { const sortTo = columnPreferences || columns - const sortFieldMap = (fieldMap, sortTo) => + const sortFieldMap = (fieldMap, sortTo: ColumnPreference[]) => fieldMap?.sort((a, b) => { - const aIndex = sortTo.findIndex((column) => 'name' in a && column.accessor === a.name) - const bIndex = sortTo.findIndex((column) => 'name' in b && column.accessor === b.name) + const aIndex = sortTo.findIndex((column) => 'name' in a && a.name in column) + const bIndex = sortTo.findIndex((column) => 'name' in b && b.name in column) if (aIndex === -1 && bIndex === -1) { return 0 @@ -136,18 +136,12 @@ export const buildColumnState = (args: Args): Column[] => { (f) => 'name' in field && 'name' in f && f.name === field.name, ) - const columnPreference = columnPreferences?.find( - (preference) => field && 'name' in field && preference.accessor === field.name, - ) - let active = false - if (columnPreference) { - active = columnPreference.active + if (columnPreferences) { + active = 'name' in field && columnPreferences?.some((col) => col?.[field.name]) } else if (columns && Array.isArray(columns) && columns.length > 0) { - active = columns.find( - (column) => field && 'name' in field && column.accessor === field.name, - )?.active + active = 'name' in field && columns.some((col) => col?.[field.name]) } else if (activeColumnsIndices.length < 4) { active = true } diff --git a/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx b/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx index 916ce7836f..471549b96a 100644 --- a/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx @@ -4,10 +4,10 @@ import type { I18nClient } from '@payloadcms/translations' import type { ClientField, Column, + ColumnPreference, DefaultCellComponentProps, DefaultServerCellComponentProps, Field, - ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -36,8 +36,8 @@ import { filterFields } from './filterFields.js' type Args = { beforeRows?: Column[] - columnPreferences: ListPreferences['columns'] - columns?: ListPreferences['columns'] + columnPreferences: ColumnPreference[] + columns?: ColumnPreference[] customCellProps: DefaultCellComponentProps['customCellProps'] docs: PaginatedDocs['docs'] enableRowSelections: boolean @@ -92,8 +92,8 @@ export const buildPolymorphicColumnState = (args: Args): Column[] => { const sortFieldMap = (fieldMap, sortTo) => fieldMap?.sort((a, b) => { - const aIndex = sortTo.findIndex((column) => 'name' in a && column.accessor === a.name) - const bIndex = sortTo.findIndex((column) => 'name' in b && column.accessor === b.name) + const aIndex = sortTo.findIndex((column) => 'name' in a && a.name in column) + const bIndex = sortTo.findIndex((column) => 'name' in b && b.name in column) if (aIndex === -1 && bIndex === -1) { return 0 @@ -127,18 +127,12 @@ export const buildPolymorphicColumnState = (args: Args): Column[] => { (f) => 'name' in field && 'name' in f && f.name === field.name, ) - const columnPreference = columnPreferences?.find( - (preference) => field && 'name' in field && preference.accessor === field.name, - ) - let active = false - if (columnPreference) { - active = columnPreference.active + if (columnPreferences) { + active = 'name' in field && columnPreferences?.some((col) => col?.[field.name]) } else if (columns && Array.isArray(columns) && columns.length > 0) { - active = columns.find( - (column) => field && 'name' in field && column.accessor === field.name, - )?.active + active = 'name' in field && columns.some((col) => col?.[field.name]) } else if (activeColumnsIndices.length < 4) { active = true } diff --git a/packages/ui/src/elements/TableColumns/getInitialColumns.ts b/packages/ui/src/elements/TableColumns/getInitialColumns.ts index 02e797ec38..304a11cba3 100644 --- a/packages/ui/src/elements/TableColumns/getInitialColumns.ts +++ b/packages/ui/src/elements/TableColumns/getInitialColumns.ts @@ -1,11 +1,11 @@ -import type { ClientField, CollectionConfig, Field, ListPreferences } from 'payload' +import type { ClientField, CollectionConfig, ColumnPreference, Field } from 'payload' import { fieldAffectsData } from 'payload/shared' const getRemainingColumns = ( fields: T, useAsTitle: string, -): ListPreferences['columns'] => +): ColumnPreference[] => fields?.reduce((remaining, field) => { if (fieldAffectsData(field) && field.name === useAsTitle) { return remaining @@ -40,7 +40,7 @@ export const getInitialColumns = ( fields: T, useAsTitle: CollectionConfig['admin']['useAsTitle'], defaultColumns: CollectionConfig['admin']['defaultColumns'], -): ListPreferences['columns'] => { +): ColumnPreference[] => { let initialColumns = [] if (Array.isArray(defaultColumns) && defaultColumns.length >= 1) { @@ -57,7 +57,6 @@ export const getInitialColumns = ( } return initialColumns.map((column) => ({ - accessor: column, - active: true, + [column]: true, })) } diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 5d7120e7a0..9dcab9db9e 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { Column, ListPreferences, SanitizedCollectionConfig } from 'payload' +import type { Column, ColumnPreference, ListPreferences, SanitizedCollectionConfig } from 'payload' import React, { createContext, useCallback, useContext, useEffect } from 'react' @@ -39,12 +39,10 @@ type Props = { } // strip out Heading, Label, and renderedCells properties, they cannot be sent to the server -const sanitizeColumns = (columns: Column[]) => { - return columns.map(({ accessor, active }) => ({ - accessor, - active, +const formatColumnPreferences = (columns: Column[]): ColumnPreference[] => + columns.map(({ accessor, active }) => ({ + [accessor]: active, })) -} export const TableColumnsProvider: React.FC = ({ children, @@ -90,7 +88,7 @@ export const TableColumnsProvider: React.FC = ({ const result = await getTableState({ collectionSlug, - columns: sanitizeColumns(withMovedColumn), + columns: formatColumnPreferences(withMovedColumn), docs, enableRowSelections, renderRowTypes, @@ -123,7 +121,7 @@ export const TableColumnsProvider: React.FC = ({ const { newColumnState, toggledColumns } = tableColumns.reduce<{ newColumnState: Column[] - toggledColumns: Pick[] + toggledColumns: ColumnPreference[] }>( (acc, col) => { if (col.accessor === column) { @@ -133,14 +131,12 @@ export const TableColumnsProvider: React.FC = ({ active: !col.active, }) acc.toggledColumns.push({ - accessor: col.accessor, - active: !col.active, + [col.accessor]: !col.active, }) } else { acc.newColumnState.push(col) acc.toggledColumns.push({ - accessor: col.accessor, - active: col.active, + [col.accessor]: col.active, }) } @@ -182,14 +178,8 @@ export const TableColumnsProvider: React.FC = ({ const setActiveColumns = React.useCallback( async (activeColumnAccessors: string[]) => { - const activeColumns: Pick[] = tableColumns - .map((col) => { - return { - accessor: col.accessor, - active: activeColumnAccessors.includes(col.accessor), - } - }) - .sort((first, second) => { + const activeColumns: ColumnPreference[] = formatColumnPreferences( + tableColumns.sort((first, second) => { const indexOfFirst = activeColumnAccessors.indexOf(first.accessor) const indexOfSecond = activeColumnAccessors.indexOf(second.accessor) @@ -198,7 +188,8 @@ export const TableColumnsProvider: React.FC = ({ } return indexOfFirst > indexOfSecond ? 1 : -1 - }) + }), + ) const { state: columnState, Table } = await getTableState({ collectionSlug, @@ -239,7 +230,7 @@ export const TableColumnsProvider: React.FC = ({ if (collectionHasChanged || !listPreferences) { const currentPreferences = await getPreference<{ - columns: ListPreferences['columns'] + columns: ColumnPreference[] }>(preferenceKey) prevCollection.current = defaultCollection diff --git a/packages/ui/src/utilities/renderTable.tsx b/packages/ui/src/utilities/renderTable.tsx index 912b9dfeb6..637ede7ed2 100644 --- a/packages/ui/src/utilities/renderTable.tsx +++ b/packages/ui/src/utilities/renderTable.tsx @@ -3,9 +3,10 @@ import type { ClientConfig, ClientField, CollectionConfig, + Column, + ColumnPreference, Field, ImportMap, - ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -14,9 +15,6 @@ import type { import { getTranslation, type I18nClient } from '@payloadcms/translations' import { fieldAffectsData, fieldIsHiddenOrDisabled, flattenTopLevelFields } from 'payload/shared' -// eslint-disable-next-line payload/no-imports-from-exports-dir -import type { Column } from '../exports/client/index.js' - import { RenderServerComponent } from '../elements/RenderServerComponent/index.js' import { buildColumnState } from '../elements/TableColumns/buildColumnState.js' import { buildPolymorphicColumnState } from '../elements/TableColumns/buildPolymorphicColumnState.js' @@ -71,8 +69,8 @@ export const renderTable = ({ clientConfig?: ClientConfig collectionConfig?: SanitizedCollectionConfig collections?: string[] - columnPreferences: ListPreferences['columns'] - columns?: ListPreferences['columns'] + columnPreferences: ColumnPreference[] + columns?: ColumnPreference[] customCellProps?: Record docs: PaginatedDocs['docs'] drawerSlug?: string @@ -109,7 +107,7 @@ export const renderTable = ({ const columns = columnsFromArgs ? columnsFromArgs?.filter((column) => flattenTopLevelFields(fields, true)?.some( - (field) => 'name' in field && field.name === column.accessor, + (field) => 'name' in field && column[field.name], ), ) : getInitialColumns(fields, useAsTitle, []) @@ -130,7 +128,7 @@ export const renderTable = ({ const columns = columnsFromArgs ? columnsFromArgs?.filter((column) => flattenTopLevelFields(clientCollectionConfig.fields, true)?.some( - (field) => 'name' in field && field.name === column.accessor, + (field) => 'name' in field && field.name in column, ), ) : getInitialColumns( diff --git a/packages/ui/src/views/List/index.tsx b/packages/ui/src/views/List/index.tsx index 9a5c862541..bd9be45dbb 100644 --- a/packages/ui/src/views/List/index.tsx +++ b/packages/ui/src/views/List/index.tsx @@ -151,6 +151,7 @@ export function DefaultListView(props: ListViewClientProps) { ]) } }, [setStepNav, labels, drawerDepth]) + return ( { user: client.user, key: 'text-fields-list', value: { - columns: [ - { - accessor: 'disableListColumnText', - active: true, - }, - ], + columns: [{ disableListColumnText: true }], }, }) diff --git a/tsconfig.base.json b/tsconfig.base.json index 16ab52137f..ffd7ec771c 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/fields-relationship/config.ts"], + "@payload-config": ["./test/_community/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], From 6b6c289d79d62cedb5c44f31ddb990d23b96b68a Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Tue, 25 Feb 2025 23:22:47 +0200 Subject: [PATCH 002/127] fix(db-mongodb): `hasNextPage` with polymorphic joins (#11394) Previously, `hasNextPage` was working incorrectly with polymorphic joins (that have an array of `collection`) in MongoDB. This PR fixes it and adds extra assertions to the polymorphic joins test. --------- Co-authored-by: Jarrod Flesch --- .../src/utilities/buildJoinAggregation.ts | 12 +++---- test/joins/int.spec.ts | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 4af139b5a7..0ffe07e6e1 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -195,17 +195,17 @@ export const buildJoinAggregation = async ({ const sliceValue = page ? [(page - 1) * limitJoin, limitJoin] : [limitJoin] aggregate.push({ - $set: { - [`${as}.docs`]: { - $slice: [`$${as}.docs`, ...sliceValue], + $addFields: { + [`${as}.hasNextPage`]: { + $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE], }, }, }) aggregate.push({ - $addFields: { - [`${as}.hasNextPage`]: { - $gt: [{ $size: `$${as}.docs` }, limitJoin || Number.MAX_VALUE], + $set: { + [`${as}.docs`]: { + $slice: [`$${as}.docs`, ...sliceValue], }, }, }) diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index a83c3b3f92..f3a8812d67 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -1205,6 +1205,37 @@ describe('Joins Field', () => { expect(parent.children.docs[1]?.value.id).toBe(child_1.id) expect(parent.children.docs[1]?.relationTo).toBe('multiple-collections-1') + // Pagination across collections + parent = await payload.findByID({ + collection: 'multiple-collections-parents', + id: parent.id, + depth: 1, + joins: { + children: { + limit: 1, + sort: 'title', + }, + }, + }) + + expect(parent.children.docs).toHaveLength(1) + expect(parent.children?.hasNextPage).toBe(true) + + parent = await payload.findByID({ + collection: 'multiple-collections-parents', + id: parent.id, + depth: 1, + joins: { + children: { + limit: 2, + sort: 'title', + }, + }, + }) + + expect(parent.children.docs).toHaveLength(2) + expect(parent.children?.hasNextPage).toBe(false) + // Sorting across collections parent = await payload.findByID({ collection: 'multiple-collections-parents', From 81fd42ef69b2a4110c3317b5e675a3596900b8ed Mon Sep 17 00:00:00 2001 From: Patrik Date: Tue, 25 Feb 2025 16:55:44 -0500 Subject: [PATCH 003/127] fix(ui): skip bulk upload thumbnail generation on non-image files (#11378) This PR fixes an issue where bulk upload attempts to generate thumbnails for non-image files, causing errors on the page. The fix ensures that thumbnail generation is skipped for non-image files, preventing unnecessary errors. Fixes #10428 --- .../src/utilities/addDataAndFileToRequest.ts | 3 +- .../BulkUpload/FormsManager/index.tsx | 3 +- test/helpers.ts | 19 ++++++ test/uploads/collections/Upload1/index.ts | 2 +- test/uploads/e2e.spec.ts | 61 +++++++++++++++++- test/uploads/payload-types.ts | 1 - test/uploads/test-pdf.pdf | Bin 0 -> 1844900 bytes 7 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 test/uploads/test-pdf.pdf diff --git a/packages/payload/src/utilities/addDataAndFileToRequest.ts b/packages/payload/src/utilities/addDataAndFileToRequest.ts index 3fff110a57..c07656953e 100644 --- a/packages/payload/src/utilities/addDataAndFileToRequest.ts +++ b/packages/payload/src/utilities/addDataAndFileToRequest.ts @@ -19,7 +19,8 @@ export const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => { if (contentType === 'application/json') { let data = {} try { - data = await req.json() + const text = await req.text() + data = text ? JSON.parse(text) : {} } catch (error) { req.payload.logger.error(error) } finally { diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx index 762b49493e..965d90478a 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx +++ b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx @@ -3,6 +3,7 @@ import type { Data, DocumentSlots, FormState, SanitizedDocumentPermissions } from 'payload' import { useModal } from '@faceless-ui/modal' +import { isImage } from 'payload/shared' import * as qs from 'qs-esm' import React from 'react' import { toast } from 'sonner' @@ -122,7 +123,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { const file = formsRef.current[i].formState.file.value as File // Skip if already processed - if (processedFiles.current.has(file) || !file) { + if (processedFiles.current.has(file) || !file || !isImage(file.type)) { continue } processedFiles.current.add(file) diff --git a/test/helpers.ts b/test/helpers.ts index 53b9b09c1c..11e4967404 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -391,9 +391,13 @@ export async function switchTab(page: Page, selector: string) { * * Useful to prevent the e2e test from passing when, for example, there are react missing key prop errors * @param page + * @param options */ export function initPageConsoleErrorCatch(page: Page, options?: { ignoreCORS?: boolean }) { const { ignoreCORS = false } = options || {} // Default to not ignoring CORS errors + const consoleErrors: string[] = [] + + let shouldCollectErrors = false page.on('console', (msg) => { if ( @@ -435,6 +439,21 @@ export function initPageConsoleErrorCatch(page: Page, options?: { ignoreCORS?: b console.log(`Ignoring expected network error: ${msg.text()}`) } }) + + // Capture uncaught errors that do not appear in the console + page.on('pageerror', (error) => { + if (shouldCollectErrors) { + consoleErrors.push(`Page error: ${error.message}`) + } else { + throw new Error(`Page error: ${error.message}`) + } + }) + + return { + consoleErrors, + collectErrors: () => (shouldCollectErrors = true), // Enable collection of errors for specific tests + stopCollectingErrors: () => (shouldCollectErrors = false), // Disable collection of errors after the test + } } export function describeIfInCIOrHasLocalstack(): jest.Describe { diff --git a/test/uploads/collections/Upload1/index.ts b/test/uploads/collections/Upload1/index.ts index 6cf7ebf1c3..bc6580611e 100644 --- a/test/uploads/collections/Upload1/index.ts +++ b/test/uploads/collections/Upload1/index.ts @@ -26,7 +26,7 @@ export const Uploads1: CollectionConfig = { relationTo: 'uploads-2', filterOptions: { mimeType: { - equals: 'image/png', + in: ['image/png', 'application/pdf'], }, }, hasMany: true, diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 191e3cbd3e..66e54f0e90 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -65,6 +65,9 @@ let uploadsOne: AdminUrlUtil let uploadsTwo: AdminUrlUtil let customUploadFieldURL: AdminUrlUtil let hideFileInputOnCreateURL: AdminUrlUtil +let consoleErrorsFromPage: string[] = [] +let collectErrorsFromPage: () => boolean +let stopCollectingErrorsFromPage: () => boolean describe('Uploads', () => { let page: Page @@ -99,7 +102,14 @@ describe('Uploads', () => { const context = await browser.newContext() page = await context.newPage() - initPageConsoleErrorCatch(page, { ignoreCORS: true }) + const { consoleErrors, collectErrors, stopCollectingErrors } = initPageConsoleErrorCatch(page, { + ignoreCORS: true, + }) + + consoleErrorsFromPage = consoleErrors + collectErrorsFromPage = collectErrors + stopCollectingErrorsFromPage = stopCollectingErrors + await ensureCompilationIsDone({ page, serverURL }) }) @@ -744,6 +754,55 @@ describe('Uploads', () => { await saveDocAndAssert(page) }) + test('should bulk upload non-image files without page errors', async () => { + // Enable collection ONLY for this test + collectErrorsFromPage() + + // Navigate to the upload creation page + await page.goto(uploadsOne.create) + await page.waitForURL(uploadsOne.create) + + // Upload single file + await page.setInputFiles( + '.file-field input[type="file"]', + path.resolve(dirname, './image.png'), + ) + const filename = page.locator('.file-field__filename') + await expect(filename).toHaveValue('image.png') + + const bulkUploadButton = page.locator('#field-hasManyUpload button', { + hasText: exactText('Create New'), + }) + await bulkUploadButton.click() + + const bulkUploadModal = page.locator('#bulk-upload-drawer-slug-1') + await expect(bulkUploadModal).toBeVisible() + + await page.setInputFiles('#bulk-upload-drawer-slug-1 .dropzone input[type="file"]', [ + path.resolve(dirname, './test-pdf.pdf'), + ]) + + await page + .locator('.bulk-upload--file-manager .render-fields #field-prefix') + .fill('prefix-one') + const saveButton = page.locator('.bulk-upload--actions-bar__saveButtons button') + await saveButton.click() + + await page.waitForSelector('#field-hasManyUpload .upload--has-many__dragItem') + const itemCount = await page + .locator('#field-hasManyUpload .upload--has-many__dragItem') + .count() + expect(itemCount).toEqual(1) + + await saveDocAndAssert(page) + + // Assert no console errors occurred for this test only + expect(consoleErrorsFromPage).toEqual([]) + + // Reset global behavior for other tests + stopCollectingErrorsFromPage() + }) + test('should apply field value to all bulk upload files after edit many', async () => { // Navigate to the upload creation page await page.goto(uploadsOne.create) diff --git a/test/uploads/payload-types.ts b/test/uploads/payload-types.ts index f75bd6fcd4..038b568d30 100644 --- a/test/uploads/payload-types.ts +++ b/test/uploads/payload-types.ts @@ -64,7 +64,6 @@ export interface Config { auth: { users: UserAuthOperations; }; - blocks: {}; collections: { relation: Relation; audio: Audio; diff --git a/test/uploads/test-pdf.pdf b/test/uploads/test-pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..845e38c540abeb767043607734089e738d1c808a GIT binary patch literal 1844900 zcmeFZbyQs2w=RggyE_!_?i#FchY+A}2~HrmdvNz6xC9LWLU2uR3lN}?1Peie6i`T4 z&iUPb_w{`;-W%Oxym9-$f4lbDQ`X*V%{jksE>>OTXFLMDVpv!L4EzipAQvnK25D&q zKEv0Z_6&TcIv^K&TVMD!_#dBvAISHw%jz#}9PR&gQPJ7gN7vq4$>XJ`hr7MIFN65M zegN9LJNh~?2*Mw$|F27G_Rfw@z6^rG68!(VV&ZHEzeiX=?B6aZdANCa8+h8-!lf(Q zzjC&041+JoOKlH& zO9|G+P!VBRA;x3aR9l1WN@yXo$Vae8Sg8KYfhldZEoh#8<>1z-KD__M>_FL0AuLpM zO$quCz17Qsv0`%2Ci!9(f&3Yz;6W6fE(8jJW(GbRI})cQ&V1~DHlu2RigF!^heirn zhqlepb)N!Ipjrz3y^5tv=YQ*{Kz|v2*Zb64x+o-RJa(9ucZn_jUvsk; z{M7e&)%SGO#|Q@bQ;AIXjM~TwaOplIg#n*j?!nVKR}-txCCft(G1utN_yFQOn*GLx zk)2@D>o+blzlT?&*kV^IS`TUBl(1S}`FdKLpgZ~;Vn8R!?8D0Vz_V}05-@jSjaS6# zWWEqP;ulbWGCx=O(BN?lugwiaSke|vRWh#&S!6v#^hPU+(E-@vsm*O5HP_raMKVsH zcrDJtX)o~#0#{XZ^jChKqPZ!aGj4j<=yya|8v#Xm4DL=bA#c~(q`j`o5*S5m-6Y4h z(-a$MX=zrL2H)Zb zj(JBFl_-~4-?_8ZTN-Zbb%5gfjw^|k=_^VZuz!cv@-AS)b}8hE>gS?vBjNd`V*<9N z2pVY^n~B%RK!_aT*v>5G@^ce1P33o(^7-K-Qr(y58Dn*@N0H@PusQS2rx_yhZWkQR zN8r1i#3)!OQpyOJxS{JEcTW6s;&4I4B!Az-UDi}1=!0v6fztbD!$GC2yuM2mhWGi; zM@Z434=6NAN&r(IOEYf5E;a;vB(l?k`7uqp`V-h!)9P54H}Oze&F2So0yQ^6U5Q+H zCooKLvN-MLz3x_1CT}f-&nVoRbCs#N(#8+DpGx`A@0r3e_I_jGA6(*O`sy>>j$Jm5 z(zo>)3Y@zN-WJNc(jM?TVB}XSU4}n?e8Mq9B1KoFqoulS((0Eh6>e6+dnsP?>V2i0 zC-q}6CiigX`>t|16@qIQn z%EiRu4*5gZY3U=8D_ebO1>0nJ0x^&-a#?cLW|BZqGwuK}1fnC~jKYbRA}uN0)47=K z<(95QjaO&+@(_Q0uQ%*Yvmw7BG^2nYnN6GjHHP_5`8WZkactonb?$lI`o&|Y-*8{RDj2(BADKdtNUDW$0Hr?0rEeN18R z21^l%keQ5csIw-fsK~LGVNy#aoqWWPN11A@Ncuwww|T2dh%>{yoiQbmAs;zgDe8>$ zZY;iavUzT)1*+l1n+p776LWpeZ5jrdVL48K32yh6B2*9|)@~06PacEA9YN&liaGvj)u`CMsk~?>Rq*$k}*mZS|*Lrcn^IfR?q~mpe_HAA3vHSBRnZgHH`m7%hSo zYV@58!*+BmvpBtzMD6jT80Nh={V{!4E4Qqk`O>LOR$b@KM>gLzn##UqqrKDWu!W#E ziu8Lr74ap+oV?w|vt=!jbCu+(=w@W4?2Rkd>_%P!`zG+)zgpR!_&`#b7_nny*P&mN znF6(IIuBkcMvY=U%Y8vZYiAZ*-VTZa8;*<=SvmV;y$H+hnhB9hjOHe}^MqIlB_2qC zcgnwE;!<%@SO$9errDn-%qQZ;>XVZDgjP=J1wI(<$wD94iCT3JhC;%o*vt2$6O-Hl z!cGm=zK0`o3OOSH4K7g%4Ws9ix7nhqhgT-~uyyELwQ)r-KJ-E4?f;4a_oX3nR*1r( zv}J(btcV2sG7!qVwf>ctJAEf&nBdTE_^um9H?Km3_|tQcuPu<&CP8UnO-JMRH=W<%Ds?Z& zOiX#At+RJ?PACAb7$OBTXrJb-IoV)HQA`WJxplg<}yAZREo*L5gvmb!Nt9wLO5XWxG$a(OG{T>I1IXSxF|Gd8-tx z>j&ShHObXc8ipp;nwYq~*iB*T>Zc2>#F;B+kjiCYjuTjyuA!IPX#D;hqil_&fWmrZ z5)0Duw%soi!W?muhKGs@sPpRoZ7KBOIeVSBsO|8@0Rg>XaUR3T-@a+RuE)@%!CDU0 zpNF*{53`8g``3zSCBi~^NsMR;1$JKh#^cv%0}1>OnG(YN#LZwv(X4o=u5uiQA?B|@ zMAVNT7Yo=%LgdI3Ia8)6&ZQ-XW1A3LVt$Us3 z8V0!!z6ZUK*jtnv}ajx({NEmj(O{uk>La6)U zY)BvFkeH?Tr`i-fD_<`l&PHq_o?G{DaG>sR5E>gBuX7|l#0r8$;mQ3XVjMlekN>?q zZ%i+Qs$M%6^WV%j2RDQJUX#b-cJiwNF6Fq98XA1(gp=ag2T%f5i&S)uD1`TfY zpwqvJRH1r|CAxg`sIBoJkY|ad}3|H8}OM9w}e#?aNDDY6f9Y=X% z1Ven(%>cL6294%SnDz`J`kn6g5Jkvwfd;@+`uFd$B|XVysf9c81`@N05^sf|$_=`P zFhue*Vyz9K4&dkxDPB#G+O(pXRBo`BRIwlS-S9qfjWT6 zn7!^H9Qy`w8W=lWbwX*uW_yl>zWAy1LL(aXXzA(HMq*-c)Ngs?HoF2s<1*G@KY^{{ zN)vLCEQR)?-Xl1&DLEQIlX)^*0%DMlHfLV54u(AOinp63)^qr6@dk@Jxd}v(acpQdg1hLO{(agQuz{a2R3LSG^43}dOhr}spZ>(8HhmJO6Viu`_cCY4MT52zyA+qoV$ym<19PPB;xU-GUksgMFg(JqHghIL zMi%E!FsSw5#Dzn4KbYys|6{CF_dQEBIcm0ZcEH@!eWJkOqPRlbzI^wcfUZ6G9U>E2 zJ1DfG+fuD|IC>y*AFyrx`FC_3tHdYv8esi!lKUo92r*Op4Y6+kUPV1UvJu%46$40~ zYfrWATTGS)kb*lPlnAeiTc^f6V<9Q>bGt^*!Cr_QG5qxxqq+52g*T;jcKe zKq9TWChmyue(IAayXAmoiu@Kc%y^ZMh(9mb(3Hs##?@dua!CPNGPO=B)&1TQQl_L2Zh+ZfOGbN%xfQ*J zq*4^|pEDTLeIdd@gg&rx%Bp?QCFd1SHXS%B3z~5_Nu=Fad*?CBSgX7I(2Pnu*hwuq z-E*pnqn#I!#<66N85<6JBqF7+u&==;r+L<3?Kk_$QOJKJ#r@@1v4b>2_Mf3Ek$5)i zxYUl1=MTZe48f$cZm48|;j3B{;Kk5C=()opSXoqIjZ~qF->P&Z5!sbDUHUFWX z#>ha^rz8AoiU|C4}xP~KH8!6k)T=}e}X1xo7ll{_>iLgd;TXZfUE zE4~hWg7%d*A>4DyqraEE`hIEGdN!rluuZ?vM-}?+;ewaF27^oF@v{gG#n9vrzTWmk zs+*v&mxj0PGN$viRP$BT zuk$J2k1uP{QOKHR6Vg^OvODPjQnDR#UVzHs=7%beq{v(71LVy9+l~3jU$xXcQeoFveg^LyZXOq z&JF!#XfKk}vI){>UV_G~VQYNkLiWMFld#NLxw(7GU`MngldOciOB0QbanlxMz6hWx zFz7))JvbRqOVm4u%cKuosqf?V;p zKuLwh%`^PY=E}=#lJ3$G$>|d(E^%r;hcfqK_|t9v-NP+0CdL9XIJc=~wgz+NP4o{! z$$pA|eA~F?){_^}?Z*b1k6UH39U=OJB4{J<%a4(TepkIN+T$`D+d{)i9Sk#T*ga0^ zh-^Ctp&c#f$E(vjBqft-UJ{K*kFTSM;|I*S=$h3Fmnv>2Q?VYM3dULh}8UXX!wKuF(LZO!y(ijlQ)z%q0g zbBZy}<;PZZKTmql*DRagCfC+43D}s^aMV=Jl1XSYL~{at)YP3lbLqVlea6A&65@=W zn%_4??DOukWlX7~Coou$^$De!RpKh%RBqDf>r<`&P%WCJ@vbq()5cgQ>hjm3WDB#$ zUq-VLM4AXUM43^WV|2Ey6^qNtLi4{R1PI5`)MZBzBYjXlu{4PNN7er%US)uN3CH{S z1+uLrqgEksYQD zQ)~^vUKql6l>*FGWj)8>cI*PW9aXlWkf#v2A9Z5u-?qsQ>DHl+iC_{+K%TGh;>N#? zI)QzVRTEOkVLwVveWkFVbU$wQCl{)Ieia)eb%4d-b~M5GmSMmfudaT zMkk;Tf_S49jwqDp*-)F)^|CD%UbwgyFFnI13p=|T*3!XvEZ|>#s^(h~Fidh1=(XuL z2B-yO_5t9MCZtX9MRBD{r>IAv`f4b!!ph$e7>cI+ylu!KOG4xTJ3rl)|-m6OhKkvk+61`A&k z3lMQ8l3TltN5Ac8R~Rg)L5bV+9rFs=sRE#+j(zVf)vd6tA)5mQ4}~{sr=2-$Dkn!L z?x0do3vSo&yi99m;~W5sZFoH|?L5RB*cE_R%t#I?>Qve(ApF+##4J7eVub(an-Ia+ zhdfS>D4CvRYFrSGDr}r4phWbP_qcSn5Pk6#GxJt`S1VK#UQnl<9l(mlzSnw7P=VF_ zbVRd4YTv~#pA6WFlAO}gD2~ZaoF^T5ZJO8cnYKzG|I^v%zLVF1uRJ;z0dLJmPbX20 z@COk3D-|bzS zZIbn45J8|M9REmIjKh!2m{Y@qWZ%Z7mD4|O)b4tay7cV`cma{NLB6x>WDvZ{j(D9! z`;STg%u+P=|Lny>_31^~`i9Vk$I`2)wmAMvUqZl^<@pU9P>H2?cu*UGxGJEl17pXd z+UPb`QSS%u)kaX6QE1eJT=j4r^3jB854rTMH-Kqm>QW@1#igD`*p6&`J@9l!zpp`S10olsT#|A$yR)e!RnTJD7Zv}>ik5~BHfatR5+(>< zdoI6~`q*!9^FJ2!2UM<)oBJd&t3Z^=_7GKs!2gyC&_t} zivI3=2A+&p>{(u~df^*`3I5w4pRyQVW0YX(HTm}IQO|?n3x8}Kj09CX8ZxFV(HoB48x@EqhZw+VK|C$^g-KY zvSk7S#dzv%t)|rKqvU=OQ*3Wcj2SMzLG3cpFuBKD6JMz zMT1CULIkH8zUP25Y4u~W2bV2s%@m75T2;#0-u?PV_5VM5J$1(d;p|H|t`+tftz^!t?+1Ym`AUl>UHx|H0rRK zf9t-dbF#Hm3&3+*fCEady7bx)b$L$>`_819mv5GUch>J$a~rj5K8pea7pFqxwkPTh zbZAzpx=vNUmdO^~83{a@%`9-T9a7ilUkX1~n4tbvnJ1~W~nOT?SC;KQQu^+faq-M(}Gn z2r`Bh>6twOH2Ys6^d9ZP3G^blG;(gwc`Kloq`j^HPN0 zL2U)%>h! z1M7G+SV{87z0KJUNd)wd7FDp27qs<{2HVig@oaPnk1%#z{lNpjyK{PLx(<<@D(iRX zmAEA7W2&&V7Uif*sw8Jg`lS!{w`XQ`pEX3}C{Y+jOGe(TSvocMysPAMalezNs>N$i z(s{2^8_h&)ru~JbnCY2DakrX{^_sedWx%rh7e*XTMOua6U%bMmFTT!`i-?6VyfH*y z23N0@8!DzJa97)BXcID5YFk$D^Z#P0xIm1=0y}v4(MQQZjq5XPFiDP`4X1EUk!JIT1C5_O8C3U0kAAmqm zSt}6#@iQ1l`=>4SZGCSe2&Z0;Cdofn2193l!f7#$34s6ESp*|5hS%=8tc5~&!Uh-#&})3M`b42sQyK5VEP zE&A=*NT-_u@!|DSA@Ro4m*0Eka7UY|Mp^>=SEJ5Yij$w=a(MqPYlwX$rqmoSVf+yi z=C4ocSNxhnhlOkb&Xs}vrDWHsPLx2yGcWE<%WDQ{b--J=ZAH@T_24JvQKD8ywbu|x zv7w5kBi$%*!pP;8+^>gV^w}F+M6wLbV0CLLLpIPLMT_pmA2{eKS#0q(B2%CSBmQ2M zcj_)CkB3IE>FI7*IkRMR|GQpe9%Ih=1+(cSHd~!6_o@`bSkU1Huln$J zK6uk>2HktlZt(vw2{PXwN0VKr21sdtS&UApz(5{j-Ig0;dh~VZ-0N%&XXZSyU**c`=^|(OL#&1YFlS%YGI`wOwbu>mqzahSLZR z?0BTWF%Qg}DGP!kU}lcNelPW#RQ`CHHP0IsW;Jje9s zuZnVNF=^Ea(NZ)A!=e=$Jas0iK42Y4?r$~7RJyuHKlQ^o1d?W7w4H38;y>)R1GNs+ z68Sx!6FoBHfMS9`%biB@UnS5Te{op)FyEuY*$=Z5=C2g7VX8f})%Grms`}9pyBVHm zNeB&*+6{IiP?S7MB1yE0w=93b8)3~C1~ST7c(=a@FwY~h4X(r51uH8Q;^?mTRyB;U zW81N&8QbxlxOs1zUNny;9#o;!i2G&}7blWxDj)U>8~&=mZz%c=C+hf~G2%*IHjB*| z*O~KI7L*#9};Bkb_8`3!~OkJ-7PJkpSS5EwVgmcZBI=!jHj}W=cgDoX0-vb+u zl19V#)@t=zG>WkB(H(C{>L3+Yc_C5R&a9EPFQ+j#VI}f{?)yyHX7A5%F4EjUobbWy z(5AFSt;;}~@qk41HR79*AHDQ3BF4&Mtnwq^`l18F22&;t^eV6mAjJ9ye4PQ7N8vlq zg5y5D?$BR~WNeJ|!T5ztmGmV<4$HM6-d!U+QOQJNt`?3|WZ?mombCBsKXaVI@|Dr) z=gXAvgD%`E>rj=YbCIH^@jzdyZLKqmi-=nzv+&QkP(Ngi~rCzeZYguveYM-vWtS)Hie;nS& z!>odZ(mLzWt6^yJM67j-OL4jw%oUzK^UG7>?l7lm^x=4@W#ej=JMU78JnXenHD5$0 z8r0V;>)@SENnA6$-213UyGM}JNT&Mpxkgys1lF-m@JX6=_vzPkva5*b=0&2K#-z5l z<)WmYZru&zB!)rtBXg3u^QA7WNHF43DVDqwm|w;J(W+MOB!$mf5eeT~sX7fsAuW76 z8+rJ{qXGTAP4M3#U#`pip4&N3e-kv7|1z#N^LNt5q-h%`DlEUh-Qg}5m_ToOWL5TQ z`SbF^$#6uYBxY`!HvD4`+nekdT2zNVs1GHJ)ay5wVgg;^urFgHvgQMJ`&aYTz_nuW zW+T8h(L9`B2%RZfeU&G9*emCp*WzG=buAR(Jk@gwsPMC{4U4!o=d#fGNQ~Zb#PVEG z@&OLWgz4Z ziT2fnD&CC@)?9fysu!$=Q4~HjLvS=s{lDnp1@VagbaO22S!}m<>}-(hK9QlxfREcm zRHu+Ek+Q7}ysLOeCvKV1%9iI?(|Ia3{37@jU8lC-%j@=9%@1}HtZ8wvCYVbMqcmfl za8yv=1iy$^-Hdor$Z#D>4dRoP!ha6P7Y$llth8wTPBgAGR3Gg^V4GqqPM9fMTaT`t zThV~IN6C2t!)+liEk=Kr2`rR(c{I;s=8gFsyltc?5-%_&P!z9Ty10Z~t*O6^a)Cn% zeTZF2nwduas$Ml!BIh`e^-uJnpO zTN}edfm|Ik+mrh-{H?dDLexiF`3e;`a|y(F3PbJ_*tu!?r)F+*4 z9crR&CdufAYRSTCIM{N7obs6#7560N->KMnI%cbKJ=$uZX0y5zZS1zkB+_}>RMhIL zxPsNKrco1ZdyY<%Ermt3PK(UM16ufuDL-5W@`9v}B_6-AuTC3m9l>l|nN)Fs6Cow+ z52Kq&ebcjaF~@fB#X0>+ggd3sl+A~$vWdgv6-IV?=~GEpslRA5#@Htjo44dAEpClL zFGvws?)(rswxyzi`Q_xtbFr+4TW`kt$vV|*eEpr$iew4-m zc?0iT^1N{yxaVjc3NK{ivN-Z5f}=B^G%DeV#%w_}A(4%si{|RmE@tIV_U(1Q?P--% zIWmKH5!tNWLvB8s`)Pu#LiwqlzeD6O7Y^nB8S=mAF@%IBgx^L8#>zJ@6&fPv zb^QnAs=`F>rFCvrMJ;4nW|~k81u1X*2*E*Yq1mY&z2jCRZ*85C$H<&I(i7RZd%eUg z^6QAXM92bCejVadxON1B`j%_$1f}V)*h(&(ekMKtKG)J7VT&#NO-+TE4ANQH2wY0Y zroxsUyS_wE7J?h4=S?=~{maYQf8ja?B);^(o`3qhXCVs3o>R zcgUj!jU_8hew_I@sd14B`_gN7OysY9xnFLrAWezt&qa@joj7p8yOb(Nk!D(C9uRG( zjCGE`N@fFN$CL(!edu0>q$f#B=7@T_ML1B`It}hn`?qD+O19|RM(nSYJchS8)B~Sx1Z)7qAPA2*$_e$%!kV%U3a*39j5 zUHl<5qowf7x-pY#nFjB=cL*8*j9s|TXud7b^Dnzy4Tm-wOxOiTlK`dn=a$L4 z#{Y5u|Cakj7jChvd$DRfP>DRnGd9!9wg+hT|4O0r?yYab735xj<)aCGe0Pt=S*VCc z^j!e|&365l?g-vF9HR#3vIgEo`9XCm%xvF$Y0kK72egOpmVKU`?)>ZU`nsdRxO}Aa z9#|mQ&rEEVwE&zbf}6DzL!~CJ&J51r%~bs{yE$1_+Vhhf?<;QXA0m|-7NuI+n6z+g z6Yo#7Ze=0Ema2%>Ze3(dfHRBXy#4PQnzcg8%S``=!R_t=Pk3RyRErTA^LJj{=-HC} zhJ3D5Ea$SYt}!{BOV9EqTB93Cm#q{e6czgWot5}=F^WG7sx}Tg1_io{S&H872I>Q% zDcz9*w9iM1xGY5#>ALE<6K}npJRD|qHm|Vbexkwgj?39zw3kb*aUPXRpAbvcI>|#J$-vn0Wklkc(y=T5aoz$A0DS+u7c( z;awqL$;`@$q?88Z%`rYGG^F_)sg^iB)naAVV;e)dsv2V=-g&Aswnd|Rbb8?F?412w zEkZ+8!w@Bw0cy$JI4f2wo`srDQe0@;*BUT}#nqaM)#M3>r&9(b$`&DW+w=3B6X{6V zDOoibI0`2pP0hg``d;kVOdOJ8W1;rvDWt}B^rSDgw|eDhqkQCR``!*!RvKk6qjJ)6 z=n+yxuKTyND?%!Ebjg(Uece+YKJUUxCBHKa2OH zFu6;y^*nXx`$#~0GrH=aD^&n$J+r_OCci8 zx&HA^V9tkSOtw!G=icxaPN%K~_UJUignsV8gqk9XIPs?bI9o*$voH$M^ovyY@b3BZ31zw*_sW^Kj4Slyt3|xklK0-_46;wx9%N%hi~_1o z|Bg!Sc3?3qk4X2*=k{nM1_oyC{^)&rdI!DG>JR2Qt0+i_F3Ie&|AE5&cVulCIvEQl z=?mL2%-;WC)<TnB|OA4X*hmOc%oE z5^vDC-;!nH;pIBS2Q4*nMn6Bo&W{%uFzuAR5i4qIyuvlAy2=Aj=&8~k%M{SX9TtT% z&=#pc2F&ai%jXBS=W)E6x{YGeG(#AP1=uLCzrwkovfs=hy7uO&lm#??ivyc)554lH zF)`)`%r0q*jGpmu($erw5kTuKj4-+u$pr~*BU?N}I!{mk5%wS4h!6W1F192GimXM= zXd>n&`WyP(8->i?iJS|0+>8J(Dn^NM@5&Q*$?sxth*GBX9$TSv$vbFn1MRvOL}*Vh z^3D!cM=(&oEZ!04zWc^s-*sv=l}V)|e2~Ps`86OzVX#HwsJC=~ftCq#CDIwZ#|r20 z;Pv8HHHe|-)LsF2EkD>8`#|~%03sz$v*boSP3J68(Y8K|A#yX-Qp!Zls0)fyn($49 zHkcl0=7Gm;@Kfh`xBE~7yhTq$$3=RsjIS=hYF8Z%b8N2$7Fwd?AJ1ZqT@_Q13*Q~3 zZe;UXH)%|(mPGGj=V|10KPVg*g5ea*6OMvJ$|L(b zz8Lh^Vs_6zP}(bJ=C+by^@W#R$n54#zfZeoqGj=q_#^hDhGH~ASDJxD9^I33=42(6 z)w*_SPr4R`#%h*@{#c&Z{eOnIwCy`>lYEr?Lb#+yW+sKpv@9M;YEibnt4a}<*lOe~ zwj~XUGS^YBiomt_9d4=X(7Na_GdIZb$}fkx?k#ugD=Os%FBGm0`L3~4emqk9`g!;M z*TZPG_zbuty?WlN>6zdT(cIXY^D7f6sXbo39b){_CAj8>u zC`a0wJS(63{pvpx^8fCHNRRMg-duh_ym}wbd&#v3U;x#X+C%xB8 z|MC#dXH(QE?sra+vy|tvGDsj9vs?`CbrP96`rwIScKznPJ!oFCka1Ffc(pC1 zW9>!uXgc_#wZVRXu2X-lwmTjg#hj2`C*~I2)d0vTnd@7oTo|I&;D4}l0`_pLZ@ndj z1OmTHWvi-nq{P&m_&bYzh!C~FU8-dtJ5^x6u#hg}{Bj_d=3HTi)KSAm8K;dZb=vJA z&zBa&aisp8!ew$^&z5{i3(>dmJjQ`_O@ zchnerWSI3eCoAMGvX1-hlYCWr2Ifk6fgOz`>2c4`Uc^uGCzUmTrJP3XPfNPRiNDt} zT6L^+v+XbG$A$F;5iJZela;C?i~Tpm%E-q*kz7@*wJz0upsF*_dtsq}eTZGxn*4~I z|4f6;I>{x&>%g%2;vEd_5~(YnN8)xNa%AE*8goJu+J0U?x_U>}BnV=oRKEd#jKX?*`X>qPBKxjhWMNBYj!eMMiF zHS<*m-B}>3KNJg@BbIuo8bQQ@MYU%_UU9dgc1qls8(z?TsGSzws9nE=W2Nhqzg{0_ zwo_H487Sl2ruBtVBWN20DH|ZI?!e{sYImI5fdg=Y21<}D+cw&iGbZi(# zJZ*1C${dou$BR*_ITZ=NryNU!S9Yu9mR75zvI|2!A*oVtWl}>j$doXTtNGJFodUsF zx@{`n!-Y63!rBFE$?$%SaixXQBe#X(&suWua%J&c$(XEq5*X#$fI>}RokAA1W|c`| zM+=RJ3ZV6Jv;_pO?;h&-bsTE{sG^4#MW>x+Y)dOfbdg{jI29D`IHgF7Zs|1VY{-~z zGOI*)Opo#)P4zvF{Jnf!L@i;5N$A#oV+%d5VkQCJ zf0GlyNuC7qQiSb1RXt<7j8!6iMnhaBemfz|DR*5RL)(0}I)3SB&`6%oU;C|U)frx; zf<7!#P~_)7=YRa(+XwhhGbC&g_Om|xPP+`rJmXhdf$_%Y&Kj@3SnPmAk(zrwl6xXJ z+Whd*)MzEi`jGV=^4LC0Eta2g+N!}OIWNfA5_Uzq;=b^;LNhurg4fS8F5jGkp#{yT ze#q4v{R56=%qNVT7dyRu@4#a2f^e=tla6nNy&|aZ9rCxAcLlx)x_q;hcqjY@T&OI| zWiEaJT0ggP!1c}K1M`~j_J5JfQLU<;)6=Vjly;!n@mD|Vk6Kolyo5)n-HQXX4lb49 z!&HWicumf<>w>pZLCC;42-&LLnU zNt$U?-O{#5W0XbgyTKPIntWamtFM2|`rX_274Vl?R$n82iH2x(E7y=8=%f4R)n+3R zx$3@`?5Xne{4)EuGfrSXsRDP|3?BV^;T>yKeYpL%B?wCRIhKV6w}e88(|_vbSCRDm z9a3aDw@Ye2C{KeQUx+TSUiF|hGJzu7)J7UQqAIUv;Yhr0FU@z(D1IFS+(7pZVMyr<>93Xw~B#bz8MTV&o4Qk6vh)|r^m zg4DNpqoo-ReW}Am-LHfSSnAJM%yKfZi6aW4+EbWUyHE?~<@O@zmyl%-g;pWPYF$~> zuap=#)U3`q6RUKN z-!wQ|pTp1bV1Pa>oK(NtVE$Me8_hU^_sOQ333*t!e#MhVPH~b%9!*H70;D8RPhrAB z6TB?keB%kxNrOE)Lk+&3q;D814W@zOHk%F75kUn;Zk;**ZFArSgz=E4c37<|^xu5o zu~IvZATY%#`us~Ofe>oiz$8xXitZ%mC@Cg-sR%B&?EOP71aWJWiIXv_j$K9s{5Ii~ z^lx1J`2Kn;&E{$G_S3IOm#9&s{MW3K&CC*gqo^|KTna@I3EoOAPt!x@PY1jQzjI5~ zG37N~c3ryHS{=#aaJ1R;da&zosj%(#vJd)GzQZ|)ktG$`4AcF}U0}GLZp(M7{tD3E zJ~mbap4vC{hb~`A%xDC~!PdWdYeb#6)ACKqk)<+DVVKx~8OD*~$izQl;dPQ`v!C=E zs2i}yf-Hpg3ek5}^*liiUgKNQkrN-w*2-Gs9bP2h9jo=80=N&<%`tayfLYY=gCGVS z8pC|aeNSPo`be`GYn=t}I*#*47^8@>*iQeQZMSd%WdLW^cp-j0clJkOh?NyeeC?wY z@}N!hvk?RU7p^(5psAj zQj9pk-U9FFRK^K=+*nJ<4T%z6F57c}K9J-AQ`u}59+r*+sfv-rm_?xvLKhML^^m?( zF^`6`R*%_Hs>Su=-cqE@!#NhW?!E#`owo*C4#V(_+(FiJbh5rvh=G!o41>EQejEC* z_lESvHSU^eR6*ee)WBL$rXX4iYSQ-8*%xa)c?AxHPohufy(aZXV|hD_6fr_9aNi5* zX&L;|t3d6l>(d4c#R68TW;P!_y1bHkqa9I5Sop+v3Y9|OKR|^LTkj1Xn_#3>9EOgw zZ2cA59796;(M3$XE*fh2)tSy<4SjXTrJO7<+DzLDzRM>YJYrLSZM|h}N#CR6-fle$~K2<~K>t(|{7D8_Xotg)OnD2iIieqY4f1TOjy&<7uCUrPl+tz0B+1T6o zU~P1Z^Vrd)d1ueez$Qa^98ns4twRcbGfrW&%pu!<4sDq5+b6OARiRWpJ?+k6F<}OF zrH-m^F0CC%EOgY0Q72+VKZ{+!!lpJ z$R7PC`}&Q{bN8WM{No1B(y2D7%7^1O(%Y#~rZu;f->f^5*Y~xj)7q2(Tly)p)|2=I z%??>@-Aw$ib>E2j0S<7nQ`QXoq>M;5TE%`>ytAn3ipO>MG9GgB9Y;dS7m4==2JYxR z0;20PiFz)iO!TDy1OLd)=B*m7tB(dMb38%JI!E0x1xYLa2>Qo$|7X1nhry^@CWw+& z*er~mHCcOigYw&|*c@k8PkotNIv4$=(tTA9xYvAKZhqd=7*`fP_3>J{VFD!TD}Zi< zHq5%gjpm!orF^YdQ99o!E26PAc;*G8Me-U88nve>2dJT;HwwAX2OdnAGP$*=f>9?m zSy-!N+l2d>vs6@;r$ViYd2BOUn^D`+gamWI?k2w60X!6AwJAM7nq;fN@*mpKF?JMP z#g%>Om`23Q{$A}1!LoISONXR{BZ|j5Y#ZHj6Z(PWnAkFW6~$=V-SmFqXp-&YK=m&i z{Xx`9GH1#`s!8K1W59m$)|()?`?4>v$DHVpa%}#>GR}3}BssI;eWuT| zv(ZoVp|kLySaVQz4mD3pm-Hldq_kn$t(7`>ZJL4gdH)B5H&z%FH~QgfqC3HT^3sQr z>P`KBB{lqz#njjPrPk|K{Dez-@P8#Hu#?u8Q=VKANPny?8%+vE2(VkcM0rHK%^{js2E+j6&uh{=cv zxq*ORxo5a|pG~Vapv*VY&F#+b5F8#R909Y-zIE`9%;{7p#+dTz9dbT$W?1C;8s9cG zO;!u=lL~nI@=S!X={8y0F zt&9HosxG9wD?n+nyv0JT_6bZvZj+gY*#0NJ9UkxzbJVpj+QU$Ai_>CKY4SL_V!N2pCmtfvGp`lE#494<6|b6)eyAq<$PD!n;k1u>(DqM$~a^rhd!(q zt-DElo>DEvCfDZQgoe@n5GQ_NitF+aKN%N2%x#Ea=A-$W$>(5Ki^YP~A9KPtGYJ;z zuI=7I^JDLCM?4imPRS92h5E%15m(`fK^p%${;K>S*Wc)yO=wAs+?u7#N}tD5eU_N( ztn}^?-`NKxH`6@M2;r_LgKSQp4mvhR#dOR?UPaaw$uf|El7uPORpbxVD+bkQcwm+! z;#A^wMScQHMI@`zV9=U2n9OLq;+G&!1eU!bUXZkXcas55!}}^~ETc7={p3fgV!fM#wzKeU7*g1+xu>ni@f9LRT^$b2`fuAdP< zaM9EfsMC8jNad71{7XPqVUEaLK!MHJoxRQn;t^~hQ~rVNQ!`h}0Wm;boe2%DqsmoD z@Xr{LS*C<@op`xU5esVq1>DhOOF_RI$(QAmSlm<3F%xrU z6EOu_yp{BdVWGQ)M}(h54r466luO0cHHZY@)^pcEzgzG%M3AYk)9n(I@PJ8)?La?b z%O#-?qhd?Ufv)q|A9vzqy)v>`Kxc9X55W>!Py}%1&98otuoZc7JH}=Fzp$XMI(`B7 zB?C{sC`tH_`#k7)MoLE8P6x9S5gGRygsyz;+f5w%*!eE=l9hoqIe2;(@L1 zQTS~JySgHVq$#m@#Wd`%A*Z&>FPz|93CX!;bw5Zc$+KcJ$l^39EtmcCiyR6X8M6-q zajUgnHB@z2s!DO%cv(HCP=P;c^@bHYtyFZM>R`Q{Zt!r~PfW=ceD_)tC#9s}+t$$W zqPQWhQOsMg5&&Ie6AH_FPri0$bqhb4WeXPZD2rgDU8baH>`~S{OlUd&08!uapP0FT zADH$a5}Rz3bdN_|aM}tM>XTTaR;|*M{jkwfz+q{+i0UPzJzS8hLD9-)H#hO;fB<#D zSe{mH@GUPj-1RQuSE>Hn`^Ll9E##a__F!!w8qOb|3uyyb~qMxW{MY< zqQ3AWY+6b9X!3b)*I!+@RQcNIkq=La6S}_Ov>7i*Q-QD3&1b25QxI=I!0fM^)wCZ}0aSCehQl0zPc-=X z;I}3NBk!}%Chfk{euI%AV&{*#cJ_OE?dFEiNR7!MFavIT!s55cIM5zQAxvMqas<#6 zRTf;Mdg>VgD$I|lIp`8{CTk}w>=%1=3iBh;aCQwTKku=)`rnugeiqn+eD*Z-iR`GV zaHqdQ{^nZ@#x?Z6`KNt_b#sN{%f&V?y6Mx@i-WRx>b@c7RN>q!m0}whI#b&S|3dA| z%4&~4A{49%xq=SC)owy^w4Yj0i5f0*JQ*kYmALSQswn#l01eP?6;H%|vcVqhktPKc z`*;HeYy|*TCvbpW_HvYc8R2Esn`>jmQ%9D+%_lrW@c>gr}A zml(NAeE~sxut3v|DvUPbe=^JpBK((KfPyHPy1I5%e8lwx%Y&EK?a=~@vmwwvkpY1@ z1iWKjG&GJ%%(#kGe-hEX)A|NvUm*y*5oPbnX6v71gH7DC!$U(a)PW;Aj{k3&OXUEX zA}{_!ZhKyV4aQBZzgf9_QX4?S;j#&JFQz35*7Lyf=)Q(mmxk{34G*79)cN$LH>App z&PBA(puVjuM{DRN3=8V&-WQJfFJAKSgrZ(JW913@a)_)L!B03Vve|$=QNx$G5P3KN z{@MK9Yli0u>U_LFr=(|QTYn!q$yf`Q>zBj2T{DaOmX<8r3cy~$BLjb2BIv!HU;cDL zvcQv1Lx1d9Mnh&Wrk#1;=TQ0~^>x72%(Qh*w)=+G>K|*?poKp?MTKOS$M^{e3%X40 zOenD9Ekne=BE3skSDn6Ek`jw^u>CESnr1$HAnmph^!`6%d@n4phYV-~ktI}NMeY&d z;k;Xx-jNF-)cEryY3W~QTSrL!04?)>KY-H&eG2+2%ZH{YQEO%V$x6u9R1||{NjWb@ z!IbBj(=+DM3p@8@_AQQhOH`*q@1VBG(OWtkr~1bZOix3OFtB#&I8d}C8l zp605XFqCavhPu$U{Nl+mASeikME!@24}#v`$RaqgSQC3R)%=1Xy>yq%68I}uQ4a#} ziZN?ggFnR(V_d_c^swp_^PSX5{>xNOk$STg&pK#togkGLNczc><}a7dwgrmAde^Q9 zj0{-@w{8o!2@ku_go@>v7)P{e6qb-p4yMxcO(d_(N*?b<++$~Pr&_9T#Z?N&4cK=Q zPTg}=v>26I<~5kpJJH2k5uHzc*_({`(1+)<-mW2HYWig2#vo6@0)b^*S%wpwHpsmv z7D<&iQ`iurA>rwLn;whaIuPwt0b z(6>+pcJpys-k7Cucqr`PDFVGMslQNg${y>Uv`*O!p7y#6_*(o%{vNAg#!zPc{CQ6f zxUERHXw?v1v;;1UyOOTt!l$eJ23@CTM9Y>2J=Sqv4Mt{yF%QPldP)izWs?DbD z%z;AX2GQ~^DWFW>9qg8pjJlD~BCCQv`E03E`oewgQAn*qC5q2z+Lf#}7CUO}%ZMU| z(|Zi9Kf|{}M-O;<4=@<6%$X@T9b45Oi!vm)p=Z!SyqnF@9c9X;o9ggAfK_hA__}MS z;z1v-Dfgk`R%Ppx&%+cFGRGC{P?|}K!Mjvi%UCj8l|-!Xi9-|Hp)BG$TDYngTkAB1 zgLefi@r!=h&W)9GPdX0crI&%6u4`x9m#z{u18MlZ>?{HFA)MuSTt-FmPU#d-`Mmvz zpyQYtKAJ*XTu3*(@%z81S6KD1!pg~bFZR~OV_Z~>@!06ap0@IVbY4S+dU?Wwn9B2` zP!ikD2ITK^c$WjUr=Vh2dVC$sRTh3;Bn~b{PctKpx3w*DB{b@)tYxoh*BcBRcGji3 z#Q5xu=c;@iAGD2+D&4WC=Vf(AJ(vE>cH3VTE-MP!zBkPfJiT8~ z`^RMeF*jb2ZXg|w3KQ60Pa=c+mD6jgMA*##qQLUw-Ax|ib+?ecOnH$ijCPk3Gm!22 z0ADW7417*ucO|c97Wul2hH|ZvOqF9?W^xa8rlDV`t9`|Tq?D^!9XuM`^7{dZ*6J)! zq8Txfm?L_-MR^1Q39(1ctGds+`}F^GI>X^U704g9kK;@m;@xyEaRv4XLc!Kh-1lyV zTKvN=gq3dl`x9b|TT>}p&CJj4$o&W7{50%%ztB%Ix?v0FvgQGQ_i&uLqOg~FON1J3 zkET-sU0qA9S?d@~2b4~2HC0Y1UK#=v%9TC&!AsT2JoPL}I9su0FgaWP5T06s=tZx;WjH$IE6&bGx7x zEC#vZ{jnE(p(uVU-`RG^c=}P;@RYKC&$I@6Y7F)&prUD6H!VAB9;0JQleBQYSP#nA ze+fq8n3zEapFC@L7jM&tLRcnFX{8&|oaYL0u~J#{dE-Cj>y$DuNgtK2e(T>f?g#hO zZBrquWtC!3ZuIIdc#?=nsGfY`8m@vm;Xcsa8^Ppu@cEqgdz}I%cO0eelcS%*%#iyP zmH+I5?q=2sxe>3)En$WTF%bk|qPJkWM@0G$0q_P2S{fc>VRXp@8I6wfz9oyh&is7{ z$U)Sp=?YWj63alWDkiJjIEc(DzbM<)<60WhL1j7TNpCD1eQ@Kx6H?KasmIdF-E@?W_+j8G}=6Z(O4$N&KcOSe7R#=I#+@dWwm`niGpWb^uK3d<7`P@G=ME95>Lr%543s z#NvYqi#;I5pD$^lO zi^*GJ-+Ohf23)e|N4XPATxVp`U8@_Jx__c^IiHcAa7Zu!(Vz2&Yt!Zup8f<>z;Wy> z-!CZC${o_cB^l^O6yb+k60R4)b(Ak;Zxyy;X>s)EX5GThAu0~FA+Sidr$I+95(4Z6 z*lB=d>G^qFDeKy6e5O2hXB9}73>HNf8ccO&4Ei9dCT7OzeTAHH5s*Os#Q$Ku&@v0i zG~$vhC>6E}!dSQTt<-!Ea71y+rG6?>p7CSSI!`)g?aX%X<5HH!_z)q>h(f2ZKx zQP$5(P1jezEe8HsxAHemZi;>W)9zl#Y*J@d!@48ivwyDW$B$XO)pq|X zQ@dySUM8fwL~nU^DSg+M5MwigX!|tSL$+}(3i=?q7lX%<`NVw2|Cv1sX-!MU+8cbQ zj?9^D5<+bBY;{R^UPyxBOQrw;zu1jAb9QbID|G^>1qh7Q3I($-8?FG0({6 zlw%3(q6XOy6=O*?an!L@AyLYQmxivj{)sks)L?fV2aINHJd!m76I{t~<@&_cT@&RN zkK)L#)mO}&XM`W;b5hy+WaNd}$272h2atXU9UW;#Chg>zW&g8`y-m63-Q#GDf(U*! zQpd5lAGRg`nCSn{bvWUdH7~aoZ|m+r#2mN)aEz1%^;`U!0kOaGL7-GOB(=v>`ul{kTQ&dOC8yUD2h1 zjV$hq1@WOw9(fiWZ&3h*Ci@@H{FnOx*8=6RCOD#pPFue^T1?w2pFNyy_{@bjt zgew-(J2`@p!K!Ikff`xf*!mYv*xhAL7@RzmToIowOu{Pf5ZxlvWZZgsz5SHJehmfq zxoS|zNtchKawo-%O7C^aavzx@VPPw&S^Y9vrj3mQiwuqz3B%V5?-J2|#K3-S{yn@o zHDOZ7ginO|d>aZ0Sz_kENkgp+5h;`V@6jK+rEaKjz7Rrx^b5SiM$BL)?Gk6EM$Y(& z`LB#&eXP2R%@VeK=NEJ#M&8PD`Zdhy3mFo-#$#_Eb#XNI17cs56|k|TuqkFsZ!?;X zS^C%`O|;<~=)9!@L`=KBfoH*~i?)LVJZeHkm%!lLh1}ZAM&bY|~aZhSa2dd0WE;jT5{6k#f&vWh2 zx9L&38S$;+Tk@k5KG?MALqFaVl%b14A2KoZOHy0zIG_*E2Syv2*`LgV-M#W+S~?|a z(L?}n!?ahd&&0r`B|O*UPK}I?L#4z@D7zOiAIAa4l@QILNjLhw~3yM5J3;@F<^^#15OlkMqnKNpub-Q@ev zscJY2sePXliZAV_9#BaLGWO)1Szc^gH(XVgHnl_FHN4I0AO(GB-HhP;YOD5GKwS;V zPAGD|lov*7EU%wQ*p#3C+mO=4k?r-u9&_t`bIP^(P|{}ST&|8q9xjZ$Z)B=TBPSM? z1Ue>~LvM7MAOA8<5+#rG3%d1<`JZ8QQ7<~}g+K^>L`-F+PT3{PBqrU5KHC#&WbB-@jkal?or8`0Pd7gK1?6!jXU$@n{9-lO6h)rgT$lPzW*K3C zgryu;Ykn#2w#S4`OoDIRGA{bf%J^p;WWQTVlSEnlFoM%Bo!vD*-bx1jw39EpjAUiYzp15Sa8u$S$`oRpGtYSH4W`bv)$FqyEB%qgFe zy(-l*zBB75`GWGX1IpsumY&e~I+J{%UvLeR1h?>zNuJudx-{M)A{7;pJCO_f!yF4| zV7(>Q%g}GYx%Iv2gyO1*TEdYf#Vb^-D6LB{J)Yo_&Pc25cxW)`C`shkLqZZMqs9oq z{#O9j`;_Yi!%1HGh({yNhtP;Y7GI1MQ0_6SjcM_7nZ7t1tihL;7;%LhtFpP4LIB`Z zm)T74W?I)qbT#s6|G*YuclcPChG#l&opv+r=5SNQmf(aC+BtDVx^N5mS4>(8A$Wv(p#QP6uWIT&Z^;0<~}18>9HiOc(F<`6~meH^3;-J z5d#;n5%2%{q0uZ54}m*8$?TJf8zMmss``rQU>3zyoqfi!kVh^;z^H_(F!eL)k z`$)-F3xm37vB4-7`^RwxFwN{BZBy}p<{Ir949KYEyQ2qXJTGOL5*)Ri)@{Qp zkrgnQx)OMf!VRgoD^Hk{l>Mdg!iFL-#oWSNAwdu=@D)8SXlV{BgTGp)&L@|k1eb^@ z{Y-G6jL_7xtEf3wocML>U&sU*v+#=v{r!yZAA{&qzQEt*sQ<@U={j2_X>{k3-LDC*d z8Tyb*dP0SB2U`p5)t(?sNpH7Q$NCyZ$jlz2tl&d!rrYkpMS4rK%@f~t2kqsu@p3#E*Uq!VLMc5^=o8Y-XLAK=cl^45zC6wQ8mP(HD1X zy_bdCzE6PY^j<}QO-o*PJCv8p8Ba5-l98Tx&&O3|Yrf44*#A%%PNdsLal^hWy#|&m z;Uj}wUkq#^?5aNWsbJE02P;3<0eL2ZD%P1WHO#m5dq74(OJ)VCmUu(9SYII54uy@r-9l&2EJl||x(tDt9 z`$SZZ)(a8-4^8l3@v*lDW77#C%>@Ms%;AV5qqZAY4O~*x7iH4hIy-#hG(M_%W?Ucz z+(pOEZ)i_tD;k!$MM7~$jDJ7c+ECH9+$1mMQaL%0RZ}9kYq^Py6u9|nLBagB>)Xwy zwWL_x5?PywWvdE4`$w;u+#n4CJ{nO#2*o!pDHK|KVKrr-L*dTjiiRlV`r(MaL8M*n z%=lDEfla5lN%lL>!lPE~53B9am7J~$IUtgvbI#3B95?gqS6AYQkO_wc)3kr}NLis= zWAf&NmX@Sf&KehcW*uRhMm}{0z*!CRg<>F}qGTQ(;CPyly*5~kq{PmX>BC!l**WHf zdkPlMgz4z0>f6`OicWc;aSd_-6}>j*hND^FyFyaC{2AHF8Q;O~D2IzSO}hy?6@0cU z0P@11p1iMQ{a4O_KA5Jhc-TMOLk~ED6({P0t6O+S`^dI!z)bHvNs#Equ11G#jLiu|U509bgY5!bf-OjSx*GM>7LZPG7@ z=~qxxM*T$-E3S4|0zowUtZaRQEAGFxj6>!dfpA`k;CO$9=8iaFIN6 zZpLeO+a_Ngb}F&~BMcl6;#xNKV!Nlk;qe`+;Dp>~tiq}GOXhd!5_USQr!SpiR6*Zf z_dr?h!d*;j+fH?FWiG5Pqcuz(V5c)i2>vYiW2FY0u@lW`RUu%>KYRe1ia@OhsRRA1 zfJD|U%}931AP&c#k{*AX38~vjcZI_Ry-i;MU1@Dh{jHJoFUVr&PM67>235!9 z@)%xE^nuV(2;5eAwMU`14tt%*AzN60v{I9T6slWlbvlTdGsZy^(dXUijLK;P#TJ-8_K^KOM=SowxkGGx56m0#84=1f#b>wJ)2_ zKt8s?8f=G!CP6mfW+WZ@khc>%`|e%em19|O5mDtp0vpiId}f;yiLrc0*I%Q%q!t4{ zeO|e}P9t?=PjoyfRM7=Jpfn1Xlt8UFVn9VHmnMFtUd8n^LTG_sy-^Vl!#tzfTs7U5 zMUEJ#ppPq+YFqU1?!hnaf3p`+&S;tN)C6u$`w;IuL(N|PY5E&H(aH`F(C$5mM8X1J z44VX$zg=p0eav!~(*3D(>8k?NG7W3F6XL4N1^(6F4WBFT3k~;oGqgB*(UpF5I}W7s zfwOh%k2^uRW{t}MQE84Tjd-W`Nsm!U7mU@uQ(=IrVH_Sjc1Dt=CuhE;9t{l;8C0uChU;PA#!@w z<3oO)&>af$u{O~|zZx8zJqxSo2ohgvG|I@$gqZ$Nw7S&D9Q)IIr5wK?&Cg@HK1xi> z_%b?5??MPDH)f^lm$raRepdT|IMUd@_`s^q3Vl6`jMILW-JvpOe?6$I1A362z?tEt zZ;eAh+GXdZhXM_#hv0Z&EBV4>LT(3V$)ROAC zVS!AH#f!KPU&r7N3ZCY3>eHs;#VRRM)e6&Vxw#(wg$@mKTFvUuOW>8Lgyf0*jGq*A z>E-cxLHUYc)gP{q8BU04z7c;~3yGG!?$lRek=HJ-=7)dh6RM_C<4;mzPNOhzl*m)} z>DdVAqqD*^88FJh;KSoqoYf5hf>2nii+ufx}AnCc3jXOGE42Z8&h zaa3NXq@xqaPszMX3D*@{gYiv%G&~^wv|Bq&m_zjQ&0jXU0qIUs>hd2eVOFw(DUoFz z%Btb$^!r5%%Cc2}U$gg~)%=XLbzk1b(1`Wd zM5prnJ3JR9AgAPYCA)(HB`hR>oh!(W`7R;Ruq{Q3a3R1h3R%>YlQdndM&1gUoG)L_ zK!sy_74JmP;YN(F0}5c7#JOfGA*W(ul(Tcz9Yt#IH;cL^;BcP<6otbjRk*VQQG zm9M%EghXkHj>E1k1L%V$@h6)q=B4dVssOhcq(!vbM<=Q)`(C*}tB~~9e!bp!u3r#R zB@1c3P}lMLMpcOq=Tezzmq``N#_eWID5bExlIj=<8`;mF1M6#^>^?wbN4VN8`59^S z4JKy5pH!ZsA1B0dwfmGtTqhYh>QEWuGd-$Jp!sUjj(#@ldvB3%6P5oNs$rM*eFLS7&v}Hv4`VO*SQ0q5W`wLaZS>E5z z0LZI%XggGC9Y%O!=g)x0F&eDbM9-xJ{68PpyA|}y-3>ds2wT!!=r)*uxtDu!4e*sLdQTMdU%J*67Hb>?aO8`h~Jj< zgwy1;=tz}qtWPr8xjeE@|J=<-R&NBf%PfU(0xVOL=Zd@W0^?2wKX}wLp4!tC@qV;UqJR#k5^5a z_dVkEJ`w$-<=u`!y9fo2W*>4umeNTk@?=d#849-Y)5d9ChQAH#i1>v_-h%ZevsQ#^ zN1tz4TshvmB&2Ke&<|d>k4QFaLqed)Y5yYSQ3~HOV}n84AdkVT;(*|hlhAx7C(Tje zC3RjrFhhYoEw}LPdQgqe|A3`5ZE_$e>kph1XY}w!*SmmYiDG^e*U~mn3b_k8NLXVk z!ol?h$z=vi@_~cxxa!(%$|w{yi>L3#U(V{lC^4Byc)o)72 z#7dXflf_tJSDvp1(}T7}d1RL86-vgyuOSww3%aNYm;z1AmT$(K&U96=j)4MKALh>M zi_W6ha(&|>#vHI}yP-^~VFtbk{z?c&H3=J7Av4Pl&YqRYZm(Y%BY@ZNTDDyvb8kwtYu-jzNddRqvY zfg)V(ArPn~%aywliIJZvApey^ToCNwT?+t!U&E-&o_sG!U^Bhji}1j{t&sNZNf(YXI?=@zps*W&y*IhzASxfcB|<|n^y{)weWSiU4uCMoStWTiIGq@TVJCTJP#hO^#D;|;8S zf2xA^R^h$YyNDbub6+2duJ+$yC_rXrn}q{xq<9FTq_(dC)Te={OA|qJC`0BKz%jnr zJof7dP$C;w<8}!ng+9Q8)(asBeZ?g`reklha0fz@-#2Ra-H^y2|CK3Dz4P}UxHZ7Z zd3=W@Wm#VVpWiLAX!;7O*=<0f%po!jwON!8^VcS10Wsa5s1t8h&KA&K2D1TxPw||` zxqs||<2tN#ujuQ?fW`^nIBv+PYmbqrLx^)Bqmf6Me%Zoj5MCEGoi`$?srZRAw% z;4RJSt&X2}$IuOI5ksA@0KrFUi2C5bmWokj?)#AO=4W}_3X%q z!LY#0(!sK1CCWN|@w_!yvHY_LnISZZh3klvKqGckXR)w0RNylCB(Dmqt+S%Sy+a>QzVmuaT zAghj%6@HV9mKDn=lsOVT%4n^DtB-@yyNeG8D++YasT8F`mn3Xj?%ED~iD~p=l8uaH=9Z1d3ESImwvLF9~58qz}1P8@~E$~=Xlru8Dio-vPt;3o7Eoio4i#8hI*p@kp zMZ!bJ||LXl4IjqEJT+WLPQ9Ay|rK$Ej3L(`%hK9NxQ zK_D2}*2yEheju=*J)EM|r$xI1Y)`nKr-X&s4z`aevG9_T_Nz) zvc-$mD(qLUOs)`C21kgX)wEA*QLrC;>Cu0FVGrM+4G_eAH6)eKUdxTd7Q6_5 zg|kpe6H2~^_}&5b6PzDnN_q*&WqqCs-zOmtYX@0Olw*M^LcA zD#aJC#0qjcm5>Nh+F3P%$d3fmgrAlDA8&-T3LUqV;G%;i~)(RYFiOgI)xAQBn!xMyWum`x=uA- zfQ%!$ivteqs|iwxj9GP#2=P1`iwD?+m(gPa=$xX>w`moPx3aAE@ES4w@t4$kW75z0Po-gjV1A~$Y1%TRf@{Gmc{brTH>?)k(f1` z#te+VB5LV;V}MUS!X`39s_!2T{Qo#m`HU+#aEiGvEx!fHFpKebHZgv16HeXhqR<1T z->aeCI;2&kofFJ_Q2)e{u!%q|cnFYug&F|IkVd49j0 zDy_FkK6v?HoFIDn8!?k(W$$NidwJoSapmDP;-kj19wc{7Rk#dOfyavQguOYM*-uDA z)S^r|U2pI5IXxM>>L=AsTsqTTGY-hGa;AX;DoZYbt(4~ufC>0qf;?IfnxZsgm?2C- zENWC34c{-ou-wN?W_uzdp%pDar_i`<_-CzeKy!~Y^*!P@PU(|ky^?Xi@r`j^rGf9A zT|*BQY8Xa7iA_aE06E01`H|HxJwS&6BUvd(S_li@?=ao|!u-Okc`@az^D%c*?~(3+ zL4ggYy(mxw%5zrCx?fBH5QN?TxY;z21_;8Pf;1T&Ya^!Sts)|Fk3*vhV(g!jvT)o( zZ5rWsDD6e>=oZh}_sQ6$aseF=bEIYCBHl9-0pY&;jEt6}o znmry@L&Ms~bulGB!HpwG2_ZAG)*CmHK*~y_>^x{!GujgKDNbE;>hWtxL*`(giAhsu zD|76$S|2$UKbj;~Ouzx`Y`svMwh5=Oj(Ub!ko$=U@5ia`UQ=9TyBEX9^Es@d+=xz` zvt-wtjKA_BgMLA>Awz=x?|sE{SG&e`hfbbA9~?!n^D>BQ)SOBVyHIMIq-{1^l2^TY z@PJes^*?Ix9nCjD!z;WO7x;tu8%Xg(TX8}F%!EE`vs-S5XLFDl>oSG zDB8$)vDT6JZ*Zw*cRL$s{~~JhctSa|acfIK)phAq!vcUV?b|_f_c!FUK-+-dXZVKD zA?P(eaT>~BFPA4oOR%CbU_atPorib4rdoH);;WR7S}Hh!T6&1Io=8}{(sdDP)2u&O zA7>Z$Y#&cbJHuVQKMncEzz}0YwJK1XBbCzr*S`l4{0rl1tCiuFVc^|D^lEey*}UD0 zo@Hh28W>aoCBtoyql#|H9CGyaKn7A2h&U1YUxElX)YC2eqRIvi+0`3v!a3X^}o-gGbF!139UL+k&4ankT+J=sYV9n zz*ZMWQ^}+fqlibljb(&MNv$vZfCT~SDiwURH;KXa4Mov5zvTT%9zOk69`VofFQDtC z;FG-^g%^Fi%}=kF4?L}!2T-6Z&qXc!2mo!_Ny>a@<8dgm>6ol9UetD_rceLDRCW<2 zc~oCu*a^Prc&GX%FQ4eg_Uh1*40^*fIF7JCF@WXudCMijIkLB1JNaQz)NR* zrgVQpKcb3J1<3ViD#OU8PkZH=+-sQRyCG?(#}4HjDTRL39@W{~KzE{DtE{=}W$(p< zKPsT05j(!U*i02v#iOlb1AOwUTWNI`a?gRaoYO6_uA}`&_&EtFXbJm=)eaADBM>cQ*cpIT(TnMt+3+<&LOL zmI_`(`uK0|R$mZF7Ev#f-#MuTEw9eIfd1gbz|rJNvtvC@`=Q|I&sGnqqI+~j@Ghp~ zn9S(u%D{cc`{0IX6^C2^M1gAO|3XC;_2p95e|*J8!f!1-bm9t;!i*9}0hj};ET;6L zrMKBNSI9l|%;hgHw%0f0Jim})A0D>R>U1o=GoFn`{0pU_yub&xE~`TOn8WyEyZU9k z>)5RH_v1iB!dr5%;3+Cy36SDR3iRqZ?`uOER1GrgZFQzUIs3UVx^vg2PPH z##UvK;VK#gdPQ|tFmB`cMV7IFpunW$F=`>Wi}l2*s?49(FLhFMJA>L?edW z0}9ZBhy6`yN~II3`|DB$+gQ}BV;XVO+PV#Nc^AN4k06N^`B$ALv!g}ZK$D!@7@CCe zn+tn=lkqj!J5~RFWYi9axkswU0^xe=wQk>w4symcgs^VO^t+&da`opT(5NPL0y{^x zA6!3%+q;NXh)YyXr90AfB3IyFE)i%B#HFLS+*}7ccHxQxt6Hnba{t5j=(u7>3fs3P#W0)5fD(nPyPe*6Sxih}`?;*cUC3drzc8 zB&ssg!jh9=oH61lKY9K!{6C!Yf9lI2Y`ezX#0e1EYybmicVrI3xWB47H@=lwNm3$B zM-$mxt6$jolPTa)JXu+`>7fOTE8ubz-faxz_$xU2_GP$Q>O}yT}*^MYcl~cP<@Oe1-y^K4W-Nd=F9Ow%47cREJyCPC*o}C>$qg%F6AHc);$f zfslb`vUM+_b+#j8KMc**_YCsXq^lYD%A}d@Tb|y}ktv}rxm0omC1;jA>sKE8%?ogS ztL^m2I=#Jkn~S%#2EsGNzNedEK3kS4lI0h~KcXY^FDC%P2Im^nqG==<)2m8vHS8b9 zV%ROJ9s1>@{8cY-_t$9>-1N2YBfngL9N4}P$A?q?rVw~xv}MvM#!#@YgXKQn;ttm8 zJ~lW))o{!X>wqfRP!j9+7QerfF^zqL%0L$d0D1qpC2aV@AE^6Oa2cJ~t~pRd7}+Ky z2L9ZBGP7{_dX#q)dd3jnG;Ds^(5S*?(eA!_*!h5GPmGPZoR#8u(AbC0;*<7L^ZVZ!s=LNw}+9U z@vB+pSoN9z_YS@&3y5t|Afm#PG2Aif4KqRyDO;m)w^rcrZ+)N%i&)8p3IUO2<%cb$ z8=Tv(GC`a-ZG;ICq|TqH0zaO5y;>c7iurO;E2PgiYrBsS^e#zcc3%-z_WO}_SWC_w z+Wn8BwJrarq1(%ATRH!D;D6goXE=xz5F~730%cyk>?#r)X_-F6d*BAF+0nRcK0@9= z#Dv~-dT@mnL0e$IPE1J)(2}A{zQbDh;s&|lwa^vmAp=4TP@aY-^_@AUn62BC z)?j*s7z^*Bx3x>6Rf+PMfUcBzGNl{NNgD6`kAJs-s9tvmC3p)=pv3_5G<^X&o2p{M zkM!i-Sasx?VyD5zEh-N2rT&?FcwN)qx&ZJA37F?@y;re|{6*N%RCbK<4*)n=lpnZc zD-lj-EdeXoVbp#u1GZ_&$qSJA!K-!H&hwC=aBv{Rg26nYS;l&QO1}0Nz_4(nx4I?L zp;RUMU)KW%K@Xe|Hem>y@d!P1wCtm#`dQkke`L>T8l)@(-d{v~g?JasmB_Iufmqa8 zxs2|f2lh|6+Z6LyXb?k2y>XDIUbT8)t^zD~NF(=J;3yUq7*NL(6}FOf=-38u4U}R| zAregJ!vRM(&5i&z&&RoWHp>O*L-$~hD~yWUL)qhS_i!^DqkJ#65CBNRo7aq4*IV!`x|f{JU`@#j*m$xYEBw{jBu0h8Njg$ ze^5`Ox~CX?bE!76n`N1ijuv{A1V7zltria~9KBUm=s3S&{|@&?V-2o^j6VMx&!|4o zV-OQ_Zy|r|OPYvbsNz6t9JCgN(X;i$#f z6liW?5USZK@!I-(s?mU~O^U}qM~0gub#-3(_W(8N=3)fkkgsI*-+8Ks$v+HO99mK2 z<{pM*BkdtxKl*j7Kk*k&@318!ZgB8lI1=yXQ+4NwsHcvv%g+j{uMZ<2p=CSKov6vf$HkDe!j+^L5_=u>t^`DCtvs zR*N6{SWBWRCajYR?$&%u(M*tgH8A9!ij7^A$alu}O6Q;F0AxktxcJi>-c(08=9h7% z@6n4iWjhX~0zg6x^dXUmmZk7B>0uJ`2_vy3*)~mGk_q>e zyj67pYd~Wqb?7&Lo~f@-2uU#X8Da~T9co9@StP7Ct&io);X;J!R?>rJPPycn%an!Q zQPi{a;gju#c>KW_@AJoRZRMQokkDe%J{-K_Sqw&D#kz?3n1&=|a-~ai&GWc^h4Gwk z>hY;`^p<>=_gl4=;x;}2LK*-1T8PY18Yvz1X6TzrNN%lf6`nsC>55b8^&?wSFWMnj zdh@Qy^3SthvV&!|cYkzHU<=S9PK5ezpO*D$7AsmH`5lji?O+;8E{{P;O%VtYJjB%PquNx$ux)JygK+POvM0TDX&YyE36oe zQQ9O~Yb~FseZ2bZZC{j|TQ_q|q178VkSsRK_V7ou9Gtp*3^GQ|^@5N6+Q{G{&M}r# zP0Y3DOKJg|gYE6+X+twSAKQ`XA_>p8pFRE*xjYTPL@X{d-z+N;F|G zSBcWe*Ryi3ewrk_Vjxug;b-|dQBA~6!aRz=t)xt)o0qVO)V|isF!Z$O3^i%txl6Ss zdJ4w`)|;Of^7mumx-e?v_dB|pW=Shn@_DQdx-L`lC#dA#^D~OXSpEBV_&@)@CUuGH zNIfZD>;Yx|Xiq0x+3_SJU{TFkq~Ig)3mNgXV>-mev^W#i_*HQnj^9zzWhun1^^Ya| z-}@FoK^T^)#9t$xBw~O!XczG+q$gv3AFq!W4tA2xl(<dbvdtlq(np>HCTWx-KPV(-VOa|BT#X#!*mErV~~pT>K%r(y}PsLWn6 z`4oGdVPlE2`$|ZA=F#aezL7mFvpUjY5-v9QQ6$#~@M6DLRZ}#Gd?t-G;k7OftEpq; zzQirC3Qrn;v{qAjpbKxU2T2%s?g+5JWO+FhIXzt4GIk@@ z`}sJ}Di5y^mfRxcQ&usG(;~~2GB(2v+rn@W0e!KCch#@D_Mcm@+73rY;MTuS?V1(y zjzpy&5)eBk3<|7hs z{Y&5AV_~@x<&*GPmBIN^Rae=XFEUZVfDGk|o`I10>t=4E7V9BdkkL~W^Fu1}L8PQu zb3AP-J7uDne0)&{V_*H4-iK`tgdPlpsERm$C4@x#M-zuZRVks$?Hi2Od>JeN_L-6_ z7wE}ol45aI{RjF~k9$u4D}4D&ao&ztL~Ui}t_n_(-83$Rp4u2;c=(#~SO`dM%Q)p- zo#`K7wN;tfTFbtUYC@z(Z!FePrC<@kcmJf3w=G;;MtLkDoYK3ID3RFb%RdJHhg+}) z{%gLLXFrLh`E+G12!q2|b=b7eo*~Ws)j7s|xbqfz@N~jz(~r7N1kNJ#%xbWr&9@2d z!A0|gNNOO|G-|v_gg8OsoQ8ZqVj9Hn@O_rbbFb#*9?u%gFTrIEDCZAEYB*h4;{br) zn^+nvnYzK<)x6jdppd;V)HQn(%>0t7v$Wp7t&TF%FR0->0l-HMRvR7a%xeMM>Wk(% z181dY7G=EWU{u$k1rXp{9VJAp{Wf*wU)HC`@mbw7^R9% zTSERfA_)-55a&>X8pKY)zH31=?OR#}G}syuLf_{o5L=d1O zXk#GC>zCf*wC&-|&jYkT+RndF)ywwNcJ^+*L4I+L&M51iBfND>X&hzEQw0s3l?s7~h_&N#4LW`MF%4)eh z2f>FxCoq8X&hB*XR9{YGFPzmLQpa`x)cx#A#$@9Fjald6RGlFh+-s1Y=4A=r`&pJG z;(Lzq1~%V4n!^N(&7{pVC5X=a*wZO#6KY?~nnzp~WvU({B+v(8kxK#hH44PSc=c&)@2g4`AwXm zyd@VA`^!4OdE!2o)JzFo!`SJ2#qSz(<}MVfyNIV2+{5|mLi+XA-5-#;%17_rGwNyRvg@;)VKrX&oBzFoM+VjpvXa7I! zy>(b!-;yng%f{W^EqHKu3-0ckAOV8AyC%3ho8So{xI^$DA-E(!AV6^4`z?~ww@=%B zx4(P)z0>dgKK^8`HLK=Yd(By+s>Yb40!!&^B|F64=kqsupsbX#;u0EhF?a*L1I$@& zm7_V0U1Wf>qbuSeDm@z|n!#A;|QixIW00Mt1m3{}7VYTbzJ$Cg3ypd_80aBu^X zW~@XB!|AJqfiW7lU(Yh{N>qZ;pwJK8@)dl6EaE+>`y<`z9)jeF_9;~=A@1p!hGcPwwJQ+?{ zl@Echi@HGz<1ndGzVwjzCO(O>L%H-K4ndyyXy=EwFZ+x0=vp)-5aE`i<7YE_YMC36 zuOOn9GdbkW^j;v6y9jL?=Hg6{se+E%E&bK^_DPIrkECh&2YeJ4swc|&aP=hvlq+{< z5pvFtUa;64;yp_(j?iQEq|of$PhZJB5dQDs1YrR3iGVqLNI#O-xQ-pifs&Nr+mXlO zm*C!8xAdES+Gq3KLxv-+s)kQSh~Iw6nCv?YcH_Gvkw*4iwpQyW`@Gwl#Le&>^Ftr~ zQyjAmF2*dSt}FFtJ5u7A<$~GNN+26_eHUeW%S#EtoCoyc@Q$C26`P6sXGX(WxG$qk zEOB#DINgZx#_8AZn3ztf3&*tbR8!~?d7{{!mN#?VQISssMNLbsT^f8o89Mi^vsR7$ zAoG?hRxN@^Fagyr?f4-b&o@QgmgO0vVj3JtKSA!SVb%jylAVOi9<{4K*wM%Owqt?2 zVqk?vKWl)o4~={Xfp_!@G8!v7QrU#hgh#Iwny?wCw$DBeK~`ukr14C7FSfwf!5wIJ zK&)+bl)|QJg|~@_X∼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

D=Y@-Ns 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�*)adf`$!0s}@x%bp@MY^~Qi4y~5ca^O?p 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

Scdj0$us(idf-MH4j0{UlKn@T^2WgkRnS7}=P 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°IK*~dm!PTOu{YJ?TO|cFjJc8qgKfH7piY; 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áq~PcN02cJTv#sXK%dq*PoeDXkrLBosm50(G2Vf^X%y#GB0E|HIJo03r3oe z&UC!#v>FY{-ko@wIZ>J5JVE-uxcZ3i+Nwh4t%-CYe~pxxC~&lF!N?a=;uI5W9FvUo zMPP-aH?uwY4W|0FammrAPy5k1cT4t{0mD^iuB#Ee>Gl?@%=@#fT%xRxp-ZPZC36|s zRxnoH1Dn_ZI=Uu0`zz19&13e`#imH29`)S7$gFz3!ul1c`*V*k4snJ?)=}MsUCqhN zl)(WHLI0OgdZ-e{88T@>aPkFJ(r~vME8brf@Arxv<()9kGil`DZ;3hrRB0Q9bYPOC z=JGZ*|9N8xy_*Z?x_kgG%|Cro`l#TTf4r(Vg&#bfh2A_(H zPfEi$tSacIo`obg*M4%ze=1J2S-r>oX zz{ywn+0iH_It#;9WwYFl=IF#0fqofjT{lq`@v6e>*DIgi+vm}J-yL(5MUC?_|)m=G_COG zapL<6<+fF(-J+nMO<{D$xle<9D@6*6muXAvg_$ld8Uad+(@W)2uCMdi?~YPEdR3<7 zZkHTTWwwOA-oP}UNy~RifyZ2xe;wI92>Krj`Vn4{Bgg)sJv=zZWKxCCNOb1(^yFLIq&8od4kfa?vKru9 zMdi`km59CM%^~xlOT^yLgVm(4!HAS0mbG4UhFe?K%_Cy%1A$1a!zaB7Ha%ERDyCl$ z9$WGA>`PNp3|6if0CiSaQ`ovqcWY`#$NC+!JiQXHQ8XdD(G;H|$lj}$A2MzA+CG^N z6y#6Q>V5?(>C&Rt32T`)Fw4n{pL(>tLwSw~Wt+hhNW$dt%~4%e8I2x#Uw`drOJ5jf z6bTM3lr2GVDSy?&v`P87SH0m2bERswp z81u8L(NjCOM~WTLQkNxG_Y!rPQBjunD|Q@#tbBAV$2~twQ$qs)Pe=$+gOFkgUuXP3 z?7ekVTw#{49o*ergS)#^xO;GykU+5D?h-t>OYjg#2qZv3;qE~~aEAo}L1=;Tb>vRn(v!&wuoTYN4CwCRgLiaImhHg&T3I9&TdsuU2pfm0JvIJIMWGPgpc ze9Cp)F^YUlX7GzY-@IWR6efF9cgn%f^K9$ef2^!an>ef%TGfjC20gY9~#= ztWO3h3A_7qHtfn|8Xx%QG&_90nPLK05tCx7V)eW-;NEnpRheh#Z@WEz%q`M43u*uG=b}bZM~-|UMAkIip!o$WdOj?A}N}jlZ_%} z=QCuH1WJZPjKCs3EIh1(cx>RSO|$jur=lEULZycyhuU-{wl5P9X!&{Q6D`=`^8i?> zeTYEKN6h~Rn5)33D^G#=S5$cqy@YB||E&Y43aK7gW(?}PMtc_{hL3xMPrFpYkvqIN z*0IZjCW9Ko(HaY?;WhT?(1^^HU4&z?k^Xv1hIJL_XQ>+BZuHKdiGGDyu2sQQD66F) zWXhH>93R)zn;^o-zG)}809`n$8A-Q4)az1^^62gYlt~=WsD7=f*r5~co%qF-$6XTc z-4GixGyRt%7SzU3=Lr}|5;x3OSQSYKKYzK1t=#^M;O4%u%e$e%ihvi3h`y{qW8}T$ zb^S6Nnj}+<_P&^Ff0&TsD3xX#`!X2SX#CfGFI@Yw88Kdo%Qt2!R1|MioI@=lb-Q2o zD;`-0G!b${X7ZNbve-pd7-dIke!&nl6#lqNK=KE+aWMdvYjh<3Spl3BB?Z63KBn|s zwb=?pRL?NN)>iab)x)>Tn=gh79GCl3$Fs}xZ+@t-ZBG?>W2d%>_yKu(GObG6${SOI-c*6h&(nqJ) zfe3Ihf;SfX6J20=*)$^vz5RU zghx*cy>9A3FI8zurgGC*^-SQpLwFBy{;CNa&5!A)dFoJ2>`ZV-ha5H0+;t#pBXM-TF?*o5V2> z2<#V+nB@nZ5w+eo{*<{B@nfKkN-M0js@H2ZFHEjas$6BTD8wKB%x*_*+K>QF@v~iC`wKq_T&XPu_ORYnSIn%{>Sn7)n*)`22zS%7Dl=;!k zSQFa${y|nWxprt%Y^VNlU>?Gs!^-%Cds>| zvu#SCUb-_3Qwy-yQK~v|SVUL6$3{J0<{{KtGJr{b1wd`#8ix5<5`|ef&twpwDE4h- z$&qZXa78+biO$nPyL{(z97oHOFzG;BgnVhj1_{%jF2aO(EBInU7HQl$ty+Sf^118b zM+|4pqe9uVWDzcAoio3k=n4@uMK5Lw%tMC;IHdMu84h%JsoR|*I0u12Ju2Kp{^r*U zhyqOB<1~Yc6q#wvH{u?0x_JonU(+z7Uh~a|z%47%5Jd_X2Aqw<@R4m+Va4>3E{eW@ zBf}Tl!L}{MR2{^>qZFa78ih?URgUTs%|7S|aVbqg>mnbQ@ZEWmo!~YT)oqROE3YX8 z1C`PvnnxRn!8SG!ivmZ_9%g`}tZS7*&1>V4IA|)uT5IqOL1s%o`vsq>qV|BEfbgCg(KAhGBm1URZ>M zB2g5_PlqUF6)(#wJjU`5jO8g1LGu}p*8ptMAWARARmN@*KiKx-JwX5@RzuO5;AN34 zEyVxSYJ*d(Nl`3Rdv{#Z6mO}4`7`nVqS1gE$aGxOG!%wVVroI`9*P^Xj~{rX^xLrd zCv6QdYT*$Y%!BZi20jeJlQ_CW`D3pBI1wB)XI*ur4T;s&vk< zW6bLpWH42idWqY2q+|Tz_UETM;@5_iBD-SXS!Bwnwg?iG?UDCUs0!{u*)md313R72 zgt>gktgniZp8jI5v)6#*jpbz|!DPg(Ku!&qp4x^_rF1VjtY~0g;34D(XsI& zel?CVt@(3vzBtA((`c@ZP_AMjt?rGb*+hj$WPSe8@h)c#GraB^QB6}4TeH653DHI5aDj3_P-T?SDld;3+QjOAi&rGmSLmB+N1H_$jZS)H-&e?x7YN zEhBOU^-0gc3BTqBCzyoXjav*nK*ZoL*~^6B<+}o9 z>f&GfJ9i1NaIP5-qID`z17h_7F&*f7KggXOZxLAs>}SDMbg%wQH*fWHSGF~F0#8O( z0B<*Av}EzS5c{jLzUXg+i|pSD-DbZtKt*VeJ9+(NschpmiUC4aC8{;O_m6y=3__`$UAVKeQHpIeDF7EwQY%)~3!G3Rb7CxRdB6m}E%5*89 zu41ywUHl2*bsT@i;&~GaRDd=OO4g%K+R}GXXy{R%jPfQZVGNISW|-v6Q)v18>e-rd zB2F!PvvG~|X5D8ssQkQh6IVkU!uQ!%G=*J1MWVZ!Se%B>hBrBIS8T8?VG7s4H{Rhz z=MO6kme*}B9>nKaa~lGb(w3R;$<7~A&S=bfc2J6Fa$?R@wzYn}$bH*9X)X60?HA#5 z&6fQac(_mTzTDGRD^ictF1@jdOE1MbW&vm*W6Z0Tnu{d5xvYQePN$@MX6*XeFl^A& zCFj9OKPNJhhjn~;?nQ50Lmv=r!0jvJ&~Hb3H|dk+NA~V%-5K%3Lg?2XQr%y^-@~Ck z`eOutj|jdm(+2}t`d#3Ak%fS4{ha90AfvsEgZo=^lVNi%<&sZQrAc}PT!h29@)a4c zMdru-4C?Db2Pnm?N?E+p%Mm&Aa%!>ivz{;0Jzo3B;UC`*uQv>yfJrT~%<->o;VvL0 z9;@9^*QvQIkeg-tVM!+98RrPtbbbKJyv_T!!iK|MX?SOy1Ey43FQPvr;<5D)`%>;h zLbj;nAMS``bgT^~p6^>nvIL*B`l@+U1eWLVxD5kl?C$lMKbaVJ z!cxCV6fa;~Q!yGQWu1$?b-0(-rFYL9Z&dy6FkBL@H=@s^X=I(2q;}zy71radAS_J< z6}WI_B8hK>IzxwRwm-<7VinV7b%p2KE&!}4pVl}v$%G7&mV`Su7z~lK*@+IK+^lTW zB~}P@&-I}Y+SrLFKFtooCKw=RIAfa(M54B(+J?n(zTA4Q)9XDzdJ%tE%-Nd9cLeA;sHZ~)x-mBSiT zz*lmJPtf3c(-q@5FdSGnzJ(+GM3%~#b-{#v%_ktCEiSQ-6JPDI9sLyy?E#=ezjkXyOZ(0iKr$;xTRmt zo?q1{aMhI$1PGXBYaMEZuISDeD^ZeAJK5=yRFZK2RMn`NgwIPwiF;a0^(Lul>U8SPo5e>f-?Es&R zaywVE84UQ@yP;Apjw&aSkdUaGIOYq#?v%Y~KUGF@PD#)#^HkAuHwH7ggA6A@ir11V z=M(vO#g9z?fsYCy{qH^;C+{5_C0dxMrQSM!;VW4xc?{zp5JptD3+(72Y@yMo&ShHH z2wL(*%&(AHh#<;+zy&A4`}7TG+J?ZcZt%KuF&287s~8b7_HPGEI7VaT!*5N>)g{nS zhq4c?jJo&9YrKeuOQ>r}ZU}%?HQ4x4}zrCuXXG)_CwEKdp zXS~eOZ2$bXzk%2v#!s3E`&zd^#P{#pak8X5`3H3|Lr^K}cLw(AC0 zE0C~n{4IQ|eoA9Z{|z3)O&0VdB1C1Od^GrIsPpDpo!iZLWcXW4YZf#oR96*JNPJZg zJge*`fMXN{`i}%({yTz0pcs_x9qwOv|3*+FbH`pA+lZKH)tdvG`ayfEb;B*_u>NhP ztuFZ+Jp?2Ub?VGm2j=B$?ojaVR8eWs;GU9?A;8K(g}r7y^))V^PrMHY~pVlFv9QDcC|a){fzh$#k-c? z9xwTv@vj2a|6lv1oh>)h^$q1;`sF@6CXfLkIU)r2%{D9yEz~w#WMMo;5qtX}1QPxl z$@twb){BfQpHgzwIvvd(L6Z#udEE*R?)k;>Cf34j_~uEE{RVT* zGJ_B)X+6iB+qIUv&A)uYzb zoEi0$$`YBvn)RT4y}K=fpy%Hu|58UTLYXLa1mne5SYP#ER<+L@w+MQ^1jzWhpWG=l z%SX>1OaB+9ejWrK!(a-ecw)WWirKs@Z}Z0n(_jpGcR!*{rx(8VKBrfKPRn=`R-TU7 zRDHo!_;moXSg}TxY5nT_`Hh;_b}w0zZi@tBG5Z?Cq%)E_O!k?eYPi7>R1e5g$P+VV_w<5v#!PSqxb4)7&IN@N_{byy(^ zXG)*Y1jN3Y0SA69dUw5LneBU$Oht;2Mp{XWZ{Xn1hx8U>zA#TD(U;y!TneXu*wO#II*mJ5~MK;EJRGCojY!mkwY!}vMV?N+CM`v z#_DEW8bk$`>dOYtxurIu05D~MD&!slQmO>G7wKsD2^Jp0j$NCJ=QKyr5|v(^k@mCu zg7bM~E_2$OH^kH@vL(U4v7#m<0*adk5n=&cUvfXLy8XJr_LeKq{c6$GxPP8=Fq$Cf zTXAwIQH{f^R2 z?vO$PBi#tQe3X`}zEw)h~~DR>|pK9ITc)`dr@jkIyXJtWt+AE)j06`!u1 zbf!pLNBm!OH6*C6wh`QO55HW$jm=;k3Y{rWf9^C47(;N|qft0pTAk9&La^LpgXR5; zdq(LBb<*{Ur}+g(eHJZ zKz=`t+B!T-M(PE(;awqF#C8z7mU@E-EVlh`LRoimUQW0BHvciLG@3&;zR68Wl}4tb z^LY-zSxbhG!G*zEcOjrw$Gpb*m&Pczq9QPt8@Zv

|=SfbtNQ;QvPW}BZ@ywqc;=F1uO1d(IYW%mz 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 PQ)A&wfLf{=}EKqIIEGGm7A4I{V# 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⪙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 literal 0 HcmV?d00001 From e4712a822b26d7a3fa643300f3610412404c0ea8 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 25 Feb 2025 21:54:38 -0700 Subject: [PATCH 004/127] perf(drizzle): use faster, direct db query for getting id to update in updateOne (#11391) Previously, `updateOne` was using `buildFindManyArgs` and `findFirst` just to retrieve the ID of the document to update, which is a huge function that's not necessary to run just to get the document ID. This PR refactors it to use a simple `db.select` query to retrieve the ID --- packages/drizzle/src/index.ts | 2 +- .../drizzle/src/{update.ts => updateOne.ts} | 25 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) rename packages/drizzle/src/{update.ts => updateOne.ts} (80%) diff --git a/packages/drizzle/src/index.ts b/packages/drizzle/src/index.ts index f7036cfc0d..fd00c95d8e 100644 --- a/packages/drizzle/src/index.ts +++ b/packages/drizzle/src/index.ts @@ -31,9 +31,9 @@ export { buildRawSchema } from './schema/buildRawSchema.js' export { beginTransaction } from './transactions/beginTransaction.js' export { commitTransaction } from './transactions/commitTransaction.js' export { rollbackTransaction } from './transactions/rollbackTransaction.js' -export { updateOne } from './update.js' export { updateGlobal } from './updateGlobal.js' export { updateGlobalVersion } from './updateGlobalVersion.js' +export { updateOne } from './updateOne.js' export { updateVersion } from './updateVersion.js' export { upsertRow } from './upsertRow/index.js' export { buildCreateMigration } from './utilities/buildCreateMigration.js' diff --git a/packages/drizzle/src/update.ts b/packages/drizzle/src/updateOne.ts similarity index 80% rename from packages/drizzle/src/update.ts rename to packages/drizzle/src/updateOne.ts index 935133fd71..3e682f4c5d 100644 --- a/packages/drizzle/src/update.ts +++ b/packages/drizzle/src/updateOne.ts @@ -1,10 +1,10 @@ +import type { LibSQLDatabase } from 'drizzle-orm/libsql' import type { UpdateOne } from 'payload' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from './types.js' -import { buildFindManyArgs } from './find/buildFindManyArgs.js' import buildQuery from './queries/buildQuery.js' import { selectDistinct } from './queries/selectDistinct.js' import { upsertRow } from './upsertRow/index.js' @@ -28,6 +28,7 @@ export const updateOne: UpdateOne = async function updateOne( where: whereToUse, }) + // selectDistinct will only return if there are joins const selectDistinctResult = await selectDistinct({ adapter: this, chainedMethods: [{ args: [1], method: 'limit' }], @@ -40,22 +41,18 @@ export const updateOne: UpdateOne = async function updateOne( if (selectDistinctResult?.[0]?.id) { idToUpdate = selectDistinctResult?.[0]?.id - // If id wasn't passed but `where` without any joins, retrieve it with findFirst } else if (whereArg && !joins.length) { - const findManyArgs = buildFindManyArgs({ - adapter: this, - depth: 0, - fields: collection.flattenedFields, - joinQuery: false, - select: {}, - tableName, - }) + const table = this.tables[tableName] - findManyArgs.where = where - - const docToUpdate = await db.query[tableName].findFirst(findManyArgs) - idToUpdate = docToUpdate?.id + const docsToUpdate = await (db as LibSQLDatabase) + .select({ + id: table.id, + }) + .from(table) + .where(where) + .limit(1) + idToUpdate = docsToUpdate?.[0]?.id } const result = await upsertRow({ From 526e5357639d7a018f04dfa74ffe6a5167b7d2eb Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 26 Feb 2025 17:05:50 +0200 Subject: [PATCH 005/127] fix: ensure custom IDs are returned to the result when `select` query exists (#11400) Previously, behavior with custom IDs and `select` query was incorrect. By default, the `id` field is guaranteed to be selected, even if it doesn't exist in the `select` query, this wasn't true for custom IDs. --- .../src/fields/hooks/afterRead/promise.ts | 2 +- test/select/collections/CustomID/index.ts | 15 +++++ test/select/config.ts | 2 + test/select/int.spec.ts | 59 +++++++++++++++++++ test/select/payload-types.ts | 26 ++++++++ 5 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 test/select/collections/CustomID/index.ts diff --git a/packages/payload/src/fields/hooks/afterRead/promise.ts b/packages/payload/src/fields/hooks/afterRead/promise.ts index bbc2787ee0..11abfa4398 100644 --- a/packages/payload/src/fields/hooks/afterRead/promise.ts +++ b/packages/payload/src/fields/hooks/afterRead/promise.ts @@ -123,7 +123,7 @@ export const promise = async ({ } // Strip unselected fields - if (fieldAffectsData(field) && select && selectMode) { + if (fieldAffectsData(field) && select && selectMode && path !== 'id') { if (selectMode === 'include') { if (!select[field.name]) { delete siblingDoc[field.name] diff --git a/test/select/collections/CustomID/index.ts b/test/select/collections/CustomID/index.ts new file mode 100644 index 0000000000..07e08b5221 --- /dev/null +++ b/test/select/collections/CustomID/index.ts @@ -0,0 +1,15 @@ +import type { CollectionConfig } from 'payload' + +export const CustomID: CollectionConfig = { + slug: 'custom-ids', + fields: [ + { + name: 'id', + type: 'number', + }, + { + name: 'text', + type: 'text', + }, + ], +} diff --git a/test/select/config.ts b/test/select/config.ts index 19a6a38f42..f85c16f792 100644 --- a/test/select/config.ts +++ b/test/select/config.ts @@ -4,6 +4,7 @@ import path from 'path' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' +import { CustomID } from './collections/CustomID/index.js' import { DeepPostsCollection } from './collections/DeepPosts/index.js' import { LocalizedPostsCollection } from './collections/LocalizedPosts/index.js' import { Pages } from './collections/Pages/index.js' @@ -34,6 +35,7 @@ export default buildConfigWithDefaults({ slug: 'rels', fields: [], }, + CustomID, ], globals: [ { diff --git a/test/select/int.spec.ts b/test/select/int.spec.ts index dd8cf4f2c1..d58239672b 100644 --- a/test/select/int.spec.ts +++ b/test/select/int.spec.ts @@ -1,3 +1,4 @@ +import { randomUUID } from 'crypto' import path from 'path' import { deepCopyObject, type Payload } from 'payload' import { assert } from 'ts-essentials' @@ -75,6 +76,21 @@ describe('Select', () => { }) }) + it('customID - should select only id as default', async () => { + const { id } = await createCustomID() + + const res = await payload.findByID({ + collection: 'custom-ids', + id, + select: {}, + depth: 0, + }) + + expect(res).toStrictEqual({ + id, + }) + }) + it('should select only number', async () => { const res = await payload.findByID({ collection: 'posts', @@ -91,6 +107,24 @@ describe('Select', () => { }) }) + it('customID - should select only text', async () => { + const { id, text } = await createCustomID() + + const res = await payload.findByID({ + collection: 'custom-ids', + id, + select: { + text: true, + }, + depth: 0, + }) + + expect(res).toStrictEqual({ + id, + text, + }) + }) + it('should select only select', async () => { const res = await payload.findByID({ collection: 'posts', @@ -446,6 +480,25 @@ describe('Select', () => { expect(res).toStrictEqual(expected) }) + it('customID - should exclude text', async () => { + const { id, createdAt, updatedAt } = await createCustomID() + + const res = await payload.findByID({ + collection: 'custom-ids', + id, + select: { + text: false, + }, + depth: 0, + }) + + expect(res).toStrictEqual({ + id, + createdAt, + updatedAt, + }) + }) + it('should exclude number', async () => { const res = await payload.findByID({ collection: 'posts', @@ -2428,3 +2481,9 @@ function createVersionedPost() { function createPoint() { return payload.create({ collection: 'points', data: { text: 'some', point: [10, 20] } }) } + +let id = 1 + +function createCustomID() { + return payload.create({ collection: 'custom-ids', data: { id: id++, text: randomUUID() } }) +} diff --git a/test/select/payload-types.ts b/test/select/payload-types.ts index 7e028f1ee8..adc1d169b3 100644 --- a/test/select/payload-types.ts +++ b/test/select/payload-types.ts @@ -74,6 +74,7 @@ export interface Config { points: Point; upload: Upload; rels: Rel; + 'custom-ids': CustomId; users: User; 'payload-locked-documents': PayloadLockedDocument; 'payload-preferences': PayloadPreference; @@ -89,6 +90,7 @@ export interface Config { points: PointsSelect | PointsSelect; upload: UploadSelect | UploadSelect; rels: RelsSelect | RelsSelect; + 'custom-ids': CustomIdsSelect | CustomIdsSelect; users: UsersSelect | UsersSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; @@ -443,6 +445,16 @@ export interface Point { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "custom-ids". + */ +export interface CustomId { + id: number; + text?: string | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users". @@ -499,6 +511,10 @@ export interface PayloadLockedDocument { relationTo: 'rels'; value: string | Rel; } | null) + | ({ + relationTo: 'custom-ids'; + value: number | CustomId; + } | null) | ({ relationTo: 'users'; value: string | User; @@ -844,6 +860,16 @@ export interface RelsSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "custom-ids_select". + */ +export interface CustomIdsSelect { + id?: T; + text?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users_select". From c6ab312286f3a97f2581243458082abd8fad3d25 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 26 Feb 2025 12:43:31 -0700 Subject: [PATCH 006/127] chore: cleanup queues test suite (#11410) This PR extracts each workflow of our queues test suite into its own file --- test/queues/config.ts | 704 +----------------- test/queues/workflows/externalWorkflow.ts | 19 + test/queues/workflows/inlineTaskTest.ts | 33 + test/queues/workflows/noRetriesSet.ts | 42 ++ test/queues/workflows/retries0.ts | 43 ++ test/queues/workflows/retriesBackoffTest.ts | 81 ++ test/queues/workflows/retriesRollbackTest.ts | 61 ++ test/queues/workflows/retriesTest.ts | 42 ++ .../workflows/retriesWorkflowLevelTest.ts | 43 ++ test/queues/workflows/subTask.ts | 60 ++ test/queues/workflows/subTaskFails.ts | 80 ++ test/queues/workflows/updatePost.ts | 37 + test/queues/workflows/updatePostJSON.ts | 41 + .../workflowAndTasksRetriesUndefined.ts | 43 ++ .../workflowRetries2TasksRetries0.ts | 44 ++ .../workflowRetries2TasksRetriesUndefined.ts | 44 ++ 16 files changed, 744 insertions(+), 673 deletions(-) create mode 100644 test/queues/workflows/externalWorkflow.ts create mode 100644 test/queues/workflows/inlineTaskTest.ts create mode 100644 test/queues/workflows/noRetriesSet.ts create mode 100644 test/queues/workflows/retries0.ts create mode 100644 test/queues/workflows/retriesBackoffTest.ts create mode 100644 test/queues/workflows/retriesRollbackTest.ts create mode 100644 test/queues/workflows/retriesTest.ts create mode 100644 test/queues/workflows/retriesWorkflowLevelTest.ts create mode 100644 test/queues/workflows/subTask.ts create mode 100644 test/queues/workflows/subTaskFails.ts create mode 100644 test/queues/workflows/updatePost.ts create mode 100644 test/queues/workflows/updatePostJSON.ts create mode 100644 test/queues/workflows/workflowAndTasksRetriesUndefined.ts create mode 100644 test/queues/workflows/workflowRetries2TasksRetries0.ts create mode 100644 test/queues/workflows/workflowRetries2TasksRetriesUndefined.ts diff --git a/test/queues/config.ts b/test/queues/config.ts index 988d86ea6b..67e1c91265 100644 --- a/test/queues/config.ts +++ b/test/queues/config.ts @@ -1,4 +1,4 @@ -import type { TaskConfig, WorkflowConfig } from 'payload' +import type { TaskConfig } from 'payload' import { lexicalEditor } from '@payloadcms/richtext-lexical' import { fileURLToPath } from 'node:url' @@ -8,6 +8,21 @@ import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' import { updatePostStep1, updatePostStep2 } from './runners/updatePost.js' import { clearAndSeedEverything } from './seed.js' +import { externalWorkflow } from './workflows/externalWorkflow.js' +import { inlineTaskTestWorkflow } from './workflows/inlineTaskTest.js' +import { noRetriesSetWorkflow } from './workflows/noRetriesSet.js' +import { retries0Workflow } from './workflows/retries0.js' +import { retriesBackoffTestWorkflow } from './workflows/retriesBackoffTest.js' +import { retriesRollbackTestWorkflow } from './workflows/retriesRollbackTest.js' +import { retriesTestWorkflow } from './workflows/retriesTest.js' +import { retriesWorkflowLevelTestWorkflow } from './workflows/retriesWorkflowLevelTest.js' +import { subTaskWorkflow } from './workflows/subTask.js' +import { subTaskFailsWorkflow } from './workflows/subTaskFails.js' +import { updatePostWorkflow } from './workflows/updatePost.js' +import { updatePostJSONWorkflow } from './workflows/updatePostJSON.js' +import { workflowAndTasksRetriesUndefinedWorkflow } from './workflows/workflowAndTasksRetriesUndefined.js' +import { workflowRetries2TasksRetries0Workflow } from './workflows/workflowRetries2TasksRetries0.js' +import { workflowRetries2TasksRetriesUndefinedWorkflow } from './workflows/workflowRetries2TasksRetriesUndefined.js' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -310,678 +325,21 @@ export default buildConfigWithDefaults({ } as TaskConfig<'ExternalTask'>, ], workflows: [ - { - slug: 'updatePost', - interfaceName: 'MyUpdatePostWorkflowType', - inputSchema: [ - { - name: 'post', - type: 'relationship', - relationTo: 'posts', - maxDepth: 0, - required: true, - }, - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks }) => { - await tasks.UpdatePost('1', { - input: { - post: job.input.post, - message: job.input.message, - }, - }) - - await tasks.UpdatePostStep2('2', { - input: { - post: job.taskStatus.UpdatePost['1'].input.post, - messageTwice: job.taskStatus.UpdatePost['1'].output.messageTwice, - }, - }) - }, - } as WorkflowConfig<'updatePost'>, - { - slug: 'updatePostJSONWorkflow', - inputSchema: [ - { - name: 'post', - type: 'relationship', - relationTo: 'posts', - maxDepth: 0, - required: true, - }, - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: [ - { - task: 'UpdatePost', - id: '1', - input: ({ job }) => ({ - post: job.input.post, - message: job.input.message, - }), - }, - { - task: 'UpdatePostStep2', - id: '2', - input: ({ job }) => ({ - post: job.taskStatus.UpdatePost['1'].input.post, - messageTwice: job.taskStatus.UpdatePost['1'].output.messageTwice, - }), - condition({ job }) { - return job?.taskStatus?.UpdatePost?.['1']?.complete - }, - completesJob: true, - }, - ], - } as WorkflowConfig<'updatePostJSONWorkflow'>, - { - slug: 'retriesTest', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimple('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimple('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'retriesTest'>, - { - slug: 'retriesRollbackTest', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, inlineTask, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await inlineTask('1', { - task: async ({ req }) => { - const newSimple = await req.payload.create({ - collection: 'simple', - req, - data: { - title: job.input.message, - }, - }) - return { - output: { - simpleID: newSimple.id, - }, - } - }, - }) - - await inlineTask('2', { - task: async ({ req }) => { - await req.payload.create({ - collection: 'simple', - req, - data: { - title: 'should not exist', - }, - }) - // Fail afterwards, so that we can also test that transactions work (i.e. the job is rolled back) - - throw new Error('Failed on purpose') - }, - retries: { - attempts: 4, - }, - }) - }, - } as WorkflowConfig<'retriesRollbackTest'>, - { - slug: 'retriesWorkflowLevelTest', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - retries: 2, // Even though CreateSimple has 3 retries, this workflow only has 2. Thus, it will only retry once - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimple('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimple('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'retriesWorkflowLevelTest'>, - { - slug: 'workflowNoRetriesSet', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimple('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimple('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'workflowNoRetriesSet'>, - { - slug: 'workflowRetries0', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - retries: 0, - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimple('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimple('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'workflowRetries0'>, - { - slug: 'workflowAndTasksRetriesUndefined', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimpleRetriesUndefined('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimpleRetriesUndefined('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'workflowAndTasksRetriesUndefined'>, - { - slug: 'workflowRetries2TasksRetriesUndefined', - retries: 2, - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimpleRetriesUndefined('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimpleRetriesUndefined('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'workflowRetries2TasksRetriesUndefined'>, - { - slug: 'workflowRetries2TasksRetries0', - retries: 2, - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, tasks, req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - - await tasks.CreateSimpleRetries0('1', { - input: { - message: job.input.message, - }, - }) - - // At this point there should always be one post created. - // job.input.amountRetried will go up to 2 as CreatePost has 2 retries - await tasks.CreateSimpleRetries0('2', { - input: { - message: job.input.message, - shouldFail: true, - }, - }) - // This will never be reached - }, - } as WorkflowConfig<'workflowRetries2TasksRetries0'>, - { - slug: 'inlineTaskTest', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, inlineTask }) => { - await inlineTask('1', { - task: async ({ input, req }) => { - const newSimple = await req.payload.create({ - collection: 'simple', - req, - data: { - title: input.message, - }, - }) - return { - output: { - simpleID: newSimple.id, - }, - } - }, - input: { - message: job.input.message, - }, - }) - }, - } as WorkflowConfig<'inlineTaskTest'>, - { - slug: 'externalWorkflow', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: path.resolve(dirname, 'runners/externalWorkflow.ts') + '#externalWorkflowHandler', - } as WorkflowConfig<'externalWorkflow'>, - { - slug: 'retriesBackoffTest', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, inlineTask, req }) => { - const newJob = await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountRetried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, - }, - }, - id: job.id, - }) - job.input = newJob.input as any - - await inlineTask('1', { - task: async ({ req }) => { - const totalTried = job?.taskStatus?.inline?.['1']?.totalTried || 0 - - const { id } = await req.payload.create({ - collection: 'simple', - req, - data: { - title: 'should not exist', - }, - }) - - // @ts-expect-error timeTried is new arbitrary data and not in the type - if (!job.input.timeTried) { - // @ts-expect-error timeTried is new arbitrary data and not in the type - job.input.timeTried = {} - } - - // @ts-expect-error timeTried is new arbitrary data and not in the type - job.input.timeTried[totalTried] = new Date().toISOString() - - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: job.input, - }, - id: job.id, - }) - - if (totalTried < 4) { - // Cleanup the post - await req.payload.delete({ - collection: 'simple', - id, - req, - }) - - // Last try it should succeed - throw new Error('Failed on purpose') - } - return { - output: {}, - } - }, - retries: { - attempts: 4, - backoff: { - type: 'exponential', - // Should retry in 300ms, then 600, then 1200, then 2400, then succeed - delay: 300, - }, - }, - }) - }, - } as WorkflowConfig<'retriesBackoffTest'>, - { - slug: 'subTask', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - handler: async ({ job, inlineTask }) => { - await inlineTask('create two docs', { - task: async ({ input, inlineTask }) => { - const { newSimple } = await inlineTask('create doc 1', { - task: async ({ req }) => { - const newSimple = await req.payload.create({ - collection: 'simple', - req, - data: { - title: input.message, - }, - }) - return { - output: { - newSimple, - }, - } - }, - }) - - const { newSimple2 } = await inlineTask('create doc 2', { - task: async ({ req }) => { - const newSimple2 = await req.payload.create({ - collection: 'simple', - req, - data: { - title: input.message, - }, - }) - return { - output: { - newSimple2, - }, - } - }, - }) - return { - output: { - simpleID1: newSimple.id, - simpleID2: newSimple2.id, - }, - } - }, - input: { - message: job.input.message, - }, - }) - }, - } as WorkflowConfig<'subTask'>, - { - slug: 'subTaskFails', - inputSchema: [ - { - name: 'message', - type: 'text', - required: true, - }, - ], - retries: 3, - handler: async ({ job, inlineTask }) => { - await inlineTask('create two docs', { - task: async ({ input, inlineTask }) => { - const { newSimple } = await inlineTask('create doc 1 - succeeds', { - task: async ({ req }) => { - const newSimple = await req.payload.create({ - collection: 'simple', - req, - data: { - title: input.message, - }, - }) - - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountTask1Retried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountTask1Retried !== undefined - ? // @ts-expect-error - job.input.amountTask1Retried + 1 - : 0, - }, - }, - id: job.id, - }) - return { - output: { - newSimple, - }, - } - }, - }) - - await inlineTask('create doc 2 - fails', { - task: async ({ req }) => { - await req.payload.update({ - collection: 'payload-jobs', - data: { - input: { - ...job.input, - amountTask2Retried: - // @ts-expect-error amountRetried is new arbitrary data and not in the type - job.input.amountTask2Retried !== undefined - ? // @ts-expect-error - job.input.amountTask2Retried + 1 - : 0, - }, - }, - id: job.id, - }) - throw new Error('Failed on purpose') - }, - }) - return { - output: { - simpleID1: newSimple.id, - }, - } - }, - input: { - message: job.input.message, - }, - }) - }, - } as WorkflowConfig<'subTaskFails'>, + updatePostWorkflow, + updatePostJSONWorkflow, + retriesTestWorkflow, + retriesRollbackTestWorkflow, + retriesWorkflowLevelTestWorkflow, + noRetriesSetWorkflow, + retries0Workflow, + workflowAndTasksRetriesUndefinedWorkflow, + workflowRetries2TasksRetriesUndefinedWorkflow, + workflowRetries2TasksRetries0Workflow, + inlineTaskTestWorkflow, + externalWorkflow, + retriesBackoffTestWorkflow, + subTaskWorkflow, + subTaskFailsWorkflow, ], }, editor: lexicalEditor(), diff --git a/test/queues/workflows/externalWorkflow.ts b/test/queues/workflows/externalWorkflow.ts new file mode 100644 index 0000000000..15106784d6 --- /dev/null +++ b/test/queues/workflows/externalWorkflow.ts @@ -0,0 +1,19 @@ +import type { WorkflowConfig } from 'payload' + +import path from 'path' +import { fileURLToPath } from 'url' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +export const externalWorkflow: WorkflowConfig<'externalWorkflow'> = { + slug: 'externalWorkflow', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: path.resolve(dirname, '../runners/externalWorkflow.ts') + '#externalWorkflowHandler', +} diff --git a/test/queues/workflows/inlineTaskTest.ts b/test/queues/workflows/inlineTaskTest.ts new file mode 100644 index 0000000000..a0f20afc95 --- /dev/null +++ b/test/queues/workflows/inlineTaskTest.ts @@ -0,0 +1,33 @@ +import type { WorkflowConfig } from 'payload' + +export const inlineTaskTestWorkflow: WorkflowConfig<'inlineTaskTest'> = { + slug: 'inlineTaskTest', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, inlineTask }) => { + await inlineTask('1', { + task: async ({ input, req }) => { + const newSimple = await req.payload.create({ + collection: 'simple', + req, + data: { + title: input.message, + }, + }) + return { + output: { + simpleID: newSimple.id, + }, + } + }, + input: { + message: job.input.message, + }, + }) + }, +} diff --git a/test/queues/workflows/noRetriesSet.ts b/test/queues/workflows/noRetriesSet.ts new file mode 100644 index 0000000000..b549cd0df8 --- /dev/null +++ b/test/queues/workflows/noRetriesSet.ts @@ -0,0 +1,42 @@ +import type { WorkflowConfig } from 'payload' + +export const noRetriesSetWorkflow: WorkflowConfig<'workflowNoRetriesSet'> = { + slug: 'workflowNoRetriesSet', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimple('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimple('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, +} diff --git a/test/queues/workflows/retries0.ts b/test/queues/workflows/retries0.ts new file mode 100644 index 0000000000..1eb7b06d2d --- /dev/null +++ b/test/queues/workflows/retries0.ts @@ -0,0 +1,43 @@ +import type { WorkflowConfig } from 'payload' + +export const retries0Workflow: WorkflowConfig<'workflowRetries0'> = { + slug: 'workflowRetries0', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + retries: 0, + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimple('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimple('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, +} diff --git a/test/queues/workflows/retriesBackoffTest.ts b/test/queues/workflows/retriesBackoffTest.ts new file mode 100644 index 0000000000..27e6b20b70 --- /dev/null +++ b/test/queues/workflows/retriesBackoffTest.ts @@ -0,0 +1,81 @@ +import type { WorkflowConfig } from 'payload' + +export const retriesBackoffTestWorkflow: WorkflowConfig<'retriesBackoffTest'> = { + slug: 'retriesBackoffTest', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, inlineTask, req }) => { + const newJob = await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + job.input = newJob.input as any + + await inlineTask('1', { + task: async ({ req }) => { + const totalTried = job?.taskStatus?.inline?.['1']?.totalTried || 0 + + const { id } = await req.payload.create({ + collection: 'simple', + req, + data: { + title: 'should not exist', + }, + }) + + // @ts-expect-error timeTried is new arbitrary data and not in the type + if (!job.input.timeTried) { + // @ts-expect-error timeTried is new arbitrary data and not in the type + job.input.timeTried = {} + } + + // @ts-expect-error timeTried is new arbitrary data and not in the type + job.input.timeTried[totalTried] = new Date().toISOString() + + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: job.input, + }, + id: job.id, + }) + + if (totalTried < 4) { + // Cleanup the post + await req.payload.delete({ + collection: 'simple', + id, + req, + }) + + // Last try it should succeed + throw new Error('Failed on purpose') + } + return { + output: {}, + } + }, + retries: { + attempts: 4, + backoff: { + type: 'exponential', + // Should retry in 300ms, then 600, then 1200, then 2400, then succeed + delay: 300, + }, + }, + }) + }, +} diff --git a/test/queues/workflows/retriesRollbackTest.ts b/test/queues/workflows/retriesRollbackTest.ts new file mode 100644 index 0000000000..eae88c7e56 --- /dev/null +++ b/test/queues/workflows/retriesRollbackTest.ts @@ -0,0 +1,61 @@ +import type { WorkflowConfig } from 'payload' + +export const retriesRollbackTestWorkflow: WorkflowConfig<'retriesRollbackTest'> = { + slug: 'retriesRollbackTest', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, inlineTask, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await inlineTask('1', { + task: async ({ req }) => { + const newSimple = await req.payload.create({ + collection: 'simple', + req, + data: { + title: job.input.message, + }, + }) + return { + output: { + simpleID: newSimple.id, + }, + } + }, + }) + + await inlineTask('2', { + task: async ({ req }) => { + await req.payload.create({ + collection: 'simple', + req, + data: { + title: 'should not exist', + }, + }) + // Fail afterwards, so that we can also test that transactions work (i.e. the job is rolled back) + + throw new Error('Failed on purpose') + }, + retries: { + attempts: 4, + }, + }) + }, +} diff --git a/test/queues/workflows/retriesTest.ts b/test/queues/workflows/retriesTest.ts new file mode 100644 index 0000000000..f462caf501 --- /dev/null +++ b/test/queues/workflows/retriesTest.ts @@ -0,0 +1,42 @@ +import type { WorkflowConfig } from 'payload' + +export const retriesTestWorkflow: WorkflowConfig<'retriesTest'> = { + slug: 'retriesTest', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimple('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimple('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, +} diff --git a/test/queues/workflows/retriesWorkflowLevelTest.ts b/test/queues/workflows/retriesWorkflowLevelTest.ts new file mode 100644 index 0000000000..d34ded952b --- /dev/null +++ b/test/queues/workflows/retriesWorkflowLevelTest.ts @@ -0,0 +1,43 @@ +import type { WorkflowConfig } from 'payload' + +export const retriesWorkflowLevelTestWorkflow: WorkflowConfig<'retriesWorkflowLevelTest'> = { + slug: 'retriesWorkflowLevelTest', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + retries: 2, // Even though CreateSimple has 3 retries, this workflow only has 2. Thus, it will only retry once + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimple('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimple('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, +} diff --git a/test/queues/workflows/subTask.ts b/test/queues/workflows/subTask.ts new file mode 100644 index 0000000000..399f6db531 --- /dev/null +++ b/test/queues/workflows/subTask.ts @@ -0,0 +1,60 @@ +import type { WorkflowConfig } from 'payload' + +export const subTaskWorkflow: WorkflowConfig<'subTask'> = { + slug: 'subTask', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, inlineTask }) => { + await inlineTask('create two docs', { + task: async ({ input, inlineTask }) => { + const { newSimple } = await inlineTask('create doc 1', { + task: async ({ req }) => { + const newSimple = await req.payload.create({ + collection: 'simple', + req, + data: { + title: input.message, + }, + }) + return { + output: { + newSimple, + }, + } + }, + }) + + const { newSimple2 } = await inlineTask('create doc 2', { + task: async ({ req }) => { + const newSimple2 = await req.payload.create({ + collection: 'simple', + req, + data: { + title: input.message, + }, + }) + return { + output: { + newSimple2, + }, + } + }, + }) + return { + output: { + simpleID1: newSimple.id, + simpleID2: newSimple2.id, + }, + } + }, + input: { + message: job.input.message, + }, + }) + }, +} diff --git a/test/queues/workflows/subTaskFails.ts b/test/queues/workflows/subTaskFails.ts new file mode 100644 index 0000000000..1c1f142415 --- /dev/null +++ b/test/queues/workflows/subTaskFails.ts @@ -0,0 +1,80 @@ +import type { WorkflowConfig } from 'payload' + +export const subTaskFailsWorkflow: WorkflowConfig<'subTaskFails'> = { + slug: 'subTaskFails', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + retries: 3, + handler: async ({ job, inlineTask }) => { + await inlineTask('create two docs', { + task: async ({ input, inlineTask }) => { + const { newSimple } = await inlineTask('create doc 1 - succeeds', { + task: async ({ req }) => { + const newSimple = await req.payload.create({ + collection: 'simple', + req, + data: { + title: input.message, + }, + }) + + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountTask1Retried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountTask1Retried !== undefined + ? // @ts-expect-error + job.input.amountTask1Retried + 1 + : 0, + }, + }, + id: job.id, + }) + return { + output: { + newSimple, + }, + } + }, + }) + + await inlineTask('create doc 2 - fails', { + task: async ({ req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountTask2Retried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountTask2Retried !== undefined + ? // @ts-expect-error + job.input.amountTask2Retried + 1 + : 0, + }, + }, + id: job.id, + }) + throw new Error('Failed on purpose') + }, + }) + return { + output: { + simpleID1: newSimple.id, + }, + } + }, + input: { + message: job.input.message, + }, + }) + }, +} diff --git a/test/queues/workflows/updatePost.ts b/test/queues/workflows/updatePost.ts new file mode 100644 index 0000000000..abf6df1404 --- /dev/null +++ b/test/queues/workflows/updatePost.ts @@ -0,0 +1,37 @@ +import type { WorkflowConfig } from 'payload' + +export const updatePostWorkflow: WorkflowConfig<'updatePost'> = { + slug: 'updatePost', + interfaceName: 'MyUpdatePostWorkflowType', + inputSchema: [ + { + name: 'post', + type: 'relationship', + relationTo: 'posts', + maxDepth: 0, + required: true, + }, + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks }) => { + await tasks.UpdatePost('1', { + input: { + post: job.input.post, + message: job.input.message, + }, + }) + + await tasks.UpdatePostStep2('2', { + input: { + // @ts-expect-error + post: job.taskStatus.UpdatePost['1'].input.post, + // @ts-expect-error + messageTwice: job.taskStatus.UpdatePost['1'].output.messageTwice, + }, + }) + }, +} diff --git a/test/queues/workflows/updatePostJSON.ts b/test/queues/workflows/updatePostJSON.ts new file mode 100644 index 0000000000..6baadfc58c --- /dev/null +++ b/test/queues/workflows/updatePostJSON.ts @@ -0,0 +1,41 @@ +import type { WorkflowConfig } from 'payload' + +export const updatePostJSONWorkflow: WorkflowConfig<'updatePostJSONWorkflow'> = { + slug: 'updatePostJSONWorkflow', + inputSchema: [ + { + name: 'post', + type: 'relationship', + relationTo: 'posts', + maxDepth: 0, + required: true, + }, + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: [ + { + task: 'UpdatePost', + id: '1', + input: ({ job }) => ({ + post: job.input.post, + message: job.input.message, + }), + }, + { + task: 'UpdatePostStep2', + id: '2', + input: ({ job }) => ({ + post: job.taskStatus.UpdatePost['1'].input.post, + messageTwice: job.taskStatus.UpdatePost['1'].output.messageTwice, + }), + condition({ job }) { + return !!job?.taskStatus?.UpdatePost?.['1']?.complete + }, + completesJob: true, + }, + ], +} diff --git a/test/queues/workflows/workflowAndTasksRetriesUndefined.ts b/test/queues/workflows/workflowAndTasksRetriesUndefined.ts new file mode 100644 index 0000000000..03e89957ed --- /dev/null +++ b/test/queues/workflows/workflowAndTasksRetriesUndefined.ts @@ -0,0 +1,43 @@ +import type { WorkflowConfig } from 'payload' + +export const workflowAndTasksRetriesUndefinedWorkflow: WorkflowConfig<'workflowAndTasksRetriesUndefined'> = + { + slug: 'workflowAndTasksRetriesUndefined', + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimpleRetriesUndefined('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimpleRetriesUndefined('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, + } diff --git a/test/queues/workflows/workflowRetries2TasksRetries0.ts b/test/queues/workflows/workflowRetries2TasksRetries0.ts new file mode 100644 index 0000000000..7cf803dc26 --- /dev/null +++ b/test/queues/workflows/workflowRetries2TasksRetries0.ts @@ -0,0 +1,44 @@ +import type { WorkflowConfig } from 'payload' + +export const workflowRetries2TasksRetries0Workflow: WorkflowConfig<'workflowRetries2TasksRetries0'> = + { + slug: 'workflowRetries2TasksRetries0', + retries: 2, + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimpleRetries0('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimpleRetries0('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, + } diff --git a/test/queues/workflows/workflowRetries2TasksRetriesUndefined.ts b/test/queues/workflows/workflowRetries2TasksRetriesUndefined.ts new file mode 100644 index 0000000000..3bbd9ee78e --- /dev/null +++ b/test/queues/workflows/workflowRetries2TasksRetriesUndefined.ts @@ -0,0 +1,44 @@ +import type { WorkflowConfig } from 'payload' + +export const workflowRetries2TasksRetriesUndefinedWorkflow: WorkflowConfig<'workflowRetries2TasksRetriesUndefined'> = + { + slug: 'workflowRetries2TasksRetriesUndefined', + retries: 2, + inputSchema: [ + { + name: 'message', + type: 'text', + required: true, + }, + ], + handler: async ({ job, tasks, req }) => { + await req.payload.update({ + collection: 'payload-jobs', + data: { + input: { + ...job.input, + amountRetried: + // @ts-expect-error amountRetried is new arbitrary data and not in the type + job.input.amountRetried !== undefined ? job.input.amountRetried + 1 : 0, + }, + }, + id: job.id, + }) + + await tasks.CreateSimpleRetriesUndefined('1', { + input: { + message: job.input.message, + }, + }) + + // At this point there should always be one post created. + // job.input.amountRetried will go up to 2 as CreatePost has 2 retries + await tasks.CreateSimpleRetriesUndefined('2', { + input: { + message: job.input.message, + shouldFail: true, + }, + }) + // This will never be reached + }, + } From b540da53ec34ef823da0ccde10c0d196a6277409 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 26 Feb 2025 21:59:34 +0200 Subject: [PATCH 007/127] feat(storage-*): large file uploads on Vercel (#11382) Currently, usage of Payload on Vercel has a limitation - uploads are limited by 4.5MB file size. This PR allows you to pass `clientUploads: true` to all existing storage adapters * Storage S3 * Vercel Blob * Google Cloud Storage * Uploadthing * Azure Blob And then, Payload will do uploads on the client instead. With the S3 Adapter it uses signed URLs and with Vercel Blob it does this - https://vercel.com/guides/how-to-bypass-vercel-body-size-limit-serverless-functions#step-2:-create-a-client-upload-route. Note that it doesn't mean that anyone can now upload files to your storage, it still does auth checks and you can customize that with `clientUploads.access` https://github.com/user-attachments/assets/5083c76c-8f5a-43dc-a88c-9ddc4527d91c Implements https://github.com/payloadcms/payload/discussions/7569 feature request. --- docs/upload/storage-adapters.mdx | 37 +- packages/payload/src/uploads/types.ts | 2 +- .../src/utilities/addDataAndFileToRequest.ts | 48 ++ packages/plugin-cloud-storage/.swcrc | 9 + packages/plugin-cloud-storage/package.json | 17 +- .../src/client/createClientUploadHandler.tsx | 69 +++ .../src/exports/client.ts | 1 + .../src/exports/utilities.ts | 1 + packages/plugin-cloud-storage/src/types.ts | 16 +- .../src/utilities/initClientUploads.ts | 76 ++++ packages/plugin-cloud-storage/tsconfig.json | 2 +- packages/storage-azure/README.md | 2 + packages/storage-azure/package.json | 10 + .../src/client/AzureClientUploadHandler.ts | 29 ++ packages/storage-azure/src/exports/client.ts | 1 + .../storage-azure/src/generateSignedURL.ts | 62 +++ packages/storage-azure/src/index.ts | 46 +- packages/storage-gcs/README.md | 1 + packages/storage-gcs/package.json | 10 + .../src/client/GcsClientUploadHandler.ts | 24 + packages/storage-gcs/src/exports/client.ts | 1 + packages/storage-gcs/src/generateSignedURL.ts | 58 +++ packages/storage-gcs/src/index.ts | 76 +++- packages/storage-s3/README.md | 1 + packages/storage-s3/package.json | 11 + .../src/client/S3ClientUploadHandler.ts | 24 + packages/storage-s3/src/exports/client.ts | 1 + packages/storage-s3/src/generateSignedURL.ts | 59 +++ packages/storage-s3/src/index.ts | 52 ++- packages/storage-uploadthing/README.md | 1 + packages/storage-uploadthing/package.json | 10 + .../client/UploadthingClientUploadHandler.ts | 18 + .../storage-uploadthing/src/exports/client.ts | 1 + .../src/getClientUploadRoute.ts | 62 +++ packages/storage-uploadthing/src/index.ts | 27 +- .../storage-uploadthing/src/staticHandler.ts | 69 +-- packages/storage-vercel-blob/README.md | 2 + packages/storage-vercel-blob/package.json | 10 + .../client/VercelBlobClientUploadHandler.ts | 34 ++ .../storage-vercel-blob/src/exports/client.ts | 1 + .../src/getClientUploadRoute.ts | 50 ++ packages/storage-vercel-blob/src/index.ts | 35 +- .../storage-vercel-blob/src/staticHandler.ts | 1 - .../BulkUpload/FormsManager/createFormData.ts | 33 +- .../BulkUpload/FormsManager/index.tsx | 21 +- packages/ui/src/exports/client/index.ts | 2 + packages/ui/src/forms/Form/index.tsx | 72 ++- packages/ui/src/forms/Form/types.ts | 2 +- packages/ui/src/providers/Root/index.tsx | 5 +- .../ui/src/providers/UploadHandlers/index.tsx | 54 +++ pnpm-lock.yaml | 430 ++++++++++++++++-- test/storage-uploadthing/config.ts | 1 + tsconfig.base.json | 10 +- tsconfig.json | 3 + 54 files changed, 1548 insertions(+), 152 deletions(-) create mode 100644 packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx create mode 100644 packages/plugin-cloud-storage/src/exports/client.ts create mode 100644 packages/plugin-cloud-storage/src/utilities/initClientUploads.ts create mode 100644 packages/storage-azure/src/client/AzureClientUploadHandler.ts create mode 100644 packages/storage-azure/src/exports/client.ts create mode 100644 packages/storage-azure/src/generateSignedURL.ts create mode 100644 packages/storage-gcs/src/client/GcsClientUploadHandler.ts create mode 100644 packages/storage-gcs/src/exports/client.ts create mode 100644 packages/storage-gcs/src/generateSignedURL.ts create mode 100644 packages/storage-s3/src/client/S3ClientUploadHandler.ts create mode 100644 packages/storage-s3/src/exports/client.ts create mode 100644 packages/storage-s3/src/generateSignedURL.ts create mode 100644 packages/storage-uploadthing/src/client/UploadthingClientUploadHandler.ts create mode 100644 packages/storage-uploadthing/src/exports/client.ts create mode 100644 packages/storage-uploadthing/src/getClientUploadRoute.ts create mode 100644 packages/storage-vercel-blob/src/client/VercelBlobClientUploadHandler.ts create mode 100644 packages/storage-vercel-blob/src/exports/client.ts create mode 100644 packages/storage-vercel-blob/src/getClientUploadRoute.ts create mode 100644 packages/ui/src/providers/UploadHandlers/index.tsx diff --git a/docs/upload/storage-adapters.mdx b/docs/upload/storage-adapters.mdx index 1c7bff85f7..af93715e66 100644 --- a/docs/upload/storage-adapters.mdx +++ b/docs/upload/storage-adapters.mdx @@ -30,6 +30,7 @@ pnpm add @payloadcms/storage-vercel-blob - Configure the `collections` object to specify which collections should use the Vercel Blob adapter. The slug _must_ match one of your existing collection slugs. - Ensure you have `BLOB_READ_WRITE_TOKEN` set in your Vercel environment variables. This is usually set by Vercel automatically after adding blob storage to your project. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts import { vercelBlobStorage } from '@payloadcms/storage-vercel-blob' @@ -64,6 +65,7 @@ export default buildConfig({ | `addRandomSuffix` | Add a random suffix to the uploaded file name in Vercel Blob storage | `false` | | `cacheControlMaxAge` | Cache-Control max-age in seconds | `365 * 24 * 60 * 60` (1 Year) | | `token` | Vercel Blob storage read/write token | `''` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## S3 Storage [`@payloadcms/storage-s3`](https://www.npmjs.com/package/@payloadcms/storage-s3) @@ -79,6 +81,7 @@ pnpm add @payloadcms/storage-s3 - Configure the `collections` object to specify which collections should use the S3 Storage adapter. The slug _must_ match one of your existing collection slugs. - The `config` object can be any [`S3ClientConfig`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3) object (from [`@aws-sdk/client-s3`](https://github.com/aws/aws-sdk-js-v3)). _This is highly dependent on your AWS setup_. Check the AWS documentation for more information. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { s3Storage } from '@payloadcms/storage-s3' @@ -126,6 +129,7 @@ pnpm add @payloadcms/storage-azure - Configure the `collections` object to specify which collections should use the Azure Blob adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method to your website. ```ts import { azureStorage } from '@payloadcms/storage-azure' @@ -161,6 +165,7 @@ export default buildConfig({ | `baseURL` | Base URL for the Azure Blob storage account | | | `connectionString` | Azure Blob storage connection string | | | `containerName` | Azure Blob storage container name | | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Google Cloud Storage [`@payloadcms/storage-gcs`](https://www.npmjs.com/package/@payloadcms/storage-gcs) @@ -175,6 +180,7 @@ pnpm add @payloadcms/storage-gcs - Configure the `collections` object to specify which collections should use the Google Cloud Storage adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { gcsStorage } from '@payloadcms/storage-gcs' @@ -203,13 +209,14 @@ export default buildConfig({ ### Configuration Options#gcs-configuration -| Option | Description | Default | -| ------------- | --------------------------------------------------------------------------------------------------- | --------- | -| `enabled` | Whether or not to enable the plugin | `true` | -| `collections` | Collections to apply the storage to | | -| `bucket` | The name of the bucket to use | | -| `options` | Google Cloud Storage client configuration. See [Docs](https://github.com/googleapis/nodejs-storage) | | -| `acl` | Access control list for files that are uploaded | `Private` | +| Option | Description | Default | +| --------------- | --------------------------------------------------------------------------------------------------- | --------- | +| `enabled` | Whether or not to enable the plugin | `true` | +| `collections` | Collections to apply the storage to | | +| `bucket` | The name of the bucket to use | | +| `options` | Google Cloud Storage client configuration. See [Docs](https://github.com/googleapis/nodejs-storage) | | +| `acl` | Access control list for files that are uploaded | `Private` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Uploadthing Storage @@ -226,6 +233,7 @@ pnpm add @payloadcms/storage-uploadthing - Configure the `collections` object to specify which collections should use uploadthing. The slug _must_ match one of your existing collection slugs and be an `upload` type. - Get a token from Uploadthing and set it as `token` in the `options` object. - `acl` is optional and defaults to `public-read`. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts export default buildConfig({ @@ -246,13 +254,14 @@ export default buildConfig({ ### Configuration Options#uploadthing-configuration -| Option | Description | Default | -| ---------------- | ----------------------------------------------- | ------------- | -| `token` | Token from Uploadthing. Required. | | -| `acl` | Access control list for files that are uploaded | `public-read` | -| `logLevel` | Log level for Uploadthing | `info` | -| `fetch` | Custom fetch function | `fetch` | -| `defaultKeyType` | Default key type for file operations | `fileKey` | +| Option | Description | Default | +| ---------------- | ------------------------------------------------------------- | ------------- | +| `token` | Token from Uploadthing. Required. | | +| `acl` | Access control list for files that are uploaded | `public-read` | +| `logLevel` | Log level for Uploadthing | `info` | +| `fetch` | Custom fetch function | `fetch` | +| `defaultKeyType` | Default key type for file operations | `fileKey` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | ## Custom Storage Adapters diff --git a/packages/payload/src/uploads/types.ts b/packages/payload/src/uploads/types.ts index cf24da507b..da29c9dd08 100644 --- a/packages/payload/src/uploads/types.ts +++ b/packages/payload/src/uploads/types.ts @@ -178,7 +178,7 @@ export type UploadConfig = { req: PayloadRequest, args: { doc: TypeWithID - params: { collection: string; filename: string } + params: { clientUploadContext?: unknown; collection: string; filename: string } }, ) => Promise | Promise | Response | void)[] /** diff --git a/packages/payload/src/utilities/addDataAndFileToRequest.ts b/packages/payload/src/utilities/addDataAndFileToRequest.ts index c07656953e..b08954ccc0 100644 --- a/packages/payload/src/utilities/addDataAndFileToRequest.ts +++ b/packages/payload/src/utilities/addDataAndFileToRequest.ts @@ -44,6 +44,54 @@ export const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => { if (fields?._payload && typeof fields._payload === 'string') { req.data = JSON.parse(fields._payload) } + + if (!req.file && fields?.file && typeof fields?.file === 'string') { + const { clientUploadContext, collectionSlug, filename, mimeType, size } = JSON.parse( + fields.file, + ) + const uploadConfig = req.payload.collections[collectionSlug].config.upload + + if (!uploadConfig.handlers) { + throw new APIError('uploadConfig.handlers is not present for ' + collectionSlug) + } + + let response: null | Response = null + let error: unknown + + for (const handler of uploadConfig.handlers) { + try { + const result = await handler(req, { + doc: null, + params: { + clientUploadContext, // Pass additional specific to adapters context returned from UploadHandler, then staticHandler can use them. + collection: collectionSlug, + filename, + }, + }) + if (result) { + response = result + } + // If we couldn't get the file from that handler, save the error and try other. + } catch (err) { + error = err + } + } + + if (!response) { + if (error) { + payload.logger.error(error) + } + + throw new APIError('Expected response from the upload handler.') + } + + req.file = { + name: filename, + data: Buffer.from(await response.arrayBuffer()), + mimetype: response.headers.get('Content-Type') || mimeType, + size, + } + } } } } diff --git a/packages/plugin-cloud-storage/.swcrc b/packages/plugin-cloud-storage/.swcrc index 14463f4b08..b4fb882caa 100644 --- a/packages/plugin-cloud-storage/.swcrc +++ b/packages/plugin-cloud-storage/.swcrc @@ -7,6 +7,15 @@ "syntax": "typescript", "tsx": true, "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } } }, "module": { diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index e78ed9d19d..95f545628b 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -33,6 +33,11 @@ "import": "./src/exports/utilities.ts", "types": "./src/exports/utilities.ts", "default": "./src/exports/utilities.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -53,15 +58,20 @@ "test": "echo \"No tests available.\"" }, "dependencies": { + "@payloadcms/ui": "workspace:*", "find-node-modules": "^2.1.3", "range-parser": "^1.2.1" }, "devDependencies": { "@types/find-node-modules": "^2.1.2", + "@types/react": "19.0.1", + "@types/react-dom": "19.0.1", "payload": "workspace:*" }, "peerDependencies": { - "payload": "workspace:*" + "payload": "workspace:*", + "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020", + "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020" }, "publishConfig": { "exports": { @@ -79,6 +89,11 @@ "import": "./dist/exports/utilities.js", "types": "./dist/exports/utilities.d.ts", "default": "./dist/exports/utilities.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx new file mode 100644 index 0000000000..a53c16d551 --- /dev/null +++ b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx @@ -0,0 +1,69 @@ +'use client' + +import type { UploadCollectionSlug } from 'payload' + +import { useConfig, useEffectEvent, useUploadHandlers } from '@payloadcms/ui' +import { Fragment, type ReactNode, useEffect } from 'react' + +type ClientUploadHandlerProps> = { + children: ReactNode + collectionSlug: UploadCollectionSlug + enabled?: boolean + extra: T + serverHandlerPath: string +} + +export const createClientUploadHandler = >({ + handler, +}: { + handler: (args: { + apiRoute: string + collectionSlug: UploadCollectionSlug + extra: T + file: File + serverHandlerPath: string + serverURL: string + updateFilename: (value: string) => void + }) => Promise +}) => { + return function ClientUploadHandler({ + children, + collectionSlug, + enabled, + extra, + serverHandlerPath, + }: ClientUploadHandlerProps) { + const { setUploadHandler } = useUploadHandlers() + const { + config: { + routes: { api: apiRoute }, + serverURL, + }, + } = useConfig() + + const initializeHandler = useEffectEvent(() => { + if (enabled) { + setUploadHandler({ + collectionSlug, + handler: ({ file, updateFilename }) => { + return handler({ + apiRoute, + collectionSlug, + extra, + file, + serverHandlerPath, + serverURL, + updateFilename, + }) + }, + }) + } + }) + + useEffect(() => { + initializeHandler() + }, []) + + return {children} + } +} diff --git a/packages/plugin-cloud-storage/src/exports/client.ts b/packages/plugin-cloud-storage/src/exports/client.ts new file mode 100644 index 0000000000..e63875627a --- /dev/null +++ b/packages/plugin-cloud-storage/src/exports/client.ts @@ -0,0 +1 @@ +export { createClientUploadHandler } from '../client/createClientUploadHandler.js' diff --git a/packages/plugin-cloud-storage/src/exports/utilities.ts b/packages/plugin-cloud-storage/src/exports/utilities.ts index e36f9b33ec..129de1ec87 100644 --- a/packages/plugin-cloud-storage/src/exports/utilities.ts +++ b/packages/plugin-cloud-storage/src/exports/utilities.ts @@ -1 +1,2 @@ export { getFilePrefix } from '../utilities/getFilePrefix.js' +export { initClientUploads } from '../utilities/initClientUploads.js' diff --git a/packages/plugin-cloud-storage/src/types.ts b/packages/plugin-cloud-storage/src/types.ts index 38ea00a981..ca27701e14 100644 --- a/packages/plugin-cloud-storage/src/types.ts +++ b/packages/plugin-cloud-storage/src/types.ts @@ -16,6 +16,17 @@ export interface File { tempFilePath?: string } +export type ClientUploadsAccess = (args: { + collectionSlug: UploadCollectionSlug + req: PayloadRequest +}) => boolean | Promise + +export type ClientUploadsConfig = + | { + access?: ClientUploadsAccess + } + | boolean + export type HandleUpload = (args: { collection: CollectionConfig data: any @@ -43,7 +54,10 @@ export type GenerateURL = (args: { export type StaticHandler = ( req: PayloadRequest, - args: { doc?: TypeWithID; params: { collection: string; filename: string } }, + args: { + doc?: TypeWithID + params: { clientUploadContext?: unknown; collection: string; filename: string } + }, ) => Promise | Response export interface GeneratedAdapter { diff --git a/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts new file mode 100644 index 0000000000..316995c380 --- /dev/null +++ b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts @@ -0,0 +1,76 @@ +import type { Config, PayloadHandler } from 'payload' + +export const initClientUploads = , T>({ + clientHandler, + collections, + config, + enabled, + extraClientHandlerProps, + serverHandler, + serverHandlerPath, +}: { + /** Path to clientHandler component */ + clientHandler: string + collections: Record + config: Config + enabled: boolean + /** extra props to pass to the client handler */ + extraClientHandlerProps?: (collection: T) => ExtraProps + serverHandler: PayloadHandler + serverHandlerPath: string +}) => { + if (enabled) { + if (!config.endpoints) { + config.endpoints = [] + } + + /** + * Tracks how many times the same handler was already applied. + * This allows to apply the same plugin multiple times, for example + * to use different buckets for different collections. + */ + let handlerCount = 0 + + for (const endpoint of config.endpoints) { + if (endpoint.path === serverHandlerPath) { + handlerCount++ + } + } + + if (handlerCount) { + serverHandlerPath = `${serverHandlerPath}-${handlerCount}` + } + + config.endpoints.push({ + handler: serverHandler, + method: 'post', + path: serverHandlerPath, + }) + } + + if (!config.admin) { + config.admin = {} + } + + if (!config.admin.components) { + config.admin.components = {} + } + + if (!config.admin.components.providers) { + config.admin.components.providers = [] + } + + for (const collectionSlug in collections) { + const collection = collections[collectionSlug] + + config.admin.components.providers.push({ + clientProps: { + collectionSlug, + enabled, + extra: extraClientHandlerProps ? extraClientHandlerProps(collection) : undefined, + serverHandlerPath, + }, + path: clientHandler, + }) + } +} diff --git a/packages/plugin-cloud-storage/tsconfig.json b/packages/plugin-cloud-storage/tsconfig.json index 14564e0715..6c57b9f880 100644 --- a/packages/plugin-cloud-storage/tsconfig.json +++ b/packages/plugin-cloud-storage/tsconfig.json @@ -5,5 +5,5 @@ "strict": false, "noUncheckedIndexedAccess": false, }, - "references": [{ "path": "../payload" }] + "references": [{ "path": "../payload" }, { "path": "../ui" }] } diff --git a/packages/storage-azure/README.md b/packages/storage-azure/README.md index 0a3e31911c..d258e01655 100644 --- a/packages/storage-azure/README.md +++ b/packages/storage-azure/README.md @@ -14,6 +14,7 @@ pnpm add @payloadcms/storage-azure - Configure the `collections` object to specify which collections should use the Azure Blob Storage adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method to your website. ```ts import { azureStorage } from '@payloadcms/storage-azure' @@ -49,3 +50,4 @@ export default buildConfig({ | `baseURL` | Base URL for the Azure Blob storage account | | | `connectionString` | Azure Blob storage connection string | | | `containerName` | Azure Blob storage container name | | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel. | | diff --git a/packages/storage-azure/package.json b/packages/storage-azure/package.json index 20d879384b..62bba29ca6 100644 --- a/packages/storage-azure/package.json +++ b/packages/storage-azure/package.json @@ -23,6 +23,11 @@ "import": "./src/index.ts", "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -62,6 +67,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/storage-azure/src/client/AzureClientUploadHandler.ts b/packages/storage-azure/src/client/AzureClientUploadHandler.ts new file mode 100644 index 0000000000..c61251fea6 --- /dev/null +++ b/packages/storage-azure/src/client/AzureClientUploadHandler.ts @@ -0,0 +1,29 @@ +'use client' +import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' + +export const AzureClientUploadHandler = createClientUploadHandler({ + handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { + body: JSON.stringify({ + collectionSlug, + filename: file.name, + mimeType: file.type, + }), + credentials: 'include', + method: 'POST', + }) + + const { url } = await response.json() + + await fetch(url, { + body: file, + headers: { + 'Content-Length': file.size.toString(), + 'Content-Type': file.type, + // Required for azure + 'x-ms-blob-type': 'BlockBlob', + }, + method: 'PUT', + }) + }, +}) diff --git a/packages/storage-azure/src/exports/client.ts b/packages/storage-azure/src/exports/client.ts new file mode 100644 index 0000000000..558c3e3f4c --- /dev/null +++ b/packages/storage-azure/src/exports/client.ts @@ -0,0 +1 @@ +export { AzureClientUploadHandler } from '../client/AzureClientUploadHandler.js' diff --git a/packages/storage-azure/src/generateSignedURL.ts b/packages/storage-azure/src/generateSignedURL.ts new file mode 100644 index 0000000000..82219de4c8 --- /dev/null +++ b/packages/storage-azure/src/generateSignedURL.ts @@ -0,0 +1,62 @@ +import type { ContainerClient, StorageSharedKeyCredential } from '@azure/storage-blob' +import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types' +import type { PayloadHandler } from 'payload' + +import { BlobSASPermissions, generateBlobSASQueryParameters } from '@azure/storage-blob' +import path from 'path' +import { APIError, Forbidden } from 'payload' + +import type { AzureStorageOptions } from './index.js' + +interface Args { + access?: ClientUploadsAccess + collections: AzureStorageOptions['collections'] + containerName: string + getStorageClient: () => ContainerClient +} + +const defaultAccess: Args['access'] = ({ req }) => !!req.user + +export const getGenerateSignedURLHandler = ({ + access = defaultAccess, + collections, + containerName, + getStorageClient, +}: Args): PayloadHandler => { + return async (req) => { + if (!req.json) { + throw new APIError('Unreachable') + } + + const { collectionSlug, filename, mimeType } = await req.json() + + const collectionS3Config = collections[collectionSlug] + if (!collectionS3Config) { + throw new APIError(`Collection ${collectionSlug} was not found in S3 options`) + } + + const prefix = (typeof collectionS3Config === 'object' && collectionS3Config.prefix) || '' + + if (!(await access({ collectionSlug, req }))) { + throw new Forbidden() + } + + const fileKey = path.posix.join(prefix, filename) + + const blobClient = getStorageClient().getBlobClient(fileKey) + + const sasToken = generateBlobSASQueryParameters( + { + blobName: fileKey, + containerName, + contentType: mimeType, + expiresOn: new Date(Date.now() + 30 * 60 * 1000), + permissions: BlobSASPermissions.parse('w'), + startsOn: new Date(), + }, + getStorageClient().credential as StorageSharedKeyCredential, + ) + + return Response.json({ url: `${blobClient.url}?${sasToken.toString()}` }) + } +} diff --git a/packages/storage-azure/src/index.ts b/packages/storage-azure/src/index.ts index 4f9994b348..babc0810e2 100644 --- a/packages/storage-azure/src/index.ts +++ b/packages/storage-azure/src/index.ts @@ -1,5 +1,7 @@ +import type { ContainerClient } from '@azure/storage-blob' import type { Adapter, + ClientUploadsConfig, PluginOptions as CloudStoragePluginOptions, CollectionOptions, GeneratedAdapter, @@ -7,7 +9,9 @@ import type { import type { Config, Plugin, UploadCollectionSlug } from 'payload' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' +import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities' +import { getGenerateSignedURLHandler } from './generateSignedURL.js' import { getGenerateURL } from './generateURL.js' import { getHandleDelete } from './handleDelete.js' import { getHandleUpload } from './handleUpload.js' @@ -27,6 +31,11 @@ export type AzureStorageOptions = { */ baseURL: string + /** + * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method to your website. + */ + clientUploads?: ClientUploadsConfig + /** * Collection options to apply the Azure Blob adapter to. */ @@ -59,7 +68,30 @@ export const azureStorage: AzureStoragePlugin = return incomingConfig } - const adapter = azureStorageInternal(azureStorageOptions) + const getStorageClient = () => + getStorageClientFunc({ + connectionString: azureStorageOptions.connectionString, + containerName: azureStorageOptions.containerName, + }) + + initClientUploads({ + clientHandler: '@payloadcms/storage-azure/client#AzureClientUploadHandler', + collections: azureStorageOptions.collections, + config: incomingConfig, + enabled: !!azureStorageOptions.clientUploads, + serverHandler: getGenerateSignedURLHandler({ + access: + typeof azureStorageOptions.clientUploads === 'object' + ? azureStorageOptions.clientUploads.access + : undefined, + collections: azureStorageOptions.collections, + containerName: azureStorageOptions.containerName, + getStorageClient, + }), + serverHandlerPath: '/storage-azure-generate-signed-url', + }) + + const adapter = azureStorageInternal(getStorageClient, azureStorageOptions) // Add adapter to each collection option object const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries( @@ -98,20 +130,16 @@ export const azureStorage: AzureStoragePlugin = })(config) } -function azureStorageInternal({ - allowContainerCreate, - baseURL, - connectionString, - containerName, -}: AzureStorageOptions): Adapter { +function azureStorageInternal( + getStorageClient: () => ContainerClient, + { allowContainerCreate, baseURL, connectionString, containerName }: AzureStorageOptions, +): Adapter { const createContainerIfNotExists = () => { void getStorageClientFunc({ connectionString, containerName }).createIfNotExists({ access: 'blob', }) } - const getStorageClient = () => getStorageClientFunc({ connectionString, containerName }) - return ({ collection, prefix }): GeneratedAdapter => { return { name: 'azure', diff --git a/packages/storage-gcs/README.md b/packages/storage-gcs/README.md index fc82b2fb21..7af85426aa 100644 --- a/packages/storage-gcs/README.md +++ b/packages/storage-gcs/README.md @@ -14,6 +14,7 @@ pnpm add @payloadcms/storage-gcs - Configure the `collections` object to specify which collections should use the Google Cloud Storage adapter. The slug _must_ match one of your existing collection slugs. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { gcsStorage } from '@payloadcms/storage-gcs' diff --git a/packages/storage-gcs/package.json b/packages/storage-gcs/package.json index 4a0eb02ff2..6aa313ee23 100644 --- a/packages/storage-gcs/package.json +++ b/packages/storage-gcs/package.json @@ -23,6 +23,11 @@ "import": "./src/index.ts", "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -59,6 +64,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/storage-gcs/src/client/GcsClientUploadHandler.ts b/packages/storage-gcs/src/client/GcsClientUploadHandler.ts new file mode 100644 index 0000000000..549c5a3c17 --- /dev/null +++ b/packages/storage-gcs/src/client/GcsClientUploadHandler.ts @@ -0,0 +1,24 @@ +'use client' +import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' + +export const GcsClientUploadHandler = createClientUploadHandler({ + handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { + body: JSON.stringify({ + collectionSlug, + filename: file.name, + mimeType: file.type, + }), + credentials: 'include', + method: 'POST', + }) + + const { url } = await response.json() + + await fetch(url, { + body: file, + headers: { 'Content-Length': file.size.toString(), 'Content-Type': file.type }, + method: 'PUT', + }) + }, +}) diff --git a/packages/storage-gcs/src/exports/client.ts b/packages/storage-gcs/src/exports/client.ts new file mode 100644 index 0000000000..ec55eda7ed --- /dev/null +++ b/packages/storage-gcs/src/exports/client.ts @@ -0,0 +1 @@ +export { GcsClientUploadHandler } from '../client/GcsClientUploadHandler.js' diff --git a/packages/storage-gcs/src/generateSignedURL.ts b/packages/storage-gcs/src/generateSignedURL.ts new file mode 100644 index 0000000000..acaf4a7f06 --- /dev/null +++ b/packages/storage-gcs/src/generateSignedURL.ts @@ -0,0 +1,58 @@ +import type { Storage } from '@google-cloud/storage' +import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types' +import type { PayloadHandler } from 'payload' + +import path from 'path' +import { APIError, Forbidden } from 'payload' + +import type { GcsStorageOptions } from './index.js' + +interface Args { + access?: ClientUploadsAccess + acl?: 'private' | 'public-read' + bucket: string + collections: GcsStorageOptions['collections'] + getStorageClient: () => Storage +} + +const defaultAccess: Args['access'] = ({ req }) => !!req.user + +export const getGenerateSignedURLHandler = ({ + access = defaultAccess, + bucket, + collections, + getStorageClient, +}: Args): PayloadHandler => { + return async (req) => { + if (!req.json) { + throw new APIError('Unreachable') + } + + const { collectionSlug, filename, mimeType } = await req.json() + + const collectionS3Config = collections[collectionSlug] + if (!collectionS3Config) { + throw new APIError(`Collection ${collectionSlug} was not found in S3 options`) + } + + const prefix = (typeof collectionS3Config === 'object' && collectionS3Config.prefix) || '' + + if (!(await access({ collectionSlug, req }))) { + throw new Forbidden() + } + + const fileKey = path.posix.join(prefix, filename) + + const [url] = await getStorageClient() + .bucket(bucket) + .file(fileKey) + .getSignedUrl({ + action: 'write', + contentType: mimeType, + expires: Date.now() + 60 * 60 * 5, + version: 'v4', + }) + + return Response.json({ url }) + } +} diff --git a/packages/storage-gcs/src/index.ts b/packages/storage-gcs/src/index.ts index ebd101766d..2b06b2a373 100644 --- a/packages/storage-gcs/src/index.ts +++ b/packages/storage-gcs/src/index.ts @@ -1,6 +1,7 @@ import type { StorageOptions } from '@google-cloud/storage' import type { Adapter, + ClientUploadsConfig, PluginOptions as CloudStoragePluginOptions, CollectionOptions, GeneratedAdapter, @@ -10,6 +11,7 @@ import type { Config, Plugin, UploadCollectionSlug } from 'payload' import { Storage } from '@google-cloud/storage' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' +import { getGenerateSignedURLHandler } from './generateSignedURL.js' import { getGenerateURL } from './generateURL.js' import { getHandleDelete } from './handleDelete.js' import { getHandleUpload } from './handleUpload.js' @@ -22,6 +24,10 @@ export interface GcsStorageOptions { * The name of the bucket to use. */ bucket: string + /** + * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website. + */ + clientUploads?: ClientUploadsConfig /** * Collection options to apply the S3 adapter to. */ @@ -50,7 +56,60 @@ export const gcsStorage: GcsStoragePlugin = return incomingConfig } - const adapter = gcsStorageInternal(gcsStorageOptions) + let storageClient: null | Storage = null + + const getStorageClient = (): Storage => { + if (storageClient) { + return storageClient + } + storageClient = new Storage(gcsStorageOptions.options) + + return storageClient + } + + const adapter = gcsStorageInternal(getStorageClient, gcsStorageOptions) + + if (gcsStorageOptions.clientUploads) { + if (!incomingConfig.endpoints) { + incomingConfig.endpoints = [] + } + + incomingConfig.endpoints.push({ + handler: getGenerateSignedURLHandler({ + access: + typeof gcsStorageOptions.clientUploads === 'object' + ? gcsStorageOptions.clientUploads.access + : undefined, + bucket: gcsStorageOptions.bucket, + collections: gcsStorageOptions.collections, + getStorageClient, + }), + method: 'post', + path: '/storage-gcs-generate-signed-url', + }) + } + + if (!incomingConfig.admin) { + incomingConfig.admin = {} + } + + if (!incomingConfig.admin.components) { + incomingConfig.admin.components = {} + } + + if (!incomingConfig.admin.components.providers) { + incomingConfig.admin.components.providers = [] + } + + for (const collectionSlug in gcsStorageOptions.collections) { + incomingConfig.admin.components.providers.push({ + clientProps: { + collectionSlug, + enabled: !!gcsStorageOptions.clientUploads, + }, + path: '@payloadcms/storage-gcs/client#GcsClientUploadHandler', + }) + } // Add adapter to each collection option object const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries( @@ -89,18 +148,11 @@ export const gcsStorage: GcsStoragePlugin = })(config) } -function gcsStorageInternal({ acl, bucket, options }: GcsStorageOptions): Adapter { +function gcsStorageInternal( + getStorageClient: () => Storage, + { acl, bucket }: GcsStorageOptions, +): Adapter { return ({ collection, prefix }): GeneratedAdapter => { - let storageClient: null | Storage = null - - const getStorageClient = (): Storage => { - if (storageClient) { - return storageClient - } - storageClient = new Storage(options) - return storageClient - } - return { name: 'gcs', generateURL: getGenerateURL({ bucket, getStorageClient }), diff --git a/packages/storage-s3/README.md b/packages/storage-s3/README.md index b187b56feb..ada7b756a1 100644 --- a/packages/storage-s3/README.md +++ b/packages/storage-s3/README.md @@ -15,6 +15,7 @@ pnpm add @payloadcms/storage-s3 - Configure the `collections` object to specify which collections should use the AWS S3 adapter. The slug _must_ match one of your existing collection slugs. - The `config` object can be any [`S3ClientConfig`](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3) object (from [`@aws-sdk/client-s3`](https://github.com/aws/aws-sdk-js-v3)). _This is highly dependent on your AWS setup_. Check the AWS documentation for more information. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. You must allow CORS PUT method for the bucket to your website. ```ts import { s3Storage } from '@payloadcms/storage-s3' diff --git a/packages/storage-s3/package.json b/packages/storage-s3/package.json index 5cad099a8e..b095a7b77e 100644 --- a/packages/storage-s3/package.json +++ b/packages/storage-s3/package.json @@ -23,6 +23,11 @@ "import": "./src/index.ts", "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -43,6 +48,7 @@ "dependencies": { "@aws-sdk/client-s3": "^3.614.0", "@aws-sdk/lib-storage": "^3.614.0", + "@aws-sdk/s3-request-presigner": "^3.614.0", "@payloadcms/plugin-cloud-storage": "workspace:*" }, "devDependencies": { @@ -60,6 +66,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/storage-s3/src/client/S3ClientUploadHandler.ts b/packages/storage-s3/src/client/S3ClientUploadHandler.ts new file mode 100644 index 0000000000..7f1748a89d --- /dev/null +++ b/packages/storage-s3/src/client/S3ClientUploadHandler.ts @@ -0,0 +1,24 @@ +'use client' +import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' + +export const S3ClientUploadHandler = createClientUploadHandler({ + handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { + body: JSON.stringify({ + collectionSlug, + filename: file.name, + mimeType: file.type, + }), + credentials: 'include', + method: 'POST', + }) + + const { url } = await response.json() + + await fetch(url, { + body: file, + headers: { 'Content-Length': file.size.toString(), 'Content-Type': file.type }, + method: 'PUT', + }) + }, +}) diff --git a/packages/storage-s3/src/exports/client.ts b/packages/storage-s3/src/exports/client.ts new file mode 100644 index 0000000000..2da0d9d5de --- /dev/null +++ b/packages/storage-s3/src/exports/client.ts @@ -0,0 +1 @@ +export { S3ClientUploadHandler } from '../client/S3ClientUploadHandler.js' diff --git a/packages/storage-s3/src/generateSignedURL.ts b/packages/storage-s3/src/generateSignedURL.ts new file mode 100644 index 0000000000..a194f919fd --- /dev/null +++ b/packages/storage-s3/src/generateSignedURL.ts @@ -0,0 +1,59 @@ +import type { ClientUploadsAccess } from '@payloadcms/plugin-cloud-storage/types' +import type { PayloadHandler } from 'payload' + +import * as AWS from '@aws-sdk/client-s3' +import { getSignedUrl } from '@aws-sdk/s3-request-presigner' +import path from 'path' +import { APIError, Forbidden } from 'payload' + +import type { S3StorageOptions } from './index.js' + +interface Args { + access?: ClientUploadsAccess + acl?: 'private' | 'public-read' + bucket: string + collections: S3StorageOptions['collections'] + getStorageClient: () => AWS.S3 +} + +const defaultAccess: Args['access'] = ({ req }) => !!req.user + +export const getGenerateSignedURLHandler = ({ + access = defaultAccess, + acl, + bucket, + collections, + getStorageClient, +}: Args): PayloadHandler => { + return async (req) => { + if (!req.json) { + throw new APIError('Content-Type expected to be application/json', 400) + } + + const { collectionSlug, filename, mimeType } = await req.json() + + const collectionS3Config = collections[collectionSlug] + if (!collectionS3Config) { + throw new APIError(`Collection ${collectionSlug} was not found in S3 options`) + } + + const prefix = (typeof collectionS3Config === 'object' && collectionS3Config.prefix) || '' + + if (!(await access({ collectionSlug, req }))) { + throw new Forbidden() + } + + const fileKey = path.posix.join(prefix, filename) + + const url = await getSignedUrl( + // @ts-expect-error mismatch versions or something + getStorageClient(), + new AWS.PutObjectCommand({ ACL: acl, Bucket: bucket, ContentType: mimeType, Key: fileKey }), + { + expiresIn: 600, + }, + ) + + return Response.json({ url }) + } +} diff --git a/packages/storage-s3/src/index.ts b/packages/storage-s3/src/index.ts index d2a2efbe7c..2fba35cc2a 100644 --- a/packages/storage-s3/src/index.ts +++ b/packages/storage-s3/src/index.ts @@ -1,5 +1,6 @@ import type { Adapter, + ClientUploadsConfig, PluginOptions as CloudStoragePluginOptions, CollectionOptions, GeneratedAdapter, @@ -8,7 +9,9 @@ import type { Config, Plugin, UploadCollectionSlug } from 'payload' import * as AWS from '@aws-sdk/client-s3' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' +import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities' +import { getGenerateSignedURLHandler } from './generateSignedURL.js' import { getGenerateURL } from './generateURL.js' import { getHandleDelete } from './handleDelete.js' import { getHandleUpload } from './handleUpload.js' @@ -28,10 +31,15 @@ export type S3StorageOptions = { bucket: string + /** + * Do uploads directly on the client to bypass limits on Vercel. You must allow CORS PUT method for the bucket to your website. + */ + clientUploads?: ClientUploadsConfig /** * Collection options to apply the S3 adapter to. */ collections: Partial | true>> + /** * AWS S3 client configuration. Highly dependent on your AWS setup. * @@ -63,7 +71,35 @@ export const s3Storage: S3StoragePlugin = return incomingConfig } - const adapter = s3StorageInternal(s3StorageOptions) + let storageClient: AWS.S3 | null = null + + const getStorageClient: () => AWS.S3 = () => { + if (storageClient) { + return storageClient + } + storageClient = new AWS.S3(s3StorageOptions.config ?? {}) + return storageClient + } + + initClientUploads({ + clientHandler: '@payloadcms/storage-s3/client#S3ClientUploadHandler', + collections: s3StorageOptions.collections, + config: incomingConfig, + enabled: !!s3StorageOptions.clientUploads, + serverHandler: getGenerateSignedURLHandler({ + access: + typeof s3StorageOptions.clientUploads === 'object' + ? s3StorageOptions.clientUploads.access + : undefined, + acl: s3StorageOptions.acl, + bucket: s3StorageOptions.bucket, + collections: s3StorageOptions.collections, + getStorageClient, + }), + serverHandlerPath: '/storage-s3-generate-signed-url', + }) + + const adapter = s3StorageInternal(getStorageClient, s3StorageOptions) // Add adapter to each collection option object const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries( @@ -102,17 +138,11 @@ export const s3Storage: S3StoragePlugin = })(config) } -function s3StorageInternal({ acl, bucket, config = {} }: S3StorageOptions): Adapter { +function s3StorageInternal( + getStorageClient: () => AWS.S3, + { acl, bucket, config = {} }: S3StorageOptions, +): Adapter { return ({ collection, prefix }): GeneratedAdapter => { - let storageClient: AWS.S3 | null = null - const getStorageClient: () => AWS.S3 = () => { - if (storageClient) { - return storageClient - } - storageClient = new AWS.S3(config) - return storageClient - } - return { name: 's3', generateURL: getGenerateURL({ bucket, config }), diff --git a/packages/storage-uploadthing/README.md b/packages/storage-uploadthing/README.md index 730b64e1cc..595fa3597d 100644 --- a/packages/storage-uploadthing/README.md +++ b/packages/storage-uploadthing/README.md @@ -13,6 +13,7 @@ pnpm add @payloadcms/storage-uploadthing - Configure the `collections` object to specify which collections should use uploadthing. The slug _must_ match one of your existing collection slugs and be an `upload` type. - Get an API key from Uploadthing and set it as `apiKey` in the `options` object. - `acl` is optional and defaults to `public-read`. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts export default buildConfig({ diff --git a/packages/storage-uploadthing/package.json b/packages/storage-uploadthing/package.json index b099b728a5..d03707d1d2 100644 --- a/packages/storage-uploadthing/package.json +++ b/packages/storage-uploadthing/package.json @@ -23,6 +23,11 @@ "import": "./src/index.ts", "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -59,6 +64,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/storage-uploadthing/src/client/UploadthingClientUploadHandler.ts b/packages/storage-uploadthing/src/client/UploadthingClientUploadHandler.ts new file mode 100644 index 0000000000..e2d248e779 --- /dev/null +++ b/packages/storage-uploadthing/src/client/UploadthingClientUploadHandler.ts @@ -0,0 +1,18 @@ +'use client' +import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' +import { genUploader } from 'uploadthing/client' + +export const UploadthingClientUploadHandler = createClientUploadHandler({ + handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + const { uploadFiles } = genUploader({ + package: 'storage-uploadthing', + url: `${serverURL}${apiRoute}${serverHandlerPath}?collectionSlug=${collectionSlug}`, + }) + + const res = await uploadFiles('uploader', { + files: [file], + }) + + return { key: res[0].key } + }, +}) diff --git a/packages/storage-uploadthing/src/exports/client.ts b/packages/storage-uploadthing/src/exports/client.ts new file mode 100644 index 0000000000..e430c1ee3b --- /dev/null +++ b/packages/storage-uploadthing/src/exports/client.ts @@ -0,0 +1 @@ +export { UploadthingClientUploadHandler } from '../client/UploadthingClientUploadHandler.js' diff --git a/packages/storage-uploadthing/src/getClientUploadRoute.ts b/packages/storage-uploadthing/src/getClientUploadRoute.ts new file mode 100644 index 0000000000..2eea6b1460 --- /dev/null +++ b/packages/storage-uploadthing/src/getClientUploadRoute.ts @@ -0,0 +1,62 @@ +import { + APIError, + Forbidden, + type PayloadHandler, + type PayloadRequest, + type UploadCollectionSlug, +} from 'payload' + +type Args = { + access?: (args: { + collectionSlug: UploadCollectionSlug + req: PayloadRequest + }) => boolean | Promise + acl: 'private' | 'public-read' + token?: string +} + +const defaultAccess: Args['access'] = ({ req }) => !!req.user + +import type { FileRouter } from 'uploadthing/server' + +import { createRouteHandler } from 'uploadthing/next' +import { createUploadthing } from 'uploadthing/server' + +export const getClientUploadRoute = ({ + access = defaultAccess, + acl, + token, +}: Args): PayloadHandler => { + const f = createUploadthing() + + const uploadRouter = { + uploader: f({ + blob: { + acl, + maxFileCount: 1, + }, + }) + .middleware(async ({ req: rawReq }) => { + const req = rawReq as PayloadRequest + + const collectionSlug = req.searchParams.get('collectionSlug') + + if (!collectionSlug) { + throw new APIError('No payload was provided') + } + + if (!(await access({ collectionSlug, req }))) { + throw new Forbidden() + } + + return {} + }) + .onUploadComplete(() => {}), + } satisfies FileRouter + + const { POST } = createRouteHandler({ config: { token }, router: uploadRouter }) + + return async (req) => { + return POST(req) + } +} diff --git a/packages/storage-uploadthing/src/index.ts b/packages/storage-uploadthing/src/index.ts index 4c472c6f77..b7af504a3a 100644 --- a/packages/storage-uploadthing/src/index.ts +++ b/packages/storage-uploadthing/src/index.ts @@ -1,5 +1,6 @@ import type { Adapter, + ClientUploadsConfig, PluginOptions as CloudStoragePluginOptions, CollectionOptions, GeneratedAdapter, @@ -8,14 +9,22 @@ import type { Config, Field, Plugin, UploadCollectionSlug } from 'payload' import type { UTApiOptions } from 'uploadthing/types' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' -import { UTApi } from 'uploadthing/server' +import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities' +import { createRouteHandler } from 'uploadthing/next' +import { createUploadthing, UTApi } from 'uploadthing/server' import { generateURL } from './generateURL.js' +import { getClientUploadRoute } from './getClientUploadRoute.js' import { getHandleDelete } from './handleDelete.js' import { getHandleUpload } from './handleUpload.js' import { getHandler } from './staticHandler.js' export type UploadthingStorageOptions = { + /** + * Do uploads directly on the client, to bypass limits on Vercel. + */ + clientUploads?: ClientUploadsConfig + /** * Collection options to apply the adapter to. */ @@ -58,6 +67,22 @@ export const uploadthingStorage: UploadthingPlugin = const adapter = uploadthingInternal(uploadthingStorageOptions) + initClientUploads({ + clientHandler: '@payloadcms/storage-uploadthing/client#UploadthingClientUploadHandler', + collections: uploadthingStorageOptions.collections, + config: incomingConfig, + enabled: !!uploadthingStorageOptions.clientUploads, + serverHandler: getClientUploadRoute({ + access: + typeof uploadthingStorageOptions.clientUploads === 'object' + ? uploadthingStorageOptions.clientUploads.access + : undefined, + acl: uploadthingStorageOptions.options.acl || 'public-read', + token: uploadthingStorageOptions.options.token, + }), + serverHandlerPath: '/storage-uploadthing-client-upload-route', + }) + // Add adapter to each collection option object const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries( uploadthingStorageOptions.collections, diff --git a/packages/storage-uploadthing/src/staticHandler.ts b/packages/storage-uploadthing/src/staticHandler.ts index cd25ebdbe7..39aaff9332 100644 --- a/packages/storage-uploadthing/src/staticHandler.ts +++ b/packages/storage-uploadthing/src/staticHandler.ts @@ -9,47 +9,58 @@ type Args = { } export const getHandler = ({ utApi }: Args): StaticHandler => { - return async (req, { doc, params: { collection, filename } }) => { + return async (req, { doc, params: { clientUploadContext, collection, filename } }) => { try { - const collectionConfig = req.payload.collections[collection]?.config - let retrievedDoc = doc + let key: string - if (!retrievedDoc) { - const or: Where[] = [ - { - filename: { - equals: filename, - }, - }, - ] + if ( + clientUploadContext && + typeof clientUploadContext === 'object' && + 'key' in clientUploadContext && + typeof clientUploadContext.key === 'string' + ) { + key = clientUploadContext.key + } else { + const collectionConfig = req.payload.collections[collection]?.config + let retrievedDoc = doc - if (collectionConfig.upload.imageSizes) { - collectionConfig.upload.imageSizes.forEach(({ name }) => { - or.push({ - [`sizes.${name}.filename`]: { + if (!retrievedDoc) { + const or: Where[] = [ + { + filename: { equals: filename, }, + }, + ] + + if (collectionConfig.upload.imageSizes) { + collectionConfig.upload.imageSizes.forEach(({ name }) => { + or.push({ + [`sizes.${name}.filename`]: { + equals: filename, + }, + }) }) + } + + const result = await req.payload.db.findOne({ + collection, + req, + where: { or }, }) + + if (result) { + retrievedDoc = result + } } - const result = await req.payload.db.findOne({ - collection, - req, - where: { or }, - }) - - if (result) { - retrievedDoc = result + if (!retrievedDoc) { + return new Response(null, { status: 404, statusText: 'Not Found' }) } - } - if (!retrievedDoc) { - return new Response(null, { status: 404, statusText: 'Not Found' }) + key = getKeyFromFilename(retrievedDoc, filename) } - const key = getKeyFromFilename(retrievedDoc, filename) - if (!key) { return new Response(null, { status: 404, statusText: 'Not Found' }) } @@ -69,7 +80,7 @@ export const getHandler = ({ utApi }: Args): StaticHandler => { const blob = await response.blob() const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match') - const objectEtag = response.headers.get('etag') as string + const objectEtag = response.headers.get('etag') if (etagFromHeaders && etagFromHeaders === objectEtag) { return new Response(null, { diff --git a/packages/storage-vercel-blob/README.md b/packages/storage-vercel-blob/README.md index 09be8dfd98..1ec9809659 100644 --- a/packages/storage-vercel-blob/README.md +++ b/packages/storage-vercel-blob/README.md @@ -15,6 +15,7 @@ pnpm add @payloadcms/storage-vercel-blob - Configure the `collections` object to specify which collections should use the Vercel Blob adapter. The slug _must_ match one of your existing collection slugs. - Ensure you have `BLOB_READ_WRITE_TOKEN` set in your Vercel environment variables. This is usually set by Vercel automatically after adding blob storage to your project. - When enabled, this package will automatically set `disableLocalStorage` to `true` for each collection. +- When deploying to Vercel, server uploads are limited with 4.5MB. Set `clientUploads` to `true` to do uploads directly on the client. ```ts import { vercelBlobStorage } from '@payloadcms/storage-vercel-blob' @@ -47,3 +48,4 @@ export default buildConfig({ | `addRandomSuffix` | Add a random suffix to the uploaded file name in Vercel Blob storage | `false` | | `cacheControlMaxAge` | Cache-Control max-age in seconds | `365 * 24 * 60 * 60` (1 Year) | | `token` | Vercel Blob storage read/write token | `''` | +| `clientUploads` | Do uploads directly on the client to bypass limits on Vercel | | diff --git a/packages/storage-vercel-blob/package.json b/packages/storage-vercel-blob/package.json index ed9fa90e73..fc64e6c5a9 100644 --- a/packages/storage-vercel-blob/package.json +++ b/packages/storage-vercel-blob/package.json @@ -23,6 +23,11 @@ "import": "./src/index.ts", "types": "./src/index.ts", "default": "./src/index.ts" + }, + "./client": { + "import": "./src/exports/client.ts", + "types": "./src/exports/client.ts", + "default": "./src/exports/client.ts" } }, "main": "./src/index.ts", @@ -59,6 +64,11 @@ "import": "./dist/index.js", "types": "./dist/index.d.ts", "default": "./dist/index.js" + }, + "./client": { + "import": "./dist/exports/client.js", + "types": "./dist/exports/client.d.ts", + "default": "./dist/exports/client.js" } }, "main": "./dist/index.js", diff --git a/packages/storage-vercel-blob/src/client/VercelBlobClientUploadHandler.ts b/packages/storage-vercel-blob/src/client/VercelBlobClientUploadHandler.ts new file mode 100644 index 0000000000..f283d24477 --- /dev/null +++ b/packages/storage-vercel-blob/src/client/VercelBlobClientUploadHandler.ts @@ -0,0 +1,34 @@ +'use client' +import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' +import { upload } from '@vercel/blob/client' + +export type VercelBlobClientUploadHandlerExtra = { + addRandomSuffix: boolean + baseURL: string + prefix: string +} + +export const VercelBlobClientUploadHandler = + createClientUploadHandler({ + handler: async ({ + apiRoute, + collectionSlug, + extra: { addRandomSuffix, baseURL, prefix = '' }, + file, + serverHandlerPath, + serverURL, + updateFilename, + }) => { + const result = await upload(`${prefix}${file.name}`, file, { + access: 'public', + clientPayload: collectionSlug, + contentType: file.type, + handleUploadUrl: `${serverURL}${apiRoute}${serverHandlerPath}`, + }) + + // Update filename with suffix from returned url + if (addRandomSuffix) { + updateFilename(result.url.replace(`${baseURL}/`, '')) + } + }, + }) diff --git a/packages/storage-vercel-blob/src/exports/client.ts b/packages/storage-vercel-blob/src/exports/client.ts new file mode 100644 index 0000000000..f02956cc5a --- /dev/null +++ b/packages/storage-vercel-blob/src/exports/client.ts @@ -0,0 +1 @@ +export { VercelBlobClientUploadHandler } from '../client/VercelBlobClientUploadHandler.js' diff --git a/packages/storage-vercel-blob/src/getClientUploadRoute.ts b/packages/storage-vercel-blob/src/getClientUploadRoute.ts new file mode 100644 index 0000000000..0dc2d6434f --- /dev/null +++ b/packages/storage-vercel-blob/src/getClientUploadRoute.ts @@ -0,0 +1,50 @@ +import type { PayloadHandler, PayloadRequest, UploadCollectionSlug } from 'payload' + +import { handleUpload, type HandleUploadBody } from '@vercel/blob/client' +import { APIError, Forbidden } from 'payload' + +type Args = { + access?: (args: { + collectionSlug: UploadCollectionSlug + req: PayloadRequest + }) => boolean | Promise + addRandomSuffix?: boolean + cacheControlMaxAge?: number + token: string +} + +const defaultAccess: Args['access'] = ({ req }) => !!req.user + +export const getClientUploadRoute = + ({ access = defaultAccess, addRandomSuffix, cacheControlMaxAge, token }: Args): PayloadHandler => + async (req) => { + const body = (await req.json!()) as HandleUploadBody + + try { + const jsonResponse = await handleUpload({ + body, + onBeforeGenerateToken: async (_pathname: string, collectionSlug: null | string) => { + if (!collectionSlug) { + throw new APIError('No payload was provided') + } + + if (!(await access({ collectionSlug, req }))) { + throw new Forbidden() + } + + return Promise.resolve({ + addRandomSuffix, + cacheControlMaxAge, + }) + }, + onUploadCompleted: async () => {}, + request: req as Request, + token, + }) + + return Response.json(jsonResponse) + } catch (error) { + req.payload.logger.error(error) + throw new APIError('storage-vercel-blob client upload route error') + } + } diff --git a/packages/storage-vercel-blob/src/index.ts b/packages/storage-vercel-blob/src/index.ts index e0add03634..3097c6ebe0 100644 --- a/packages/storage-vercel-blob/src/index.ts +++ b/packages/storage-vercel-blob/src/index.ts @@ -1,5 +1,6 @@ import type { Adapter, + ClientUploadsConfig, PluginOptions as CloudStoragePluginOptions, CollectionOptions, GeneratedAdapter, @@ -7,8 +8,12 @@ import type { import type { Config, Plugin, UploadCollectionSlug } from 'payload' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' +import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities' + +import type { VercelBlobClientUploadHandlerExtra } from './client/VercelBlobClientUploadHandler.js' import { getGenerateUrl } from './generateURL.js' +import { getClientUploadRoute } from './getClientUploadRoute.js' import { getHandleDelete } from './handleDelete.js' import { getHandleUpload } from './handleUpload.js' import { getStaticHandler } from './staticHandler.js' @@ -32,10 +37,15 @@ export type VercelBlobStorageOptions = { /** * Cache-Control max-age in seconds * - * @defaultvalue 365 * 24 * 60 * 60 (1 Year) + * @default 365 * 24 * 60 * 60 // (1 Year) */ cacheControlMaxAge?: number + /** + * Do uploads directly on the client, to bypass limits on Vercel. + */ + clientUploads?: ClientUploadsConfig + /** * Collections to apply the Vercel Blob adapter to */ @@ -91,6 +101,29 @@ export const vercelBlobStorage: VercelBlobStoragePlugin = const baseUrl = `https://${storeId}.${optionsWithDefaults.access}.blob.vercel-storage.com` + initClientUploads< + VercelBlobClientUploadHandlerExtra, + VercelBlobStorageOptions['collections'][string] + >({ + clientHandler: '@payloadcms/storage-vercel-blob/client#VercelBlobClientUploadHandler', + collections: options.collections, + config: incomingConfig, + enabled: !!options.clientUploads, + extraClientHandlerProps: (collection) => ({ + addRandomSuffix: !!optionsWithDefaults.addRandomSuffix, + baseURL: baseUrl, + prefix: (typeof collection === 'object' && collection.prefix) || '', + }), + serverHandler: getClientUploadRoute({ + access: + typeof options.clientUploads === 'object' ? options.clientUploads.access : undefined, + addRandomSuffix: optionsWithDefaults.addRandomSuffix, + cacheControlMaxAge: options.cacheControlMaxAge, + token: options.token, + }), + serverHandlerPath: '/vercel-blob-client-upload-route', + }) + const adapter = vercelBlobStorageInternal({ ...optionsWithDefaults, baseUrl }) // Add adapter to each collection option object diff --git a/packages/storage-vercel-blob/src/staticHandler.ts b/packages/storage-vercel-blob/src/staticHandler.ts index 203ad27b27..008576f336 100644 --- a/packages/storage-vercel-blob/src/staticHandler.ts +++ b/packages/storage-vercel-blob/src/staticHandler.ts @@ -22,7 +22,6 @@ export const getStaticHandler = ( const fileUrl = `${baseUrl}/${fileKey}` const etagFromHeaders = req.headers.get('etag') || req.headers.get('if-none-match') - const blobMetadata = await head(fileUrl, { token }) const uploadedAtString = blobMetadata.uploadedAt.toISOString() const ETag = `"${fileKey}-${uploadedAtString}"` diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts index 6adfedd708..68d0594303 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts +++ b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts @@ -1,16 +1,43 @@ -import type { FormState } from 'payload' +import type { CollectionSlug, FormState } from 'payload' import { serialize } from 'object-to-formdata' import { reduceFieldsToValues } from 'payload/shared' -export function createFormData(formState: FormState = {}, overrides: Record = {}) { +import type { UploadHandlersContext } from '../../../providers/UploadHandlers/index.js' + +export async function createFormData( + formState: FormState = {}, + overrides: Record = {}, + collectionSlug: CollectionSlug, + uploadHandler: ReturnType, +) { const data = reduceFieldsToValues(formState, true) - const file = data?.file + let file = data?.file if (file) { delete data.file } + let clientUploadContext = null + + if (typeof uploadHandler === 'function') { + let filename = file.name + clientUploadContext = await uploadHandler({ + file, + updateFilename: (value) => { + filename = value + }, + }) + + file = JSON.stringify({ + clientUploadContext, + collectionSlug, + filename, + mimeType: file.type, + size: file.size, + }) + } + const dataWithOverrides = { ...data, ...overrides, diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx index 965d90478a..628d03544f 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx +++ b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx @@ -15,6 +15,7 @@ import { useConfig } from '../../../providers/Config/index.js' import { useLocale } from '../../../providers/Locale/index.js' import { useServerFunctions } from '../../../providers/ServerFunctions/index.js' import { useTranslation } from '../../../providers/Translation/index.js' +import { useUploadHandlers } from '../../../providers/UploadHandlers/index.js' import { hasSavePermission as getHasSavePermission } from '../../../utilities/hasSavePermission.js' import { LoadingOverlay } from '../../Loading/index.js' import { useLoadingOverlay } from '../../LoadingOverlay/index.js' @@ -94,6 +95,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { const { i18n, t } = useTranslation() const { getDocumentSlots, getFormState } = useServerFunctions() + const { getUploadHandler } = useUploadHandlers() const [documentSlots, setDocumentSlots] = React.useState({}) const [hasSubmitted, setHasSubmitted] = React.useState(false) @@ -296,7 +298,12 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { setLoadingText(t('general:uploadingBulk', { current: i + 1, total: currentForms.length })) const req = await fetch(actionURL, { - body: createFormData(form.formState, overrides), + body: await createFormData( + form.formState, + overrides, + collectionSlug, + getUploadHandler({ collectionSlug }), + ), method: 'POST', }) @@ -387,7 +394,17 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { }, }) }, - [actionURL, activeIndex, forms, onSuccess, t, closeModal, drawerSlug], + [ + actionURL, + activeIndex, + forms, + onSuccess, + collectionSlug, + getUploadHandler, + t, + closeModal, + drawerSlug, + ], ) const bulkUpdateForm = React.useCallback( diff --git a/packages/ui/src/exports/client/index.ts b/packages/ui/src/exports/client/index.ts index 2dccdfc451..870044f2e1 100644 --- a/packages/ui/src/exports/client/index.ts +++ b/packages/ui/src/exports/client/index.ts @@ -290,6 +290,8 @@ export { export { ScrollInfoProvider, useScrollInfo } from '../../providers/ScrollInfo/index.js' export { SearchParamsProvider, useSearchParams } from '../../providers/SearchParams/index.js' export { SelectionProvider, useSelection } from '../../providers/Selection/index.js' +export { UploadHandlersProvider, useUploadHandlers } from '../../providers/UploadHandlers/index.js' +export type { UploadHandlersContext } from '../../providers/UploadHandlers/index.js' export { defaultTheme, type Theme, ThemeProvider, useTheme } from '../../providers/Theme/index.js' export { TranslationProvider, useTranslation } from '../../providers/Translation/index.js' export { useWindowInfo, WindowInfoProvider } from '../../providers/WindowInfo/index.js' diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index f2c0356683..5fc0f2cd21 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -32,6 +32,7 @@ import { useOperation } from '../../providers/Operation/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useServerFunctions } from '../../providers/ServerFunctions/index.js' import { useTranslation } from '../../providers/Translation/index.js' +import { useUploadHandlers } from '../../providers/UploadHandlers/index.js' import { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js' import { requests } from '../../utilities/api.js' import { @@ -90,6 +91,7 @@ export const Form: React.FC = (props) => { const { getFormState } = useServerFunctions() const { startRouteTransition } = useRouteTransition() + const { getUploadHandler } = useUploadHandlers() const { config } = useConfig() @@ -319,7 +321,7 @@ export const Form: React.FC = (props) => { return } - const formData = contextRef.current.createFormData(overrides, { + const formData = await contextRef.current.createFormData(overrides, { mergeOverrideData: Boolean(typeof overridesFromArgs !== 'function'), }) @@ -480,34 +482,58 @@ export const Form: React.FC = (props) => { [], ) - const createFormData = useCallback((overrides, { mergeOverrideData = true }) => { - let data = reduceFieldsToValues(contextRef.current.fields, true) + const createFormData = useCallback( + async (overrides, { mergeOverrideData = true }) => { + let data = reduceFieldsToValues(contextRef.current.fields, true) - const file = data?.file + let file = data?.file - if (file) { - delete data.file - } - - if (mergeOverrideData) { - data = { - ...data, - ...overrides, + if (file) { + delete data.file } - } else { - data = overrides - } - const dataToSerialize = { - _payload: JSON.stringify(data), - file, - } + if (mergeOverrideData) { + data = { + ...data, + ...overrides, + } + } else { + data = overrides + } - // nullAsUndefineds is important to allow uploads and relationship fields to clear themselves - const formData = serialize(dataToSerialize, { indices: true, nullsAsUndefineds: false }) + const handler = getUploadHandler({ collectionSlug }) - return formData - }, []) + if (typeof handler === 'function') { + let clientUploadContext = null + let filename = file.name + clientUploadContext = await handler({ + file, + updateFilename: (value) => { + filename = value + }, + }) + + file = JSON.stringify({ + clientUploadContext, + collectionSlug, + filename, + mimeType: file.type, + size: file.size, + }) + } + + const dataToSerialize = { + _payload: JSON.stringify(data), + file, + } + + // nullAsUndefineds is important to allow uploads and relationship fields to clear themselves + const formData = serialize(dataToSerialize, { indices: true, nullsAsUndefineds: false }) + + return formData + }, + [collectionSlug, getUploadHandler], + ) const reset = useCallback( async (data: unknown) => { diff --git a/packages/ui/src/forms/Form/types.ts b/packages/ui/src/forms/Form/types.ts index b8a33ee821..5455e189ac 100644 --- a/packages/ui/src/forms/Form/types.ts +++ b/packages/ui/src/forms/Form/types.ts @@ -84,7 +84,7 @@ export type CreateFormData = ( * @default true */ options?: { mergeOverrideData?: boolean }, -) => FormData +) => FormData | Promise export type GetFields = () => FormState export type GetField = (path: string) => FormField export type GetData = () => Data diff --git a/packages/ui/src/providers/Root/index.tsx b/packages/ui/src/providers/Root/index.tsx index 4291468275..7f94aa2c34 100644 --- a/packages/ui/src/providers/Root/index.tsx +++ b/packages/ui/src/providers/Root/index.tsx @@ -34,6 +34,7 @@ import { ServerFunctionsProvider } from '../ServerFunctions/index.js' import { ThemeProvider } from '../Theme/index.js' import { ToastContainer } from '../ToastContainer/index.js' import { TranslationProvider } from '../Translation/index.js' +import { UploadHandlersProvider } from '../UploadHandlers/index.js' type Props = { readonly children: React.ReactNode @@ -106,7 +107,9 @@ export const RootProvider: React.FC = ({ - {children} + + {children} + diff --git a/packages/ui/src/providers/UploadHandlers/index.tsx b/packages/ui/src/providers/UploadHandlers/index.tsx new file mode 100644 index 0000000000..b3ac8009d8 --- /dev/null +++ b/packages/ui/src/providers/UploadHandlers/index.tsx @@ -0,0 +1,54 @@ +'use client' +import type { UploadCollectionSlug } from 'payload' + +import React, { useState } from 'react' + +type UploadHandler = (args: { + file: File + updateFilename: (filename: string) => void +}) => Promise + +export type UploadHandlersContext = { + getUploadHandler: (args: { collectionSlug: UploadCollectionSlug }) => null | UploadHandler + setUploadHandler: (args: { + collectionSlug: UploadCollectionSlug + handler: UploadHandler + }) => unknown +} + +const Context = React.createContext(null) + +export const UploadHandlersProvider = ({ children }) => { + const [uploadHandlers, setUploadHandlers] = useState>( + () => new Map(), + ) + + const getUploadHandler: UploadHandlersContext['getUploadHandler'] = ({ collectionSlug }) => { + return uploadHandlers.get(collectionSlug) + } + + const setUploadHandler: UploadHandlersContext['setUploadHandler'] = ({ + collectionSlug, + handler, + }) => { + setUploadHandlers((uploadHandlers) => { + const clone = new Map(uploadHandlers) + clone.set(collectionSlug, handler) + return clone + }) + } + + return ( + {children} + ) +} + +export const useUploadHandlers = (): UploadHandlersContext => { + const context = React.useContext(Context) + + if (context === null) { + throw new Error('useUploadHandlers must be used within UploadHandlersProvider') + } + + return context +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 033685d85c..4bba2b98c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -956,16 +956,31 @@ importers: packages/plugin-cloud-storage: dependencies: + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui find-node-modules: specifier: ^2.1.3 version: 2.1.3 range-parser: specifier: ^1.2.1 version: 1.2.1 + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) devDependencies: '@types/find-node-modules': specifier: ^2.1.2 version: 2.1.2 + '@types/react': + specifier: 19.0.1 + version: 19.0.1 + '@types/react-dom': + specifier: 19.0.1 + version: 19.0.1 payload: specifier: workspace:* version: link:../payload @@ -1408,6 +1423,9 @@ importers: '@aws-sdk/lib-storage': specifier: ^3.614.0 version: 3.687.0(@aws-sdk/client-s3@3.687.0) + '@aws-sdk/s3-request-presigner': + specifier: ^3.614.0 + version: 3.750.0 '@payloadcms/plugin-cloud-storage': specifier: workspace:* version: link:../plugin-cloud-storage @@ -1929,6 +1947,10 @@ packages: resolution: {integrity: sha512-Xt3DV4DnAT3v2WURwzTxWQK34Ew+iiLzoUoguvLaZrVMFOqMMrwVjP+sizqIaHp1j7rGmFcN5I8saXnsDLuQLA==} engines: {node: '>=16.0.0'} + '@aws-sdk/core@3.750.0': + resolution: {integrity: sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==} + engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-cognito-identity@3.687.0': resolution: {integrity: sha512-hJq9ytoj2q/Jonc7mox/b0HT+j4NeMRuU184DkXRJbvIvwwB+oMt12221kThLezMhwIYfXEteZ7GEId7Hn8Y8g==} engines: {node: '>=16.0.0'} @@ -2007,6 +2029,10 @@ packages: resolution: {integrity: sha512-YGHYqiyRiNNucmvLrfx3QxIkjSDWR/+cc72bn0lPvqFUQBRHZgmYQLxVYrVZSmRzzkH2FQ1HsZcXhOafLbq4vQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.750.0': + resolution: {integrity: sha512-3H6Z46cmAQCHQ0z8mm7/cftY5ifiLfCjbObrbyyp2fhQs9zk6gCKzIX8Zjhw0RMd93FZi3ebRuKJWmMglf4Itw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-ssec@3.686.0': resolution: {integrity: sha512-zJXml/CpVHFUdlGQqja87vNQ3rPB5SlDbfdwxlj1KBbjnRRwpBtxxmOlWRShg8lnVV6aIMGv95QmpIFy4ayqnQ==} engines: {node: '>=16.0.0'} @@ -2019,10 +2045,18 @@ packages: resolution: {integrity: sha512-6zXD3bSD8tcsMAVVwO1gO7rI1uy2fCD3czgawuPGPopeLiPpo6/3FoUWCQzk2nvEhj7p9Z4BbjwZGSlRkVrXTw==} engines: {node: '>=16.0.0'} + '@aws-sdk/s3-request-presigner@3.750.0': + resolution: {integrity: sha512-G4GNngNQlh9EyJZj2WKOOikX0Fev1WSxTV/XJugaHlpnVriebvi3GzolrgxUpRrcGpFGWjmAxLi/gYxTUla1ow==} + engines: {node: '>=18.0.0'} + '@aws-sdk/signature-v4-multi-region@3.687.0': resolution: {integrity: sha512-vdOQHCRHJPX9mT8BM6xOseazHD6NodvHl9cyF5UjNtLn+gERRJEItIA9hf0hlt62odGD8Fqp+rFRuqdmbNkcNw==} engines: {node: '>=16.0.0'} + '@aws-sdk/signature-v4-multi-region@3.750.0': + resolution: {integrity: sha512-RA9hv1Irro/CrdPcOEXKwJ0DJYJwYCsauGEdRXihrRfy8MNSR9E+mD5/Fr5Rxjaq5AHM05DYnN3mg/DU6VwzSw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.686.0': resolution: {integrity: sha512-9oL4kTCSePFmyKPskibeiOXV6qavPZ63/kXM9Wh9V6dTSvBtLeNnMxqGvENGKJcTdIgtoqyqA6ET9u0PJ5IRIg==} engines: {node: '>=16.0.0'} @@ -2033,14 +2067,26 @@ packages: resolution: {integrity: sha512-xFnrb3wxOoJcW2Xrh63ZgFo5buIu9DF7bOHnwoUxHdNpUXicUh0AHw85TjXxyxIAd0d1psY/DU7QHoNI3OswgQ==} engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.734.0': + resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-arn-parser@3.679.0': resolution: {integrity: sha512-CwzEbU8R8rq9bqUFryO50RFBlkfufV9UfMArHPWlo+lmsC+NlSluHQALoj6Jkq3zf5ppn1CN0c1DDLrEqdQUXg==} engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.723.0': + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.686.0': resolution: {integrity: sha512-7msZE2oYl+6QYeeRBjlDgxQUhq/XRky3cXE0FqLFs2muLS7XSuQEXkpOXB3R782ygAP6JX0kmBxPTLurRTikZg==} engines: {node: '>=16.0.0'} + '@aws-sdk/util-format-url@3.734.0': + resolution: {integrity: sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw==} + engines: {node: '>=18.0.0'} + '@aws-sdk/util-locate-window@3.679.0': resolution: {integrity: sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA==} engines: {node: '>=16.0.0'} @@ -3655,79 +3701,67 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -4043,49 +4077,42 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.0.1': resolution: {integrity: sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.0.1': resolution: {integrity: sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.0.1': resolution: {integrity: sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.0.1': resolution: {integrity: sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.0.1': resolution: {integrity: sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.0.1': resolution: {integrity: sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@napi-rs/nice-win32-arm64-msvc@1.0.1': resolution: {integrity: sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==} @@ -4174,84 +4201,72 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@15.1.3': resolution: {integrity: sha512-YbdaYjyHa4fPK4GR4k2XgXV0p8vbU1SZh7vv6El4bl9N+ZSiMfbmqCuCuNU1Z4ebJMumafaz6UCC2zaJCsdzjw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@15.1.5': resolution: {integrity: sha512-rDJC4ctlYbK27tCyFUhgIv8o7miHNlpCjb2XXfTLQszwAUOSbcMN9q2y3urSrrRCyGVOd9ZR9a4S45dRh6JF3A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@15.0.3': resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@15.1.3': resolution: {integrity: sha512-qgH/aRj2xcr4BouwKG3XdqNu33SDadqbkqB6KaZZkozar857upxKakbRllpqZgWl/NDeSCBYPmUAZPBHZpbA0w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@15.1.5': resolution: {integrity: sha512-FG5RApf4Gu+J+pHUQxXPM81oORZrKBYKUaBTylEIQ6Lz17hKVDsLbSXInfXM0giclvXbyiLXjTv42sQMATmZ0A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@15.0.3': resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@15.1.3': resolution: {integrity: sha512-uzafnTFwZCPN499fNVnS2xFME8WLC9y7PLRs/yqz5lz1X/ySoxfaK2Hbz74zYUdEg+iDZPd8KlsWaw9HKkLEVw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@15.1.5': resolution: {integrity: sha512-NX2Ar3BCquAOYpnoYNcKz14eH03XuF7SmSlPzTSSU4PJe7+gelAjxo3Y7F2m8+hLT8ZkkqElawBp7SWBdzwqQw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@15.0.3': resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@15.1.3': resolution: {integrity: sha512-el6GUFi4SiDYnMTTlJJFMU+GHvw0UIFnffP1qhurrN1qJV3BqaSRUjkDUgVV44T6zpw1Lc6u+yn0puDKHs+Sbw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@15.1.5': resolution: {integrity: sha512-EQgqMiNu3mrV5eQHOIgeuh6GB5UU57tu17iFnLfBEhYfiOfyK+vleYKh2dkRVkV6ayx3eSqbIYgE7J7na4hhcA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@15.0.3': resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==} @@ -4538,25 +4553,21 @@ packages: resolution: {integrity: sha512-otVbS4zeo3n71zgGLBYRTriDzc0zpruC0WI3ICwjpIk454cLwGV0yzh4jlGYWQJYJk0BRAmXFd3ooKIF+bKBHw==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@1.12.0': resolution: {integrity: sha512-IStQDjIT7Lzmqg1i9wXvPL/NsYsxF24WqaQFS8b8rxra+z0VG7saBOsEnOaa4jcEY8MVpLYabFhTV+fSsA2vnA==} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-resolver/binding-linux-x64-gnu@1.12.0': resolution: {integrity: sha512-SipT7EVORz8pOQSFwemOm91TpSiBAGmOjG830/o+aLEsvQ4pEy223+SAnCfITh7+AahldYsJnVoIs519jmIlKQ==} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@1.12.0': resolution: {integrity: sha512-mGh0XfUzKdn+WFaqPacziNraCWL5znkHRfQVxG9avGS9zb2KC/N1EBbPzFqutDwixGDP54r2gx4q54YCJEZ4iQ==} cpu: [x64] os: [linux] - libc: [musl] '@oxc-resolver/binding-wasm32-wasi@1.12.0': resolution: {integrity: sha512-SZN6v7apKmQf/Vwiqb6e/s3Y2Oacw8uW8V2i1AlxtyaEFvnFE0UBn89zq6swEwE3OCajNWs0yPvgAXUMddYc7Q==} @@ -4795,6 +4806,10 @@ packages: resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==} engines: {node: '>=16.0.0'} + '@smithy/abort-controller@4.0.1': + resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} + engines: {node: '>=18.0.0'} + '@smithy/chunked-blob-reader-native@3.0.1': resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} @@ -4809,6 +4824,10 @@ packages: resolution: {integrity: sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==} engines: {node: '>=16.0.0'} + '@smithy/core@3.1.4': + resolution: {integrity: sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@3.2.5': resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==} engines: {node: '>=16.0.0'} @@ -4835,6 +4854,10 @@ packages: '@smithy/fetch-http-handler@4.0.0': resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==} + '@smithy/fetch-http-handler@5.0.1': + resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} + engines: {node: '>=18.0.0'} + '@smithy/hash-blob-browser@3.1.7': resolution: {integrity: sha512-4yNlxVNJifPM5ThaA5HKnHkn7JhctFUHvcaz6YXxHlYOSIrzI6VKQPTN8Gs1iN5nqq9iFcwIR9THqchUCouIfg==} @@ -4857,6 +4880,10 @@ packages: resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} engines: {node: '>=16.0.0'} + '@smithy/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} + '@smithy/md5-js@3.0.8': resolution: {integrity: sha512-LwApfTK0OJ/tCyNUXqnWCKoE2b4rDSr4BJlDAVCkiWYeHESr+y+d5zlAanuLW6fnitVJRD/7d9/kN/ZM9Su4mA==} @@ -4868,6 +4895,10 @@ packages: resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@4.0.5': + resolution: {integrity: sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-retry@3.0.25': resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==} engines: {node: '>=16.0.0'} @@ -4876,34 +4907,66 @@ packages: resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.0.2': + resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} + engines: {node: '>=18.0.0'} + '@smithy/middleware-stack@3.0.8': resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==} engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.0.1': + resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} + engines: {node: '>=18.0.0'} + '@smithy/node-config-provider@3.1.9': resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==} engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.0.1': + resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} + engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@3.2.5': resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==} engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@4.0.2': + resolution: {integrity: sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@3.1.8': resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==} engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.0.1': + resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} + engines: {node: '>=18.0.0'} + '@smithy/protocol-http@4.1.5': resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==} engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.0.1': + resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-builder@3.0.8': resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==} engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.0.1': + resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} + engines: {node: '>=18.0.0'} + '@smithy/querystring-parser@3.0.8': resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==} engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.0.1': + resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} + engines: {node: '>=18.0.0'} + '@smithy/service-error-classification@3.0.8': resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==} engines: {node: '>=16.0.0'} @@ -4912,28 +4975,56 @@ packages: resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==} engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@4.0.1': + resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} + engines: {node: '>=18.0.0'} + '@smithy/signature-v4@4.2.1': resolution: {integrity: sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==} engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.0.1': + resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} + engines: {node: '>=18.0.0'} + '@smithy/smithy-client@3.4.2': resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==} engines: {node: '>=16.0.0'} + '@smithy/smithy-client@4.1.5': + resolution: {integrity: sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==} + engines: {node: '>=18.0.0'} + '@smithy/types@3.6.0': resolution: {integrity: sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==} engines: {node: '>=16.0.0'} + '@smithy/types@4.1.0': + resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} + engines: {node: '>=18.0.0'} + '@smithy/url-parser@3.0.8': resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==} + '@smithy/url-parser@4.0.1': + resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} + engines: {node: '>=18.0.0'} + '@smithy/util-base64@3.0.0': resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} engines: {node: '>=16.0.0'} + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-browser@3.0.0': resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} + '@smithy/util-body-length-node@3.0.0': resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} @@ -4946,10 +5037,18 @@ packages: resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} + '@smithy/util-config-provider@3.0.0': resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} engines: {node: '>=16.0.0'} + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} + '@smithy/util-defaults-mode-browser@3.0.25': resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==} engines: {node: '>= 10.0.0'} @@ -4966,10 +5065,18 @@ packages: resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} + '@smithy/util-middleware@3.0.8': resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==} engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.0.1': + resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} + engines: {node: '>=18.0.0'} + '@smithy/util-retry@3.0.8': resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==} engines: {node: '>=16.0.0'} @@ -4978,10 +5085,18 @@ packages: resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==} engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.1.1': + resolution: {integrity: sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@3.0.0': resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} + '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} @@ -4990,6 +5105,10 @@ packages: resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} engines: {node: '>=16.0.0'} + '@smithy/util-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} + '@smithy/util-waiter@3.1.7': resolution: {integrity: sha512-d5yGlQtmN/z5eoTtIYgkvOw27US2Ous4VycnXatyoImIF9tzlcpnKqQ/V7qhvJmb2p6xZne1NopCLakdTnkBBQ==} engines: {node: '>=16.0.0'} @@ -5044,28 +5163,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.10.12': resolution: {integrity: sha512-oqhSmV+XauSf0C//MoQnVErNUB/5OzmSiUzuazyLsD5pwqKNN+leC3JtRQ/QVzaCpr65jv9bKexT9+I2Tt3xDw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.10.12': resolution: {integrity: sha512-XldSIHyjD7m1Gh+/8rxV3Ok711ENLI420CU2EGEqSe3VSGZ7pHJvJn9ZFbYpWhsLxPqBYMFjp3Qw+J6OXCPXCA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.10.12': resolution: {integrity: sha512-wvPXzJxzPgTqhyp1UskOx1hRTtdWxlyFD1cGWOxgLsMik0V9xKRgqKnMPv16Nk7L9xl6quQ6DuUHj9ID7L3oVw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.10.12': resolution: {integrity: sha512-TUYzWuu1O7uyIcRfxdm6Wh1u+gNnrW5M1DUgDOGZLsyQzgc2Zjwfh2llLhuAIilvCVg5QiGbJlpibRYJ/8QGsg==} @@ -5846,6 +5961,7 @@ packages: bson@6.10.1: resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} engines: {node: '>=16.20.1'} + deprecated: a critical bug affecting only useBigInt64=true deserialization usage is fixed in bson@6.10.3 buffer-builder@0.2.0: resolution: {integrity: sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==} @@ -10554,6 +10670,20 @@ snapshots: fast-xml-parser: 4.4.1 tslib: 2.8.1 + '@aws-sdk/core@3.750.0': + dependencies: + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.4 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.5 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 + fast-xml-parser: 4.4.1 + tslib: 2.8.1 + '@aws-sdk/credential-provider-cognito-identity@3.687.0': dependencies: '@aws-sdk/client-cognito-identity': 3.687.0 @@ -10764,6 +10894,23 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@aws-sdk/middleware-sdk-s3@3.750.0': + dependencies: + '@aws-sdk/core': 3.750.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/core': 3.1.4 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.5 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@aws-sdk/middleware-ssec@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 @@ -10789,6 +10936,17 @@ snapshots: '@smithy/util-middleware': 3.0.8 tslib: 2.8.1 + '@aws-sdk/s3-request-presigner@3.750.0': + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.750.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-format-url': 3.734.0 + '@smithy/middleware-endpoint': 4.0.5 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.5 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.687.0': dependencies: '@aws-sdk/middleware-sdk-s3': 3.687.0 @@ -10798,6 +10956,15 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@aws-sdk/signature-v4-multi-region@3.750.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.750.0 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@aws-sdk/token-providers@3.686.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0))': dependencies: '@aws-sdk/client-sso-oidc': 3.687.0(@aws-sdk/client-sts@3.687.0) @@ -10812,10 +10979,19 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@aws-sdk/types@3.734.0': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@aws-sdk/util-arn-parser@3.679.0': dependencies: tslib: 2.8.1 + '@aws-sdk/util-arn-parser@3.723.0': + dependencies: + tslib: 2.8.1 + '@aws-sdk/util-endpoints@3.686.0': dependencies: '@aws-sdk/types': 3.686.0 @@ -10823,6 +10999,13 @@ snapshots: '@smithy/util-endpoints': 2.1.4 tslib: 2.8.1 + '@aws-sdk/util-format-url@3.734.0': + dependencies: + '@aws-sdk/types': 3.734.0 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@aws-sdk/util-locate-window@3.679.0': dependencies: tslib: 2.8.1 @@ -13871,6 +14054,11 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/abort-controller@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/chunked-blob-reader-native@3.0.1': dependencies: '@smithy/util-base64': 3.0.0 @@ -13899,6 +14087,17 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/core@3.1.4': + dependencies: + '@smithy/middleware-serde': 4.0.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.1 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/credential-provider-imds@3.2.5': dependencies: '@smithy/node-config-provider': 3.1.9 @@ -13945,6 +14144,14 @@ snapshots: '@smithy/util-base64': 3.0.0 tslib: 2.8.1 + '@smithy/fetch-http-handler@5.0.1': + dependencies: + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 + tslib: 2.8.1 + '@smithy/hash-blob-browser@3.1.7': dependencies: '@smithy/chunked-blob-reader': 4.0.0 @@ -13978,6 +14185,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/is-array-buffer@4.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/md5-js@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -14001,6 +14212,17 @@ snapshots: '@smithy/util-middleware': 3.0.8 tslib: 2.8.1 + '@smithy/middleware-endpoint@4.0.5': + dependencies: + '@smithy/core': 3.1.4 + '@smithy/middleware-serde': 4.0.2 + '@smithy/node-config-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-middleware': 4.0.1 + tslib: 2.8.1 + '@smithy/middleware-retry@3.0.25': dependencies: '@smithy/node-config-provider': 3.1.9 @@ -14018,11 +14240,21 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/middleware-serde@4.0.2': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/middleware-stack@3.0.8': dependencies: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/middleware-stack@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/node-config-provider@3.1.9': dependencies: '@smithy/property-provider': 3.1.8 @@ -14030,6 +14262,13 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/node-config-provider@4.0.1': + dependencies: + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/node-http-handler@3.2.5': dependencies: '@smithy/abort-controller': 3.1.6 @@ -14038,27 +14277,56 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.0.2': + dependencies: + '@smithy/abort-controller': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/property-provider@3.1.8': dependencies: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/property-provider@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/protocol-http@4.1.5': dependencies: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/protocol-http@5.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/querystring-builder@3.0.8': dependencies: '@smithy/types': 3.6.0 '@smithy/util-uri-escape': 3.0.0 tslib: 2.8.1 + '@smithy/querystring-builder@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + '@smithy/util-uri-escape': 4.0.0 + tslib: 2.8.1 + '@smithy/querystring-parser@3.0.8': dependencies: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/querystring-parser@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/service-error-classification@3.0.8': dependencies: '@smithy/types': 3.6.0 @@ -14068,6 +14336,11 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/shared-ini-file-loader@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/signature-v4@4.2.1': dependencies: '@smithy/is-array-buffer': 3.0.0 @@ -14079,6 +14352,17 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/signature-v4@5.0.1': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/smithy-client@3.4.2': dependencies: '@smithy/core': 2.5.1 @@ -14089,26 +14373,56 @@ snapshots: '@smithy/util-stream': 3.2.1 tslib: 2.8.1 + '@smithy/smithy-client@4.1.5': + dependencies: + '@smithy/core': 3.1.4 + '@smithy/middleware-endpoint': 4.0.5 + '@smithy/middleware-stack': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-stream': 4.1.1 + tslib: 2.8.1 + '@smithy/types@3.6.0': dependencies: tslib: 2.8.1 + '@smithy/types@4.1.0': + dependencies: + tslib: 2.8.1 + '@smithy/url-parser@3.0.8': dependencies: '@smithy/querystring-parser': 3.0.8 '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/url-parser@4.0.1': + dependencies: + '@smithy/querystring-parser': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/util-base64@3.0.0': dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/util-base64@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/util-body-length-browser@3.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-body-length-browser@4.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-body-length-node@3.0.0': dependencies: tslib: 2.8.1 @@ -14123,10 +14437,19 @@ snapshots: '@smithy/is-array-buffer': 3.0.0 tslib: 2.8.1 + '@smithy/util-buffer-from@4.0.0': + dependencies: + '@smithy/is-array-buffer': 4.0.0 + tslib: 2.8.1 + '@smithy/util-config-provider@3.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-config-provider@4.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-defaults-mode-browser@3.0.25': dependencies: '@smithy/property-provider': 3.1.8 @@ -14155,11 +14478,20 @@ snapshots: dependencies: tslib: 2.8.1 + '@smithy/util-hex-encoding@4.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-middleware@3.0.8': dependencies: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@smithy/util-middleware@4.0.1': + dependencies: + '@smithy/types': 4.1.0 + tslib: 2.8.1 + '@smithy/util-retry@3.0.8': dependencies: '@smithy/service-error-classification': 3.0.8 @@ -14177,10 +14509,25 @@ snapshots: '@smithy/util-utf8': 3.0.0 tslib: 2.8.1 + '@smithy/util-stream@4.1.1': + dependencies: + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/node-http-handler': 4.0.2 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@3.0.0': dependencies: tslib: 2.8.1 + '@smithy/util-uri-escape@4.0.0': + dependencies: + tslib: 2.8.1 + '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 @@ -14191,6 +14538,11 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 tslib: 2.8.1 + '@smithy/util-utf8@4.0.0': + dependencies: + '@smithy/util-buffer-from': 4.0.0 + tslib: 2.8.1 + '@smithy/util-waiter@3.1.7': dependencies: '@smithy/abort-controller': 3.1.6 diff --git a/test/storage-uploadthing/config.ts b/test/storage-uploadthing/config.ts index 871644e495..c5c66222be 100644 --- a/test/storage-uploadthing/config.ts +++ b/test/storage-uploadthing/config.ts @@ -36,6 +36,7 @@ export default buildConfigWithDefaults({ }, plugins: [ uploadthingStorage({ + clientUploads: true, collections: { [mediaSlug]: true, }, diff --git a/tsconfig.base.json b/tsconfig.base.json index ffd7ec771c..26c3c9821e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -66,7 +66,15 @@ "./packages/plugin-multi-tenant/src/exports/client.ts" ], "@payloadcms/plugin-multi-tenant": ["./packages/plugin-multi-tenant/src/index.ts"], - "@payloadcms/next": ["./packages/next/src/exports/*"] + "@payloadcms/next": ["./packages/next/src/exports/*"], + "@payloadcms/storage-s3/client": ["./packages/storage-s3/src/exports/client.ts"], + "@payloadcms/storage-vercel-blob/client": [ + "./packages/storage-vercel-blob/src/exports/client.ts" + ], + "@payloadcms/storage-gcs/client": ["./packages/storage-gcs/src/exports/client.ts"], + "@payloadcms/storage-uploadthing/client": [ + "./packages/storage-uploadthing/src/exports/client.ts" + ] } }, "include": ["${configDir}/src"], diff --git a/tsconfig.json b/tsconfig.json index a9f8afbb34..33c6a6c045 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -40,6 +40,9 @@ { "path": "./packages/plugin-cloud-storage" }, + { + "path": "./packages/storage-s3" + }, { "path": "./packages/payload-cloud" }, From b975858e76ce9ebe1474b1f584d91510554ab4c1 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 26 Feb 2025 16:54:39 -0500 Subject: [PATCH 008/127] test: removes all unnecessary page.waitForURL methods (#11412) Removes all unnecessary `page.waitForURL` methods within e2e tests. These are unneeded when following a `page.goto` call because the subsequent page load is already being awaited. It is only a requirement when: - Clicking a link and expecting navigation - Expecting a redirect after a route change - Waiting for a change in search params --- test/access-control/e2e.spec.ts | 23 +++++---------- test/admin/e2e/document-view/e2e.spec.ts | 23 ++------------- test/admin/e2e/general/e2e.spec.ts | 2 ++ test/admin/e2e/list-view/e2e.spec.ts | 8 ----- test/auth/e2e.spec.ts | 1 - test/fields-relationship/e2e.spec.ts | 1 - test/fields/collections/Date/e2e.spec.ts | 3 -- test/fields/collections/Indexed/e2e.spec.ts | 1 - test/fields/collections/JSON/e2e.spec.ts | 2 -- test/fields/collections/Point/e2e.spec.ts | 2 -- .../collections/Relationship/e2e.spec.ts | 22 +++++++------- test/fields/collections/RichText/e2e.spec.ts | 1 - test/fields/collections/Tabs/e2e.spec.ts | 1 - test/helpers.ts | 2 +- test/helpers/e2e/navigateToDoc.ts | 2 +- test/i18n/e2e.spec.ts | 1 - test/live-preview/e2e.spec.ts | 5 +--- test/live-preview/helpers.ts | 2 -- test/localization/e2e.spec.ts | 8 ++--- test/locked-documents/e2e.spec.ts | 29 ------------------- test/uploads/e2e.spec.ts | 17 ----------- test/versions/e2e.spec.ts | 9 ------ 22 files changed, 31 insertions(+), 134 deletions(-) diff --git a/test/access-control/e2e.spec.ts b/test/access-control/e2e.spec.ts index 90edf52996..006f94542f 100644 --- a/test/access-control/e2e.spec.ts +++ b/test/access-control/e2e.spec.ts @@ -232,16 +232,14 @@ describe('Access Control', () => { test('ensure complex collection config fields show up in correct read-only state', async () => { const regression1URL = new AdminUrlUtil(serverURL, 'regression1') await page.goto(regression1URL.list) - // Click on first card + await page.locator('.cell-id a').first().click() - // wait for url await page.waitForURL(`**/collections/regression1/**`) await ensureRegression1FieldsHaveCorrectAccess() // Edit any field await page.locator('#field-group1__text').fill('test!') - // Save the doc await saveDocAndAssert(page) await wait(1000) // Ensure fields still have the correct readOnly state. When saving the document, permissions are re-evaluated @@ -278,18 +276,17 @@ describe('Access Control', () => { test('ensure complex collection config fields show up in correct read-only state 2', async () => { const regression2URL = new AdminUrlUtil(serverURL, 'regression2') await page.goto(regression2URL.list) - // Click on first card + await page.locator('.cell-id a').first().click() - // wait for url await page.waitForURL(`**/collections/regression2/**`) await ensureRegression2FieldsHaveCorrectAccess() // Edit any field await page.locator('#field-group__text').fill('test!') - // Save the doc await saveDocAndAssert(page) await wait(1000) + // Ensure fields still have the correct readOnly state. When saving the document, permissions are re-evaluated await ensureRegression2FieldsHaveCorrectAccess() }) @@ -407,7 +404,6 @@ describe('Access Control', () => { test('should not show edit button', async () => { const createNotUpdateURL = new AdminUrlUtil(serverURL, createNotUpdateCollectionSlug) await page.goto(createNotUpdateURL.create) - await page.waitForURL(createNotUpdateURL.create) await expect(page.locator('#field-name')).toBeVisible() await page.locator('#field-name').fill('name') await expect(page.locator('#field-name')).toHaveValue('name') @@ -450,7 +446,6 @@ describe('Access Control', () => { test('should not show edit button', async () => { const createNotUpdateURL = new AdminUrlUtil(serverURL, readNotUpdateGlobalSlug) await page.goto(createNotUpdateURL.global(readNotUpdateGlobalSlug)) - await page.waitForURL(createNotUpdateURL.global(readNotUpdateGlobalSlug)) await expect(page.locator('#field-name')).toBeVisible() await expect(page.locator('#field-name')).toBeDisabled() await expect(page.locator('#action-save')).toBeHidden() @@ -513,7 +508,6 @@ describe('Access Control', () => { describe('global', () => { test('should restrict update access based on document field', async () => { await page.goto(userRestrictedGlobalURL.global(userRestrictedGlobalSlug)) - await page.waitForURL(userRestrictedGlobalURL.global(userRestrictedGlobalSlug)) await expect(page.locator('#field-name')).toBeVisible() await expect(page.locator('#field-name')).toHaveValue(devUser.email) await expect(page.locator('#field-name')).toBeEnabled() @@ -531,7 +525,6 @@ describe('Access Control', () => { }) await page.goto(userRestrictedGlobalURL.global(userRestrictedGlobalSlug)) - await page.waitForURL(userRestrictedGlobalURL.global(userRestrictedGlobalSlug)) await expect(page.locator('#field-name')).toBeDisabled() await expect(page.locator('#action-save')).toBeHidden() }) @@ -620,7 +613,6 @@ describe('Access Control', () => { describe('admin access', () => { test('unauthenticated users should not have access to the admin panel', async () => { await page.goto(url.logout) - await page.waitForURL(url.logout) await expect(page.locator('.payload-toast-container')).toContainText( 'You have been logged out successfully.', @@ -629,13 +621,15 @@ describe('Access Control', () => { await expect(page.locator('form.login__form')).toBeVisible() await page.goto(url.admin) + + // wait for redirect to login await page.waitForURL(url.login) + expect(page.url()).toEqual(url.login) }) test('non-admin users should not have access to the admin panel', async () => { await page.goto(url.logout) - await page.waitForURL(url.logout) await login({ data: { @@ -651,7 +645,6 @@ describe('Access Control', () => { ) await page.goto(url.logout) - await page.waitForURL(url.logout) await expect(page.locator('.payload-toast-container')).toContainText( 'You have been logged out successfully.', @@ -662,7 +655,6 @@ describe('Access Control', () => { test('public users should not have access to access admin', async () => { await page.goto(url.logout) - await page.waitForURL(url.logout) const user = await payload.login({ collection: publicUsersSlug, @@ -686,6 +678,8 @@ describe('Access Control', () => { await page.reload() await page.goto(url.admin) + + // await for redirect to unauthorized await page.waitForURL(/unauthorized$/) await expect(page.locator('.unauthorized .form-header h1')).toHaveText( @@ -693,7 +687,6 @@ describe('Access Control', () => { ) await page.goto(url.logout) - await page.waitForURL(url.logout) await expect(page.locator('.payload-toast-container')).toContainText( 'You have been logged out successfully.', diff --git a/test/admin/e2e/document-view/e2e.spec.ts b/test/admin/e2e/document-view/e2e.spec.ts index b4b92ee806..08dd762143 100644 --- a/test/admin/e2e/document-view/e2e.spec.ts +++ b/test/admin/e2e/document-view/e2e.spec.ts @@ -146,7 +146,6 @@ describe('Document View', () => { test('collection — should render preview button when `admin.preview` is set', async () => { const collectionWithPreview = new AdminUrlUtil(serverURL, postsCollectionSlug) await page.goto(collectionWithPreview.create) - await page.waitForURL(collectionWithPreview.create) await page.locator('#field-title').fill(title) await saveDocAndAssert(page) await expect(page.locator('.btn.preview-btn')).toBeVisible() @@ -155,7 +154,6 @@ describe('Document View', () => { test('collection — should not render preview button when `admin.preview` is not set', async () => { const collectionWithoutPreview = new AdminUrlUtil(serverURL, group1Collection1Slug) await page.goto(collectionWithoutPreview.create) - await page.waitForURL(collectionWithoutPreview.create) await page.locator('#field-title').fill(title) await saveDocAndAssert(page) await expect(page.locator('.btn.preview-btn')).toBeHidden() @@ -222,7 +220,6 @@ describe('Document View', () => { const { id } = await createPost() const postURL = postsUrl.edit(id) await page.goto(postURL) - await page.waitForURL(postURL) await wait(500) await page.locator('#field-title')?.fill('') await expect(page.locator('.doc-header__title.render-title:has-text("ID:")')).toBeVisible() @@ -231,7 +228,6 @@ describe('Document View', () => { test('global — should render custom, localized label', async () => { await page.goto(globalURL.global(globalSlug)) - await page.waitForURL(globalURL.global(globalSlug)) await openNav(page) const label = 'My Global Label' const globalLabel = page.locator(`#nav-global-global`) @@ -247,7 +243,6 @@ describe('Document View', () => { test('global — should render simple label strings', async () => { await page.goto(postsUrl.admin) - await page.waitForURL(postsUrl.admin) await openNav(page) const label = 'Group Globals 1' const globalLabel = page.locator(`#nav-global-group-globals-one`) @@ -259,7 +254,6 @@ describe('Document View', () => { test('global — should render slug in sentence case as fallback', async () => { await page.goto(postsUrl.admin) - await page.waitForURL(postsUrl.admin) await openNav(page) const label = 'Group Globals Two' const globalLabel = page.locator(`#nav-global-group-globals-two`) @@ -311,7 +305,6 @@ describe('Document View', () => { const customNestedTabViewURL = `${pageURL}${customNestedTabViewPath}` await page.goto(customNestedTabViewURL) - await page.waitForURL(customNestedTabViewURL) await expect(page.locator('h1#custom-view-title')).toContainText(customNestedTabViewTitle) }) @@ -385,7 +378,6 @@ describe('Document View', () => { describe('descriptions', () => { test('should render tab admin description', async () => { await page.goto(postsUrl.create) - await page.waitForURL(postsUrl.create) const tabsContent = page.locator('.tabs-field__content-wrap') await expect(tabsContent.locator('.field-description')).toHaveText(customTabAdminDescription) @@ -393,7 +385,6 @@ describe('Document View', () => { test('should render tab admin description as a translation function', async () => { await page.goto(postsUrl.create) - await page.waitForURL(postsUrl.create) const secondTab = page.locator('.tabs-field__tab-button').nth(1) await secondTab.click() @@ -410,27 +401,23 @@ describe('Document View', () => { describe('custom fields', () => { test('should render custom field component', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await expect(page.locator('#field-customTextClientField')).toBeVisible() }) test('renders custom label component', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await expect(page.locator('#custom-client-field-label')).toBeVisible() await expect(page.locator('#custom-server-field-label')).toBeVisible() }) test('renders custom field description text', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await expect(page.locator('#custom-client-field-description')).toBeVisible() await expect(page.locator('#custom-server-field-description')).toBeVisible() }) test('custom server components should receive field props', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await expect( page.locator('#custom-server-field-label', { hasText: exactText('Label: the max length of this field is: 100'), @@ -446,12 +433,13 @@ describe('Document View', () => { test('custom client components should receive field props', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) + await expect( page.locator('#custom-client-field-label', { hasText: exactText('Label: the max length of this field is: 100'), }), ).toBeVisible() + await expect( page.locator('#custom-client-field-description', { hasText: exactText('Description: the max length of this field is: 100'), @@ -461,7 +449,6 @@ describe('Document View', () => { test('custom select input can have its value cleared', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await expect(page.locator('#field-customSelectInput')).toBeVisible() await page.locator('#field-customSelectInput .rs__control').click() @@ -480,7 +467,7 @@ describe('Document View', () => { describe('field descriptions', () => { test('should render static field description', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) + await expect(page.locator('.field-description-descriptionAsString')).toContainText( 'Static field description.', ) @@ -488,7 +475,6 @@ describe('Document View', () => { test('should render functional field description', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await page.locator('#field-descriptionAsFunction').fill('functional') await expect(page.locator('.field-description-descriptionAsFunction')).toContainText( 'Function description', @@ -498,7 +484,6 @@ describe('Document View', () => { test('should render component field description', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await page.locator('#field-descriptionAsComponent').fill('component') await expect(page.locator('.field-description-descriptionAsComponent')).toContainText( 'Component description: descriptionAsComponent - component', @@ -507,7 +492,6 @@ describe('Document View', () => { test('should render custom error component', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) const input = page.locator('input[id="field-customTextClientField"]') await input.fill('ab') await expect(input).toHaveValue('ab') @@ -539,7 +523,6 @@ describe('Document View', () => { describe('select field', () => { test('should render custom select options', async () => { await page.goto(customFieldsURL.create) - await page.waitForURL(customFieldsURL.create) await page.locator('#field-customSelectField .rs__control').click() await expect(page.locator('#field-customSelectField .rs__option')).toHaveCount(2) }) diff --git a/test/admin/e2e/general/e2e.spec.ts b/test/admin/e2e/general/e2e.spec.ts index ec77d11e64..44139d1927 100644 --- a/test/admin/e2e/general/e2e.spec.ts +++ b/test/admin/e2e/general/e2e.spec.ts @@ -521,6 +521,8 @@ describe('General', () => { test('should render protected nested custom view', async () => { await page.goto(`${serverURL}${adminRoutes.routes.admin}${protectedCustomNestedViewPath}`) + + // wait for redirect to unauthorized page await page.waitForURL(`**${adminRoutes.routes.admin}/unauthorized`) await expect(page.locator('.unauthorized')).toBeVisible() diff --git a/test/admin/e2e/list-view/e2e.spec.ts b/test/admin/e2e/list-view/e2e.spec.ts index 30c6490b78..2e063210e7 100644 --- a/test/admin/e2e/list-view/e2e.spec.ts +++ b/test/admin/e2e/list-view/e2e.spec.ts @@ -100,7 +100,6 @@ describe('List View', () => { // delete all posts created by the seed await deleteAllPosts() await page.goto(postsUrl.list) - await page.waitForURL((url) => url.toString().startsWith(postsUrl.list)) await expect(page.locator(tableRowLocator)).toBeHidden() await createPost({ title: 'post1' }) @@ -245,7 +244,6 @@ describe('List View', () => { // prefill search with "a" from the query param await page.goto(`${postsUrl.list}?search=dennis`) - await page.waitForURL(new RegExp(`${postsUrl.list}\\?search=dennis`)) // input should be filled out, list should filter await expect(page.locator('.search-filter__input')).toHaveValue('dennis') @@ -256,7 +254,6 @@ describe('List View', () => { const { id } = await createPost() const url = `${postsUrl.list}?limit=10&page=1&search=${id}` await page.goto(url) - await page.waitForURL(url) const tableItems = page.locator(tableRowLocator) await expect(tableItems).toHaveCount(1) }) @@ -265,7 +262,6 @@ describe('List View', () => { const { id } = await createGeo() const url = `${geoUrl.list}?limit=10&page=1&search=${id}` await page.goto(url) - await page.waitForURL(url) const tableItems = page.locator(tableRowLocator) await expect(tableItems).toHaveCount(1) }) @@ -286,7 +282,6 @@ describe('List View', () => { test('search should persist through browser back button', async () => { const url = `${postsUrl.list}?limit=10&page=1&search=post1` await page.goto(url) - await page.waitForURL(url) await expect(page.locator('#search-filter-input')).toHaveValue('post1') await goToFirstCell(page, postsUrl) await page.goBack() @@ -297,7 +292,6 @@ describe('List View', () => { test('search should not persist between navigation', async () => { const url = `${postsUrl.list}?limit=10&page=1&search=test` await page.goto(url) - await page.waitForURL(url) await expect(page.locator('#search-filter-input')).toHaveValue('test') @@ -306,7 +300,6 @@ describe('List View', () => { const uploadsUrl = await page.locator('#nav-uploads').getAttribute('href') await page.goto(serverURL + uploadsUrl) - await page.waitForURL(serverURL + uploadsUrl) await expect(page.locator('#search-filter-input')).toHaveValue('') }) @@ -339,7 +332,6 @@ describe('List View', () => { test('should respect base list filters', async () => { await page.goto(baseListFiltersUrl.list) - await page.waitForURL((url) => url.toString().startsWith(baseListFiltersUrl.list)) await expect(page.locator(tableRowLocator)).toHaveCount(1) }) diff --git a/test/auth/e2e.spec.ts b/test/auth/e2e.spec.ts index c3c2b3ea6f..02253074d5 100644 --- a/test/auth/e2e.spec.ts +++ b/test/auth/e2e.spec.ts @@ -188,7 +188,6 @@ describe('Auth', () => { test('should have up-to-date user in `useAuth` hook', async () => { await page.goto(url.account) - await page.waitForURL(url.account) await expect(page.locator('#users-api-result')).toHaveText('Hello, world!') await expect(page.locator('#use-auth-result')).toHaveText('Hello, world!') const field = page.locator('#field-custom') diff --git a/test/fields-relationship/e2e.spec.ts b/test/fields-relationship/e2e.spec.ts index 56f1802a6b..b68204071a 100644 --- a/test/fields-relationship/e2e.spec.ts +++ b/test/fields-relationship/e2e.spec.ts @@ -494,7 +494,6 @@ describe('Relationship Field', () => { test.skip('should open document drawer from read-only relationships', async () => { const editURL = url.edit(docWithExistingRelations.id) await page.goto(editURL) - await page.waitForURL(editURL) await openDocDrawer( page, diff --git a/test/fields/collections/Date/e2e.spec.ts b/test/fields/collections/Date/e2e.spec.ts index bc86060e4e..773d91a169 100644 --- a/test/fields/collections/Date/e2e.spec.ts +++ b/test/fields/collections/Date/e2e.spec.ts @@ -122,7 +122,6 @@ describe('Date', () => { }) test('create EST day only date', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) const dateField = page.locator('#field-default input') // enter date in default date field @@ -167,7 +166,6 @@ describe('Date', () => { test('create PDT day only date', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) const dateField = page.locator('#field-default input') // enter date in default date field @@ -212,7 +210,6 @@ describe('Date', () => { test('create ST day only date', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) const dateField = page.locator('#field-default input') // enter date in default date field diff --git a/test/fields/collections/Indexed/e2e.spec.ts b/test/fields/collections/Indexed/e2e.spec.ts index 0e64af60cf..73cf008cd8 100644 --- a/test/fields/collections/Indexed/e2e.spec.ts +++ b/test/fields/collections/Indexed/e2e.spec.ts @@ -85,7 +85,6 @@ describe('Radio', () => { }) await page.goto(url.create) - await page.waitForURL(url.create) await page.locator('#field-text').fill('test') await page.locator('#field-uniqueText').fill(uniqueText) diff --git a/test/fields/collections/JSON/e2e.spec.ts b/test/fields/collections/JSON/e2e.spec.ts index feafa0e053..f920534bc4 100644 --- a/test/fields/collections/JSON/e2e.spec.ts +++ b/test/fields/collections/JSON/e2e.spec.ts @@ -73,7 +73,6 @@ describe('JSON', () => { test('should create', async () => { const input = '{"foo": "bar"}' await page.goto(url.create) - await page.waitForURL(url.create) const jsonCodeEditor = page.locator('.json-field .code-editor').first() await expect(() => expect(jsonCodeEditor).toBeVisible()).toPass({ timeout: POLL_TOPASS_TIMEOUT, @@ -90,7 +89,6 @@ describe('JSON', () => { const input = '{"foo.with.periods": "bar"}' await page.goto(url.create) - await page.waitForURL(url.create) const jsonCodeEditor = page.locator('.group-field .json-field .code-editor').first() await expect(() => expect(jsonCodeEditor).toBeVisible()).toPass({ timeout: POLL_TOPASS_TIMEOUT, diff --git a/test/fields/collections/Point/e2e.spec.ts b/test/fields/collections/Point/e2e.spec.ts index c5f3dc3551..4a26a50094 100644 --- a/test/fields/collections/Point/e2e.spec.ts +++ b/test/fields/collections/Point/e2e.spec.ts @@ -113,7 +113,6 @@ describe('Point', () => { test('should update point', async () => { await page.goto(url.edit(emptyGroupPoint.id)) - await page.waitForURL(`**/${emptyGroupPoint.id}`) const longField = page.locator('#field-longitude-point') await longField.fill('9') @@ -144,7 +143,6 @@ describe('Point', () => { test('should be able to clear a value point', async () => { await page.goto(url.edit(filledGroupPoint.id)) - await page.waitForURL(`**/${filledGroupPoint.id}`) const groupLongitude = page.locator('#field-longitude-group__point') await groupLongitude.fill('') diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts index 3564ec7268..34bbfadfa6 100644 --- a/test/fields/collections/Relationship/e2e.spec.ts +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -98,7 +98,7 @@ describe('relationship', () => { test('should create nested inline relationships', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) + // Open first modal await openCreateDocDrawer(page, '#field-relationToSelf') @@ -157,29 +157,36 @@ describe('relationship', () => { test('should hide relationship add new button', async () => { await page.goto(url.create) - await page.waitForURL(url.create) + const locator1 = page.locator( '#relationWithAllowEditToFalse-add-new .relationship-add-new__add-button', ) + await expect(locator1).toHaveCount(1) + // expect the button to not exist in the field const locator2 = page.locator( '#relationWithAllowCreateToFalse-add-new .relationship-add-new__add-button', ) + await expect(locator2).toHaveCount(0) }) test('should hide relationship edit button', async () => { await page.goto(url.create) - await page.waitForURL(url.create) + const locator1 = page .locator('#field-relationWithAllowEditToFalse') .getByLabel('Edit dev@payloadcms.com') + await expect(locator1).toHaveCount(0) + const locator2 = page .locator('#field-relationWithAllowCreateToFalse') .getByLabel('Edit dev@payloadcms.com') + await expect(locator2).toHaveCount(1) + // The reason why I check for locator 1 again is that I've noticed that sometimes // the default value does not appear after the first locator is tested. IDK why. await expect(locator1).toHaveCount(0) @@ -235,7 +242,6 @@ describe('relationship', () => { // TODO: React-Select not loading things sometimes. Fix later test.skip('should display `hasMany` polymorphic relationships', async () => { await page.goto(url.create) - await page.waitForURL(url.create) const field = page.locator('#field-relationHasManyPolymorphic') await field.click() @@ -271,7 +277,6 @@ describe('relationship', () => { test('should populate relationship dynamic default value', async () => { await page.goto(url.create) - await page.waitForURL(url.create) await expect( page.locator('#field-relationWithDynamicDefault .relationship--single-value__text'), ).toContainText('dev@payloadcms.com') @@ -291,7 +296,7 @@ describe('relationship', () => { // Related issue: https://github.com/payloadcms/payload/issues/2815 test('should edit document in relationship drawer', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) + // First fill out the relationship field, as it's required await openCreateDocDrawer(page, '#field-relationship') await page @@ -578,7 +583,7 @@ describe('relationship', () => { test('should fail min rows validation when rows are present', async () => { await page.goto(url.create) - await page.waitForURL(url.create) + // First fill out the relationship field, as it's required await openCreateDocDrawer(page, '#field-relationship') await page.locator('#field-relationship .value-container').click() @@ -601,7 +606,6 @@ describe('relationship', () => { test('should sort relationship options by sortOptions property (ID in ascending order)', async () => { await page.goto(url.create) - await page.waitForURL(url.create) const field = page.locator('#field-relationship') await field.click() @@ -615,7 +619,6 @@ describe('relationship', () => { test('should sort relationHasManyPolymorphic options by sortOptions property: text-fields collection (items in descending order)', async () => { await page.goto(url.create) - await page.waitForURL(url.create) const field = page.locator('#field-relationHasManyPolymorphic') @@ -637,7 +640,6 @@ describe('relationship', () => { await createRelationshipFieldDoc({ value: textDoc.id, relationTo: 'text-fields' }) await page.goto(url.list) - await page.waitForURL(new RegExp(url.list)) await addListFilter({ page, diff --git a/test/fields/collections/RichText/e2e.spec.ts b/test/fields/collections/RichText/e2e.spec.ts index 299aa308cf..ac5afdaafe 100644 --- a/test/fields/collections/RichText/e2e.spec.ts +++ b/test/fields/collections/RichText/e2e.spec.ts @@ -60,7 +60,6 @@ describe('Rich Text', () => { async function navigateToRichTextFields() { const url: AdminUrlUtil = new AdminUrlUtil(serverURL, 'rich-text-fields') await page.goto(url.list) - await page.waitForURL('**' + url.list + '**') const linkToDoc = page.locator('.row-1 .cell-title a').first() await expect(() => expect(linkToDoc).toBeTruthy()).toPass({ timeout: POLL_TOPASS_TIMEOUT }) diff --git a/test/fields/collections/Tabs/e2e.spec.ts b/test/fields/collections/Tabs/e2e.spec.ts index 0e59d50c35..4e55fa5261 100644 --- a/test/fields/collections/Tabs/e2e.spec.ts +++ b/test/fields/collections/Tabs/e2e.spec.ts @@ -73,7 +73,6 @@ describe('Tabs', () => { const jsonValue = '{ "foo": "bar"}' await page.goto(url.create) - await page.waitForURL(url.create) await switchTab(page, '.tabs-field__tab-button:has-text("Tab with Row")') await page.locator('#field-textInRow').fill(textInRowValue) diff --git a/test/helpers.ts b/test/helpers.ts index 11e4967404..3ee90344e2 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -103,6 +103,7 @@ export async function ensureCompilationIsDone({ ) await page.goto(adminURL) + await page.waitForURL( readyURL ?? (noAutoLogin ? `${adminURL + (adminURL.endsWith('/') ? '' : '/')}login` : adminURL), @@ -205,7 +206,6 @@ export async function login(args: LoginArgs): Promise { }) await page.goto(loginRoute) - await page.waitForURL(loginRoute) await wait(500) await page.fill('#field-email', data.email) await page.fill('#field-password', data.password) diff --git a/test/helpers/e2e/navigateToDoc.ts b/test/helpers/e2e/navigateToDoc.ts index 0c2cdda702..f2484802b8 100644 --- a/test/helpers/e2e/navigateToDoc.ts +++ b/test/helpers/e2e/navigateToDoc.ts @@ -5,11 +5,11 @@ export const goToFirstCell = async (page: Page, urlUtil: AdminUrlUtil) => { const cellLink = page.locator(`tbody tr:first-child td a`).first() const linkURL = await cellLink.getAttribute('href') await page.goto(`${urlUtil.serverURL}${linkURL}`) - await page.waitForURL(`**${linkURL}`) } export const navigateToDoc = async (page: Page, urlUtil: AdminUrlUtil) => { await page.goto(urlUtil.list) + // wait for query params to arrive const regex = new RegExp(`^${urlUtil.list}(?:\\?.*)?$`) await page.waitForURL(regex) await goToFirstCell(page, urlUtil) diff --git a/test/i18n/e2e.spec.ts b/test/i18n/e2e.spec.ts index c2373eb475..8880a8ec05 100644 --- a/test/i18n/e2e.spec.ts +++ b/test/i18n/e2e.spec.ts @@ -49,7 +49,6 @@ describe('i18n', () => { test('ensure i18n labels and useTranslation hooks display correct translation', async () => { await page.goto(serverURL + '/admin') - await page.waitForURL(serverURL + '/admin') await expect( page.locator('.componentWithDefaultI18n .componentWithDefaultI18nValidT'), diff --git a/test/live-preview/e2e.spec.ts b/test/live-preview/e2e.spec.ts index 0f08d8f6ca..300f531f82 100644 --- a/test/live-preview/e2e.spec.ts +++ b/test/live-preview/e2e.spec.ts @@ -2,6 +2,7 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' import path from 'path' +import { wait } from 'payload/shared' import { fileURLToPath } from 'url' import { @@ -32,7 +33,6 @@ import { ssrAutosavePagesSlug, ssrPagesSlug, } from './shared.js' -import { wait } from 'payload/shared' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -210,7 +210,6 @@ describe('Live Preview', () => { test('global — has tab', async () => { const global = new AdminUrlUtil(serverURL, 'header') await page.goto(global.global('header')) - await page.waitForURL(global.global('header')) const docURL = page.url() const pathname = new URL(docURL).pathname @@ -248,7 +247,6 @@ describe('Live Preview', () => { test('device — properly measures size', async () => { await page.goto(pagesURLUtil.create) - await page.waitForURL(pagesURLUtil.create) await page.locator('#field-title').fill('Title 3') await page.locator('#field-slug').fill('slug-3') @@ -297,7 +295,6 @@ describe('Live Preview', () => { test('device — resizes to specified breakpoint', async () => { await page.goto(pagesURLUtil.create) - await page.waitForURL(pagesURLUtil.create) await page.locator('#field-title').fill('Title 4') await page.locator('#field-slug').fill('slug-4') diff --git a/test/live-preview/helpers.ts b/test/live-preview/helpers.ts index 792ab1e81e..fff96c9065 100644 --- a/test/live-preview/helpers.ts +++ b/test/live-preview/helpers.ts @@ -13,7 +13,6 @@ export const goToCollectionLivePreview = async ( ): Promise => { await navigateToDoc(page, urlUtil) await page.goto(`${page.url()}/preview`) - await page.waitForURL(`**/preview`) } export const goToGlobalLivePreview = async ( @@ -24,7 +23,6 @@ export const goToGlobalLivePreview = async ( const global = new AdminUrlUtil(serverURL, slug) const previewURL = `${global.global(slug)}/preview` await page.goto(previewURL) - await page.waitForURL(previewURL) } export const selectLivePreviewBreakpoint = async (page: Page, breakpointLabel: string) => { diff --git a/test/localization/e2e.spec.ts b/test/localization/e2e.spec.ts index c2403318b2..69be0abd5e 100644 --- a/test/localization/e2e.spec.ts +++ b/test/localization/e2e.spec.ts @@ -246,7 +246,6 @@ describe('Localization', () => { }) await page.goto(url.edit(id)) - await page.waitForURL(`**${url.edit(id)}`) await openDocControls(page) await page.locator('#action-duplicate').click() await expect(page.locator('.payload-toast-container')).toContainText('successfully') @@ -262,7 +261,6 @@ describe('Localization', () => { test('should duplicate localized checkbox correctly', async () => { await page.goto(url.create) - await page.waitForURL(url.create) await changeLocale(page, defaultLocale) await fillValues({ description, title: englishTitle }) await page.locator('#field-localizedCheckbox').click() @@ -329,9 +327,9 @@ describe('Localization', () => { await page.goto(url.list) - const localeLabel = page - .locator('.localizer.app-header__localizer .localizer-button__current-label') - + const localeLabel = page.locator( + '.localizer.app-header__localizer .localizer-button__current-label', + ) await expect(localeLabel).not.toHaveText('English') }) diff --git a/test/locked-documents/e2e.spec.ts b/test/locked-documents/e2e.spec.ts index 1c1f61c554..eb76472634 100644 --- a/test/locked-documents/e2e.spec.ts +++ b/test/locked-documents/e2e.spec.ts @@ -179,21 +179,18 @@ describe('Locked Documents', () => { test('should show lock icon on document row if locked', async () => { await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) await expect(page.locator('.table .row-2 .locked svg')).toBeVisible() }) test('should not show lock icon on document row if unlocked', async () => { await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) await expect(page.locator('.table .row-3 .checkbox-input__input')).toBeVisible() }) test('should not show lock icon on document if expired', async () => { await page.goto(testsUrl.list) - await page.waitForURL(new RegExp(testsUrl.list)) // Need to wait for lock duration to expire (lockDuration: 5 seconds) // eslint-disable-next-line payload/no-wait-function @@ -206,7 +203,6 @@ describe('Locked Documents', () => { test('should not show lock icon on document row if locked by current user', async () => { await page.goto(postsUrl.edit(anotherPostDoc.id)) - await page.waitForURL(postsUrl.edit(anotherPostDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('testing') @@ -214,7 +210,6 @@ describe('Locked Documents', () => { await page.reload() await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) await expect(page.locator('.table .row-1 .checkbox-input__input')).toBeVisible() }) @@ -238,7 +233,6 @@ describe('Locked Documents', () => { await page.reload() await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) await page.locator('input#select-all').check() await page.locator('.list-selection .list-selection__button').click() @@ -284,7 +278,6 @@ describe('Locked Documents', () => { test('should only allow bulk edit on unlocked documents on all pages', async () => { await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) const bulkText = 'Bulk update title' @@ -441,7 +434,6 @@ describe('Locked Documents', () => { test('should delete all expired locked documents upon initial editing of unlocked document', async () => { await page.goto(testsUrl.list) - await page.waitForURL(new RegExp(testsUrl.list)) await expect(page.locator('.table .row-2 .locked svg')).toBeVisible() await expect(page.locator('.table .row-3 .locked svg')).toBeVisible() @@ -462,7 +454,6 @@ describe('Locked Documents', () => { expect(lockedTestDocs.docs.length).toBe(2) await page.goto(testsUrl.edit(testDoc.id)) - await page.waitForURL(testsUrl.edit(testDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('some test doc') @@ -480,7 +471,6 @@ describe('Locked Documents', () => { test('should lock document upon initial editing of unlocked document', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -502,7 +492,6 @@ describe('Locked Documents', () => { test('should unlock document on save / publish', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -540,7 +529,6 @@ describe('Locked Documents', () => { test('should keep document locked when navigating to other tabs i.e. api', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('testing tab navigation...') @@ -594,7 +582,6 @@ describe('Locked Documents', () => { test('should unlock document on navigate away', async () => { await page.goto(postsUrl.edit(postDocTwo.id)) - await page.waitForURL(postsUrl.edit(postDocTwo.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -727,13 +714,11 @@ describe('Locked Documents', () => { test('should show Document Locked modal for incoming user when entering locked document', async () => { await page.goto(postsUrl.list) - await page.waitForURL(new RegExp(postsUrl.list)) // eslint-disable-next-line payload/no-wait-function await wait(500) await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const modalContainer = page.locator('.payload__modal-container') await expect(modalContainer).toBeVisible() @@ -746,7 +731,6 @@ describe('Locked Documents', () => { test('should not show Document Locked modal for incoming user when entering expired locked document', async () => { await page.goto(testsUrl.list) - await page.waitForURL(new RegExp(testsUrl.list)) // Need to wait for lock duration to expire (lockDuration: 5 seconds) // eslint-disable-next-line payload/no-wait-function @@ -755,7 +739,6 @@ describe('Locked Documents', () => { await page.reload() await page.goto(testsUrl.edit(expiredTestDoc.id)) - await page.waitForURL(testsUrl.edit(expiredTestDoc.id)) const modalContainer = page.locator('.payload__modal-container') await expect(modalContainer).toBeHidden() @@ -763,7 +746,6 @@ describe('Locked Documents', () => { test('should show fields in read-only if incoming user views locked doc in read-only mode', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const modalContainer = page.locator('.payload__modal-container') await expect(modalContainer).toBeVisible() @@ -835,7 +817,6 @@ describe('Locked Documents', () => { test('should update user data if incoming user takes over from document modal', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const modalContainer = page.locator('.payload__modal-container') await expect(modalContainer).toBeVisible() @@ -925,7 +906,6 @@ describe('Locked Documents', () => { test('should update user data if incoming user takes over from within document', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const modalContainer = page.locator('.payload__modal-container') await expect(modalContainer).toBeVisible() @@ -995,7 +975,6 @@ describe('Locked Documents', () => { }) test('should show Document Take Over modal for previous user if taken over', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -1046,7 +1025,6 @@ describe('Locked Documents', () => { test('should take previous user back to dashboard on dashboard button click', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -1102,7 +1080,6 @@ describe('Locked Documents', () => { test('should show fields in read-only if previous user views doc in read-only mode', async () => { await page.goto(postsUrl.edit(postDoc.id)) - await page.waitForURL(postsUrl.edit(postDoc.id)) const textInput = page.locator('#field-text') await textInput.fill('hello world') @@ -1216,7 +1193,6 @@ describe('Locked Documents', () => { test('should show lock on document card in dashboard view if locked', async () => { await page.goto(postsUrl.admin) - await page.waitForURL(new RegExp(postsUrl.admin)) await expect(page.locator('.dashboard__card-list #card-menu .locked svg')).toBeVisible() }) @@ -1231,14 +1207,12 @@ describe('Locked Documents', () => { await wait(500) await page.goto(postsUrl.admin) - await page.waitForURL(new RegExp(postsUrl.admin)) await expect(page.locator('.dashboard__card-list #card-menu .locked')).toBeHidden() }) test('should not show lock on document card in dashboard view if locked by current user', async () => { await page.goto(globalUrl.global('menu')) - await page.waitForURL(globalUrl.global('menu')) const textInput = page.locator('#field-globalText') await textInput.fill('this is a global menu text field') @@ -1246,14 +1220,12 @@ describe('Locked Documents', () => { await page.reload() await page.goto(postsUrl.admin) - await page.waitForURL(new RegExp(postsUrl.admin)) await expect(page.locator('.dashboard__card-list #card-menu .locked')).toBeHidden() }) test('should not show lock on document card in dashboard view if lock expired', async () => { await page.goto(postsUrl.admin) - await page.waitForURL(new RegExp(postsUrl.admin)) await expect(page.locator('.dashboard__card-list #card-admin .locked svg')).toBeVisible() @@ -1285,7 +1257,6 @@ describe('Locked Documents', () => { }) await page.goto(postsUrl.admin) - await page.waitForURL(new RegExp(postsUrl.admin)) await expect(page.locator('.dashboard__card-list #card-admin .locked svg')).toBeVisible() diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 66e54f0e90..28b1f747f2 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -168,7 +168,6 @@ describe('Uploads', () => { ).docs[0] await page.goto(relationURL.edit(relationDoc.id)) - await page.waitForURL(relationURL.edit(relationDoc.id)) const filename = page.locator('.upload-relationship-details__filename a').nth(0) await expect(filename).toContainText('image.png') @@ -398,7 +397,6 @@ describe('Uploads', () => { ).docs[0] await page.goto(audioURL.edit(audioDoc.id)) - await page.waitForURL(audioURL.edit(audioDoc.id)) // remove the selection and open the list drawer await wait(500) // flake workaround @@ -441,7 +439,6 @@ describe('Uploads', () => { ).docs[0] await page.goto(audioURL.edit(audioDoc.id)) - await page.waitForURL(audioURL.edit(audioDoc.id)) // remove the selection and open the list drawer await wait(500) // flake workaround @@ -562,7 +559,6 @@ describe('Uploads', () => { test('should detect correct mimeType', async () => { await page.goto(mediaURL.create) - await page.waitForURL(mediaURL.create) await page.setInputFiles('input[type="file"]', path.resolve(dirname, './image.png')) await saveDocAndAssert(page) @@ -579,7 +575,6 @@ describe('Uploads', () => { test('should upload image with metadata', async () => { await page.goto(withMetadataURL.create) - await page.waitForURL(withMetadataURL.create) const fileChooserPromise = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -607,7 +602,6 @@ describe('Uploads', () => { test('should upload image without metadata', async () => { await page.goto(withoutMetadataURL.create) - await page.waitForURL(withoutMetadataURL.create) const fileChooserPromise = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -635,7 +629,6 @@ describe('Uploads', () => { test('should only upload image with metadata if jpeg mimetype', async () => { await page.goto(withOnlyJPEGMetadataURL.create) - await page.waitForURL(withOnlyJPEGMetadataURL.create) const fileChooserPromiseForJPEG = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -662,7 +655,6 @@ describe('Uploads', () => { expect(acceptableFileSizesForJPEG).toContain(jpegMediaDoc.sizes.sizeThree.filesize) await page.goto(withOnlyJPEGMetadataURL.create) - await page.waitForURL(withOnlyJPEGMetadataURL.create) const fileChooserPromiseForWEBP = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -705,7 +697,6 @@ describe('Uploads', () => { test('should bulk upload multiple files', async () => { // Navigate to the upload creation page await page.goto(uploadsOne.create) - await page.waitForURL(uploadsOne.create) // Upload single file await page.setInputFiles( @@ -760,7 +751,6 @@ describe('Uploads', () => { // Navigate to the upload creation page await page.goto(uploadsOne.create) - await page.waitForURL(uploadsOne.create) // Upload single file await page.setInputFiles( @@ -858,7 +848,6 @@ describe('Uploads', () => { test('should remove validation errors from bulk upload files after correction in edit many drawer', async () => { // Navigate to the upload creation page await page.goto(uploadsOne.create) - await page.waitForURL(uploadsOne.create) // Upload single file await page.setInputFiles( @@ -1010,7 +999,6 @@ describe('Uploads', () => { const createFocalCrop = async (page: Page, position: 'bottom-right' | 'top-left') => { const { dragX, dragY, focalX, focalY } = positions[position] await page.goto(mediaURL.create) - await page.waitForURL(mediaURL.create) // select and upload file const fileChooserPromise = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -1070,7 +1058,6 @@ describe('Uploads', () => { test('should update image alignment based on focal point', async () => { const updateFocalPosition = async (page: Page) => { await page.goto(focalOnlyURL.create) - await page.waitForURL(focalOnlyURL.create) // select and upload file const fileChooserPromise = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -1107,7 +1094,6 @@ describe('Uploads', () => { test('should resize image after crop if resizeOptions defined', async () => { await page.goto(animatedTypeMediaURL.create) - await page.waitForURL(animatedTypeMediaURL.create) const fileChooserPromise = page.waitForEvent('filechooser') await page.getByText('Select a file').click() @@ -1181,14 +1167,11 @@ describe('Uploads', () => { test('should hide file input when disableCreateFileInput is true on collection create', async () => { await page.goto(hideFileInputOnCreateURL.create) - await page.waitForURL(hideFileInputOnCreateURL.create) - await expect(page.locator('.file-field__upload')).toBeHidden() }) test('should hide bulk upload from list view when disableCreateFileInput is true', async () => { await page.goto(hideFileInputOnCreateURL.list) - await expect(page.locator('.list-header')).not.toContainText('Bulk Upload') }) diff --git a/test/versions/e2e.spec.ts b/test/versions/e2e.spec.ts index d7d44c0842..0348e303d1 100644 --- a/test/versions/e2e.spec.ts +++ b/test/versions/e2e.spec.ts @@ -311,7 +311,6 @@ describe('Versions', () => { test('should restore version with correct data', async () => { await page.goto(url.create) - await page.waitForURL(url.create) await page.locator('#field-title').fill('v1') await page.locator('#field-description').fill('hello') await saveDocAndAssert(page) @@ -322,7 +321,6 @@ describe('Versions', () => { const row2 = page.locator('tbody .row-2') const versionID = await row2.locator('.cell-id').textContent() await page.goto(`${savedDocURL}/versions/${versionID}`) - await page.waitForURL(`${savedDocURL}/versions/${versionID}`) await expect(page.locator('.render-field-diffs')).toBeVisible() await page.locator('.restore-version__button').click() await page.locator('button:has-text("Confirm")').click() @@ -481,7 +479,6 @@ describe('Versions', () => { test('collection - should update updatedAt', async () => { await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) // fill out doc in english await page.locator('#field-title').fill('title') @@ -535,7 +532,6 @@ describe('Versions', () => { test('global - should autosave', async () => { const url = new AdminUrlUtil(serverURL, autoSaveGlobalSlug) await page.goto(url.global(autoSaveGlobalSlug)) - await page.waitForURL(`**/${autoSaveGlobalSlug}`) const titleField = page.locator('#field-title') await titleField.fill('global title') await waitForAutoSaveToRunAndComplete(page) @@ -577,7 +573,6 @@ describe('Versions', () => { const englishTitle = 'english title' await page.goto(url.create) - await page.waitForURL(`**/${url.create}`) // fill out doc in english await page.locator('#field-title').fill(englishTitle) @@ -640,7 +635,6 @@ describe('Versions', () => { test('should save versions with custom IDs', async () => { await page.goto(customIDURL.create) - await page.waitForURL(`${customIDURL.create}`) await page.locator('#field-id').fill('custom') await page.locator('#field-title').fill('title') await saveDocAndAssert(page) @@ -792,7 +786,6 @@ describe('Versions', () => { test('should schedule publish', async () => { await page.goto(url.create) - await page.waitForURL(url.create) await page.locator('#field-title').fill('scheduled publish') await page.locator('#field-description').fill('scheduled publish description') @@ -1220,14 +1213,12 @@ describe('Versions', () => { async function navigateToVersionDiff() { const versionURL = `${serverURL}/admin/collections/${draftCollectionSlug}/${postID}/versions/${versionID}` await page.goto(versionURL) - await page.waitForURL(versionURL) await expect(page.locator('.render-field-diffs').first()).toBeVisible() } async function navigateToVersionFieldsDiff() { const versionURL = `${serverURL}/admin/collections/${diffCollectionSlug}/${diffID}/versions/${versionDiffID}` await page.goto(versionURL) - await page.waitForURL(versionURL) await expect(page.locator('.render-field-diffs').first()).toBeVisible() } From 7e713a454acd5dfd8866b58bf1b5c572866ab3b1 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 26 Feb 2025 17:21:15 -0700 Subject: [PATCH 009/127] feat(richtext-lexical): allows client features to access components added to the import map by the server feature (#11414) Lexical server features are able to add components to the import map through the `componentImports` property. As of now, the client feature did not have access to those. This is usually not necessary, as those import map entries are used internally to render custom components server-side, e.g. when a request to the form state endpoint is made. However, in some cases, these import map entries need to be accessed by the client feature (see "Why" section below). This PR ensures that keyed `componentImports` entries are made available to the client feature via the new `featureClientImportMap` property. ## Why? This is a prerequisite of the lexical [wrapper blocks PR](https://github.com/payloadcms/payload/pull/9289), where wrapper block custom components need to be made to the ClientFeature. The ClientFeature is where the wrapper block node is registered - in order to generate the wrapper block node, we need access to the component --- .../src/features/typesClient.ts | 1 + .../src/features/typesServer.ts | 14 ++++++++-- packages/richtext-lexical/src/field/index.tsx | 3 +++ .../richtext-lexical/src/field/rscEntry.tsx | 3 ++- .../src/lexical/config/client/loader.ts | 3 +++ packages/richtext-lexical/src/types.ts | 1 + .../src/utilities/createClientFeature.ts | 3 +++ .../src/utilities/generateImportMap.tsx | 10 +++++-- .../src/utilities/initLexicalFeatures.ts | 26 ++++++++++++++++++- 9 files changed, 58 insertions(+), 6 deletions(-) diff --git a/packages/richtext-lexical/src/features/typesClient.ts b/packages/richtext-lexical/src/features/typesClient.ts index 71b2b2f763..569ab1971a 100644 --- a/packages/richtext-lexical/src/features/typesClient.ts +++ b/packages/richtext-lexical/src/features/typesClient.ts @@ -34,6 +34,7 @@ export type FeatureProviderClient< feature: | ((props: { config: ClientConfig + featureClientImportMap: Record featureClientSchemaMap: FeatureClientSchemaMap /** unSanitizedEditorConfig.features, but mapped */ featureProviderMap: ClientFeatureProviderMap diff --git a/packages/richtext-lexical/src/features/typesServer.ts b/packages/richtext-lexical/src/features/typesServer.ts index 96505597f8..969da3ff30 100644 --- a/packages/richtext-lexical/src/features/typesServer.ts +++ b/packages/richtext-lexical/src/features/typesServer.ts @@ -280,8 +280,18 @@ export type ServerFeature = { * This determines what props will be available on the Client. */ clientFeatureProps?: ClientFeatureProps - // @ts-expect-error - TODO: fix this - componentImports?: Config['admin']['importMap']['generators'][0] | PayloadComponent[] + /** + * Adds payload components to the importMap. + * + * If an object is provided, the imported components will automatically be made available to the client feature, keyed by the object's keys. + */ + componentImports?: + | { + [key: string]: PayloadComponent + } + // @ts-expect-error - TODO: fix this + | Config['admin']['importMap']['generators'][0] + | PayloadComponent[] generatedTypes?: { modifyOutputSchema: (args: { collectionIDFieldTypes: { [key: string]: 'number' | 'string' } diff --git a/packages/richtext-lexical/src/field/index.tsx b/packages/richtext-lexical/src/field/index.tsx index 05a088a42e..dcbcb5c7b3 100644 --- a/packages/richtext-lexical/src/field/index.tsx +++ b/packages/richtext-lexical/src/field/index.tsx @@ -21,6 +21,7 @@ export const RichTextField: React.FC = (props) => { const { admin = {}, clientFeatures, + featureClientImportMap, featureClientSchemaMap, field, lexicalEditorConfig = defaultEditorLexicalConfig, @@ -53,6 +54,7 @@ export const RichTextField: React.FC = (props) => { const resolvedClientFeatures = loadClientFeatures({ config, + featureClientImportMap, featureClientSchemaMap, field: field as RichTextFieldClient, schemaPath: schemaPath ?? field.name, @@ -70,6 +72,7 @@ export const RichTextField: React.FC = (props) => { admin, finalSanitizedEditorConfig, clientFeatures, + featureClientImportMap, featureClientSchemaMap, field, config, diff --git a/packages/richtext-lexical/src/field/rscEntry.tsx b/packages/richtext-lexical/src/field/rscEntry.tsx index acac61da77..a232efcfff 100644 --- a/packages/richtext-lexical/src/field/rscEntry.tsx +++ b/packages/richtext-lexical/src/field/rscEntry.tsx @@ -39,7 +39,7 @@ export const RscEntryLexicalField: React.FC< throw new Error('Initialized lexical RSC field without a field name') } - const { clientFeatures, featureClientSchemaMap } = initLexicalFeatures({ + const { clientFeatures, featureClientImportMap, featureClientSchemaMap } = initLexicalFeatures({ clientFieldSchemaMap: args.clientFieldSchemaMap, fieldSchemaMap: args.fieldSchemaMap, i18n: args.i18n, @@ -88,6 +88,7 @@ export const RscEntryLexicalField: React.FC< const props: LexicalRichTextFieldProps = { clientFeatures, + featureClientImportMap, featureClientSchemaMap, // TODO: Does client need this? Why cant this just live in the server field: args.clientField as RichTextFieldClient, forceRender: args.forceRender, diff --git a/packages/richtext-lexical/src/lexical/config/client/loader.ts b/packages/richtext-lexical/src/lexical/config/client/loader.ts index f368edc193..b10b0d379d 100644 --- a/packages/richtext-lexical/src/lexical/config/client/loader.ts +++ b/packages/richtext-lexical/src/lexical/config/client/loader.ts @@ -16,12 +16,14 @@ import type { ClientEditorConfig } from '../types.js' */ export function loadClientFeatures({ config, + featureClientImportMap, featureClientSchemaMap, field, schemaPath, unSanitizedEditorConfig, }: { config: ClientConfig + featureClientImportMap: Record featureClientSchemaMap: FeatureClientSchemaMap field?: RichTextFieldClient schemaPath: string @@ -58,6 +60,7 @@ export function loadClientFeatures({ typeof featureProvider.feature === 'function' ? featureProvider.feature({ config, + featureClientImportMap, featureClientSchemaMap, featureProviderMap, field, diff --git a/packages/richtext-lexical/src/types.ts b/packages/richtext-lexical/src/types.ts index 1775e1811c..540ebac327 100644 --- a/packages/richtext-lexical/src/types.ts +++ b/packages/richtext-lexical/src/types.ts @@ -110,6 +110,7 @@ export type LexicalRichTextFieldProps = { clientFeatureProvider?: FeatureProviderProviderClient } } + featureClientImportMap: Record featureClientSchemaMap: FeatureClientSchemaMap initialLexicalFormState: InitialLexicalFormState lexicalEditorConfig: LexicalEditorConfig | undefined // Undefined if default lexical editor config should be used diff --git a/packages/richtext-lexical/src/utilities/createClientFeature.ts b/packages/richtext-lexical/src/utilities/createClientFeature.ts index a77feb311c..f0204ceed4 100644 --- a/packages/richtext-lexical/src/utilities/createClientFeature.ts +++ b/packages/richtext-lexical/src/utilities/createClientFeature.ts @@ -14,6 +14,7 @@ import type { FeatureClientSchemaMap } from '../types.js' export type CreateClientFeatureArgs = | ((props: { config: ClientConfig + featureClientImportMap: Record featureClientSchemaMap: FeatureClientSchemaMap /** unSanitizedEditorConfig.features, but mapped */ featureProviderMap: ClientFeatureProviderMap @@ -41,6 +42,7 @@ export const createClientFeature: < if (typeof feature === 'function') { featureProviderClient.feature = ({ config, + featureClientImportMap, featureClientSchemaMap, featureProviderMap, field, @@ -50,6 +52,7 @@ export const createClientFeature: < }) => { const toReturn = feature({ config, + featureClientImportMap, featureClientSchemaMap, featureProviderMap, field, diff --git a/packages/richtext-lexical/src/utilities/generateImportMap.tsx b/packages/richtext-lexical/src/utilities/generateImportMap.tsx index f1857a720c..6f0389ac8d 100644 --- a/packages/richtext-lexical/src/utilities/generateImportMap.tsx +++ b/packages/richtext-lexical/src/utilities/generateImportMap.tsx @@ -22,11 +22,17 @@ export const getGenerateImportMap = importMap, imports, }) - } else if (resolvedFeature.componentImports?.length) { - // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve + } else if ( + Array.isArray(resolvedFeature.componentImports) && + resolvedFeature.componentImports?.length + ) { resolvedFeature.componentImports.forEach((component) => { addToImportMap(component) }) + } else if (typeof resolvedFeature.componentImports === 'object') { + for (const component of Object.values(resolvedFeature.componentImports)) { + addToImportMap(component) + } } } diff --git a/packages/richtext-lexical/src/utilities/initLexicalFeatures.ts b/packages/richtext-lexical/src/utilities/initLexicalFeatures.ts index 04cca6c731..a31e572910 100644 --- a/packages/richtext-lexical/src/utilities/initLexicalFeatures.ts +++ b/packages/richtext-lexical/src/utilities/initLexicalFeatures.ts @@ -18,6 +18,7 @@ type Args = { export function initLexicalFeatures(args: Args): { clientFeatures: LexicalRichTextFieldProps['clientFeatures'] + featureClientImportMap: Record featureClientSchemaMap: FeatureClientSchemaMap } { const clientFeatures: LexicalRichTextFieldProps['clientFeatures'] = {} @@ -29,6 +30,11 @@ export function initLexicalFeatures(args: Args): { const featureClientSchemaMap: FeatureClientSchemaMap = {} + /** + * All modules added to the import map, keyed by the provided key, if feature.componentImports with type object is used + */ + const featureClientImportMap: Record = {} + for (const [featureKey, resolvedFeature] of resolvedFeatureMapArray) { clientFeatures[featureKey] = {} @@ -64,7 +70,7 @@ export function initLexicalFeatures(args: Args): { } /** - * Handle sub-fields (formstate of those)ttt + * Handle sub-fields (formstate of those) */ // The args.fieldSchemaMap generated before in buildFormState should contain all of lexical features' sub-field schemas // as well, as it already called feature.generateSchemaMap for each feature. @@ -84,10 +90,28 @@ export function initLexicalFeatures(args: Args): { featureClientSchemaMap[featureKey][key] = 'fields' in entry ? entry.fields : [entry] } } + if ( + resolvedFeature.componentImports && + typeof resolvedFeature.componentImports === 'object' + ) { + for (const key in resolvedFeature.componentImports) { + const payloadComponent = resolvedFeature.componentImports[key] + + const resolvedComponent = getFromImportMap({ + importMap: args.payload.importMap, + PayloadComponent: payloadComponent, + schemaPath: 'lexical-clientComponent', + silent: true, + }) + + featureClientImportMap[`${resolvedFeature.key}.${key}`] = resolvedComponent + } + } } } return { clientFeatures, + featureClientImportMap, featureClientSchemaMap, } } From 88a284150046d0c50636509a093a76e675ce9e42 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 26 Feb 2025 17:41:41 -0700 Subject: [PATCH 010/127] docs: add lexical docs for configuring jsx converters for internal links and overriding them (#11415) This PR improves existing JSX converter docs and adds 2 new sections: - **converting internal links** - addresses why a `"found internal link, but internalDocToHref is not provided"` error is thrown, and how to get around it - **Overriding default JSX Converters** --- docs/rich-text/converters.mdx | 130 ++++++++++++++++++++++++++++------ 1 file changed, 107 insertions(+), 23 deletions(-) diff --git a/docs/rich-text/converters.mdx b/docs/rich-text/converters.mdx index a663a49586..9396f45121 100644 --- a/docs/rich-text/converters.mdx +++ b/docs/rich-text/converters.mdx @@ -10,7 +10,7 @@ Lexical saves data in JSON - this is great for storage and flexibility and allow ## Lexical => JSX -If your frontend uses React, converting Lexical to JSX is the recommended way to render rich text content. Import the `RichText` component from `@payloadcms/richtext-lexical/react` and pass the Lexical content to it: +For React-based frontends, converting Lexical content to JSX is the recommended rendering approach. Import the RichText component from @payloadcms/richtext-lexical/react and pass the Lexical content to it: ```tsx import React from 'react' @@ -24,46 +24,130 @@ export const MyComponent = ({ data }: { data: SerializedEditorState }) => { } ``` -The `RichText` component includes built-in serializers for common Lexical nodes but allows customization through the `converters` prop. - -In our website template [you have an example](https://github.com/payloadcms/payload/blob/main/templates/website/src/components/RichText/index.tsx) of how to use `converters` to render custom blocks. - +The `RichText` component includes built-in serializers for common Lexical nodes but allows customization through the `converters` prop. In our [website template](https://github.com/payloadcms/payload/blob/main/templates/website/src/components/RichText/index.tsx) you have an example of how to use `converters` to render custom blocks, custom nodes and override existing converters. - The JSX converter expects the input data to be fully populated. When fetching data, ensure the `depth` setting is high enough, to ensure that lexical nodes such as uploads are populated. + When fetching data, ensure your `depth` setting is high enough to fully populate Lexical nodes such as uploads. The JSX converter requires fully populated data to work correctly. -### Converting Lexical Blocks to JSX +### Converting Internal Links -In order to convert lexical blocks or inline blocks to JSX, you will have to pass the converter for your block to the RichText component. This converter is not included by default, as Payload doesn't know how to render your custom blocks. +By default, Payload doesn't know how to convert **internal** links to JSX, as it doesn't know what the corresponding URL of the internal link is. You'll notice that you get a "found internal link, but internalDocToHref is not provided" error in the console when you try to render content with internal links. + +To fix this, you need to pass the `internalDocToHref` prop to `LinkJSXConverter`. This prop is a function that receives the link node and returns the URL of the document. ```tsx -import React from 'react' -import { - type JSXConvertersFunction, - RichText, -} from '@payloadcms/richtext-lexical/react' +import type { DefaultNodeTypes, SerializedLinkNode } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' -const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ +import { + type JSXConvertersFunction, + LinkJSXConverter, + RichText, +} from '@payloadcms/richtext-lexical/react' +import React from 'react' + +const internalDocToHref = ({ linkNode }: { linkNode: SerializedLinkNode }) => { + const { relationTo, value } = linkNode.fields.doc! + if (typeof value !== 'object') { + throw new Error('Expected value to be an object') + } + const slug = value.slug + return relationTo === 'posts' ? `/posts/${slug}` : `/${slug}` +} + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + ...LinkJSXConverter({ internalDocToHref }), +}) + +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return +} +``` + +### Converting Lexical Blocks + +To convert Lexical Blocks or Inline Blocks to JSX, pass the converter for your block to the `RichText` component. This converter is not included by default, as Payload doesn't know how to render your custom blocks. + +```tsx +'use client' +import type { MyInlineBlock, MyTextBlock } from '@/payload-types' +import type { DefaultNodeTypes, SerializedBlockNode } from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' +import React from 'react' + +// Extend the default node types with your custom blocks for full type safety +type NodeTypes = DefaultNodeTypes | SerializedBlockNode + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ ...defaultConverters, blocks: { - // myTextBlock is the slug of the block + // Each key should match your block's slug myTextBlock: ({ node }) =>

, }, inlineBlocks: { - // myInlineBlock is the slug of the block + // Each key should match your inline block's slug myInlineBlock: ({ node }) => {node.fields.text}, }, }) -export const MyComponent = ({ lexicalData }) => { - return ( - - ) +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return +} +``` + +### Overriding Default JSX Converters + +You can override any of the default JSX converters by passing passing your custom converter, keyed to the node type, to the `converters` prop / the converters function. + +Example - overriding the upload node converter to use next/image: + +```tsx +'use client' +import type { DefaultNodeTypes, SerializedUploadNode } from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' +import Image from 'next/image' +import React from 'react' + +type NodeTypes = DefaultNodeTypes + +// Custom upload converter component that uses next/image +const CustomUploadComponent: React.FC<{ + node: SerializedUploadNode +}> = ({ node }) => { + if (node.relationTo === 'uploads') { + const uploadDoc = node.value + if (typeof uploadDoc !== 'object') { + return null + } + const { alt, height, url, width } = uploadDoc + return {alt} + } + + return null +} + +const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + // Override the default upload converter + upload: ({ node }) => { + return + }, +}) + +export const MyComponent: React.FC<{ + lexicalData: SerializedEditorState +}> = ({ lexicalData }) => { + return } ``` From 67b7a730babe8cb7b48d973a4b9b37c0e2fe1c5d Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 26 Feb 2025 17:47:36 -0700 Subject: [PATCH 011/127] docs: improve lexical code block documentation (#11416) The existing code example had type errors when `strict: true` was enabled --- docs/rich-text/custom-features.mdx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/rich-text/custom-features.mdx b/docs/rich-text/custom-features.mdx index f9701deceb..ec6bdf8162 100644 --- a/docs/rich-text/custom-features.mdx +++ b/docs/rich-text/custom-features.mdx @@ -29,9 +29,9 @@ Using the BlocksFeature, you can add both inline blocks (= can be inserted into ### Example: Code Field Block with language picker -This example demonstrates how to create a custom code field block with a language picker using the `BlocksFeature`. Make sure to manually install `@payloadcms/ui`first. +This example demonstrates how to create a custom code field block with a language picker using the `BlocksFeature`. First, make sure to explicitly install `@payloadcms/ui` in your project. -Field config: +Field Config: ```ts import { @@ -91,7 +91,6 @@ CodeComponent.tsx: ```tsx 'use client' - import type { CodeFieldClient, CodeFieldClientProps } from 'payload' import { CodeField, useFormFields } from '@payloadcms/ui' @@ -105,6 +104,8 @@ const languageKeyToMonacoLanguageMap = { tsx: 'typescript', } +type Language = keyof typeof languageKeyToMonacoLanguageMap + export const Code: React.FC = ({ autoComplete, field, @@ -118,10 +119,10 @@ export const Code: React.FC = ({ }) => { const languageField = useFormFields(([fields]) => fields['language']) - const language: string = - (languageField?.value as string) || (languageField.initialValue as string) || 'typescript' + const language: Language = + (languageField?.value as Language) || (languageField?.initialValue as Language) || 'ts' - const label = languages[language as keyof typeof languages] + const label = languages[language] const props: CodeFieldClient = useMemo( () => ({ @@ -129,9 +130,10 @@ export const Code: React.FC = ({ type: 'code', admin: { ...field.admin, - label, + editorOptions: undefined, language: languageKeyToMonacoLanguageMap[language] || language, }, + label, }), [field, language, label], ) From 45cee23adde488b9202885b98ded2562e36352d7 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 26 Feb 2025 21:50:36 -0500 Subject: [PATCH 012/127] feat(plugin-multi-tenant): filter users list and tenants lists (#11417) ### What? - Adds `users` base list filtering when tenant is selected - Adds `tenants` base list filtering when tenant is selected --- docs/plugins/multi-tenant.mdx | 10 +++- .../src/exports/utilities.ts | 2 +- packages/plugin-multi-tenant/src/index.ts | 52 +++++++++++++++++-- .../filterDocumentsBySelectedTenant.ts} | 6 +-- .../filterTenantsBySelectedTenant.ts | 30 +++++++++++ .../filterUsersBySelectedTenant.ts | 37 +++++++++++++ packages/plugin-multi-tenant/src/types.ts | 8 +++ ...antListFilter.ts => combineListFilters.ts} | 19 +++---- 8 files changed, 142 insertions(+), 22 deletions(-) rename packages/plugin-multi-tenant/src/{utilities/getTenantListFilter.ts => list-filters/filterDocumentsBySelectedTenant.ts} (74%) create mode 100644 packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts create mode 100644 packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts rename packages/plugin-multi-tenant/src/utilities/{withTenantListFilter.ts => combineListFilters.ts} (66%) diff --git a/docs/plugins/multi-tenant.mdx b/docs/plugins/multi-tenant.mdx index 743b8281ad..c59bb900f5 100644 --- a/docs/plugins/multi-tenant.mdx +++ b/docs/plugins/multi-tenant.mdx @@ -52,7 +52,7 @@ The plugin accepts an object with the following properties: ```ts type MultiTenantPluginConfig = { -/** + /** * After a tenant is deleted, the plugin will attempt to clean up related documents * - removing documents with the tenant ID * - removing the tenant from users @@ -176,6 +176,14 @@ type MultiTenantPluginConfig = { * Opt out of adding access constraints to the tenants collection */ useTenantsCollectionAccess?: boolean + /** + * Opt out including the baseListFilter to filter tenants by selected tenant + */ + useTenantsListFilter?: boolean + /** + * Opt out including the baseListFilter to filter users by selected tenant + */ + useUsersTenantFilter?: boolean } ``` diff --git a/packages/plugin-multi-tenant/src/exports/utilities.ts b/packages/plugin-multi-tenant/src/exports/utilities.ts index 595e494816..c21ae23fa7 100644 --- a/packages/plugin-multi-tenant/src/exports/utilities.ts +++ b/packages/plugin-multi-tenant/src/exports/utilities.ts @@ -1,5 +1,5 @@ +export { filterDocumentsBySelectedTenant as getTenantListFilter } from '../list-filters/filterDocumentsBySelectedTenant.js' export { getGlobalViewRedirect } from '../utilities/getGlobalViewRedirect.js' export { getTenantAccess } from '../utilities/getTenantAccess.js' export { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' -export { getTenantListFilter } from '../utilities/getTenantListFilter.js' export { getUserTenantIDs } from '../utilities/getUserTenantIDs.js' diff --git a/packages/plugin-multi-tenant/src/index.ts b/packages/plugin-multi-tenant/src/index.ts index a94da8d059..2b2b6ccd5e 100644 --- a/packages/plugin-multi-tenant/src/index.ts +++ b/packages/plugin-multi-tenant/src/index.ts @@ -6,9 +6,12 @@ import { defaults } from './defaults.js' import { tenantField } from './fields/tenantField/index.js' import { tenantsArrayField } from './fields/tenantsArrayField/index.js' import { addTenantCleanup } from './hooks/afterTenantDelete.js' +import { filterDocumentsBySelectedTenant } from './list-filters/filterDocumentsBySelectedTenant.js' +import { filterTenantsBySelectedTenant } from './list-filters/filterTenantsBySelectedTenant.js' +import { filterUsersBySelectedTenant } from './list-filters/filterUsersBySelectedTenant.js' import { addCollectionAccess } from './utilities/addCollectionAccess.js' import { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js' -import { withTenantListFilter } from './utilities/withTenantListFilter.js' +import { combineListFilters } from './utilities/combineListFilters.js' export const multiTenantPlugin = (pluginConfig: MultiTenantPluginConfig) => @@ -97,6 +100,23 @@ export const multiTenantPlugin = userHasAccessToAllTenants, }) + if (pluginConfig.useUsersTenantFilter !== false) { + if (!adminUsersCollection.admin) { + adminUsersCollection.admin = {} + } + + adminUsersCollection.admin.baseListFilter = combineListFilters({ + baseListFilter: adminUsersCollection.admin?.baseListFilter, + customFilter: (args) => + filterUsersBySelectedTenant({ + req: args.req, + tenantsArrayFieldName, + tenantsArrayTenantFieldName, + tenantsCollectionSlug, + }), + }) + } + let tenantCollection: CollectionConfig | undefined const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce< @@ -138,6 +158,25 @@ export const multiTenantPlugin = }) } + if (pluginConfig.useTenantsListFilter !== false) { + /** + * Add list filter to tenants collection + * - filter by selected tenant + */ + if (!collection.admin) { + collection.admin = {} + } + + collection.admin.baseListFilter = combineListFilters({ + baseListFilter: collection.admin?.baseListFilter, + customFilter: (args) => + filterTenantsBySelectedTenant({ + req: args.req, + tenantsCollectionSlug, + }), + }) + } + if (pluginConfig.cleanupAfterTenantDelete !== false) { /** * Add cleanup logic when tenant is deleted @@ -195,10 +234,15 @@ export const multiTenantPlugin = if (!collection.admin) { collection.admin = {} } - collection.admin.baseListFilter = withTenantListFilter({ + + collection.admin.baseListFilter = combineListFilters({ baseListFilter: collection.admin?.baseListFilter, - tenantFieldName, - tenantsCollectionSlug, + customFilter: (args) => + filterDocumentsBySelectedTenant({ + req: args.req, + tenantFieldName, + tenantsCollectionSlug, + }), }) } diff --git a/packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts b/packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts similarity index 74% rename from packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts rename to packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts index 47ae504b05..1f6b32fa63 100644 --- a/packages/plugin-multi-tenant/src/utilities/getTenantListFilter.ts +++ b/packages/plugin-multi-tenant/src/list-filters/filterDocumentsBySelectedTenant.ts @@ -1,15 +1,15 @@ import type { PayloadRequest, Where } from 'payload' import { SELECT_ALL } from '../constants.js' -import { getCollectionIDType } from './getCollectionIDType.js' -import { getTenantFromCookie } from './getTenantFromCookie.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' type Args = { req: PayloadRequest tenantFieldName: string tenantsCollectionSlug: string } -export const getTenantListFilter = ({ +export const filterDocumentsBySelectedTenant = ({ req, tenantFieldName, tenantsCollectionSlug, diff --git a/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts b/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts new file mode 100644 index 0000000000..89cf1b886f --- /dev/null +++ b/packages/plugin-multi-tenant/src/list-filters/filterTenantsBySelectedTenant.ts @@ -0,0 +1,30 @@ +import type { PayloadRequest, Where } from 'payload' + +import { SELECT_ALL } from '../constants.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' + +type Args = { + req: PayloadRequest + tenantsCollectionSlug: string +} +export const filterTenantsBySelectedTenant = ({ + req, + tenantsCollectionSlug, +}: Args): null | Where => { + const idType = getCollectionIDType({ + collectionSlug: tenantsCollectionSlug, + payload: req.payload, + }) + const selectedTenant = getTenantFromCookie(req.headers, idType) + + if (selectedTenant === SELECT_ALL) { + return {} + } + + return { + id: { + equals: selectedTenant, + }, + } +} diff --git a/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts b/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts new file mode 100644 index 0000000000..595d45e1bf --- /dev/null +++ b/packages/plugin-multi-tenant/src/list-filters/filterUsersBySelectedTenant.ts @@ -0,0 +1,37 @@ +import type { PayloadRequest, Where } from 'payload' + +import { SELECT_ALL } from '../constants.js' +import { getCollectionIDType } from '../utilities/getCollectionIDType.js' +import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js' + +type Args = { + req: PayloadRequest + tenantsArrayFieldName: string + tenantsArrayTenantFieldName: string + tenantsCollectionSlug: string +} +/** + * Filter the list of users by the selected tenant + */ +export const filterUsersBySelectedTenant = ({ + req, + tenantsArrayFieldName, + tenantsArrayTenantFieldName, + tenantsCollectionSlug, +}: Args): null | Where => { + const idType = getCollectionIDType({ + collectionSlug: tenantsCollectionSlug, + payload: req.payload, + }) + const selectedTenant = getTenantFromCookie(req.headers, idType) + + if (selectedTenant === SELECT_ALL) { + return {} + } + + return { + [`${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`]: { + in: [selectedTenant], + }, + } +} diff --git a/packages/plugin-multi-tenant/src/types.ts b/packages/plugin-multi-tenant/src/types.ts index abb026f19d..c3af2ad21f 100644 --- a/packages/plugin-multi-tenant/src/types.ts +++ b/packages/plugin-multi-tenant/src/types.ts @@ -125,6 +125,14 @@ export type MultiTenantPluginConfig = { * Opt out of adding access constraints to the tenants collection */ useTenantsCollectionAccess?: boolean + /** + * Opt out including the baseListFilter to filter tenants by selected tenant + */ + useTenantsListFilter?: boolean + /** + * Opt out including the baseListFilter to filter users by selected tenant + */ + useUsersTenantFilter?: boolean } export type Tenant = { diff --git a/packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts b/packages/plugin-multi-tenant/src/utilities/combineListFilters.ts similarity index 66% rename from packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts rename to packages/plugin-multi-tenant/src/utilities/combineListFilters.ts index 7f3e70bb4e..c8024330fb 100644 --- a/packages/plugin-multi-tenant/src/utilities/withTenantListFilter.ts +++ b/packages/plugin-multi-tenant/src/utilities/combineListFilters.ts @@ -1,19 +1,16 @@ import type { BaseListFilter, Where } from 'payload' -import { getTenantListFilter } from './getTenantListFilter.js' - type Args = { baseListFilter?: BaseListFilter - tenantFieldName: string - tenantsCollectionSlug: string + customFilter: BaseListFilter } /** * Combines a base list filter with a tenant list filter * * Combines where constraints inside of an AND operator */ -export const withTenantListFilter = - ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: Args): BaseListFilter => +export const combineListFilters = + ({ baseListFilter, customFilter }: Args): BaseListFilter => async (args) => { const filterConstraints = [] @@ -25,14 +22,10 @@ export const withTenantListFilter = } } - const tenantListFilter = getTenantListFilter({ - req: args.req, - tenantFieldName, - tenantsCollectionSlug, - }) + const customFilterResult = await customFilter(args) - if (tenantListFilter) { - filterConstraints.push(tenantListFilter) + if (customFilterResult) { + filterConstraints.push(customFilterResult) } if (filterConstraints.length) { From 958e1950179a5b56e712ab5c55911cf8aad8971e Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 26 Feb 2025 22:39:51 -0500 Subject: [PATCH 013/127] feat(plugin-multi-tenant): allow customization of selector label (#11418) ### What? Allows for custom labeling of the tenant selector shown in the sidebar. Fixes https://github.com/payloadcms/payload/issues/11262 --- docs/plugins/multi-tenant.mdx | 10 +++++ packages/plugin-multi-tenant/package.json | 1 + .../src/components/TenantSelector/index.tsx | 8 ++-- packages/plugin-multi-tenant/src/defaults.ts | 1 + packages/plugin-multi-tenant/src/index.ts | 38 ++++++++++++++++++- packages/plugin-multi-tenant/src/types.ts | 11 ++++++ packages/plugin-multi-tenant/tsconfig.json | 2 +- pnpm-lock.yaml | 3 ++ test/plugin-multi-tenant/config.ts | 1 + 9 files changed, 69 insertions(+), 6 deletions(-) diff --git a/docs/plugins/multi-tenant.mdx b/docs/plugins/multi-tenant.mdx index c59bb900f5..85ee3de109 100644 --- a/docs/plugins/multi-tenant.mdx +++ b/docs/plugins/multi-tenant.mdx @@ -158,6 +158,16 @@ type MultiTenantPluginConfig = { rowFields?: never tenantFieldAccess?: never } + /** + * Customize tenant selector label + * + * Either a string or an object where the keys are locales and the values are the string labels + */ + tenantSelectorLabel?: + | Partial<{ + [key in AcceptedLanguages]?: string + }> + | string /** * The slug for the tenant collection * diff --git a/packages/plugin-multi-tenant/package.json b/packages/plugin-multi-tenant/package.json index def4177d8d..634530008e 100644 --- a/packages/plugin-multi-tenant/package.json +++ b/packages/plugin-multi-tenant/package.json @@ -78,6 +78,7 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", + "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", "payload": "workspace:*" }, diff --git a/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx b/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx index 91e9a116cb..915b5ff8fe 100644 --- a/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx +++ b/packages/plugin-multi-tenant/src/components/TenantSelector/index.tsx @@ -2,17 +2,17 @@ import type { ReactSelectOption } from '@payloadcms/ui' import type { ViewTypes } from 'payload' -import { SelectInput } from '@payloadcms/ui' - import './index.scss' +import { SelectInput, useTranslation } from '@payloadcms/ui' import React from 'react' import { SELECT_ALL } from '../../constants.js' import { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js' -export const TenantSelector = ({ viewType }: { viewType?: ViewTypes }) => { +export const TenantSelector = ({ label, viewType }: { label: string; viewType?: ViewTypes }) => { const { options, selectedTenantID, setTenant } = useTenantSelection() + const { t } = useTranslation() const handleChange = React.useCallback( (option: ReactSelectOption | ReactSelectOption[]) => { @@ -33,7 +33,7 @@ export const TenantSelector = ({ viewType }: { viewType?: ViewTypes }) => {
{ + const locale = _locale as AcceptedLanguages + if (!incomingConfig.i18n) { + incomingConfig.i18n = {} + } + if (!incomingConfig.i18n.translations) { + incomingConfig.i18n.translations = {} + } + if (!incomingConfig.i18n.translations[locale]) { + incomingConfig.i18n.translations[locale] = {} + } + if (!('multiTenant' in incomingConfig.i18n.translations[locale])) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + incomingConfig.i18n.translations[locale].multiTenant = {} + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label + tenantSelectorLabel = 'multiTenant:selectorLabel' + }) + } + /** * Add tenants array field to users collection */ @@ -229,7 +261,8 @@ export const multiTenantPlugin = if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) { /** - * Collection baseListFilter with selected tenant constraint (if selected) + * Add list filter to enabled collections + * - filters results by selected tenant */ if (!collection.admin) { collection.admin = {} @@ -295,6 +328,9 @@ export const multiTenantPlugin = * Add tenant selector to admin UI */ incomingConfig.admin.components.beforeNavLinks.push({ + clientProps: { + label: tenantSelectorLabel, + }, path: '@payloadcms/plugin-multi-tenant/client#TenantSelector', }) diff --git a/packages/plugin-multi-tenant/src/types.ts b/packages/plugin-multi-tenant/src/types.ts index c3af2ad21f..4974e4e498 100644 --- a/packages/plugin-multi-tenant/src/types.ts +++ b/packages/plugin-multi-tenant/src/types.ts @@ -1,3 +1,4 @@ +import type { AcceptedLanguages } from '@payloadcms/translations' import type { ArrayField, CollectionSlug, Field, RelationshipField, User } from 'payload' export type MultiTenantPluginConfig = { @@ -107,6 +108,16 @@ export type MultiTenantPluginConfig = { rowFields?: never tenantFieldAccess?: never } + /** + * Customize tenant selector label + * + * Either a string or an object where the keys are locales and the values are the string labels + */ + tenantSelectorLabel?: + | Partial<{ + [key in AcceptedLanguages]?: string + }> + | string /** * The slug for the tenant collection * diff --git a/packages/plugin-multi-tenant/tsconfig.json b/packages/plugin-multi-tenant/tsconfig.json index 2b41f4df60..b14b853dc0 100644 --- a/packages/plugin-multi-tenant/tsconfig.json +++ b/packages/plugin-multi-tenant/tsconfig.json @@ -1,4 +1,4 @@ { "extends": "../../tsconfig.base.json", - "references": [{ "path": "../payload" }, { "path": "../ui"}] + "references": [{ "path": "../payload" }, { "path": "../ui"}, { "path": "../translations"}] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4bba2b98c5..da38c8aff4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1031,6 +1031,9 @@ importers: '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations '@payloadcms/ui': specifier: workspace:* version: link:../ui diff --git a/test/plugin-multi-tenant/config.ts b/test/plugin-multi-tenant/config.ts index 24db527a48..999de7acbf 100644 --- a/test/plugin-multi-tenant/config.ts +++ b/test/plugin-multi-tenant/config.ts @@ -41,6 +41,7 @@ export default buildConfigWithDefaults({ isGlobal: true, }, }, + tenantSelectorLabel: 'Sites', }), ], typescript: { From 2a3682ff689fee475a43b0f0b4621835edab8ad9 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 26 Feb 2025 22:56:09 -0700 Subject: [PATCH 014/127] fix(deps): ensure Next.js 15.2.0 compatibility, upgrade nextjs and @types/react versions in monorepo (#11419) This bumps next.js to 15.2.0 in our monorepo, as well as all @types/react and @types/react-dom versions. Additionally, it removes the obsolete `peerDependencies` property from our root package.json. This PR also fixes 2 bugs introduced by Next.js 15.2.0. This highlights why running our test suite against the latest Next.js, to make sure Payload is compatible, version is important. ## 1. handleWhereChange running endlessly Upgrading to Next.js 15.2.0 caused `handleWhereChange` to be continuously called by a `useEffect` when the list view filters were opened, leading to a React error - I did not investigate why upgrading the Next.js version caused that, but this PR fixes it by making use of the more predictable `useEffectEvent`. ## 2. Custom Block and Array label React key errors Upgrading to Next.js 15.2.0 caused react key errors when rendering custom block and array row labels on the server. This has been fixed by rendering those with a key ## 3. Table React key errors When rendering a `Table`, a React key error is thrown since Next.js 15.2.0 --- package.json | 12 +- packages/live-preview-react/package.json | 4 +- packages/next/package.json | 4 +- packages/plugin-cloud-storage/package.json | 4 +- packages/plugin-form-builder/package.json | 4 +- packages/plugin-search/package.json | 4 +- packages/plugin-sentry/package.json | 4 +- packages/plugin-seo/package.json | 4 +- packages/plugin-stripe/package.json | 4 +- packages/richtext-lexical/package.json | 4 +- packages/richtext-slate/package.json | 4 +- packages/translations/package.json | 4 +- packages/ui/package.json | 4 +- .../ui/src/elements/WhereBuilder/index.tsx | 18 +- .../fieldSchemasToFormState/renderField.tsx | 2 + packages/ui/src/utilities/renderTable.tsx | 3 +- pnpm-lock.yaml | 289 +++++++++--------- test/package.json | 8 +- 18 files changed, 194 insertions(+), 186 deletions(-) diff --git a/package.json b/package.json index 9c4336508d..1d943bebe8 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "devDependencies": { "@jest/globals": "29.7.0", "@libsql/client": "0.14.0", - "@next/bundle-analyzer": "15.1.5", + "@next/bundle-analyzer": "15.2.0", "@payloadcms/db-postgres": "workspace:*", "@payloadcms/eslint-config": "workspace:*", "@payloadcms/eslint-plugin": "workspace:*", @@ -132,8 +132,8 @@ "@types/jest": "29.5.12", "@types/minimist": "1.2.5", "@types/node": "22.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/shelljs": "0.8.15", "chalk": "^4.1.2", "comment-json": "^4.2.3", @@ -153,7 +153,7 @@ "lint-staged": "15.2.7", "minimist": "1.2.8", "mongodb-memory-server": "^10", - "next": "15.1.5", + "next": "15.2.0", "open": "^10.1.0", "p-limit": "^5.0.0", "playwright": "1.50.0", @@ -173,10 +173,6 @@ "turbo": "^2.3.3", "typescript": "5.7.3" }, - "peerDependencies": { - "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020", - "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020" - }, "packageManager": "pnpm@9.7.1", "engines": { "node": "^18.20.2 || >=20.9.0", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index 64b0bb7f48..fdd1efb19d 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -45,8 +45,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/next/package.json b/packages/next/package.json index 9085aebe97..72568c8fdd 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -107,8 +107,8 @@ "@next/eslint-plugin-next": "15.1.5", "@payloadcms/eslint-config": "workspace:*", "@types/busboy": "1.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/uuid": "10.0.0", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "esbuild": "0.24.2", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 95f545628b..d3a6a9c6e2 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -64,8 +64,8 @@ }, "devDependencies": { "@types/find-node-modules": "^2.1.2", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 9eb5be0233..25996f0cc5 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -67,8 +67,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@types/escape-html": "^1.0.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "copyfiles": "^2.4.1", "cross-env": "^7.0.3", "payload": "workspace:*" diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index b42ec3ec3f..8a24e5a11b 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -64,8 +64,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index 2f7072aded..d221827a2d 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -58,8 +58,8 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index e8c897d3a0..7a5296fc62 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -70,8 +70,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@payloadcms/next": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index 9b15aa5013..66ae7aade1 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -71,8 +71,8 @@ "@payloadcms/eslint-config": "workspace:*", "@payloadcms/next": "workspace:*", "@types/lodash.get": "^4.4.7", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/uuid": "10.0.0", "payload": "workspace:*" }, diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index e3bc7dc9e1..d3bcb97034 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -383,8 +383,8 @@ "@types/escape-html": "1.0.4", "@types/json-schema": "7.0.15", "@types/node": "22.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "babel-plugin-transform-remove-imports": "^1.8.0", "esbuild": "0.24.2", diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index e7e0af8574..17acbc3234 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -63,8 +63,8 @@ "@payloadcms/eslint-config": "workspace:*", "@types/is-hotkey": "^0.1.10", "@types/node": "22.5.4", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "payload": "workspace:*" }, "peerDependencies": { diff --git a/packages/translations/package.json b/packages/translations/package.json index e88c90993c..eae68d3bd9 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -60,8 +60,8 @@ "devDependencies": { "@payloadcms/eslint-config": "workspace:*", "@swc/core": "1.10.12", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "dotenv": "16.4.7", "prettier": "3.3.3", "typescript": "5.7.3" diff --git a/packages/ui/package.json b/packages/ui/package.json index 08a94c19e9..dc4eedc56d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -147,8 +147,8 @@ "@babel/preset-typescript": "7.26.0", "@hyrious/esbuild-plugin-commonjs": "^0.2.4", "@payloadcms/eslint-config": "workspace:*", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "@types/uuid": "10.0.0", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "esbuild": "0.24.2", diff --git a/packages/ui/src/elements/WhereBuilder/index.tsx b/packages/ui/src/elements/WhereBuilder/index.tsx index d7cb5ca9b4..4a83fe75b0 100644 --- a/packages/ui/src/elements/WhereBuilder/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/index.tsx @@ -6,15 +6,16 @@ import React, { useMemo } from 'react' import type { AddCondition, UpdateCondition, WhereBuilderProps } from './types.js' +import { useEffectEvent } from '../../hooks/useEffectEvent.js' import { useListQuery } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { Button } from '../Button/index.js' import { Condition } from './Condition/index.js' import fieldTypes from './field-types.js' import { reduceFields } from './reduceFields.js' +import './index.scss' import { transformWhereQuery } from './transformWhereQuery.js' import validateWhereQuery from './validateWhereQuery.js' -import './index.scss' const baseClass = 'where-builder' @@ -122,15 +123,16 @@ export const WhereBuilder: React.FC = (props) => { [conditions], ) - React.useEffect(() => { + const handleChange = useEffectEvent(async (conditions: Where[]) => { if (shouldUpdateQuery) { - async function handleChange() { - await handleWhereChange({ or: conditions }) - setShouldUpdateQuery(false) - } - void handleChange() + await handleWhereChange({ or: conditions }) + setShouldUpdateQuery(false) } - }, [conditions, handleWhereChange, shouldUpdateQuery]) + }) + + React.useEffect(() => { + void handleChange(conditions) + }, [conditions]) return (
diff --git a/packages/ui/src/forms/fieldSchemasToFormState/renderField.tsx b/packages/ui/src/forms/fieldSchemasToFormState/renderField.tsx index c91378f56a..d8c5113cea 100644 --- a/packages/ui/src/forms/fieldSchemasToFormState/renderField.tsx +++ b/packages/ui/src/forms/fieldSchemasToFormState/renderField.tsx @@ -125,6 +125,7 @@ export const renderField: RenderFieldMethod = ({ clientProps, Component: fieldConfig.admin.components.RowLabel, importMap: req.payload.importMap, + key: `${rowIndex}`, serverProps: { ...serverProps, rowLabel: `${getTranslation(fieldConfig.labels.singular, req.i18n)} ${String( @@ -161,6 +162,7 @@ export const renderField: RenderFieldMethod = ({ clientProps, Component: blockConfig.admin.components.Label, importMap: req.payload.importMap, + key: `${rowIndex}`, serverProps: { ...serverProps, blockType: row.blockType, diff --git a/packages/ui/src/utilities/renderTable.tsx b/packages/ui/src/utilities/renderTable.tsx index 637ede7ed2..ae2776e11c 100644 --- a/packages/ui/src/utilities/renderTable.tsx +++ b/packages/ui/src/utilities/renderTable.tsx @@ -195,6 +195,7 @@ export const renderTable = ({ return { columnState, - Table: , + // key is required since Next.js 15.2.0 to prevent React key error + Table:
, } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da38c8aff4..28536d68aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ importers: specifier: 0.14.0 version: 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@next/bundle-analyzer': - specifier: 15.1.5 - version: 15.1.5(bufferutil@4.0.8) + specifier: 15.2.0 + version: 15.2.0(bufferutil@4.0.8) '@payloadcms/db-postgres': specifier: workspace:* version: link:packages/db-postgres @@ -45,7 +45,7 @@ importers: version: 1.50.0 '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) '@sentry/node': specifier: ^8.33.1 version: 8.37.1 @@ -71,11 +71,11 @@ importers: specifier: 22.5.4 version: 22.5.4 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) '@types/shelljs': specifier: 0.8.15 version: 0.8.15 @@ -102,7 +102,7 @@ importers: version: 0.28.0 drizzle-orm: specifier: 0.36.1 - version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) escape-html: specifier: ^1.0.3 version: 1.0.3 @@ -134,8 +134,8 @@ importers: specifier: ^10 version: 10.1.3(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: - specifier: 15.1.5 - version: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + specifier: 15.2.0 + version: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) open: specifier: ^10.1.0 version: 10.1.0 @@ -296,7 +296,7 @@ importers: version: 0.28.0 drizzle-orm: specifier: 0.36.1 - version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) pg: specifier: 8.11.3 version: 8.11.3 @@ -342,7 +342,7 @@ importers: version: 0.28.0 drizzle-orm: specifier: 0.36.1 - version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) prompts: specifier: 2.4.2 version: 2.4.2 @@ -382,7 +382,7 @@ importers: version: 0.28.0 drizzle-orm: specifier: 0.36.1 - version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) pg: specifier: 8.11.3 version: 8.11.3 @@ -422,7 +422,7 @@ importers: version: 2.12.1 drizzle-orm: specifier: 0.36.1 - version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) + version: 0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0) prompts: specifier: 2.4.2 version: 2.4.2 @@ -641,11 +641,11 @@ importers: specifier: workspace:* version: link:../eslint-config '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -712,7 +712,7 @@ importers: version: 7.0.2 react-diff-viewer-continued: specifier: 4.0.4 - version: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: specifier: 1.77.4 version: 1.77.4 @@ -745,11 +745,11 @@ importers: specifier: 1.5.4 version: 1.5.4 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) '@types/uuid': specifier: 10.0.0 version: 10.0.0 @@ -976,11 +976,11 @@ importers: specifier: ^2.1.2 version: 2.1.2 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -1007,11 +1007,11 @@ importers: specifier: ^1.0.4 version: 1.0.4 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) copyfiles: specifier: 2.4.1 version: 2.4.1 @@ -1078,11 +1078,11 @@ importers: specifier: workspace:* version: link:../eslint-config '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -1091,7 +1091,7 @@ importers: dependencies: '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) '@sentry/types': specifier: ^8.33.1 version: 8.37.1 @@ -1106,11 +1106,11 @@ importers: specifier: workspace:* version: link:../eslint-config '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -1137,11 +1137,11 @@ importers: specifier: workspace:* version: link:../next '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -1174,11 +1174,11 @@ importers: specifier: ^4.4.7 version: 4.4.9 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) '@types/uuid': specifier: 10.0.0 version: 10.0.0 @@ -1310,11 +1310,11 @@ importers: specifier: 22.5.4 version: 22.5.4 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) babel-plugin-react-compiler: specifier: 19.0.0-beta-714736e-20250131 version: 19.0.0-beta-714736e-20250131 @@ -1374,11 +1374,11 @@ importers: specifier: 22.5.4 version: 22.5.4 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) payload: specifier: workspace:* version: link:../payload @@ -1444,7 +1444,7 @@ importers: version: link:../plugin-cloud-storage uploadthing: specifier: 7.3.0 - version: 7.3.0(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 7.3.0(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) devDependencies: payload: specifier: workspace:* @@ -1476,11 +1476,11 @@ importers: specifier: 1.10.12 version: 1.10.12(@swc/helpers@0.5.15) '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) dotenv: specifier: 16.4.7 version: 16.4.7 @@ -1552,7 +1552,7 @@ importers: version: 10.1.8(react@19.0.0) react-select: specifier: 5.9.0 - version: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: specifier: 0.25.0 version: 0.25.0 @@ -1591,11 +1591,11 @@ importers: specifier: workspace:* version: link:../eslint-config '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) '@types/uuid': specifier: 10.0.0 version: 10.0.0 @@ -1624,8 +1624,8 @@ importers: specifier: 1.2.0 version: 1.2.0 '@next/env': - specifier: 15.1.5 - version: 15.1.5 + specifier: 15.2.0 + version: 15.2.0 '@payloadcms/db-mongodb': specifier: workspace:* version: link:../packages/db-mongodb @@ -1724,7 +1724,7 @@ importers: version: link:../packages/ui '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) '@sentry/react': specifier: ^7.77.0 version: 7.119.2(react@19.0.0) @@ -1732,11 +1732,11 @@ importers: specifier: 29.5.12 version: 29.5.12 '@types/react': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) babel-plugin-react-compiler: specifier: 19.0.0-beta-714736e-20250131 version: 19.0.0-beta-714736e-20250131 @@ -1777,8 +1777,8 @@ importers: specifier: 8.9.5 version: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: - specifier: 15.1.5 - version: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + specifier: 15.2.0 + version: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) nodemailer: specifier: 6.9.16 version: 6.9.16 @@ -4148,8 +4148,8 @@ packages: '@neondatabase/serverless@0.9.5': resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==} - '@next/bundle-analyzer@15.1.5': - resolution: {integrity: sha512-pCYMPgGRwf+FjEwUXFo3QF14VzBSPPsBHSFuXUpq5ifKcY8LbcmoF2xMVVMa2HoYgA1XuqPSAIfLJr4YXNa9xQ==} + '@next/bundle-analyzer@15.2.0': + resolution: {integrity: sha512-RZjYnKD6qQRIQ58YefxnbUIH6dq3cqcZPWpdLkKRaQFbnNejmXCA6MWAIMGDiAOt/NUL/IlhQhSDeADtmF3sFg==} '@next/env@15.0.3': resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==} @@ -4160,6 +4160,9 @@ packages: '@next/env@15.1.5': resolution: {integrity: sha512-jg8ygVq99W3/XXb9Y6UQsritwhjc+qeiO7QrGZRYOfviyr/HcdnhdBQu4gbp2rBIh2ZyBYTBMWbPw3JSCb0GHw==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} + '@next/eslint-plugin-next@15.1.5': resolution: {integrity: sha512-3cCrXBybsqe94UxD6DBQCYCCiP9YohBMgZ5IzzPYHmPzj8oqNlhBii5b6o1HDDaRHdz2pVnSsAROCtrczy8O0g==} @@ -4175,8 +4178,8 @@ packages: cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@15.1.5': - resolution: {integrity: sha512-5ttHGE75Nw9/l5S8zR2xEwR8OHEqcpPym3idIMAZ2yo+Edk0W/Vf46jGqPOZDk+m/SJ+vYZDSuztzhVha8rcdA==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -4193,8 +4196,8 @@ packages: cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@15.1.5': - resolution: {integrity: sha512-8YnZn7vDURUUTInfOcU5l0UWplZGBqUlzvqKKUFceM11SzfNEz7E28E1Arn4/FsOf90b1Nopboy7i7ufc4jXag==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -4211,8 +4214,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@15.1.5': - resolution: {integrity: sha512-rDJC4ctlYbK27tCyFUhgIv8o7miHNlpCjb2XXfTLQszwAUOSbcMN9q2y3urSrrRCyGVOd9ZR9a4S45dRh6JF3A==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4229,8 +4232,8 @@ packages: cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.5': - resolution: {integrity: sha512-FG5RApf4Gu+J+pHUQxXPM81oORZrKBYKUaBTylEIQ6Lz17hKVDsLbSXInfXM0giclvXbyiLXjTv42sQMATmZ0A==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4247,8 +4250,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.5': - resolution: {integrity: sha512-NX2Ar3BCquAOYpnoYNcKz14eH03XuF7SmSlPzTSSU4PJe7+gelAjxo3Y7F2m8+hLT8ZkkqElawBp7SWBdzwqQw==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4265,8 +4268,8 @@ packages: cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.5': - resolution: {integrity: sha512-EQgqMiNu3mrV5eQHOIgeuh6GB5UU57tu17iFnLfBEhYfiOfyK+vleYKh2dkRVkV6ayx3eSqbIYgE7J7na4hhcA==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4283,8 +4286,8 @@ packages: cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@15.1.5': - resolution: {integrity: sha512-HPULzqR/VqryQZbZME8HJE3jNFmTGcp+uRMHabFbQl63TtDPm+oCXAz3q8XyGv2AoihwNApVlur9Up7rXWRcjg==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -4301,8 +4304,8 @@ packages: cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.5': - resolution: {integrity: sha512-n74fUb/Ka1dZSVYfjwQ+nSJ+ifUff7jGurFcTuJNKZmI62FFOxQXUYit/uZXPTj2cirm1rvGWHG2GhbSol5Ikw==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -5391,14 +5394,16 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@19.0.1': - resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + peerDependencies: + '@types/react': ^19.0.0 '@types/react-transition-group@4.4.11': resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@19.0.1': - resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/request@2.48.12': resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} @@ -8445,8 +8450,8 @@ packages: sass: optional: true - next@15.1.5: - resolution: {integrity: sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -12112,7 +12117,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(@types/react@19.0.1)(react@19.0.0)': + '@emotion/react@11.13.3(@types/react@19.0.10)(react@19.0.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.12.0 @@ -12124,11 +12129,11 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.0.0 optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.10 transitivePeerDependencies: - supports-color - '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': dependencies: '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 @@ -12140,7 +12145,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.0.0 optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.10 transitivePeerDependencies: - supports-color @@ -13307,7 +13312,7 @@ snapshots: dependencies: '@types/pg': 8.11.6 - '@next/bundle-analyzer@15.1.5(bufferutil@4.0.8)': + '@next/bundle-analyzer@15.2.0(bufferutil@4.0.8)': dependencies: webpack-bundle-analyzer: 4.10.1(bufferutil@4.0.8) transitivePeerDependencies: @@ -13320,6 +13325,8 @@ snapshots: '@next/env@15.1.5': {} + '@next/env@15.2.0': {} + '@next/eslint-plugin-next@15.1.5': dependencies: fast-glob: 3.3.1 @@ -13330,7 +13337,7 @@ snapshots: '@next/swc-darwin-arm64@15.1.3': optional: true - '@next/swc-darwin-arm64@15.1.5': + '@next/swc-darwin-arm64@15.2.0': optional: true '@next/swc-darwin-x64@15.0.3': @@ -13339,7 +13346,7 @@ snapshots: '@next/swc-darwin-x64@15.1.3': optional: true - '@next/swc-darwin-x64@15.1.5': + '@next/swc-darwin-x64@15.2.0': optional: true '@next/swc-linux-arm64-gnu@15.0.3': @@ -13348,7 +13355,7 @@ snapshots: '@next/swc-linux-arm64-gnu@15.1.3': optional: true - '@next/swc-linux-arm64-gnu@15.1.5': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true '@next/swc-linux-arm64-musl@15.0.3': @@ -13357,7 +13364,7 @@ snapshots: '@next/swc-linux-arm64-musl@15.1.3': optional: true - '@next/swc-linux-arm64-musl@15.1.5': + '@next/swc-linux-arm64-musl@15.2.0': optional: true '@next/swc-linux-x64-gnu@15.0.3': @@ -13366,7 +13373,7 @@ snapshots: '@next/swc-linux-x64-gnu@15.1.3': optional: true - '@next/swc-linux-x64-gnu@15.1.5': + '@next/swc-linux-x64-gnu@15.2.0': optional: true '@next/swc-linux-x64-musl@15.0.3': @@ -13375,7 +13382,7 @@ snapshots: '@next/swc-linux-x64-musl@15.1.3': optional: true - '@next/swc-linux-x64-musl@15.1.5': + '@next/swc-linux-x64-musl@15.2.0': optional: true '@next/swc-win32-arm64-msvc@15.0.3': @@ -13384,7 +13391,7 @@ snapshots: '@next/swc-win32-arm64-msvc@15.1.3': optional: true - '@next/swc-win32-arm64-msvc@15.1.5': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true '@next/swc-win32-x64-msvc@15.0.3': @@ -13393,7 +13400,7 @@ snapshots: '@next/swc-win32-x64-msvc@15.1.3': optional: true - '@next/swc-win32-x64-msvc@15.1.5': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': @@ -13896,7 +13903,7 @@ snapshots: '@sentry/utils': 7.119.2 localforage: 1.10.0 - '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': + '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) @@ -13912,7 +13919,7 @@ snapshots: '@sentry/vercel-edge': 8.37.1 '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) chalk: 3.0.0 - next: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.10 @@ -14862,15 +14869,15 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react-dom@19.0.1': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.10 '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.10 - '@types/react@19.0.1': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 @@ -16109,24 +16116,24 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0): + drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.10.2)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0): optionalDependencies: '@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@neondatabase/serverless': 0.9.5 '@opentelemetry/api': 1.9.0 '@types/pg': 8.10.2 - '@types/react': 19.0.1 + '@types/react': 19.0.10 '@vercel/postgres': 0.9.0 pg: 8.11.3 react: 19.0.0 - drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@types/react@19.0.1)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0): + drizzle-orm@0.36.1(@libsql/client@0.14.0(bufferutil@4.0.8))(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.9.0)(@types/pg@8.11.6)(@types/react@19.0.10)(@vercel/postgres@0.9.0)(pg@8.11.3)(react@19.0.0): optionalDependencies: '@libsql/client': 0.14.0(bufferutil@4.0.8)(utf-8-validate@6.0.5) '@neondatabase/serverless': 0.9.5 '@opentelemetry/api': 1.9.0 '@types/pg': 8.11.6 - '@types/react': 19.0.1 + '@types/react': 19.0.10 '@vercel/postgres': 0.9.0 pg: 8.11.3 react: 19.0.0 @@ -18601,9 +18608,9 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.5 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -18613,14 +18620,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(@babel/core@7.26.7)(babel-plugin-macros@3.1.0)(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.5 - '@next/swc-darwin-x64': 15.1.5 - '@next/swc-linux-arm64-gnu': 15.1.5 - '@next/swc-linux-arm64-musl': 15.1.5 - '@next/swc-linux-x64-gnu': 15.1.5 - '@next/swc-linux-x64-musl': 15.1.5 - '@next/swc-win32-arm64-msvc': 15.1.5 - '@next/swc-win32-x64-msvc': 15.1.5 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.50.0 babel-plugin-react-compiler: 19.0.0-beta-714736e-20250131 @@ -19130,10 +19137,10 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 @@ -19166,11 +19173,11 @@ snapshots: react-is@18.3.1: {} - react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@babel/runtime': 7.26.0 '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.3(@types/react@19.0.1)(react@19.0.0) + '@emotion/react': 11.13.3(@types/react@19.0.10)(react@19.0.0) '@floating-ui/dom': 1.6.12 '@types/react-transition-group': 4.4.11 memoize-one: 6.0.0 @@ -19178,7 +19185,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.1)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.10)(react@19.0.0) transitivePeerDependencies: - '@types/react' - supports-color @@ -20292,14 +20299,14 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@7.3.0(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + uploadthing@7.3.0(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: '@effect/platform': 0.69.8(effect@3.10.3) '@uploadthing/mime-types': 0.3.2 '@uploadthing/shared': 7.1.1 effect: 3.10.3 optionalDependencies: - next: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) uri-js@4.4.1: dependencies: @@ -20310,11 +20317,11 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.1 + '@types/react': 19.0.10 utf-8-validate@6.0.5: dependencies: diff --git a/test/package.json b/test/package.json index a6a209d7c3..01442ac8f4 100644 --- a/test/package.json +++ b/test/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@aws-sdk/client-s3": "^3.614.0", "@date-fns/tz": "1.2.0", - "@next/env": "15.1.5", + "@next/env": "15.2.0", "@payloadcms/db-mongodb": "workspace:*", "@payloadcms/db-postgres": "workspace:*", "@payloadcms/db-sqlite": "workspace:*", @@ -60,8 +60,8 @@ "@sentry/nextjs": "^8.33.1", "@sentry/react": "^7.77.0", "@types/jest": "29.5.12", - "@types/react": "19.0.1", - "@types/react-dom": "19.0.1", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "comment-json": "^4.2.3", "create-payload-app": "workspace:*", @@ -75,7 +75,7 @@ "jest": "29.7.0", "jwt-decode": "4.0.0", "mongoose": "8.9.5", - "next": "15.1.5", + "next": "15.2.0", "nodemailer": "6.9.16", "payload": "workspace:*", "qs-esm": "7.0.2", From 6aa9da73f80974bc11c7f2a90a6a612df509f83f Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 27 Feb 2025 08:39:24 -0500 Subject: [PATCH 015/127] Revert "feat: simplify column prefs (#11390)" (#11427) This reverts commit 69c0d09 in #11390. In order to future proof column prefs, it probably is best to continue to use the current shape. This change was intended to ensure that as little transformation to URL params was made as possible for #11387, but we will likely transform them after all. This will ensure that we can add support for additional properties over time, as needed. For example, if we hypothetically wanted to add a custom `label` or similar feature to columns prefs, it would make more sense to use explicit properties to identity `accessor` and `active`. For example: ```ts [ { accessor: "title", active: true, label: 'Custom Label' // hypothetical } ] ``` --- packages/payload/src/admin/functions/index.ts | 4 +-- packages/payload/src/index.ts | 1 - .../payload/src/preferences/migrateColumns.ts | 19 ---------- .../src/preferences/preferencesCollection.ts | 9 ----- packages/payload/src/preferences/types.ts | 6 +--- .../src/elements/RelationshipTable/index.tsx | 10 +++--- .../TableColumns/buildColumnState.tsx | 24 ++++++++----- .../buildPolymorphicColumnState.tsx | 22 +++++++----- .../TableColumns/getInitialColumns.ts | 9 ++--- .../ui/src/elements/TableColumns/index.tsx | 35 ++++++++++++------- packages/ui/src/utilities/renderTable.tsx | 14 ++++---- packages/ui/src/views/List/index.tsx | 1 - test/fields/collections/Text/e2e.spec.ts | 7 +++- tsconfig.base.json | 2 +- 14 files changed, 79 insertions(+), 84 deletions(-) delete mode 100644 packages/payload/src/preferences/migrateColumns.ts diff --git a/packages/payload/src/admin/functions/index.ts b/packages/payload/src/admin/functions/index.ts index 94f930d466..6a127de063 100644 --- a/packages/payload/src/admin/functions/index.ts +++ b/packages/payload/src/admin/functions/index.ts @@ -1,7 +1,7 @@ import type { ImportMap } from '../../bin/generateImportMap/index.js' import type { SanitizedConfig } from '../../config/types.js' import type { PaginatedDocs } from '../../database/types.js' -import type { CollectionSlug, ColumnPreference } from '../../index.js' +import type { CollectionSlug } from '../../index.js' import type { PayloadRequest, Sort, Where } from '../../types/index.js' export type DefaultServerFunctionArgs = { @@ -50,7 +50,7 @@ export type ListQuery = { export type BuildTableStateArgs = { collectionSlug: string | string[] - columns?: ColumnPreference[] + columns?: { accessor: string; active: boolean }[] docs?: PaginatedDocs['docs'] enableRowSelections?: boolean parent?: { diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index b2581d18d2..d955eab676 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1374,7 +1374,6 @@ export { restoreVersionOperation as restoreVersionOperationGlobal } from './glob export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, - ColumnPreference, DocumentPreferences, FieldsPreferences, InsideFieldsPreferences, diff --git a/packages/payload/src/preferences/migrateColumns.ts b/packages/payload/src/preferences/migrateColumns.ts deleted file mode 100644 index bcf6727cd9..0000000000 --- a/packages/payload/src/preferences/migrateColumns.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @todo remove this function and subsequent hooks in v4 - * They are used to transform the old shape of `columnPreferences` to new shape - * i.e. ({ accessor: string, active: boolean })[] to ({ [accessor: string]: boolean })[] - * In v4 can we use the new shape directly - */ -export const migrateColumns = (value: Record) => { - if (value && typeof value === 'object' && 'columns' in value && Array.isArray(value.columns)) { - value.columns = value.columns.map((col) => { - if ('accessor' in col) { - return { [col.accessor]: col.active } - } - - return col - }) - } - - return value -} diff --git a/packages/payload/src/preferences/preferencesCollection.ts b/packages/payload/src/preferences/preferencesCollection.ts index a72389be46..c6b0d4d5c0 100644 --- a/packages/payload/src/preferences/preferencesCollection.ts +++ b/packages/payload/src/preferences/preferencesCollection.ts @@ -2,7 +2,6 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Access, Config } from '../config/types.js' -import { migrateColumns } from './migrateColumns.js' import { deleteHandler } from './requestHandlers/delete.js' import { findByIDHandler } from './requestHandlers/findOne.js' import { updateHandler } from './requestHandlers/update.js' @@ -77,14 +76,6 @@ const getPreferencesCollection = (config: Config): CollectionConfig => ({ { name: 'value', type: 'json', - /** - * @todo remove these hooks in v4 - * See `migrateColumns` for more information - */ - hooks: { - afterRead: [({ value }) => migrateColumns(value)], - beforeValidate: [({ value }) => migrateColumns(value)], - }, validate: (value) => { if (value) { try { diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index c3686006bd..1405841675 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -28,12 +28,8 @@ export type DocumentPreferences = { fields: FieldsPreferences } -export type ColumnPreference = { - [key: string]: boolean -} - export type ListPreferences = { - columns?: ColumnPreference[] + columns?: { accessor: string; active: boolean }[] limit?: number sort?: string } diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 0e4111d474..e45d2ecfeb 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -2,7 +2,6 @@ import type { CollectionSlug, Column, - ColumnPreference, JoinFieldClient, ListQuery, PaginatedDocs, @@ -26,6 +25,7 @@ import { useServerFunctions } from '../../providers/ServerFunctions/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { hoistQueryParamsToAnd } from '../../utilities/mergeListSearchAndWhere.js' import { AnimateHeight } from '../AnimateHeight/index.js' +import './index.scss' import { ColumnSelector } from '../ColumnSelector/index.js' import { useDocumentDrawer } from '../DocumentDrawer/index.js' import { Popup, PopupList } from '../Popup/index.js' @@ -33,7 +33,6 @@ import { RelationshipProvider } from '../Table/RelationshipProvider/index.js' import { TableColumnsProvider } from '../TableColumns/index.js' import { DrawerLink } from './cells/DrawerLink/index.js' import { RelationshipTablePagination } from './Pagination.js' -import './index.scss' const baseClass = 'relationship-table' @@ -124,10 +123,11 @@ export const RelationshipTable: React.FC = (pro newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOptions) } - // map columns from string[] to ColumnPreference[] - const defaultColumns: ColumnPreference[] = field.admin.defaultColumns + // map columns from string[] to ListPreferences['columns'] + const defaultColumns = field.admin.defaultColumns ? field.admin.defaultColumns.map((accessor) => ({ - [accessor]: true, + accessor, + active: true, })) : undefined diff --git a/packages/ui/src/elements/TableColumns/buildColumnState.tsx b/packages/ui/src/elements/TableColumns/buildColumnState.tsx index 909490fdc5..8eaacb507d 100644 --- a/packages/ui/src/elements/TableColumns/buildColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildColumnState.tsx @@ -4,10 +4,10 @@ import type { ClientComponentProps, ClientField, Column, - ColumnPreference, DefaultCellComponentProps, DefaultServerCellComponentProps, Field, + ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -39,8 +39,8 @@ type Args = { beforeRows?: Column[] clientCollectionConfig: ClientCollectionConfig collectionConfig: SanitizedCollectionConfig - columnPreferences: ColumnPreference[] - columns?: ColumnPreference[] + columnPreferences: ListPreferences['columns'] + columns?: ListPreferences['columns'] customCellProps: DefaultCellComponentProps['customCellProps'] docs: PaginatedDocs['docs'] enableRowSelections: boolean @@ -99,10 +99,10 @@ export const buildColumnState = (args: Args): Column[] => { const sortTo = columnPreferences || columns - const sortFieldMap = (fieldMap, sortTo: ColumnPreference[]) => + const sortFieldMap = (fieldMap, sortTo) => fieldMap?.sort((a, b) => { - const aIndex = sortTo.findIndex((column) => 'name' in a && a.name in column) - const bIndex = sortTo.findIndex((column) => 'name' in b && b.name in column) + const aIndex = sortTo.findIndex((column) => 'name' in a && column.accessor === a.name) + const bIndex = sortTo.findIndex((column) => 'name' in b && column.accessor === b.name) if (aIndex === -1 && bIndex === -1) { return 0 @@ -136,12 +136,18 @@ export const buildColumnState = (args: Args): Column[] => { (f) => 'name' in field && 'name' in f && f.name === field.name, ) + const columnPreference = columnPreferences?.find( + (preference) => field && 'name' in field && preference.accessor === field.name, + ) + let active = false - if (columnPreferences) { - active = 'name' in field && columnPreferences?.some((col) => col?.[field.name]) + if (columnPreference) { + active = columnPreference.active } else if (columns && Array.isArray(columns) && columns.length > 0) { - active = 'name' in field && columns.some((col) => col?.[field.name]) + active = columns.find( + (column) => field && 'name' in field && column.accessor === field.name, + )?.active } else if (activeColumnsIndices.length < 4) { active = true } diff --git a/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx b/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx index 471549b96a..916ce7836f 100644 --- a/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx +++ b/packages/ui/src/elements/TableColumns/buildPolymorphicColumnState.tsx @@ -4,10 +4,10 @@ import type { I18nClient } from '@payloadcms/translations' import type { ClientField, Column, - ColumnPreference, DefaultCellComponentProps, DefaultServerCellComponentProps, Field, + ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -36,8 +36,8 @@ import { filterFields } from './filterFields.js' type Args = { beforeRows?: Column[] - columnPreferences: ColumnPreference[] - columns?: ColumnPreference[] + columnPreferences: ListPreferences['columns'] + columns?: ListPreferences['columns'] customCellProps: DefaultCellComponentProps['customCellProps'] docs: PaginatedDocs['docs'] enableRowSelections: boolean @@ -92,8 +92,8 @@ export const buildPolymorphicColumnState = (args: Args): Column[] => { const sortFieldMap = (fieldMap, sortTo) => fieldMap?.sort((a, b) => { - const aIndex = sortTo.findIndex((column) => 'name' in a && a.name in column) - const bIndex = sortTo.findIndex((column) => 'name' in b && b.name in column) + const aIndex = sortTo.findIndex((column) => 'name' in a && column.accessor === a.name) + const bIndex = sortTo.findIndex((column) => 'name' in b && column.accessor === b.name) if (aIndex === -1 && bIndex === -1) { return 0 @@ -127,12 +127,18 @@ export const buildPolymorphicColumnState = (args: Args): Column[] => { (f) => 'name' in field && 'name' in f && f.name === field.name, ) + const columnPreference = columnPreferences?.find( + (preference) => field && 'name' in field && preference.accessor === field.name, + ) + let active = false - if (columnPreferences) { - active = 'name' in field && columnPreferences?.some((col) => col?.[field.name]) + if (columnPreference) { + active = columnPreference.active } else if (columns && Array.isArray(columns) && columns.length > 0) { - active = 'name' in field && columns.some((col) => col?.[field.name]) + active = columns.find( + (column) => field && 'name' in field && column.accessor === field.name, + )?.active } else if (activeColumnsIndices.length < 4) { active = true } diff --git a/packages/ui/src/elements/TableColumns/getInitialColumns.ts b/packages/ui/src/elements/TableColumns/getInitialColumns.ts index 304a11cba3..02e797ec38 100644 --- a/packages/ui/src/elements/TableColumns/getInitialColumns.ts +++ b/packages/ui/src/elements/TableColumns/getInitialColumns.ts @@ -1,11 +1,11 @@ -import type { ClientField, CollectionConfig, ColumnPreference, Field } from 'payload' +import type { ClientField, CollectionConfig, Field, ListPreferences } from 'payload' import { fieldAffectsData } from 'payload/shared' const getRemainingColumns = ( fields: T, useAsTitle: string, -): ColumnPreference[] => +): ListPreferences['columns'] => fields?.reduce((remaining, field) => { if (fieldAffectsData(field) && field.name === useAsTitle) { return remaining @@ -40,7 +40,7 @@ export const getInitialColumns = ( fields: T, useAsTitle: CollectionConfig['admin']['useAsTitle'], defaultColumns: CollectionConfig['admin']['defaultColumns'], -): ColumnPreference[] => { +): ListPreferences['columns'] => { let initialColumns = [] if (Array.isArray(defaultColumns) && defaultColumns.length >= 1) { @@ -57,6 +57,7 @@ export const getInitialColumns = ( } return initialColumns.map((column) => ({ - [column]: true, + accessor: column, + active: true, })) } diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 9dcab9db9e..5d7120e7a0 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { Column, ColumnPreference, ListPreferences, SanitizedCollectionConfig } from 'payload' +import type { Column, ListPreferences, SanitizedCollectionConfig } from 'payload' import React, { createContext, useCallback, useContext, useEffect } from 'react' @@ -39,10 +39,12 @@ type Props = { } // strip out Heading, Label, and renderedCells properties, they cannot be sent to the server -const formatColumnPreferences = (columns: Column[]): ColumnPreference[] => - columns.map(({ accessor, active }) => ({ - [accessor]: active, +const sanitizeColumns = (columns: Column[]) => { + return columns.map(({ accessor, active }) => ({ + accessor, + active, })) +} export const TableColumnsProvider: React.FC = ({ children, @@ -88,7 +90,7 @@ export const TableColumnsProvider: React.FC = ({ const result = await getTableState({ collectionSlug, - columns: formatColumnPreferences(withMovedColumn), + columns: sanitizeColumns(withMovedColumn), docs, enableRowSelections, renderRowTypes, @@ -121,7 +123,7 @@ export const TableColumnsProvider: React.FC = ({ const { newColumnState, toggledColumns } = tableColumns.reduce<{ newColumnState: Column[] - toggledColumns: ColumnPreference[] + toggledColumns: Pick[] }>( (acc, col) => { if (col.accessor === column) { @@ -131,12 +133,14 @@ export const TableColumnsProvider: React.FC = ({ active: !col.active, }) acc.toggledColumns.push({ - [col.accessor]: !col.active, + accessor: col.accessor, + active: !col.active, }) } else { acc.newColumnState.push(col) acc.toggledColumns.push({ - [col.accessor]: col.active, + accessor: col.accessor, + active: col.active, }) } @@ -178,8 +182,14 @@ export const TableColumnsProvider: React.FC = ({ const setActiveColumns = React.useCallback( async (activeColumnAccessors: string[]) => { - const activeColumns: ColumnPreference[] = formatColumnPreferences( - tableColumns.sort((first, second) => { + const activeColumns: Pick[] = tableColumns + .map((col) => { + return { + accessor: col.accessor, + active: activeColumnAccessors.includes(col.accessor), + } + }) + .sort((first, second) => { const indexOfFirst = activeColumnAccessors.indexOf(first.accessor) const indexOfSecond = activeColumnAccessors.indexOf(second.accessor) @@ -188,8 +198,7 @@ export const TableColumnsProvider: React.FC = ({ } return indexOfFirst > indexOfSecond ? 1 : -1 - }), - ) + }) const { state: columnState, Table } = await getTableState({ collectionSlug, @@ -230,7 +239,7 @@ export const TableColumnsProvider: React.FC = ({ if (collectionHasChanged || !listPreferences) { const currentPreferences = await getPreference<{ - columns: ColumnPreference[] + columns: ListPreferences['columns'] }>(preferenceKey) prevCollection.current = defaultCollection diff --git a/packages/ui/src/utilities/renderTable.tsx b/packages/ui/src/utilities/renderTable.tsx index ae2776e11c..9ef3a6d154 100644 --- a/packages/ui/src/utilities/renderTable.tsx +++ b/packages/ui/src/utilities/renderTable.tsx @@ -3,10 +3,9 @@ import type { ClientConfig, ClientField, CollectionConfig, - Column, - ColumnPreference, Field, ImportMap, + ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -15,6 +14,9 @@ import type { import { getTranslation, type I18nClient } from '@payloadcms/translations' import { fieldAffectsData, fieldIsHiddenOrDisabled, flattenTopLevelFields } from 'payload/shared' +// eslint-disable-next-line payload/no-imports-from-exports-dir +import type { Column } from '../exports/client/index.js' + import { RenderServerComponent } from '../elements/RenderServerComponent/index.js' import { buildColumnState } from '../elements/TableColumns/buildColumnState.js' import { buildPolymorphicColumnState } from '../elements/TableColumns/buildPolymorphicColumnState.js' @@ -69,8 +71,8 @@ export const renderTable = ({ clientConfig?: ClientConfig collectionConfig?: SanitizedCollectionConfig collections?: string[] - columnPreferences: ColumnPreference[] - columns?: ColumnPreference[] + columnPreferences: ListPreferences['columns'] + columns?: ListPreferences['columns'] customCellProps?: Record docs: PaginatedDocs['docs'] drawerSlug?: string @@ -107,7 +109,7 @@ export const renderTable = ({ const columns = columnsFromArgs ? columnsFromArgs?.filter((column) => flattenTopLevelFields(fields, true)?.some( - (field) => 'name' in field && column[field.name], + (field) => 'name' in field && field.name === column.accessor, ), ) : getInitialColumns(fields, useAsTitle, []) @@ -128,7 +130,7 @@ export const renderTable = ({ const columns = columnsFromArgs ? columnsFromArgs?.filter((column) => flattenTopLevelFields(clientCollectionConfig.fields, true)?.some( - (field) => 'name' in field && field.name in column, + (field) => 'name' in field && field.name === column.accessor, ), ) : getInitialColumns( diff --git a/packages/ui/src/views/List/index.tsx b/packages/ui/src/views/List/index.tsx index bd9be45dbb..9a5c862541 100644 --- a/packages/ui/src/views/List/index.tsx +++ b/packages/ui/src/views/List/index.tsx @@ -151,7 +151,6 @@ export function DefaultListView(props: ListViewClientProps) { ]) } }, [setStepNav, labels, drawerDepth]) - return ( { user: client.user, key: 'text-fields-list', value: { - columns: [{ disableListColumnText: true }], + columns: [ + { + accessor: 'disableListColumnText', + active: true, + }, + ], }, }) diff --git a/tsconfig.base.json b/tsconfig.base.json index 26c3c9821e..fed3e543da 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/_community/config.ts"], + "@payload-config": ["./test/fields-relationship/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], From bcc68572bf4801b41a678759a1bd049c08dd5ae2 Mon Sep 17 00:00:00 2001 From: Patrik Date: Thu, 27 Feb 2025 10:36:34 -0500 Subject: [PATCH 016/127] docs: adds Reserved Field Names section to migration guide (#11308) Added a new Reserved Field Names section to the migration guide. Clarified that certain field names (`__v`, `salt`, `hash`, `file`, etc.) are reserved for internal use and will be sanitized from the config if used. Included additional reserved names specific to `MongoDB`, `auth`-enabled collections, and `upload`-enabled collections. Added a note recommending against using field names with an underscore (`_`) prefix, as they are reserved for internal columns and may cause conflicts in `SQL` and other contexts. Fixes #11159 --- docs/migration-guide/overview.mdx | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/migration-guide/overview.mdx b/docs/migration-guide/overview.mdx index 386cee9a5c..fa3687d011 100644 --- a/docs/migration-guide/overview.mdx +++ b/docs/migration-guide/overview.mdx @@ -1113,6 +1113,57 @@ plugins: [ If you have custom features for `@payloadcms/richtext-lexical` you will need to migrate your code to the new API. Read more about the new API in the [documentation](https://payloadcms.com/docs/rich-text/building-custom-features). +## Reserved Field names + +Payload reserves certain field names for internal use. Using any of the following names in your collections or globals will result in those fields being sanitized from the config, which can cause deployment errors. Ensure that any conflicting fields are renamed before migrating. + +### General Reserved Names + +- `file` +- `_id` (MongoDB only) +- `__v` (MongoDB only) + +**Important Note**: It is recommended to avoid using field names with an underscore (`_`) prefix unless explicitly required by a plugin. Payload uses this prefix for internal columns, which can lead to conflicts in certain SQL conditions. The following are examples of reserved internal columns (this list is not exhaustive and other internal fields may also apply): + +- `_order` +- `_path` +- `_uuid` +- `_parent_id` +- `_locale` + +### Auth-Related Reserved Names + +These are restricted if your collection uses `auth: true` and does not have `disableAuthStrategy: true`: +- `salt` +- `hash` +- `apiKey` (when `auth.useAPIKey: true` is enabled) +- `useAPIKey` (when `auth.useAPIKey: true` is enabled) +- `resetPasswordToken` +- `resetPasswordExpiration` +- `password` +- `email` +- `username` + +### Upload-Related Reserved Names + +These apply if your collection has `upload: true` configured: + +- `filename` +- `mimetype` +- `filesize` +- `width` +- `height` +- `focalX` +- `focalY` +- `url` +- `thumbnailURL` + +If `imageSizes` is configured, the following are also reserved: + +- `sizes` + +If any of these names are found in your collection / global fields, update them before migrating to avoid unexpected issues. + ## Upgrade from previous beta Reference this [community-made site](https://payload-releases-filter.vercel.app/?version=3&from=152429656&to=188243150&sort=asc&breaking=on). Set your version, sort by oldest first, enable breaking changes only. From 3436fb16ead18f0eed10ca9e40f890732a7157db Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Thu, 27 Feb 2025 18:05:48 +0200 Subject: [PATCH 017/127] feat: allow to count related docs for join fields (#11395) ### What? For the join field query adds ability to specify `count: true`, example: ```ts const result = await payload.find({ joins: { 'group.relatedPosts': { sort: '-title', count: true, }, }, collection: "categories", }) result.group?.relatedPosts?.totalDocs // available ``` ### Why? Can be useful to implement full pagination / show total related documents count in the UI. ### How? Implements the logic in database adapters. In MongoDB it's additional `$lookup` that has `$count` in the pipeline. In SQL, it's additional subquery with `COUNT(*)`. Preserves the current behavior by default, since counting introduces overhead. Additionally, fixes a typescript generation error for join fields. Before, `docs` and `hasNextPage` were marked as nullable, which is not true, these fields cannot be `null`. Additionally, fixes threading of `joinQuery` in `transform/read/traverseFields` for group / tab fields recursive calls. --- docs/fields/join.mdx | 11 +- .../src/utilities/buildJoinAggregation.ts | 114 ++++++-- packages/drizzle/src/find/traverseFields.ts | 24 +- .../src/transform/read/traverseFields.ts | 19 +- packages/payload/src/types/index.ts | 1 + .../src/utilities/configToJSONSchema.ts | 7 +- .../src/utilities/sanitizeJoinParams.ts | 1 + test/joins/int.spec.ts | 63 +++++ test/joins/payload-types.ts | 244 ++++++++++-------- 9 files changed, 345 insertions(+), 139 deletions(-) diff --git a/docs/fields/join.mdx b/docs/fields/join.mdx index e7a0e7f056..2a80619f04 100644 --- a/docs/fields/join.mdx +++ b/docs/fields/join.mdx @@ -158,6 +158,7 @@ object with: - `docs` an array of related documents or only IDs if the depth is reached - `hasNextPage` a boolean indicating if there are additional documents +- `totalDocs` a total number of documents, exists only if `count: true` is passed to the join query ```json { @@ -171,7 +172,8 @@ object with: } // { ... } ], - "hasNextPage": false + "hasNextPage": false, + "totalDocs": 10, // if count: true is passed } // other fields... } @@ -184,6 +186,7 @@ object with: - `docs` an array of `relationTo` - the collection slug of the document and `value` - the document itself or the ID if the depth is reached - `hasNextPage` a boolean indicating if there are additional documents +- `totalDocs` a total number of documents, exists only if `count: true` is passed to the join query ```json { @@ -200,7 +203,8 @@ object with: } // { ... } ], - "hasNextPage": false + "hasNextPage": false, + "totalDocs": 10, // if count: true is passed } // other fields... } @@ -215,10 +219,11 @@ returning. This is useful for performance reasons when you don't need the relate The following query options are supported: | Property | Description | -|-------------|-----------------------------------------------------------------------------------------------------| +| ----------- | --------------------------------------------------------------------------------------------------- | | **`limit`** | The maximum related documents to be returned, default is 10. | | **`where`** | An optional `Where` query to filter joined documents. Will be merged with the field `where` object. | | **`sort`** | A string used to order related results | +| **`count`** | Whether include the count of related documents or not. Not included by default | These can be applied to the local API, GraphQL, and REST API. diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 0ffe07e6e1..85f2355bdb 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -78,6 +78,7 @@ export const buildJoinAggregation = async ({ } const { + count = false, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, @@ -121,6 +122,28 @@ export const buildJoinAggregation = async ({ const alias = `${as}.docs.${collectionSlug}` aliases.push(alias) + const basePipeline = [ + { + $addFields: { + relationTo: { + $literal: collectionSlug, + }, + }, + }, + { + $match: { + $and: [ + { + $expr: { + $eq: [`$${join.field.on}`, '$$root_id_'], + }, + }, + $match, + ], + }, + }, + ] + aggregate.push({ $lookup: { as: alias, @@ -129,25 +152,7 @@ export const buildJoinAggregation = async ({ root_id_: '$_id', }, pipeline: [ - { - $addFields: { - relationTo: { - $literal: collectionSlug, - }, - }, - }, - { - $match: { - $and: [ - { - $expr: { - $eq: [`$${join.field.on}`, '$$root_id_'], - }, - }, - $match, - ], - }, - }, + ...basePipeline, { $sort: { [sortProperty]: sortDirection, @@ -169,6 +174,24 @@ export const buildJoinAggregation = async ({ ], }, }) + + if (count) { + aggregate.push({ + $lookup: { + as: `${as}.totalDocs.${alias}`, + from: adapter.collections[collectionSlug].collection.name, + let: { + root_id_: '$_id', + }, + pipeline: [ + ...basePipeline, + { + $count: 'result', + }, + ], + }, + }) + } } aggregate.push({ @@ -179,6 +202,23 @@ export const buildJoinAggregation = async ({ }, }) + if (count) { + aggregate.push({ + $addFields: { + [`${as}.totalDocs`]: { + $add: aliases.map((alias) => ({ + $ifNull: [ + { + $first: `$${as}.totalDocs.${alias}.result`, + }, + 0, + ], + })), + }, + }, + }) + } + aggregate.push({ $set: { [`${as}.docs`]: { @@ -222,6 +262,7 @@ export const buildJoinAggregation = async ({ } const { + count, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, @@ -274,6 +315,31 @@ export const buildJoinAggregation = async ({ polymorphicSuffix = '.value' } + const addTotalDocsAggregation = (as: string, foreignField: string) => + aggregate.push( + { + $lookup: { + as: `${as}.totalDocs`, + foreignField, + from: adapter.collections[slug].collection.name, + localField: versions ? 'parent' : '_id', + pipeline: [ + { + $match, + }, + { + $count: 'result', + }, + ], + }, + }, + { + $addFields: { + [`${as}.totalDocs`]: { $ifNull: [{ $first: `$${as}.totalDocs.result` }, 0] }, + }, + }, + ) + if (adapter.payload.config.localization && locale === 'all') { adapter.payload.config.localization.localeCodes.forEach((code) => { const as = `${versions ? `version.${join.joinPath}` : join.joinPath}${code}` @@ -304,6 +370,7 @@ export const buildJoinAggregation = async ({ }, }, ) + if (limitJoin > 0) { aggregate.push({ $addFields: { @@ -313,6 +380,10 @@ export const buildJoinAggregation = async ({ }, }) } + + if (count) { + addTotalDocsAggregation(as, `${join.field.on}${code}${polymorphicSuffix}`) + } }) } else { const localeSuffix = @@ -359,6 +430,11 @@ export const buildJoinAggregation = async ({ }, }, ) + + if (count) { + addTotalDocsAggregation(as, foreignField) + } + if (limitJoin > 0) { aggregate.push({ $addFields: { diff --git a/packages/drizzle/src/find/traverseFields.ts b/packages/drizzle/src/find/traverseFields.ts index d4cf87df3e..629f5b124e 100644 --- a/packages/drizzle/src/find/traverseFields.ts +++ b/packages/drizzle/src/find/traverseFields.ts @@ -2,7 +2,7 @@ import type { LibSQLDatabase } from 'drizzle-orm/libsql' import type { SQLiteSelectBase } from 'drizzle-orm/sqlite-core' import type { FlattenedField, JoinQuery, SelectMode, SelectType, Where } from 'payload' -import { and, asc, desc, eq, or, sql } from 'drizzle-orm' +import { and, asc, count, desc, eq, or, sql } from 'drizzle-orm' import { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared' import toSnakeCase from 'to-snake-case' @@ -386,6 +386,7 @@ export const traverseFields = ({ } const { + count: shouldCount = false, limit: limitArg = field.defaultLimit ?? 10, page, sort = field.defaultSort, @@ -480,6 +481,13 @@ export const traverseFields = ({ sqlWhere = and(sqlWhere, buildSQLWhere(where, subQueryAlias)) } + if (shouldCount) { + currentArgs.extras[`${columnName}_count`] = sql`${db + .select({ count: count() }) + .from(sql`${currentQuery.as(subQueryAlias)}`) + .where(sqlWhere)}`.as(`${columnName}_count`) + } + currentQuery = currentQuery.orderBy(sortOrder(sql`"sortPath"`)) as SQLSelect if (page && limit !== 0) { @@ -611,6 +619,20 @@ export const traverseFields = ({ .orderBy(() => orderBy.map(({ column, order }) => order(column))), }).as(subQueryAlias) + if (shouldCount) { + currentArgs.extras[`${columnName}_count`] = sql`${db + .select({ + count: count(), + }) + .from( + sql`${db + .select(selectFields as any) + .from(newAliasTable) + .where(subQueryWhere) + .as(`${subQueryAlias}_count_subquery`)}`, + )}`.as(`${subQueryAlias}_count`) + } + currentArgs.extras[columnName] = sql`${db .select({ result: jsonAggBuildObject(adapter, { diff --git a/packages/drizzle/src/transform/read/traverseFields.ts b/packages/drizzle/src/transform/read/traverseFields.ts index 3bb4aedb2c..9a051d1f67 100644 --- a/packages/drizzle/src/transform/read/traverseFields.ts +++ b/packages/drizzle/src/transform/read/traverseFields.ts @@ -1,6 +1,7 @@ import type { FlattenedBlock, FlattenedField, JoinQuery, SanitizedConfig } from 'payload' import { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared' +import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter } from '../../types.js' import type { BlocksMap } from '../../utilities/createBlocksMap.js' @@ -398,7 +399,7 @@ export const traverseFields = >({ } if (field.type === 'join') { - const { limit = field.defaultLimit ?? 10 } = + const { count, limit = field.defaultLimit ?? 10 } = joinQuery?.[`${fieldPrefix.replaceAll('_', '.')}${field.name}`] || {} // raw hasMany results from SQLite @@ -407,8 +408,8 @@ export const traverseFields = >({ } let fieldResult: - | { docs: unknown[]; hasNextPage: boolean } - | Record + | { docs: unknown[]; hasNextPage: boolean; totalDocs?: number } + | Record if (Array.isArray(fieldData)) { if (isLocalized && adapter.payload.config.localization) { fieldResult = fieldData.reduce( @@ -449,6 +450,17 @@ export const traverseFields = >({ } } + if (count) { + const countPath = `${fieldName}_count` + if (typeof table[countPath] !== 'undefined') { + let value = Number(table[countPath]) + if (Number.isNaN(value)) { + value = 0 + } + fieldResult.totalDocs = value + } + } + result[field.name] = fieldResult return result } @@ -607,6 +619,7 @@ export const traverseFields = >({ deletions, fieldPrefix: groupFieldPrefix, fields: field.flattenedFields, + joinQuery, numbers, parentIsLocalized: parentIsLocalized || field.localized, path: `${sanitizedPath}${field.name}`, diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 185962d6a9..3c3496f10d 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -145,6 +145,7 @@ export type JoinQuery = | Partial<{ [K in keyof TypedCollectionJoins[TSlug]]: | { + count?: boolean limit?: number page?: number sort?: string diff --git a/packages/payload/src/utilities/configToJSONSchema.ts b/packages/payload/src/utilities/configToJSONSchema.ts index d17d39a869..ddba5263d5 100644 --- a/packages/payload/src/utilities/configToJSONSchema.ts +++ b/packages/payload/src/utilities/configToJSONSchema.ts @@ -434,14 +434,15 @@ export function fieldsToJSONSchema( fieldSchema = { ...baseFieldSchema, - type: withNullableJSONSchemaType('object', false), + type: 'object', additionalProperties: false, properties: { docs: { - type: withNullableJSONSchemaType('array', false), + type: 'array', items, }, - hasNextPage: { type: withNullableJSONSchemaType('boolean', false) }, + hasNextPage: { type: 'boolean' }, + totalDocs: { type: 'number' }, }, } break diff --git a/packages/payload/src/utilities/sanitizeJoinParams.ts b/packages/payload/src/utilities/sanitizeJoinParams.ts index 894c1103c0..30215be8a3 100644 --- a/packages/payload/src/utilities/sanitizeJoinParams.ts +++ b/packages/payload/src/utilities/sanitizeJoinParams.ts @@ -27,6 +27,7 @@ export const sanitizeJoinParams = ( joinQuery[schemaPath] = false } else { joinQuery[schemaPath] = { + count: joins[schemaPath].count === 'true', limit: isNumber(joins[schemaPath]?.limit) ? Number(joins[schemaPath].limit) : undefined, page: isNumber(joins[schemaPath]?.page) ? Number(joins[schemaPath].page) : undefined, sort: joins[schemaPath]?.sort ? joins[schemaPath].sort : undefined, diff --git a/test/joins/int.spec.ts b/test/joins/int.spec.ts index f3a8812d67..1fa4a7fe21 100644 --- a/test/joins/int.spec.ts +++ b/test/joins/int.spec.ts @@ -186,6 +186,36 @@ describe('Joins Field', () => { expect(categoryWithPosts.group.relatedPosts.docs[0].title).toStrictEqual('test 9') }) + it('should count joins', async () => { + let categoryWithPosts = await payload.findByID({ + id: category.id, + joins: { + 'group.relatedPosts': { + sort: '-title', + count: true, + }, + }, + collection: categoriesSlug, + }) + + expect(categoryWithPosts.group.relatedPosts?.totalDocs).toBe(15) + + // With limit 1 + categoryWithPosts = await payload.findByID({ + id: category.id, + joins: { + 'group.relatedPosts': { + sort: '-title', + count: true, + limit: 1, + }, + }, + collection: categoriesSlug, + }) + + expect(categoryWithPosts.group.relatedPosts?.totalDocs).toBe(15) + }) + it('should populate relationships in joins', async () => { const { docs } = await payload.find({ limit: 1, @@ -1302,6 +1332,39 @@ describe('Joins Field', () => { expect(parent.children?.docs).toHaveLength(1) expect(parent.children.docs[0]?.value.title).toBe('doc-2') + + // counting + parent = await payload.findByID({ + collection: 'multiple-collections-parents', + id: parent.id, + depth: 1, + joins: { + children: { + count: true, + }, + }, + }) + + expect(parent.children?.totalDocs).toBe(2) + + // counting filtered + parent = await payload.findByID({ + collection: 'multiple-collections-parents', + id: parent.id, + depth: 1, + joins: { + children: { + count: true, + where: { + relationTo: { + equals: 'multiple-collections-2', + }, + }, + }, + }, + }) + + expect(parent.children?.totalDocs).toBe(1) }) }) }) diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 13392fa615..50c6cac398 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -216,9 +216,10 @@ export interface UserAuthOperations { export interface User { id: string; posts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; email: string; @@ -324,9 +325,10 @@ export interface Post { export interface Upload { id: string; relatedPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; url?: string | null; @@ -347,74 +349,90 @@ export interface Category { id: string; name?: string | null; relatedPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; /** * Static Description */ hasManyPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; hasManyPostsLocalized?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; hiddenPosts?: { - docs?: (string | HiddenPost)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | HiddenPost)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; group?: { relatedPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; camelCasePosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; }; arrayPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; localizedArrayPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; blocksPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; polymorphic?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; polymorphics?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; localizedPolymorphic?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; localizedPolymorphics?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; singulars?: { - docs?: (string | Singular)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Singular)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; filtered?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; joinWithError?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; enableErrorOnJoin?: boolean | null; updatedAt: string; createdAt: string; @@ -460,13 +478,15 @@ export interface Version { export interface CategoriesVersion { id: string; relatedVersions?: { - docs?: (string | Version)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Version)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; relatedVersionsMany?: { - docs?: (string | Version)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Version)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; _status?: ('draft' | 'published') | null; @@ -479,9 +499,10 @@ export interface SelfJoin { id: string; rel?: (string | null) | SelfJoin; joins?: { - docs?: (string | SelfJoin)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | SelfJoin)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -504,9 +525,10 @@ export interface LocalizedCategory { id: string; name?: string | null; relatedPosts?: { - docs?: (string | LocalizedPost)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | LocalizedPost)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -518,9 +540,10 @@ export interface RestrictedCategory { id: string; name?: string | null; restrictedPosts?: { - docs?: (string | Post)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | Post)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -532,9 +555,10 @@ export interface CategoriesJoinRestricted { id: string; name?: string | null; collectionRestrictedJoin?: { - docs?: (string | CollectionRestricted)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | CollectionRestricted)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -570,9 +594,10 @@ export interface DepthJoins1 { id: string; rel?: (string | null) | DepthJoins2; joins?: { - docs?: (string | DepthJoins3)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | DepthJoins3)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -583,9 +608,10 @@ export interface DepthJoins1 { export interface DepthJoins2 { id: string; joins?: { - docs?: (string | DepthJoins1)[] | null; - hasNextPage?: boolean | null; - } | null; + docs?: (string | DepthJoins1)[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -606,20 +632,19 @@ export interface DepthJoins3 { export interface MultipleCollectionsParent { id: string; children?: { - docs?: - | ( - | { - relationTo?: 'multiple-collections-1'; - value: string | MultipleCollections1; - } - | { - relationTo?: 'multiple-collections-2'; - value: string | MultipleCollections2; - } - )[] - | null; - hasNextPage?: boolean | null; - } | null; + docs?: ( + | { + relationTo?: 'multiple-collections-1'; + value: string | MultipleCollections1; + } + | { + relationTo?: 'multiple-collections-2'; + value: string | MultipleCollections2; + } + )[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } @@ -656,24 +681,23 @@ export interface Folder { folder?: (string | null) | Folder; title?: string | null; children?: { - docs?: - | ( - | { - relationTo?: 'folders'; - value: string | Folder; - } - | { - relationTo?: 'example-pages'; - value: string | ExamplePage; - } - | { - relationTo?: 'example-posts'; - value: string | ExamplePost; - } - )[] - | null; - hasNextPage?: boolean | null; - } | null; + docs?: ( + | { + relationTo?: 'folders'; + value: string | Folder; + } + | { + relationTo?: 'example-pages'; + value: string | ExamplePage; + } + | { + relationTo?: 'example-posts'; + value: string | ExamplePost; + } + )[]; + hasNextPage?: boolean; + totalDocs?: number; + }; updatedAt: string; createdAt: string; } From bdf0113b2f52f9c7fc06118d4bf2025cec5ca527 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 27 Feb 2025 12:06:03 -0500 Subject: [PATCH 018/127] chore(release): v3.25.0 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/db-sqlite/package.json | 2 +- packages/db-vercel-postgres/package.json | 2 +- packages/drizzle/package.json | 2 +- packages/email-nodemailer/package.json | 2 +- packages/email-resend/package.json | 2 +- packages/graphql/package.json | 2 +- packages/live-preview-react/package.json | 2 +- packages/live-preview-vue/package.json | 2 +- packages/live-preview/package.json | 2 +- packages/next/package.json | 2 +- packages/payload-cloud/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-multi-tenant/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-sentry/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/plugin-stripe/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/storage-azure/package.json | 2 +- packages/storage-gcs/package.json | 2 +- packages/storage-s3/package.json | 2 +- packages/storage-uploadthing/package.json | 2 +- packages/storage-vercel-blob/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index 1d943bebe8..ee711df3e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.24.0", + "version": "3.25.0", "private": true, "type": "module", "scripts": { diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 271dad68c0..0fc55dab30 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.24.0", + "version": "3.25.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 4f4986a84f..a297aad66a 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.24.0", + "version": "3.25.0", "description": "The officially supported MongoDB database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 48772ba576..81d7d4db8c 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.24.0", + "version": "3.25.0", "description": "The officially supported Postgres database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index c02490e8aa..b3b9bfa649 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-sqlite", - "version": "3.24.0", + "version": "3.25.0", "description": "The officially supported SQLite database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index 25fff2ee7c..60c50d6758 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-vercel-postgres", - "version": "3.24.0", + "version": "3.25.0", "description": "Vercel Postgres adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index 7e0b221082..2d9744511e 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/drizzle", - "version": "3.24.0", + "version": "3.25.0", "description": "A library of shared functions used by different payload database adapters", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-nodemailer/package.json b/packages/email-nodemailer/package.json index 19c8f487fa..4b397d14c1 100644 --- a/packages/email-nodemailer/package.json +++ b/packages/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-nodemailer", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload Nodemailer Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-resend/package.json b/packages/email-resend/package.json index 8264428a1d..0192611e1c 100644 --- a/packages/email-resend/package.json +++ b/packages/email-resend/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-resend", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload Resend Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/graphql/package.json b/packages/graphql/package.json index 4afa05af41..b5e4d59fc5 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.24.0", + "version": "3.25.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index fdd1efb19d..67e9a1c7ec 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-react", - "version": "3.24.0", + "version": "3.25.0", "description": "The official React SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview-vue/package.json b/packages/live-preview-vue/package.json index df0e998639..9f18d5124a 100644 --- a/packages/live-preview-vue/package.json +++ b/packages/live-preview-vue/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-vue", - "version": "3.24.0", + "version": "3.25.0", "description": "The official Vue SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 45e1b58e2d..21faa1d42a 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview", - "version": "3.24.0", + "version": "3.25.0", "description": "The official live preview JavaScript SDK for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/next/package.json b/packages/next/package.json index 72568c8fdd..c9660d0d84 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.24.0", + "version": "3.25.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/payload-cloud/package.json b/packages/payload-cloud/package.json index 4a25711dcb..ae43a532ea 100644 --- a/packages/payload-cloud/package.json +++ b/packages/payload-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/payload-cloud", - "version": "3.24.0", + "version": "3.25.0", "description": "The official Payload Cloud plugin", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/payload/package.json b/packages/payload/package.json index 2cd12afb06..93eb11892b 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.24.0", + "version": "3.25.0", "description": "Node, React, Headless CMS and Application Framework built on Next.js", "keywords": [ "admin panel", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index d3a6a9c6e2..3fa532cdaa 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-cloud-storage", - "version": "3.24.0", + "version": "3.25.0", "description": "The official cloud storage plugin for Payload CMS", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 25996f0cc5..5db4617bcf 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-form-builder", - "version": "3.24.0", + "version": "3.25.0", "description": "Form builder plugin for Payload CMS", "keywords": [ "payload", diff --git a/packages/plugin-multi-tenant/package.json b/packages/plugin-multi-tenant/package.json index 634530008e..21ebbf4b68 100644 --- a/packages/plugin-multi-tenant/package.json +++ b/packages/plugin-multi-tenant/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-multi-tenant", - "version": "3.24.0", + "version": "3.25.0", "description": "Multi Tenant plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index e93be9b2e8..0eb2ca9010 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.24.0", + "version": "3.25.0", "description": "The official Nested Docs plugin for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 8d930e9b0e..331737dae1 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.24.0", + "version": "3.25.0", "description": "Redirects plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 8a24e5a11b..d658081823 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.24.0", + "version": "3.25.0", "description": "Search plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index d221827a2d..014cbd2268 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-sentry", - "version": "3.24.0", + "version": "3.25.0", "description": "Sentry plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 7a5296fc62..42e2e170ff 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.24.0", + "version": "3.25.0", "description": "SEO plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index 66ae7aade1..b3e22e1171 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-stripe", - "version": "3.24.0", + "version": "3.25.0", "description": "Stripe plugin for Payload", "keywords": [ "payload", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index d3bcb97034..fec476c50c 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.24.0", + "version": "3.25.0", "description": "The officially supported Lexical richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 17acbc3234..7f07f565ab 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.24.0", + "version": "3.25.0", "description": "The officially supported Slate richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-azure/package.json b/packages/storage-azure/package.json index 62bba29ca6..e3ffab1b58 100644 --- a/packages/storage-azure/package.json +++ b/packages/storage-azure/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-azure", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload storage adapter for Azure Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-gcs/package.json b/packages/storage-gcs/package.json index 6aa313ee23..07d4191587 100644 --- a/packages/storage-gcs/package.json +++ b/packages/storage-gcs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-gcs", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload storage adapter for Google Cloud Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-s3/package.json b/packages/storage-s3/package.json index b095a7b77e..e7e7d18a49 100644 --- a/packages/storage-s3/package.json +++ b/packages/storage-s3/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-s3", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload storage adapter for Amazon S3", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-uploadthing/package.json b/packages/storage-uploadthing/package.json index d03707d1d2..0a5b7c4fc0 100644 --- a/packages/storage-uploadthing/package.json +++ b/packages/storage-uploadthing/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-uploadthing", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload storage adapter for uploadthing", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-vercel-blob/package.json b/packages/storage-vercel-blob/package.json index fc64e6c5a9..b933223759 100644 --- a/packages/storage-vercel-blob/package.json +++ b/packages/storage-vercel-blob/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-vercel-blob", - "version": "3.24.0", + "version": "3.25.0", "description": "Payload storage adapter for Vercel Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/translations/package.json b/packages/translations/package.json index eae68d3bd9..e2ed2b970c 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.24.0", + "version": "3.25.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/ui/package.json b/packages/ui/package.json index dc4eedc56d..38bbb61ea2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.24.0", + "version": "3.25.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", From 7118b6418f0188aef889bc614045e4b2b5014927 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 27 Feb 2025 10:28:08 -0700 Subject: [PATCH 019/127] fix(ui): disable publish button if form is autosaving (#11343) Fixes https://github.com/payloadcms/payload/issues/6648 This PR introduces a new `useFormBackgroundProcessing` hook and a corresponding `setBackgroundProcessing` function in the `useForm` hook. Unlike `useFormProcessing` / `setProcessing`, which mark the entire form as read-only, this new approach only disables the Publish button during autosaving, keeping form fields editable for a better user experience. I named it `backgroundProcessing` because it should run behind the scenes without disrupting the user. You could argue that it is a bit more generic than something like `isAutosaving`, but it signals intent: Background = do not disrupt the user. --- packages/ui/src/elements/Autosave/index.tsx | 16 ++++++++++++++-- packages/ui/src/exports/client/index.ts | 1 + packages/ui/src/forms/Form/context.ts | 12 ++++++++++++ packages/ui/src/forms/Form/index.tsx | 17 ++++++++++++----- packages/ui/src/forms/Form/initContextState.ts | 2 ++ packages/ui/src/forms/Form/types.ts | 5 +++++ packages/ui/src/forms/Submit/index.tsx | 16 ++++++++++++++-- 7 files changed, 60 insertions(+), 9 deletions(-) diff --git a/packages/ui/src/elements/Autosave/index.tsx b/packages/ui/src/elements/Autosave/index.tsx index 0d9d30d3a7..4ddac35fbc 100644 --- a/packages/ui/src/elements/Autosave/index.tsx +++ b/packages/ui/src/elements/Autosave/index.tsx @@ -11,6 +11,7 @@ import { useAllFormFields, useForm, useFormModified, + useFormProcessing, useFormSubmitted, } from '../../forms/Form/context.js' import { useDebounce } from '../../hooks/useDebounce.js' @@ -57,7 +58,8 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) const isProcessingRef = useRef(false) const { reportUpdate } = useDocumentEvents() - const { dispatchFields, isValid, setIsValid, setSubmitted } = useForm() + const { dispatchFields, isValid, setBackgroundProcessing, setIsValid, setSubmitted } = useForm() + const isFormProcessing = useFormProcessing() const [fields] = useAllFormFields() const modified = useFormModified() @@ -108,6 +110,13 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) return } + // Do not autosave if the form is already processing (e.g. if the user clicked the publish button + // right before this autosave runs), as parallel updates could cause conflicts + if (isFormProcessing) { + queueRef.current = [] + return + } + if (!isValidRef.current) { // Clear queue so we don't end up in an infinite loop queueRef.current = [] @@ -120,15 +129,18 @@ export const Autosave: React.FC = ({ id, collection, global: globalDoc }) const latestAction = queueRef.current[queueRef.current.length - 1] queueRef.current = [] + setBackgroundProcessing(true) try { await latestAction() } finally { isProcessingRef.current = false + setBackgroundProcessing(false) if (queueRef.current.length > 0) { await processQueue() } } - }, []) + setBackgroundProcessing(false) + }, [isFormProcessing, setBackgroundProcessing]) const autosaveTimeoutRef = useRef(null) diff --git a/packages/ui/src/exports/client/index.ts b/packages/ui/src/exports/client/index.ts index 870044f2e1..1d1a53d725 100644 --- a/packages/ui/src/exports/client/index.ts +++ b/packages/ui/src/exports/client/index.ts @@ -192,6 +192,7 @@ export { useAllFormFields, useDocumentForm, useForm, + useFormBackgroundProcessing, useFormFields, useFormInitializing, useFormModified, diff --git a/packages/ui/src/forms/Form/context.ts b/packages/ui/src/forms/Form/context.ts index 6c520d93ae..28bba76b21 100644 --- a/packages/ui/src/forms/Form/context.ts +++ b/packages/ui/src/forms/Form/context.ts @@ -15,6 +15,11 @@ const DocumentFormContext = createContext({} as Context) const FormWatchContext = createContext({} as Context) const SubmittedContext = createContext(false) const ProcessingContext = createContext(false) +/** + * If the form has started processing in the background (e.g. + * if autosave is running), this will be true. + */ +const BackgroundProcessingContext = createContext(false) const ModifiedContext = createContext(false) const InitializingContext = createContext(false) const FormFieldsContext = createSelectorContext([{}, () => null]) @@ -36,6 +41,11 @@ const useDocumentForm = (): Context => useContext(DocumentFormContext) const useWatchForm = (): Context => useContext(FormWatchContext) const useFormSubmitted = (): boolean => useContext(SubmittedContext) const useFormProcessing = (): boolean => useContext(ProcessingContext) +/** + * If the form has started processing in the background (e.g. + * if autosave is running), this will be true. + */ +const useFormBackgroundProcessing = (): boolean => useContext(BackgroundProcessingContext) const useFormModified = (): boolean => useContext(ModifiedContext) const useFormInitializing = (): boolean => useContext(InitializingContext) @@ -56,6 +66,7 @@ const useFormFields = ( const useAllFormFields = (): FormFieldsContextType => useFullContext(FormFieldsContext) export { + BackgroundProcessingContext, DocumentFormContext, FormContext, FormFieldsContext, @@ -67,6 +78,7 @@ export { useAllFormFields, useDocumentForm, useForm, + useFormBackgroundProcessing, useFormFields, useFormInitializing, useFormModified, diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 5fc0f2cd21..8e8bc2c2b2 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -36,6 +36,7 @@ import { useUploadHandlers } from '../../providers/UploadHandlers/index.js' import { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js' import { requests } from '../../utilities/api.js' import { + BackgroundProcessingContext, DocumentFormContext, FormContext, FormFieldsContext, @@ -105,6 +106,8 @@ export const Form: React.FC = (props) => { const [isValid, setIsValid] = useState(true) const [initializing, setInitializing] = useState(initializingFromProps) const [processing, setProcessing] = useState(false) + const [backgroundProcessing, setBackgroundProcessing] = useState(false) + const [submitted, setSubmitted] = useState(false) const formRef = useRef(null) const contextRef = useRef({} as FormContextType) @@ -653,6 +656,8 @@ export const Form: React.FC = (props) => { contextRef.current.createFormData = createFormData contextRef.current.setModified = setModified contextRef.current.setProcessing = setProcessing + contextRef.current.setBackgroundProcessing = setBackgroundProcessing + contextRef.current.setSubmitted = setSubmitted contextRef.current.setIsValid = setIsValid contextRef.current.disabled = disabled @@ -798,11 +803,13 @@ export const Form: React.FC = (props) => { - - - {children} - - + + + + {children} + + + diff --git a/packages/ui/src/forms/Form/initContextState.ts b/packages/ui/src/forms/Form/initContextState.ts index 3f49c2a31a..30ba7295ce 100644 --- a/packages/ui/src/forms/Form/initContextState.ts +++ b/packages/ui/src/forms/Form/initContextState.ts @@ -22,6 +22,7 @@ const createFormData: CreateFormData = () => undefined const setModified: SetModified = () => undefined const setProcessing: SetProcessing = () => undefined +const setBackgroundProcessing: SetProcessing = () => undefined const setSubmitted: SetSubmitted = () => undefined const reset: Reset = () => undefined @@ -44,6 +45,7 @@ export const initContextState: Context = { replaceFieldRow: () => undefined, replaceState: () => undefined, reset, + setBackgroundProcessing, setDisabled: () => undefined, setIsValid: () => undefined, setModified, diff --git a/packages/ui/src/forms/Form/types.ts b/packages/ui/src/forms/Form/types.ts index 5455e189ac..f68a23eeb9 100644 --- a/packages/ui/src/forms/Form/types.ts +++ b/packages/ui/src/forms/Form/types.ts @@ -248,6 +248,11 @@ export type Context = { }) => void replaceState: (state: FormState) => void reset: Reset + /** + * If the form has started processing in the background (e.g. + * if autosave is running), this will be true. + */ + setBackgroundProcessing: SetProcessing setDisabled: (disabled: boolean) => void setIsValid: (processing: boolean) => void setModified: SetModified diff --git a/packages/ui/src/forms/Submit/index.tsx b/packages/ui/src/forms/Submit/index.tsx index ecf5ed4f25..6557ccd4f5 100644 --- a/packages/ui/src/forms/Submit/index.tsx +++ b/packages/ui/src/forms/Submit/index.tsx @@ -4,7 +4,12 @@ import React from 'react' import type { Props } from '../../elements/Button/types.js' import { Button } from '../../elements/Button/index.js' -import { useForm, useFormInitializing, useFormProcessing } from '../Form/context.js' +import { + useForm, + useFormBackgroundProcessing, + useFormInitializing, + useFormProcessing, +} from '../Form/context.js' import './index.scss' const baseClass = 'form-submit' @@ -21,10 +26,17 @@ export const FormSubmit: React.FC = (props) => { } = props const processing = useFormProcessing() + const backgroundProcessing = useFormBackgroundProcessing() const initializing = useFormInitializing() const { disabled, submit } = useForm() - const canSave = !(disabledFromProps || initializing || processing || disabled) + const canSave = !( + disabledFromProps || + initializing || + processing || + backgroundProcessing || + disabled + ) const handleClick = onClick ?? From 1d252cbacfe52ba0aa77a97d6e03ba36344387cd Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 27 Feb 2025 13:13:47 -0500 Subject: [PATCH 020/127] templates: bump for v3.25.0 (#11431) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Automated bump of templates for v3.25.0 Triggered by user: @denolfe Co-authored-by: github-actions[bot] --- ...1_180301_initial.json => 20250227_171503_initial.json} | 2 +- ...50211_180301_initial.ts => 20250227_171503_initial.ts} | 0 templates/with-postgres/src/migrations/index.ts | 8 ++++---- templates/with-postgres/src/payload-types.ts | 1 + ...1_180236_initial.json => 20250227_171438_initial.json} | 2 +- ...50211_180236_initial.ts => 20250227_171438_initial.ts} | 0 templates/with-vercel-postgres/src/migrations/index.ts | 8 ++++---- templates/with-vercel-postgres/src/payload-types.ts | 1 + ...1_180251_initial.json => 20250227_171453_initial.json} | 2 +- ...50211_180251_initial.ts => 20250227_171453_initial.ts} | 0 templates/with-vercel-website/src/migrations/index.ts | 8 ++++---- templates/with-vercel-website/src/payload-types.ts | 1 + 12 files changed, 18 insertions(+), 15 deletions(-) rename templates/with-postgres/src/migrations/{20250211_180301_initial.json => 20250227_171503_initial.json} (99%) rename templates/with-postgres/src/migrations/{20250211_180301_initial.ts => 20250227_171503_initial.ts} (100%) rename templates/with-vercel-postgres/src/migrations/{20250211_180236_initial.json => 20250227_171438_initial.json} (99%) rename templates/with-vercel-postgres/src/migrations/{20250211_180236_initial.ts => 20250227_171438_initial.ts} (100%) rename templates/with-vercel-website/src/migrations/{20250211_180251_initial.json => 20250227_171453_initial.json} (99%) rename templates/with-vercel-website/src/migrations/{20250211_180251_initial.ts => 20250227_171453_initial.ts} (100%) diff --git a/templates/with-postgres/src/migrations/20250211_180301_initial.json b/templates/with-postgres/src/migrations/20250227_171503_initial.json similarity index 99% rename from templates/with-postgres/src/migrations/20250211_180301_initial.json rename to templates/with-postgres/src/migrations/20250227_171503_initial.json index 62cd8e0d0d..1961f415ec 100644 --- a/templates/with-postgres/src/migrations/20250211_180301_initial.json +++ b/templates/with-postgres/src/migrations/20250227_171503_initial.json @@ -1,5 +1,5 @@ { - "id": "d1008610-2c21-4fa7-be4d-d42a2aef9de1", + "id": "68ffc268-6144-4470-8258-65a7d4d4bac6", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-postgres/src/migrations/20250211_180301_initial.ts b/templates/with-postgres/src/migrations/20250227_171503_initial.ts similarity index 100% rename from templates/with-postgres/src/migrations/20250211_180301_initial.ts rename to templates/with-postgres/src/migrations/20250227_171503_initial.ts diff --git a/templates/with-postgres/src/migrations/index.ts b/templates/with-postgres/src/migrations/index.ts index 4461bf8aeb..0812d53505 100644 --- a/templates/with-postgres/src/migrations/index.ts +++ b/templates/with-postgres/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250211_180301_initial from './20250211_180301_initial' +import * as migration_20250227_171503_initial from './20250227_171503_initial' export const migrations = [ { - up: migration_20250211_180301_initial.up, - down: migration_20250211_180301_initial.down, - name: '20250211_180301_initial', + up: migration_20250227_171503_initial.up, + down: migration_20250227_171503_initial.down, + name: '20250227_171503_initial', }, ] diff --git a/templates/with-postgres/src/payload-types.ts b/templates/with-postgres/src/payload-types.ts index 47c26925ba..533bc86e73 100644 --- a/templates/with-postgres/src/payload-types.ts +++ b/templates/with-postgres/src/payload-types.ts @@ -64,6 +64,7 @@ export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { users: User; media: Media; diff --git a/templates/with-vercel-postgres/src/migrations/20250211_180236_initial.json b/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json similarity index 99% rename from templates/with-vercel-postgres/src/migrations/20250211_180236_initial.json rename to templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json index dc7589156f..1862003750 100644 --- a/templates/with-vercel-postgres/src/migrations/20250211_180236_initial.json +++ b/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json @@ -1,5 +1,5 @@ { - "id": "62731a0a-be9c-4598-a5f6-6cea3879edfa", + "id": "9507702f-2302-45e9-ac4d-bd33b5d64a5a", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-vercel-postgres/src/migrations/20250211_180236_initial.ts b/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.ts similarity index 100% rename from templates/with-vercel-postgres/src/migrations/20250211_180236_initial.ts rename to templates/with-vercel-postgres/src/migrations/20250227_171438_initial.ts diff --git a/templates/with-vercel-postgres/src/migrations/index.ts b/templates/with-vercel-postgres/src/migrations/index.ts index d37741fac9..67a93f7528 100644 --- a/templates/with-vercel-postgres/src/migrations/index.ts +++ b/templates/with-vercel-postgres/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250211_180236_initial from './20250211_180236_initial' +import * as migration_20250227_171438_initial from './20250227_171438_initial' export const migrations = [ { - up: migration_20250211_180236_initial.up, - down: migration_20250211_180236_initial.down, - name: '20250211_180236_initial', + up: migration_20250227_171438_initial.up, + down: migration_20250227_171438_initial.down, + name: '20250227_171438_initial', }, ] diff --git a/templates/with-vercel-postgres/src/payload-types.ts b/templates/with-vercel-postgres/src/payload-types.ts index 47c26925ba..533bc86e73 100644 --- a/templates/with-vercel-postgres/src/payload-types.ts +++ b/templates/with-vercel-postgres/src/payload-types.ts @@ -64,6 +64,7 @@ export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { users: User; media: Media; diff --git a/templates/with-vercel-website/src/migrations/20250211_180251_initial.json b/templates/with-vercel-website/src/migrations/20250227_171453_initial.json similarity index 99% rename from templates/with-vercel-website/src/migrations/20250211_180251_initial.json rename to templates/with-vercel-website/src/migrations/20250227_171453_initial.json index e965713bcc..b06e70afc9 100644 --- a/templates/with-vercel-website/src/migrations/20250211_180251_initial.json +++ b/templates/with-vercel-website/src/migrations/20250227_171453_initial.json @@ -1,5 +1,5 @@ { - "id": "3c0386a2-999b-411c-870f-e63333e8e833", + "id": "090f3356-1c23-4749-bf86-2191f58b85b4", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-vercel-website/src/migrations/20250211_180251_initial.ts b/templates/with-vercel-website/src/migrations/20250227_171453_initial.ts similarity index 100% rename from templates/with-vercel-website/src/migrations/20250211_180251_initial.ts rename to templates/with-vercel-website/src/migrations/20250227_171453_initial.ts diff --git a/templates/with-vercel-website/src/migrations/index.ts b/templates/with-vercel-website/src/migrations/index.ts index bcc8b7b344..dc6f1f047b 100644 --- a/templates/with-vercel-website/src/migrations/index.ts +++ b/templates/with-vercel-website/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250211_180251_initial from './20250211_180251_initial' +import * as migration_20250227_171453_initial from './20250227_171453_initial' export const migrations = [ { - up: migration_20250211_180251_initial.up, - down: migration_20250211_180251_initial.down, - name: '20250211_180251_initial', + up: migration_20250227_171453_initial.up, + down: migration_20250227_171453_initial.down, + name: '20250227_171453_initial', }, ] diff --git a/templates/with-vercel-website/src/payload-types.ts b/templates/with-vercel-website/src/payload-types.ts index 3d3c0e1468..0873ab7672 100644 --- a/templates/with-vercel-website/src/payload-types.ts +++ b/templates/with-vercel-website/src/payload-types.ts @@ -64,6 +64,7 @@ export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { pages: Page; posts: Post; From 9c25e7b68e7d941913c02bd2e206a440db07e530 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Thu, 27 Feb 2025 13:53:45 -0500 Subject: [PATCH 021/127] fix(plugin-multi-tenant): scope access constraint to admin collection (#11430) ### What? The idea of this plugin is to only add constraints when a user is present on a request. This change makes it so access control only applies to admin panel users as they are the ones assigned to tenants. This change allows you to more freely write access functions on tenant enabled collections. Say you have 2 auth enabled collections, the plugin would incorrectly assume since there is a user on the req that it needs to apply tenant constraints. When really, you should be able to just add in your own access check for `req.user.collection` and return true/false if you want to prevent/allow other auth enabled collections for certain operations. ```ts import { Access } from 'payload' const readByTenant: Access = ({ req }) => { const { user } = req if (!user || user.collection === 'auth2') return false return true } ``` When you have a function like this that returns `true` and the collection is multi-tenant enabled - the plugin injects constraints ensuring the user on the request is assigned to the tenant on the doc being accessed. Before this change, you would need to opt out of access control with `useTenantAccess` and then wire up your own access function: ```ts import type { Access } from 'payload' import { getTenantAccess } from '@payloadcms/plugin-multi-tenant/utilities' export const tenantAccess: Access = async ({ req: { user } }) => { if (user) { if (user.collection === 'auth2') { return true } // Before, you would need to re-implement // internal multi-tenant access constraints if (user.roles?.includes('super-admin')) return true return getTenantAccess({ fieldName: 'tenant', user, }) } return false } ``` After this change you would not need to opt out of `useTenantAccess` and can just write: ```ts import type { Access } from 'payload' import { getTenantAccess } from '@payloadcms/plugin-multi-tenant/utilities' export const tenantAccess: Access = async ({ req: { user } }) => { return Boolean(user) } ``` This is because internally the plugin will only add the tenant constraint when the access function returns true/Where _AND_ the user belongs to the admin panel users collection. --- packages/plugin-multi-tenant/src/index.ts | 7 ++++++- packages/plugin-multi-tenant/src/types.ts | 8 +++++--- .../src/utilities/addCollectionAccess.ts | 3 +++ .../plugin-multi-tenant/src/utilities/withTenantAccess.ts | 3 +++ test/plugin-multi-tenant/int.spec.ts | 1 - 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/plugin-multi-tenant/src/index.ts b/packages/plugin-multi-tenant/src/index.ts index b1dfd47949..6def3374e7 100644 --- a/packages/plugin-multi-tenant/src/index.ts +++ b/packages/plugin-multi-tenant/src/index.ts @@ -80,9 +80,11 @@ export const multiTenantPlugin = if (!incomingConfig.i18n.translations) { incomingConfig.i18n.translations = {} } - if (!incomingConfig.i18n.translations[locale]) { + if (!(locale in incomingConfig.i18n.translations)) { incomingConfig.i18n.translations[locale] = {} } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error if (!('multiTenant' in incomingConfig.i18n.translations[locale])) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -125,6 +127,7 @@ export const multiTenantPlugin = } addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection: adminUsersCollection, fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`, tenantsArrayFieldName, @@ -182,6 +185,7 @@ export const multiTenantPlugin = * - constrains access a users assigned tenants */ addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection, fieldName: 'id', tenantsArrayFieldName, @@ -284,6 +288,7 @@ export const multiTenantPlugin = * Add access control constraint to tenant enabled collection */ addCollectionAccess({ + adminUsersSlug: adminUsersCollection.slug, collection, fieldName: tenantFieldName, tenantsArrayFieldName, diff --git a/packages/plugin-multi-tenant/src/types.ts b/packages/plugin-multi-tenant/src/types.ts index 4974e4e498..8d0eb4fce3 100644 --- a/packages/plugin-multi-tenant/src/types.ts +++ b/packages/plugin-multi-tenant/src/types.ts @@ -152,7 +152,9 @@ export type Tenant = { } export type UserWithTenantsField = { - tenants: { - tenant: number | string | Tenant - }[] + tenants?: + | { + tenant: number | string | Tenant + }[] + | null } & User diff --git a/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts b/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts index e70d45965f..ff35a04a6a 100644 --- a/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts +++ b/packages/plugin-multi-tenant/src/utilities/addCollectionAccess.ts @@ -18,6 +18,7 @@ const collectionAccessKeys: AllAccessKeys< > = ['create', 'read', 'update', 'delete', 'readVersions', 'unlock'] as const type Args = { + adminUsersSlug: string collection: CollectionConfig fieldName: string tenantsArrayFieldName?: string @@ -32,6 +33,7 @@ type Args = { * - constrains access a users assigned tenants */ export const addCollectionAccess = ({ + adminUsersSlug, collection, fieldName, tenantsArrayFieldName, @@ -44,6 +46,7 @@ export const addCollectionAccess = ({ } collection.access[key] = withTenantAccess({ accessFunction: collection.access?.[key], + adminUsersSlug, collection, fieldName: key === 'readVersions' ? `version.${fieldName}` : fieldName, operation: key, diff --git a/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts b/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts index 78fb779650..0d4e1a5bb2 100644 --- a/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts +++ b/packages/plugin-multi-tenant/src/utilities/withTenantAccess.ts @@ -15,6 +15,7 @@ import { getTenantAccess } from './getTenantAccess.js' type Args = { accessFunction?: Access + adminUsersSlug: string collection: CollectionConfig fieldName: string operation: AllOperations @@ -27,6 +28,7 @@ type Args = { export const withTenantAccess = ({ accessFunction, + adminUsersSlug, collection, fieldName, tenantsArrayFieldName, @@ -49,6 +51,7 @@ export const withTenantAccess = if ( args.req.user && + args.req.user.collection === adminUsersSlug && !userHasAccessToAllTenants( args.req.user as ConfigType extends { user: unknown } ? ConfigType['user'] : User, ) diff --git a/test/plugin-multi-tenant/int.spec.ts b/test/plugin-multi-tenant/int.spec.ts index 512ea44000..b7e19750e2 100644 --- a/test/plugin-multi-tenant/int.spec.ts +++ b/test/plugin-multi-tenant/int.spec.ts @@ -45,7 +45,6 @@ describe('@payloadcms/plugin-multi-tenant', () => { data: { name: 'tenant1', domain: 'tenant1.com', - slug: 'tenant1', }, }) From f7b1cd9d63eeb7542b6a32c8e4867ef122e95dc9 Mon Sep 17 00:00:00 2001 From: Patrik Date: Thu, 27 Feb 2025 13:58:27 -0500 Subject: [PATCH 022/127] fix(ui): duplicate basePath in Logout Button Link (#11432) This PR resolves an issue where the `href` for the Logout button in the admin panel included duplicate `basePath` values when `basePath` was set in `next.config.js`. The Logout button was recently updated to use `NextLink` (`next/link`), which automatically applies the `basePath` from the Next.js configuration. As a result, manually adding the `basePath` to the `href` is no longer necessary. Relevant PRs that modified this behavior originally: - #9275 - #11155 --- packages/ui/src/elements/Logout/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/ui/src/elements/Logout/index.tsx b/packages/ui/src/elements/Logout/index.tsx index e729b9da5d..acde86663c 100644 --- a/packages/ui/src/elements/Logout/index.tsx +++ b/packages/ui/src/elements/Logout/index.tsx @@ -28,8 +28,6 @@ export const Logout: React.FC<{ routes: { admin: adminRoute }, } = config - const basePath = process.env.NEXT_BASE_PATH ?? '' - const props = { 'aria-label': t('authentication:logOut'), className: `${baseClass}__log-out`, @@ -43,7 +41,6 @@ export const Logout: React.FC<{ {...props} href={formatAdminURL({ adminRoute, - basePath, path: logoutRoute, })} > From c4bc0ae48a812e7601ed2ac462b95e67fb0e322b Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 27 Feb 2025 15:21:28 -0500 Subject: [PATCH 023/127] fix(next): disables active nav item (#11434) When visiting a collection's list view, the nav item corresponding to that collection correctly appears in an active state, but is still rendered as an anchor tag. This makes it possible to reload the current page by simply clicking the link, which is a problem because this performs an unnecessary server roundtrip. This is especially apparent when search params exist in the current URL, as the href on the link does not. Unrelated: also cleans up leftover code that was missed in this PR: #11155 --- .../next/src/elements/Nav/index.client.tsx | 29 +++++----- packages/next/src/elements/Nav/index.scss | 52 ++++++++---------- packages/ui/src/elements/AppHeader/index.tsx | 8 +-- packages/ui/src/elements/Logout/index.tsx | 14 ++--- test/access-control/e2e.spec.ts | 5 +- test/access-control/payload-types.ts | 55 +++++++++++++++++++ test/admin/e2e/document-view/e2e.spec.ts | 2 +- test/admin/e2e/general/e2e.spec.ts | 11 +++- test/helpers.ts | 12 ---- test/helpers/e2e/toggleNav.ts | 21 +++++++ tsconfig.base.json | 2 +- 11 files changed, 138 insertions(+), 73 deletions(-) create mode 100644 test/helpers/e2e/toggleNav.ts diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index aeedc49576..1bb703545e 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -44,23 +44,26 @@ export const DefaultNavClient: React.FC<{ id = `nav-global-${slug}` } - const LinkElement = Link || 'a' const activeCollection = pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]) + const Label = ( + {getTranslation(label, i18n)} + ) + + if (activeCollection) { + return ( +
+
+ {Label} +
+ ) + } + return ( - - {activeCollection &&
} - {getTranslation(label, i18n)} - + + {Label} + ) })} diff --git a/packages/next/src/elements/Nav/index.scss b/packages/next/src/elements/Nav/index.scss index 93c03802f9..636b6b103d 100644 --- a/packages/next/src/elements/Nav/index.scss +++ b/packages/next/src/elements/Nav/index.scss @@ -93,36 +93,32 @@ } } - nav { - a { - position: relative; - padding-block: base(0.125); - padding-inline-start: 0; - padding-inline-end: base(1.5); - display: flex; - text-decoration: none; - - &:focus:not(:focus-visible) { - box-shadow: none; - font-weight: 600; - } - - &:hover, - &:focus-visible { - text-decoration: underline; - } - - &.active { - font-weight: normal; - padding-left: 0; - font-weight: 600; - } - } - } - &__link { display: flex; align-items: center; + position: relative; + padding-block: base(0.125); + padding-inline-start: 0; + padding-inline-end: base(1.5); + text-decoration: none; + + &:focus:not(:focus-visible) { + box-shadow: none; + font-weight: 600; + } + + &.active { + font-weight: normal; + padding-left: 0; + font-weight: 600; + } + } + + a.nav__link { + &:hover, + &:focus-visible { + text-decoration: underline; + } } &__link-indicator { @@ -148,7 +144,7 @@ padding: var(--app-header-height) var(--gutter-h) base(2); } - nav a { + &__link { font-size: base(0.875); line-height: base(1.5); } diff --git a/packages/ui/src/elements/AppHeader/index.tsx b/packages/ui/src/elements/AppHeader/index.tsx index 7307de39a6..da539789b6 100644 --- a/packages/ui/src/elements/AppHeader/index.tsx +++ b/packages/ui/src/elements/AppHeader/index.tsx @@ -59,8 +59,6 @@ export function AppHeader({ CustomAvatar, CustomIcon }: Props) { } }, [Actions]) - const LinkElement = Link || 'a' - const ActionComponents = Actions ? Object.values(Actions) : [] return ( @@ -95,15 +93,15 @@ export function AppHeader({ CustomAvatar, CustomIcon }: Props) { {localization && ( )} - } /> - +
diff --git a/packages/ui/src/elements/Logout/index.tsx b/packages/ui/src/elements/Logout/index.tsx index acde86663c..2da58c7322 100644 --- a/packages/ui/src/elements/Logout/index.tsx +++ b/packages/ui/src/elements/Logout/index.tsx @@ -28,21 +28,17 @@ export const Logout: React.FC<{ routes: { admin: adminRoute }, } = config - const props = { - 'aria-label': t('authentication:logOut'), - className: `${baseClass}__log-out`, - prefetch: Link ? false : undefined, - tabIndex, - title: t('authentication:logOut'), - } - return ( diff --git a/test/access-control/e2e.spec.ts b/test/access-control/e2e.spec.ts index 006f94542f..2ef3b566c3 100644 --- a/test/access-control/e2e.spec.ts +++ b/test/access-control/e2e.spec.ts @@ -4,6 +4,7 @@ import type { TypeWithID } from 'payload' import { expect, test } from '@playwright/test' import { devUser } from 'credentials.js' import { openDocControls } from 'helpers/e2e/openDocControls.js' +import { openNav } from 'helpers/e2e/toggleNav.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -18,7 +19,6 @@ import { getRoutes, initPageConsoleErrorCatch, login, - openNav, saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' @@ -312,7 +312,7 @@ describe('Access Control', () => { test('should not show in nav', async () => { await page.goto(url.admin) await openNav(page) - // await expect(page.locator('.nav >> a:has-text("Restricteds")')).toHaveCount(0) + await expect( page.locator('.nav a', { hasText: exactText('Restricteds'), @@ -532,7 +532,6 @@ describe('Access Control', () => { test('should restrict access based on user settings', async () => { const url = `${serverURL}/admin/globals/settings` await page.goto(url) - await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).toContain(url) await openNav(page) await expect(page.locator('#nav-global-settings')).toBeVisible() await expect(page.locator('#nav-global-test')).toBeHidden() diff --git a/test/access-control/payload-types.ts b/test/access-control/payload-types.ts index ed98d40347..8be2a00c1e 100644 --- a/test/access-control/payload-types.ts +++ b/test/access-control/payload-types.ts @@ -6,11 +6,66 @@ * and re-run `payload generate:types` to regenerate this file. */ +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + export interface Config { auth: { users: UserAuthOperations; 'public-users': PublicUserAuthOperations; }; + blocks: {}; collections: { users: User; 'public-users': PublicUser; diff --git a/test/admin/e2e/document-view/e2e.spec.ts b/test/admin/e2e/document-view/e2e.spec.ts index 08dd762143..6dcdeeb123 100644 --- a/test/admin/e2e/document-view/e2e.spec.ts +++ b/test/admin/e2e/document-view/e2e.spec.ts @@ -11,7 +11,6 @@ import { ensureCompilationIsDone, exactText, initPageConsoleErrorCatch, - openNav, saveDocAndAssert, } from '../../../helpers.js' import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' @@ -46,6 +45,7 @@ const description = 'Description' let payload: PayloadTestSDK import { navigateToDoc } from 'helpers/e2e/navigateToDoc.js' +import { openNav } from 'helpers/e2e/toggleNav.js' import path from 'path' import { fileURLToPath } from 'url' diff --git a/test/admin/e2e/general/e2e.spec.ts b/test/admin/e2e/general/e2e.spec.ts index 44139d1927..6c84a828c8 100644 --- a/test/admin/e2e/general/e2e.spec.ts +++ b/test/admin/e2e/general/e2e.spec.ts @@ -9,7 +9,6 @@ import { exactText, getRoutes, initPageConsoleErrorCatch, - openNav, saveDocAndAssert, saveDocHotkeyAndAssert, // throttleTest, @@ -51,6 +50,7 @@ let payload: PayloadTestSDK import { navigateToDoc } from 'helpers/e2e/navigateToDoc.js' import { openDocControls } from 'helpers/e2e/openDocControls.js' +import { openNav } from 'helpers/e2e/toggleNav.js' import path from 'path' import { fileURLToPath } from 'url' @@ -406,6 +406,15 @@ describe('General', () => { await expect(link).toBeHidden() }) + test('should disable active nav item', async () => { + await page.goto(postsUrl.list) + await openNav(page) + const activeItem = page.locator('.nav .nav__link.active') + await expect(activeItem).toBeVisible() + const tagName = await activeItem.evaluate((el) => el.tagName.toLowerCase()) + expect(tagName).toBe('div') + }) + test('breadcrumbs — should navigate from list to dashboard', async () => { await page.goto(postsUrl.list) await page.locator(`.step-nav a[href="${adminRoutes.routes.admin}"]`).click() diff --git a/test/helpers.ts b/test/helpers.ts index 3ee90344e2..4510cc3820 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -255,18 +255,6 @@ export async function saveDocAndAssert( } } -export async function openNav(page: Page): Promise { - // check to see if the nav is already open and if not, open it - // use the `--nav-open` modifier class to check if the nav is open - // this will prevent clicking nav links that are bleeding off the screen - if (await page.locator('.template-default.template-default--nav-open').isVisible()) { - return - } - // playwright: get first element with .nav-toggler which is VISIBLE (not hidden), could be 2 elements with .nav-toggler on mobile and desktop but only one is visible - await page.locator('.nav-toggler >> visible=true').click() - await expect(page.locator('.template-default.template-default--nav-open')).toBeVisible() -} - export async function openDocDrawer(page: Page, selector: string): Promise { await wait(500) // wait for parent form state to initialize await page.locator(selector).click() diff --git a/test/helpers/e2e/toggleNav.ts b/test/helpers/e2e/toggleNav.ts new file mode 100644 index 0000000000..88108d5a98 --- /dev/null +++ b/test/helpers/e2e/toggleNav.ts @@ -0,0 +1,21 @@ +import type { Page } from '@playwright/test' + +import { expect } from '@playwright/test' +import { wait } from 'payload/shared' + +export async function openNav(page: Page): Promise { + // wait for the preferences/media queries to either open or close the nav + // TODO: remove this in the future when nav state can be initialized properly + await wait(250) + + // check to see if the nav is already open and if not, open it + // use the `--nav-open` modifier class to check if the nav is open + // this will prevent clicking nav links that are bleeding off the screen + if (await page.locator('.template-default.template-default--nav-open').isVisible()) { + return + } + + // playwright: get first element with .nav-toggler which is VISIBLE (not hidden), could be 2 elements with .nav-toggler on mobile and desktop but only one is visible + await page.locator('.nav-toggler >> visible=true').click() + await expect(page.locator('.template-default.template-default--nav-open')).toBeVisible() +} diff --git a/tsconfig.base.json b/tsconfig.base.json index fed3e543da..a12b54a3a6 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/fields-relationship/config.ts"], + "@payload-config": ["./test/access-control/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], From b3e7a9d19420cf75ff1ac64a456dd29fa66f3e71 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Thu, 27 Feb 2025 16:00:27 -0500 Subject: [PATCH 024/127] fix: incorrect value inside beforeValidate field hooks (#11433) ### What? `value` within the beforeValidate field hook was not correctly falling back to the document value when no value was passed inside the request for the field. ### Why? The fallback logic was running after the beforeValidate field hooks are called. ### How? Run the fallback logic before running the beforeValidate field hooks. Fixes https://github.com/payloadcms/payload/issues/10923 --- .../fields/hooks/beforeValidate/promise.ts | 34 +++++++++---------- test/hooks/collections/Value/index.ts | 34 +++++++++++++++++++ test/hooks/config.ts | 2 ++ test/hooks/int.spec.ts | 21 +++++++++++- test/hooks/payload-types.ts | 29 ++++++++++++++++ 5 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 test/hooks/collections/Value/index.ts diff --git a/packages/payload/src/fields/hooks/beforeValidate/promise.ts b/packages/payload/src/fields/hooks/beforeValidate/promise.ts index 59ba4a8a70..e1ab380eab 100644 --- a/packages/payload/src/fields/hooks/beforeValidate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeValidate/promise.ts @@ -274,6 +274,23 @@ export const promise = async ({ } } + if (typeof siblingData[field.name] === 'undefined') { + // If no incoming data, but existing document data is found, merge it in + if (typeof siblingDoc[field.name] !== 'undefined') { + siblingData[field.name] = cloneDataFromOriginalDoc(siblingDoc[field.name]) + + // Otherwise compute default value + } else if (typeof field.defaultValue !== 'undefined') { + siblingData[field.name] = await getDefaultValue({ + defaultValue: field.defaultValue, + locale: req.locale, + req, + user: req.user, + value: siblingData[field.name], + }) + } + } + // Execute hooks if (field.hooks?.beforeValidate) { for (const hook of field.hooks.beforeValidate) { @@ -314,23 +331,6 @@ export const promise = async ({ delete siblingData[field.name] } } - - if (typeof siblingData[field.name] === 'undefined') { - // If no incoming data, but existing document data is found, merge it in - if (typeof siblingDoc[field.name] !== 'undefined') { - siblingData[field.name] = cloneDataFromOriginalDoc(siblingDoc[field.name]) - - // Otherwise compute default value - } else if (typeof field.defaultValue !== 'undefined') { - siblingData[field.name] = await getDefaultValue({ - defaultValue: field.defaultValue, - locale: req.locale, - req, - user: req.user, - value: siblingData[field.name], - }) - } - } } // Traverse subfields diff --git a/test/hooks/collections/Value/index.ts b/test/hooks/collections/Value/index.ts new file mode 100644 index 0000000000..b1b07f63f4 --- /dev/null +++ b/test/hooks/collections/Value/index.ts @@ -0,0 +1,34 @@ +import type { CollectionConfig } from 'payload' + +export const valueHooksSlug = 'value-hooks' +export const ValueCollection: CollectionConfig = { + slug: valueHooksSlug, + fields: [ + { + name: 'slug', + type: 'text', + hooks: { + beforeValidate: [ + ({ value, siblingData }) => { + siblingData.beforeValidate_value = String(value) + return value + }, + ], + beforeChange: [ + ({ value, siblingData }) => { + siblingData.beforeChange_value = String(value) + return value + }, + ], + }, + }, + { + name: 'beforeValidate_value', + type: 'text', + }, + { + name: 'beforeChange_value', + type: 'text', + }, + ], +} diff --git a/test/hooks/config.ts b/test/hooks/config.ts index a3247abcae..703b5319a5 100644 --- a/test/hooks/config.ts +++ b/test/hooks/config.ts @@ -19,6 +19,7 @@ import NestedAfterReadHooks from './collections/NestedAfterReadHooks/index.js' import Relations from './collections/Relations/index.js' import TransformHooks from './collections/Transform/index.js' import Users, { seedHooksUsers } from './collections/Users/index.js' +import { ValueCollection } from './collections/Value/index.js' import { DataHooksGlobal } from './globals/Data/index.js' export const HooksConfig: Promise = buildConfigWithDefaults({ @@ -40,6 +41,7 @@ export const HooksConfig: Promise = buildConfigWithDefaults({ Users, DataHooks, FieldPaths, + ValueCollection, ], globals: [DataHooksGlobal], endpoints: [ diff --git a/test/hooks/int.spec.ts b/test/hooks/int.spec.ts index 8d21609870..ef3786fe5a 100644 --- a/test/hooks/int.spec.ts +++ b/test/hooks/int.spec.ts @@ -21,9 +21,10 @@ import { import { relationsSlug } from './collections/Relations/index.js' import { transformSlug } from './collections/Transform/index.js' import { hooksUsersSlug } from './collections/Users/index.js' -import { beforeValidateSlug, fieldPathsSlug } from './shared.js' +import { valueHooksSlug } from './collections/Value/index.js' import { HooksConfig } from './config.js' import { dataHooksGlobalSlug } from './globals/Data/index.js' +import { beforeValidateSlug, fieldPathsSlug } from './shared.js' let restClient: NextRESTClient let payload: Payload @@ -612,6 +613,24 @@ describe('Hooks', () => { }), }) }) + + it('should assign value properly when missing in data', async () => { + const doc = await payload.create({ + collection: valueHooksSlug, + data: { + slug: 'test', + }, + }) + + const updatedDoc = await payload.update({ + id: doc.id, + collection: valueHooksSlug, + data: {}, + }) + + expect(updatedDoc.beforeValidate_value).toEqual('test') + expect(updatedDoc.beforeChange_value).toEqual('test') + }) }) describe('config level after error hook', () => { diff --git a/test/hooks/payload-types.ts b/test/hooks/payload-types.ts index 450f189080..87ad25904d 100644 --- a/test/hooks/payload-types.ts +++ b/test/hooks/payload-types.ts @@ -78,6 +78,7 @@ export interface Config { 'hooks-users': HooksUser; 'data-hooks': DataHook; 'field-paths': FieldPath; + 'value-hooks': ValueHook; 'payload-locked-documents': PayloadLockedDocument; 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; @@ -96,6 +97,7 @@ export interface Config { 'hooks-users': HooksUsersSelect | HooksUsersSelect; 'data-hooks': DataHooksSelect | DataHooksSelect; 'field-paths': FieldPathsSelect | FieldPathsSelect; + 'value-hooks': ValueHooksSelect | ValueHooksSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; @@ -610,6 +612,18 @@ export interface FieldPath { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "value-hooks". + */ +export interface ValueHook { + id: string; + slug?: string | null; + beforeValidate_value?: string | null; + beforeChange_value?: string | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-locked-documents". @@ -664,6 +678,10 @@ export interface PayloadLockedDocument { | ({ relationTo: 'field-paths'; value: string | FieldPath; + } | null) + | ({ + relationTo: 'value-hooks'; + value: string | ValueHook; } | null); globalSlug?: string | null; user: { @@ -910,6 +928,17 @@ export interface FieldPathsSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "value-hooks_select". + */ +export interface ValueHooksSelect { + slug?: T; + beforeValidate_value?: T; + beforeChange_value?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-locked-documents_select". From c21dac1b530767ff484e842892ad4e484e749d56 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 27 Feb 2025 15:40:22 -0700 Subject: [PATCH 025/127] perf(db-*): add option to disable returning modified documents in db methods (#11393) This PR adds a new `returning` option to various db adapter methods. Setting it to `false` where the return value is not used will lead to performance gains, as we don't have to do additional db calls to fetch the updated document and then sanitize it. --- packages/db-mongodb/src/create.ts | 7 ++- packages/db-mongodb/src/createGlobal.ts | 5 +- .../db-mongodb/src/createGlobalVersion.ts | 5 ++ packages/db-mongodb/src/createVersion.ts | 5 ++ packages/db-mongodb/src/deleteOne.ts | 11 +++- packages/db-mongodb/src/updateGlobal.ts | 11 +++- .../db-mongodb/src/updateGlobalVersion.ts | 10 +++- packages/db-mongodb/src/updateOne.ts | 23 +++++-- packages/db-mongodb/src/updateVersion.ts | 11 +++- packages/db-mongodb/src/upsert.ts | 13 +++- packages/drizzle/src/create.ts | 7 ++- packages/drizzle/src/createGlobal.ts | 7 ++- packages/drizzle/src/createGlobalVersion.ts | 6 ++ packages/drizzle/src/createVersion.ts | 5 ++ packages/drizzle/src/deleteOne.ts | 19 +++--- packages/drizzle/src/updateGlobal.ts | 7 ++- packages/drizzle/src/updateGlobalVersion.ts | 16 ++++- packages/drizzle/src/updateOne.ts | 17 +++++- packages/drizzle/src/updateVersion.ts | 16 ++++- packages/drizzle/src/upsertRow/index.ts | 4 ++ packages/drizzle/src/upsertRow/types.ts | 2 +- packages/payload/src/database/types.ts | 60 +++++++++++++++++++ 22 files changed, 232 insertions(+), 35 deletions(-) diff --git a/packages/db-mongodb/src/create.ts b/packages/db-mongodb/src/create.ts index 3c99e79324..f3db852854 100644 --- a/packages/db-mongodb/src/create.ts +++ b/packages/db-mongodb/src/create.ts @@ -1,5 +1,5 @@ import type { CreateOptions } from 'mongoose' -import type { Create, Document } from 'payload' +import type { Create } from 'payload' import type { MongooseAdapter } from './index.js' @@ -9,7 +9,7 @@ import { transform } from './utilities/transform.js' export const create: Create = async function create( this: MongooseAdapter, - { collection, data, req }, + { collection, data, req, returning }, ) { const Model = this.collections[collection] const options: CreateOptions = { @@ -34,6 +34,9 @@ export const create: Create = async function create( } catch (error) { handleError({ collection, error, req }) } + if (returning === false) { + return null + } doc = doc.toObject() diff --git a/packages/db-mongodb/src/createGlobal.ts b/packages/db-mongodb/src/createGlobal.ts index 28c10b39ca..a90d96c8cc 100644 --- a/packages/db-mongodb/src/createGlobal.ts +++ b/packages/db-mongodb/src/createGlobal.ts @@ -8,7 +8,7 @@ import { transform } from './utilities/transform.js' export const createGlobal: CreateGlobal = async function createGlobal( this: MongooseAdapter, - { slug, data, req }, + { slug, data, req, returning }, ) { const Model = this.globals @@ -25,6 +25,9 @@ export const createGlobal: CreateGlobal = async function createGlobal( } let [result] = (await Model.create([data], options)) as any + if (returning === false) { + return null + } result = result.toObject() diff --git a/packages/db-mongodb/src/createGlobalVersion.ts b/packages/db-mongodb/src/createGlobalVersion.ts index 2137ca84aa..979ac04ad8 100644 --- a/packages/db-mongodb/src/createGlobalVersion.ts +++ b/packages/db-mongodb/src/createGlobalVersion.ts @@ -16,6 +16,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo parent, publishedLocale, req, + returning, snapshot, updatedAt, versionData, @@ -75,6 +76,10 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo options, ) + if (returning === false) { + return null + } + doc = doc.toObject() transform({ diff --git a/packages/db-mongodb/src/createVersion.ts b/packages/db-mongodb/src/createVersion.ts index a0894adc88..d81fdf092d 100644 --- a/packages/db-mongodb/src/createVersion.ts +++ b/packages/db-mongodb/src/createVersion.ts @@ -16,6 +16,7 @@ export const createVersion: CreateVersion = async function createVersion( parent, publishedLocale, req, + returning, snapshot, updatedAt, versionData, @@ -86,6 +87,10 @@ export const createVersion: CreateVersion = async function createVersion( options, ) + if (returning === false) { + return null + } + doc = doc.toObject() transform({ diff --git a/packages/db-mongodb/src/deleteOne.ts b/packages/db-mongodb/src/deleteOne.ts index 0ae3231531..80ce73e566 100644 --- a/packages/db-mongodb/src/deleteOne.ts +++ b/packages/db-mongodb/src/deleteOne.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { DeleteOne } from 'payload' import type { MongooseAdapter } from './index.js' @@ -10,10 +10,10 @@ import { transform } from './utilities/transform.js' export const deleteOne: DeleteOne = async function deleteOne( this: MongooseAdapter, - { collection, req, select, where }, + { collection, req, returning, select, where }, ) { const Model = this.collections[collection] - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { projection: buildProjectionFromSelect({ adapter: this, fields: this.payload.collections[collection].config.flattenedFields, @@ -29,6 +29,11 @@ export const deleteOne: DeleteOne = async function deleteOne( where, }) + if (returning === false) { + await Model.deleteOne(query, options)?.lean() + return null + } + const doc = await Model.findOneAndDelete(query, options)?.lean() if (!doc) { diff --git a/packages/db-mongodb/src/updateGlobal.ts b/packages/db-mongodb/src/updateGlobal.ts index 3ed8a04b3c..6d693c00eb 100644 --- a/packages/db-mongodb/src/updateGlobal.ts +++ b/packages/db-mongodb/src/updateGlobal.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { UpdateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' @@ -9,12 +9,12 @@ import { transform } from './utilities/transform.js' export const updateGlobal: UpdateGlobal = async function updateGlobal( this: MongooseAdapter, - { slug, data, options: optionsArgs = {}, req, select }, + { slug, data, options: optionsArgs = {}, req, returning, select }, ) { const Model = this.globals const fields = this.payload.config.globals.find((global) => global.slug === slug).fields - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -28,6 +28,11 @@ export const updateGlobal: UpdateGlobal = async function updateGlobal( transform({ adapter: this, data, fields, globalSlug: slug, operation: 'write' }) + if (returning === false) { + await Model.updateOne({ globalType: slug }, data, options) + return null + } + const result: any = await Model.findOneAndUpdate({ globalType: slug }, data, options) transform({ adapter: this, data: result, fields, globalSlug: slug, operation: 'read' }) diff --git a/packages/db-mongodb/src/updateGlobalVersion.ts b/packages/db-mongodb/src/updateGlobalVersion.ts index 9bc4b592ea..1929cd8669 100644 --- a/packages/db-mongodb/src/updateGlobalVersion.ts +++ b/packages/db-mongodb/src/updateGlobalVersion.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import { buildVersionGlobalFields, type TypeWithID, type UpdateGlobalVersionArgs } from 'payload' @@ -17,6 +17,7 @@ export async function updateGlobalVersion( locale, options: optionsArgs = {}, req, + returning, select, versionData, where, @@ -28,7 +29,7 @@ export async function updateGlobalVersion( const currentGlobal = this.payload.config.globals.find((global) => global.slug === globalSlug) const fields = buildVersionGlobalFields(this.payload.config, currentGlobal) const flattenedFields = buildVersionGlobalFields(this.payload.config, currentGlobal, true) - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -49,6 +50,11 @@ export async function updateGlobalVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) + if (returning === false) { + await VersionModel.updateOne(query, versionData, options) + return null + } + const doc = await VersionModel.findOneAndUpdate(query, versionData, options) if (!doc) { diff --git a/packages/db-mongodb/src/updateOne.ts b/packages/db-mongodb/src/updateOne.ts index 25dd47ba37..9d52f23fc3 100644 --- a/packages/db-mongodb/src/updateOne.ts +++ b/packages/db-mongodb/src/updateOne.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import type { UpdateOne } from 'payload' import type { MongooseAdapter } from './index.js' @@ -11,12 +11,22 @@ import { transform } from './utilities/transform.js' export const updateOne: UpdateOne = async function updateOne( this: MongooseAdapter, - { id, collection, data, locale, options: optionsArgs = {}, req, select, where: whereArg }, + { + id, + collection, + data, + locale, + options: optionsArgs = {}, + req, + returning, + select, + where: whereArg, + }, ) { const where = id ? { id: { equals: id } } : whereArg const Model = this.collections[collection] const fields = this.payload.collections[collection].config.fields - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -41,7 +51,12 @@ export const updateOne: UpdateOne = async function updateOne( transform({ adapter: this, data, fields, operation: 'write' }) try { - result = await Model.findOneAndUpdate(query, data, options) + if (returning === false) { + await Model.updateOne(query, data, options) + return null + } else { + result = await Model.findOneAndUpdate(query, data, options) + } } catch (error) { handleError({ collection, error, req }) } diff --git a/packages/db-mongodb/src/updateVersion.ts b/packages/db-mongodb/src/updateVersion.ts index a2431388a4..6563326ec0 100644 --- a/packages/db-mongodb/src/updateVersion.ts +++ b/packages/db-mongodb/src/updateVersion.ts @@ -1,4 +1,4 @@ -import type { QueryOptions } from 'mongoose' +import type { MongooseUpdateQueryOptions } from 'mongoose' import { buildVersionCollectionFields, type UpdateVersion } from 'payload' @@ -11,7 +11,7 @@ import { transform } from './utilities/transform.js' export const updateVersion: UpdateVersion = async function updateVersion( this: MongooseAdapter, - { id, collection, locale, options: optionsArgs = {}, req, select, versionData, where }, + { id, collection, locale, options: optionsArgs = {}, req, returning, select, versionData, where }, ) { const VersionModel = this.versions[collection] const whereToUse = where || { id: { equals: id } } @@ -26,7 +26,7 @@ export const updateVersion: UpdateVersion = async function updateVersion( true, ) - const options: QueryOptions = { + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, @@ -47,6 +47,11 @@ export const updateVersion: UpdateVersion = async function updateVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) + if (returning === false) { + await VersionModel.updateOne(query, versionData, options) + return null + } + const doc = await VersionModel.findOneAndUpdate(query, versionData, options) if (!doc) { diff --git a/packages/db-mongodb/src/upsert.ts b/packages/db-mongodb/src/upsert.ts index 3ee7303a19..0f662e914d 100644 --- a/packages/db-mongodb/src/upsert.ts +++ b/packages/db-mongodb/src/upsert.ts @@ -4,7 +4,16 @@ import type { MongooseAdapter } from './index.js' export const upsert: Upsert = async function upsert( this: MongooseAdapter, - { collection, data, locale, req, select, where }, + { collection, data, locale, req, returning, select, where }, ) { - return this.updateOne({ collection, data, locale, options: { upsert: true }, req, select, where }) + return this.updateOne({ + collection, + data, + locale, + options: { upsert: true }, + req, + returning, + select, + where, + }) } diff --git a/packages/drizzle/src/create.ts b/packages/drizzle/src/create.ts index 55e6a797bd..17b502f59a 100644 --- a/packages/drizzle/src/create.ts +++ b/packages/drizzle/src/create.ts @@ -9,7 +9,7 @@ import { getTransaction } from './utilities/getTransaction.js' export const create: Create = async function create( this: DrizzleAdapter, - { collection: collectionSlug, data, req, select }, + { collection: collectionSlug, data, req, select, returning }, ) { const db = await getTransaction(this, req) const collection = this.payload.collections[collectionSlug].config @@ -25,7 +25,12 @@ export const create: Create = async function create( req, select, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/createGlobal.ts b/packages/drizzle/src/createGlobal.ts index cc8015ae49..4b399ed2fe 100644 --- a/packages/drizzle/src/createGlobal.ts +++ b/packages/drizzle/src/createGlobal.ts @@ -9,7 +9,7 @@ import { getTransaction } from './utilities/getTransaction.js' export async function createGlobal>( this: DrizzleAdapter, - { slug, data, req }: CreateGlobalArgs, + { slug, data, req, returning }: CreateGlobalArgs, ): Promise { const db = await getTransaction(this, req) const globalConfig = this.payload.globals.config.find((config) => config.slug === slug) @@ -26,8 +26,13 @@ export async function createGlobal>( operation: 'create', req, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + result.globalType = slug return result diff --git a/packages/drizzle/src/createGlobalVersion.ts b/packages/drizzle/src/createGlobalVersion.ts index c419e8f584..fb32a6dc94 100644 --- a/packages/drizzle/src/createGlobalVersion.ts +++ b/packages/drizzle/src/createGlobalVersion.ts @@ -21,6 +21,7 @@ export async function createGlobalVersion( snapshot, updatedAt, versionData, + returning, }: CreateGlobalVersionArgs, ) { const db = await getTransaction(this, req) @@ -45,6 +46,7 @@ export async function createGlobalVersion( req, select, tableName, + ignoreResult: returning === false ? 'idOnly' : false, }) const table = this.tables[tableName] @@ -59,5 +61,9 @@ export async function createGlobalVersion( }) } + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/createVersion.ts b/packages/drizzle/src/createVersion.ts index c7e880bf23..c5e2ce028c 100644 --- a/packages/drizzle/src/createVersion.ts +++ b/packages/drizzle/src/createVersion.ts @@ -22,6 +22,7 @@ export async function createVersion( snapshot, updatedAt, versionData, + returning, }: CreateVersionArgs, ) { const db = await getTransaction(this, req) @@ -72,5 +73,9 @@ export async function createVersion( }) } + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/deleteOne.ts b/packages/drizzle/src/deleteOne.ts index 66b7409843..2c2d12c65b 100644 --- a/packages/drizzle/src/deleteOne.ts +++ b/packages/drizzle/src/deleteOne.ts @@ -13,7 +13,7 @@ import { getTransaction } from './utilities/getTransaction.js' export const deleteOne: DeleteOne = async function deleteOne( this: DrizzleAdapter, - { collection: collectionSlug, req, select, where: whereArg }, + { collection: collectionSlug, req, select, where: whereArg, returning }, ) { const db = await getTransaction(this, req) const collection = this.payload.collections[collectionSlug].config @@ -59,13 +59,16 @@ export const deleteOne: DeleteOne = async function deleteOne( docToDelete = await db.query[tableName].findFirst(findManyArgs) } - const result = transform({ - adapter: this, - config: this.payload.config, - data: docToDelete, - fields: collection.flattenedFields, - joinQuery: false, - }) + const result = + returning === false + ? null + : transform({ + adapter: this, + config: this.payload.config, + data: docToDelete, + fields: collection.flattenedFields, + joinQuery: false, + }) await this.deleteWhere({ db, diff --git a/packages/drizzle/src/updateGlobal.ts b/packages/drizzle/src/updateGlobal.ts index d3ba00858d..29039f83e4 100644 --- a/packages/drizzle/src/updateGlobal.ts +++ b/packages/drizzle/src/updateGlobal.ts @@ -9,7 +9,7 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateGlobal>( this: DrizzleAdapter, - { slug, data, req, select }: UpdateGlobalArgs, + { slug, data, req, select, returning }: UpdateGlobalArgs, ): Promise { const db = await getTransaction(this, req) const globalConfig = this.payload.globals.config.find((config) => config.slug === slug) @@ -26,8 +26,13 @@ export async function updateGlobal>( req, select, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + result.globalType = slug return result diff --git a/packages/drizzle/src/updateGlobalVersion.ts b/packages/drizzle/src/updateGlobalVersion.ts index 8cb4572a35..99b140ccec 100644 --- a/packages/drizzle/src/updateGlobalVersion.ts +++ b/packages/drizzle/src/updateGlobalVersion.ts @@ -16,7 +16,16 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateGlobalVersion( this: DrizzleAdapter, - { id, global, locale, req, select, versionData, where: whereArg }: UpdateGlobalVersionArgs, + { + id, + global, + locale, + req, + select, + versionData, + where: whereArg, + returning, + }: UpdateGlobalVersionArgs, ) { const db = await getTransaction(this, req) const globalConfig: SanitizedGlobalConfig = this.payload.globals.config.find( @@ -49,7 +58,12 @@ export async function updateGlobalVersion( select, tableName, where, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/updateOne.ts b/packages/drizzle/src/updateOne.ts index 3e682f4c5d..4ebb3abafc 100644 --- a/packages/drizzle/src/updateOne.ts +++ b/packages/drizzle/src/updateOne.ts @@ -12,7 +12,17 @@ import { getTransaction } from './utilities/getTransaction.js' export const updateOne: UpdateOne = async function updateOne( this: DrizzleAdapter, - { id, collection: collectionSlug, data, joins: joinQuery, locale, req, select, where: whereArg }, + { + id, + collection: collectionSlug, + data, + joins: joinQuery, + locale, + req, + select, + where: whereArg, + returning, + }, ) { const db = await getTransaction(this, req) const collection = this.payload.collections[collectionSlug].config @@ -66,7 +76,12 @@ export const updateOne: UpdateOne = async function updateOne( req, select, tableName, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/updateVersion.ts b/packages/drizzle/src/updateVersion.ts index d5bb55c657..1a05dee870 100644 --- a/packages/drizzle/src/updateVersion.ts +++ b/packages/drizzle/src/updateVersion.ts @@ -16,7 +16,16 @@ import { getTransaction } from './utilities/getTransaction.js' export async function updateVersion( this: DrizzleAdapter, - { id, collection, locale, req, select, versionData, where: whereArg }: UpdateVersionArgs, + { + id, + collection, + locale, + req, + select, + versionData, + where: whereArg, + returning, + }: UpdateVersionArgs, ) { const db = await getTransaction(this, req) const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config @@ -47,7 +56,12 @@ export async function updateVersion( select, tableName, where, + ignoreResult: returning === false, }) + if (returning === false) { + return null + } + return result } diff --git a/packages/drizzle/src/upsertRow/index.ts b/packages/drizzle/src/upsertRow/index.ts index b2438eca29..32f6e4ff16 100644 --- a/packages/drizzle/src/upsertRow/index.ts +++ b/packages/drizzle/src/upsertRow/index.ts @@ -428,6 +428,10 @@ export const upsertRow = async | TypeWithID>( } } + if (ignoreResult === 'idOnly') { + return { id: insertedRow.id } as T + } + if (ignoreResult) { return data as T } diff --git a/packages/drizzle/src/upsertRow/types.ts b/packages/drizzle/src/upsertRow/types.ts index 991540c727..9a0c4df0db 100644 --- a/packages/drizzle/src/upsertRow/types.ts +++ b/packages/drizzle/src/upsertRow/types.ts @@ -12,7 +12,7 @@ type BaseArgs = { * When true, skips reading the data back from the database and returns the input data * @default false */ - ignoreResult?: boolean + ignoreResult?: boolean | 'idOnly' joinQuery?: JoinQuery path?: string req?: Partial diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 791aea0709..2cc4db957a 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -292,6 +292,12 @@ export type UpdateGlobalVersionArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType versionData: T } & ( @@ -319,6 +325,12 @@ export type FindGlobal = = any>( export type CreateGlobalArgs = any> = { data: T req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean slug: string } export type CreateGlobal = = any>( @@ -332,6 +344,12 @@ export type UpdateGlobalArgs = any> = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType slug: string } @@ -365,6 +383,12 @@ export type CreateVersionArgs = { parent: number | string publishedLocale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType snapshot?: true updatedAt: string @@ -383,6 +407,12 @@ export type CreateGlobalVersionArgs = { parent: number | string publishedLocale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType snapshot?: true updatedAt: string @@ -403,6 +433,12 @@ export type UpdateVersionArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType versionData: T } & ( @@ -429,6 +465,12 @@ export type CreateArgs = { draft?: boolean locale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType } @@ -445,6 +487,12 @@ export type UpdateOneArgs = { */ options?: Record req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType } & ( | { @@ -468,6 +516,12 @@ export type UpsertArgs = { joins?: JoinQuery locale?: string req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType where: Where } @@ -478,6 +532,12 @@ export type DeleteOneArgs = { collection: CollectionSlug joins?: JoinQuery req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean select?: SelectType where: Where } From f3844ee533d8fe760f8abc66b8a8454f972279a3 Mon Sep 17 00:00:00 2001 From: Philipp Meyer Date: Fri, 28 Feb 2025 01:05:05 +0100 Subject: [PATCH 026/127] fix(next): email verification not working due to incorrect token url parsing (#11439) ### What? This PR reverts a presumably accidental change made in [b80010b1a1b77fa041fc46d7277830420c72d97c](https://github.com/payloadcms/payload/commit/b80010b1a1b77fa041fc46d7277830420c72d97c), that broke the email verification feature in v3.24.0 and onwards. ### Why? Through the missing verify in `const [collectionSlug, verify, token] = params.segments`, the token value was always the string `verify` --- packages/next/src/views/Verify/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/views/Verify/index.tsx b/packages/next/src/views/Verify/index.tsx index 390e6510dd..5fcc3d7b57 100644 --- a/packages/next/src/views/Verify/index.tsx +++ b/packages/next/src/views/Verify/index.tsx @@ -14,7 +14,7 @@ export { generateVerifyMetadata } from './meta.js' export async function Verify({ initPageResult, params, searchParams }: AdminViewServerProps) { // /:collectionSlug/verify/:token - const [collectionSlug, token] = params.segments + const [collectionSlug, verify, token] = params.segments const { locale, permissions, req } = initPageResult const { From 6ce5e8b83b5bc1ddf7399e3a11707e5145962e13 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 27 Feb 2025 17:53:23 -0700 Subject: [PATCH 027/127] perf: disable returning of db operations that don't need the return value (#11437) If the return value of a db operation is not used, we can pass `returning: false` which will result in the query being executed faster. See https://github.com/payloadcms/payload/pull/11393 --- packages/payload/src/auth/operations/verifyEmail.ts | 1 + packages/payload/src/collections/operations/delete.ts | 1 + packages/payload/src/versions/saveVersion.ts | 5 +++-- packages/ui/src/utilities/handleFormStateLocking.ts | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/auth/operations/verifyEmail.ts b/packages/payload/src/auth/operations/verifyEmail.ts index dab7d6d2a6..ede5f3c2d0 100644 --- a/packages/payload/src/auth/operations/verifyEmail.ts +++ b/packages/payload/src/auth/operations/verifyEmail.ts @@ -48,6 +48,7 @@ export const verifyEmailOperation = async (args: Args): Promise => { _verified: true, }, req, + returning: false, }) if (shouldCommit) { diff --git a/packages/payload/src/collections/operations/delete.ts b/packages/payload/src/collections/operations/delete.ts index ff88fbf29f..28a777319f 100644 --- a/packages/payload/src/collections/operations/delete.ts +++ b/packages/payload/src/collections/operations/delete.ts @@ -195,6 +195,7 @@ export const deleteOperation = async < await payload.db.deleteOne({ collection: collectionConfig.slug, req, + returning: false, where: { id: { equals: id, diff --git a/packages/payload/src/versions/saveVersion.ts b/packages/payload/src/versions/saveVersion.ts index 8911d5eb32..2242c4c7bb 100644 --- a/packages/payload/src/versions/saveVersion.ts +++ b/packages/payload/src/versions/saveVersion.ts @@ -1,7 +1,7 @@ // @ts-strict-ignore import type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js' import type { SanitizedGlobalConfig } from '../globals/config/types.js' -import type { Payload } from '../index.js' +import type { CreateGlobalVersionArgs, CreateVersionArgs, Payload } from '../index.js' import type { PayloadRequest, SelectType } from '../types/index.js' import { deepCopyObjectSimple } from '../index.js' @@ -159,10 +159,11 @@ export const saveVersion = async ({ const updatedArgs = { ...createVersionArgs, createdAt: snapshotDate, + returning: false, snapshot: true, updatedAt: snapshotDate, versionData: snapshotData, - } as any + } as CreateGlobalVersionArgs & CreateVersionArgs if (collection) { await payload.db.createVersion(updatedArgs) diff --git a/packages/ui/src/utilities/handleFormStateLocking.ts b/packages/ui/src/utilities/handleFormStateLocking.ts index 23765cc665..3f351c8422 100644 --- a/packages/ui/src/utilities/handleFormStateLocking.ts +++ b/packages/ui/src/utilities/handleFormStateLocking.ts @@ -85,6 +85,7 @@ export const handleFormStateLocking = async ({ id: lockedDocument.docs[0].id, collection: 'payload-locked-documents', data: {}, + returning: false, }) } } else { @@ -136,6 +137,7 @@ export const handleFormStateLocking = async ({ value: req.user.id, }, }, + returning: false, }) result = { From 3709950d50f56ebe8b254a3244a24b972e51798b Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Thu, 27 Feb 2025 20:00:40 -0500 Subject: [PATCH 028/127] feat: maintains column state in url (#11387) Maintains column state in the URL. This makes it possible to share direct links to the list view in a specific column order or active column state, similar to the behavior of filters. This also makes it possible to change both the filters and columns in the same rendering cycle, a requirement of the "list presets" feature being worked on here: #11330. For example: ``` ?columns=%5B"title"%2C"content"%2C"-updatedAt"%2C"createdAt"%2C"id"%5D ``` The `-` prefix denotes that the column is inactive. This strategy performs a single round trip to the server, ultimately simplifying the table columns provider as it no longer needs to request a newly rendered table for itself. Without this change, column state would need to be replaced first, followed by a change to the filters. This would make an unnecessary number of requests to the server and briefly render the UI in a stale state. This all happens behind an optimistic update, where the state of the columns is immediately reflected in the UI while the request takes place in the background. Technically speaking, an additional database query in performed compared to the old strategy, whereas before we'd send the data through the request to avoid this. But this is a necessary tradeoff and doesn't have huge performance implications. One could argue that this is actually a good thing, as the data might have changed in the background which would not have been reflected in the result otherwise. --- packages/next/src/views/List/index.tsx | 33 +- packages/payload/src/admin/functions/index.ts | 10 +- packages/payload/src/admin/views/list.ts | 6 + packages/payload/src/exports/shared.ts | 10 +- packages/payload/src/index.ts | 3 +- packages/payload/src/preferences/types.ts | 7 +- .../utilities/transformColumnPreferences.ts | 48 +++ packages/ui/src/elements/Localizer/index.tsx | 36 +- .../ui/src/elements/PublishButton/index.tsx | 2 +- .../src/elements/RelationshipTable/index.tsx | 32 +- .../ui/src/elements/TableColumns/context.ts | 7 + .../ui/src/elements/TableColumns/index.tsx | 309 ++++-------------- .../ui/src/elements/TableColumns/types.ts | 51 +++ .../elements/WhereBuilder/Condition/index.tsx | 18 +- .../ui/src/elements/WhereBuilder/index.tsx | 46 +-- .../ui/src/elements/WhereBuilder/types.ts | 12 +- .../ui/src/providers/ListQuery/context.ts | 7 + packages/ui/src/providers/ListQuery/index.tsx | 129 ++++---- packages/ui/src/providers/ListQuery/types.ts | 42 +++ packages/ui/src/views/List/index.tsx | 12 +- test/admin/e2e/list-view/e2e.spec.ts | 201 +++++++++--- test/fields-relationship/e2e.spec.ts | 24 +- .../collections/Relationship/e2e.spec.ts | 40 ++- test/fields/collections/Text/e2e.spec.ts | 5 +- test/fields/collections/Upload/e2e.spec.ts | 16 +- .../e2e/{upsertPrefs.ts => preferences.ts} | 29 +- test/helpers/e2e/toggleColumn.ts | 37 ++- test/helpers/e2e/toggleDocDrawer.ts | 32 ++ test/helpers/e2e/toggleListDrawer.ts | 14 + test/localization/e2e.spec.ts | 8 +- test/localization/payload-types.ts | 1 + test/uploads/e2e.spec.ts | 13 +- test/versions/e2e.spec.ts | 2 +- tsconfig.base.json | 2 +- 34 files changed, 723 insertions(+), 521 deletions(-) create mode 100644 packages/payload/src/utilities/transformColumnPreferences.ts create mode 100644 packages/ui/src/elements/TableColumns/context.ts create mode 100644 packages/ui/src/elements/TableColumns/types.ts create mode 100644 packages/ui/src/providers/ListQuery/context.ts create mode 100644 packages/ui/src/providers/ListQuery/types.ts rename test/helpers/e2e/{upsertPrefs.ts => preferences.ts} (72%) create mode 100644 test/helpers/e2e/toggleDocDrawer.ts create mode 100644 test/helpers/e2e/toggleListDrawer.ts diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 177fbde7fb..7671018f32 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -1,18 +1,18 @@ -import type { - AdminViewServerProps, - ListPreferences, - ListQuery, - ListViewClientProps, - ListViewServerPropsOnly, - Where, -} from 'payload' - import { DefaultListView, HydrateAuthProvider, ListQueryProvider } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' import { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc' import { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared' import { notFound } from 'next/navigation.js' -import { isNumber } from 'payload/shared' +import { + type AdminViewServerProps, + type ColumnPreference, + type ListPreferences, + type ListQuery, + type ListViewClientProps, + type ListViewServerPropsOnly, + type Where, +} from 'payload' +import { isNumber, transformColumnsToPreferences } from 'payload/shared' import React, { Fragment } from 'react' import { renderListViewSlots } from './renderListViewSlots.js' @@ -72,10 +72,20 @@ export const renderListView = async ( const query = queryFromArgs || queryFromReq + const columns: ColumnPreference[] = transformColumnsToPreferences( + query?.columns as ColumnPreference[] | string, + ) + + /** + * @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc. + * This will ensure that prefs are only updated when explicitly set by the user + * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie + */ const listPreferences = await upsertPreferences({ key: `${collectionSlug}-list`, req, value: { + columns, limit: isNumber(query?.limit) ? Number(query.limit) : undefined, sort: query?.sort as string, }, @@ -141,6 +151,7 @@ export const renderListView = async ( clientCollectionConfig, collectionConfig, columnPreferences: listPreferences?.columns, + columns, customCellProps, docs: data.docs, drawerSlug, @@ -203,9 +214,11 @@ export const renderListView = async ( {RenderServerComponent({ diff --git a/packages/payload/src/admin/functions/index.ts b/packages/payload/src/admin/functions/index.ts index 6a127de063..a1966b19b9 100644 --- a/packages/payload/src/admin/functions/index.ts +++ b/packages/payload/src/admin/functions/index.ts @@ -1,8 +1,9 @@ import type { ImportMap } from '../../bin/generateImportMap/index.js' import type { SanitizedConfig } from '../../config/types.js' import type { PaginatedDocs } from '../../database/types.js' -import type { CollectionSlug } from '../../index.js' +import type { CollectionSlug, ColumnPreference } from '../../index.js' import type { PayloadRequest, Sort, Where } from '../../types/index.js' +import type { ColumnsFromURL } from '../../utilities/transformColumnPreferences.js' export type DefaultServerFunctionArgs = { importMap: ImportMap @@ -38,6 +39,11 @@ export type ServerFunctionHandler = ( ) => Promise export type ListQuery = { + /* + * This is an of strings, i.e. `['title', '-slug']` + * Use `transformColumnsToPreferences` to convert it back and forth + */ + columns?: ColumnsFromURL limit?: string page?: string /* @@ -50,7 +56,7 @@ export type ListQuery = { export type BuildTableStateArgs = { collectionSlug: string | string[] - columns?: { accessor: string; active: boolean }[] + columns?: ColumnPreference[] docs?: PaginatedDocs['docs'] enableRowSelections?: boolean parent?: { diff --git a/packages/payload/src/admin/views/list.ts b/packages/payload/src/admin/views/list.ts index 5823abf01c..624d842c11 100644 --- a/packages/payload/src/admin/views/list.ts +++ b/packages/payload/src/admin/views/list.ts @@ -42,8 +42,14 @@ export type ListViewClientProps = { disableBulkEdit?: boolean enableRowSelections?: boolean hasCreatePermission: boolean + /** + * @deprecated + */ listPreferences?: ListPreferences newDocumentURL: string + /** + * @deprecated + */ preferenceKey?: string renderedFilters?: Map resolvedFilterOptions?: Map diff --git a/packages/payload/src/exports/shared.ts b/packages/payload/src/exports/shared.ts index afbc060ff8..f55aa13a66 100644 --- a/packages/payload/src/exports/shared.ts +++ b/packages/payload/src/exports/shared.ts @@ -52,6 +52,7 @@ export { deepCopyObjectSimple, deepCopyObjectSimpleWithoutReactComponents, } from '../utilities/deepCopyObject.js' + export { deepMerge, deepMergeWithCombinedArrays, @@ -60,13 +61,13 @@ export { } from '../utilities/deepMerge.js' export { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js' + export { flattenAllFields } from '../utilities/flattenAllFields.js' export { default as flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js' - export { getDataByPath } from '../utilities/getDataByPath.js' + export { getSelectMode } from '../utilities/getSelectMode.js' export { getSiblingData } from '../utilities/getSiblingData.js' - export { getUniqueListBy } from '../utilities/getUniqueListBy.js' export { isNextBuild } from '../utilities/isNextBuild.js' @@ -87,6 +88,11 @@ export { setsAreEqual } from '../utilities/setsAreEqual.js' export { default as toKebabCase } from '../utilities/toKebabCase.js' +export { + transformColumnsToPreferences, + transformColumnsToSearchParams, +} from '../utilities/transformColumnPreferences.js' + export { unflatten } from '../utilities/unflatten.js' export { validateMimeType } from '../utilities/validateMimeType.js' export { wait } from '../utilities/wait.js' diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index d955eab676..978181ff1a 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1374,6 +1374,7 @@ export { restoreVersionOperation as restoreVersionOperationGlobal } from './glob export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, + ColumnPreference, DocumentPreferences, FieldsPreferences, InsideFieldsPreferences, @@ -1411,8 +1412,8 @@ export { getLocalI18n } from './translations/getLocalI18n.js' export * from './types/index.js' export { getFileByPath } from './uploads/getFileByPath.js' export type * from './uploads/types.js' - export { addDataAndFileToRequest } from './utilities/addDataAndFileToRequest.js' + export { addLocalesToRequestFromData, sanitizeLocales } from './utilities/addLocalesToRequest.js' export { commitTransaction } from './utilities/commitTransaction.js' export { diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index 1405841675..fff45efe63 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -28,8 +28,13 @@ export type DocumentPreferences = { fields: FieldsPreferences } +export type ColumnPreference = { + accessor: string + active: boolean +} + export type ListPreferences = { - columns?: { accessor: string; active: boolean }[] + columns?: ColumnPreference[] limit?: number sort?: string } diff --git a/packages/payload/src/utilities/transformColumnPreferences.ts b/packages/payload/src/utilities/transformColumnPreferences.ts new file mode 100644 index 0000000000..e427897a2c --- /dev/null +++ b/packages/payload/src/utilities/transformColumnPreferences.ts @@ -0,0 +1,48 @@ +import type { Column } from '../admin/types.js' +import type { ColumnPreference } from '../preferences/types.js' + +export type ColumnsFromURL = string[] + +/** + * Transforms various forms of columns into `ColumnPreference[]` which is what is stored in the user's preferences table + * In React state, for example, columns are stored in in their entirety, including React components: `[{ accessor: 'title', active: true, Label: React.ReactNode, ... }]` + * In the URL, they are stored as an array of strings: `['title', '-slug']`, where the `-` prefix is used to indicate that the column is inactive + * However in the database, columns must be in this exact shape: `[{ accessor: 'title', active: true }, { accessor: 'slug', active: false }]` + * This means that when handling columns, they need to be consistently transformed back and forth + */ +export const transformColumnsToPreferences = ( + columns: Column[] | ColumnPreference[] | ColumnsFromURL | string, +): ColumnPreference[] | undefined => { + let columnsToTransform = columns + + // Columns that originate from the URL are a stringified JSON array and need to be parsed first + if (typeof columns === 'string') { + try { + columnsToTransform = JSON.parse(columns) + } catch (e) { + console.error('Error parsing columns', columns, e) // eslint-disable-line no-console + } + } + + if (columnsToTransform && Array.isArray(columnsToTransform)) { + return columnsToTransform.map((col) => { + if (typeof col === 'string') { + const active = col[0] !== '-' + return { accessor: active ? col : col.slice(1), active } + } + + return { accessor: col.accessor, active: col.active } + }) + } +} + +/** + * Does the opposite of `transformColumnsToPreferences`, where `ColumnPreference[]` and `Column[]` are transformed into `ColumnsFromURL` + * This is useful for storing the columns in the URL, where it appears as a simple comma delimited array of strings + * The `-` prefix is used to indicate that the column is inactive + */ +export const transformColumnsToSearchParams = ( + columns: Column[] | ColumnPreference[], +): ColumnsFromURL => { + return columns.map((col) => (col.active ? col.accessor : `-${col.accessor}`)) +} diff --git a/packages/ui/src/elements/Localizer/index.tsx b/packages/ui/src/elements/Localizer/index.tsx index 0802981502..88b6a79160 100644 --- a/packages/ui/src/elements/Localizer/index.tsx +++ b/packages/ui/src/elements/Localizer/index.tsx @@ -1,16 +1,16 @@ 'use client' import { getTranslation } from '@payloadcms/translations' -import { useSearchParams } from 'next/navigation.js' +import { useRouter } from 'next/navigation.js' import * as qs from 'qs-esm' import React, { Fragment } from 'react' import { useConfig } from '../../providers/Config/index.js' import { useLocale, useLocaleLoading } from '../../providers/Locale/index.js' +import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { parseSearchParams } from '../../utilities/parseSearchParams.js' import { Popup, PopupList } from '../Popup/index.js' -import { LocalizerLabel } from './LocalizerLabel/index.js' import './index.scss' +import { LocalizerLabel } from './LocalizerLabel/index.js' const baseClass = 'localizer' @@ -21,7 +21,10 @@ export const Localizer: React.FC<{ const { config: { localization }, } = useConfig() - const searchParams = useSearchParams() + + const router = useRouter() + const { startRouteTransition } = useRouteTransition() + const { setLocaleIsLoading } = useLocaleLoading() const { i18n } = useTranslation() @@ -44,17 +47,28 @@ export const Localizer: React.FC<{ { setLocaleIsLoading(true) close() + + // can't use `useSearchParams` here because it is stale due to `window.history.pushState` in `ListQueryProvider` + const searchParams = new URLSearchParams(window.location.search) + + const url = qs.stringify( + { + ...qs.parse(searchParams.toString(), { + depth: 10, + ignoreQueryPrefix: true, + }), + locale: localeOption.code, + }, + { addQueryPrefix: true }, + ) + + startRouteTransition(() => { + router.push(url) + }) }} > {localeOptionLabel !== localeOption.code ? ( diff --git a/packages/ui/src/elements/PublishButton/index.tsx b/packages/ui/src/elements/PublishButton/index.tsx index 64703e6981..640d622590 100644 --- a/packages/ui/src/elements/PublishButton/index.tsx +++ b/packages/ui/src/elements/PublishButton/index.tsx @@ -222,7 +222,7 @@ export function PublishButton({ label: labelProp }: PublishButtonClientProps) { )} {localization && canPublish && ( - + {secondaryLabel} diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index e45d2ecfeb..76795c6c1e 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -1,14 +1,14 @@ 'use client' -import type { - CollectionSlug, - Column, - JoinFieldClient, - ListQuery, - PaginatedDocs, - Where, -} from 'payload' - import { getTranslation } from '@payloadcms/translations' +import { + type CollectionSlug, + type Column, + type JoinFieldClient, + type ListQuery, + type PaginatedDocs, + type Where, +} from 'payload' +import { transformColumnsToPreferences } from 'payload/shared' import React, { Fragment, useCallback, useEffect, useState } from 'react' import type { DocumentDrawerProps } from '../DocumentDrawer/types.js' @@ -137,7 +137,7 @@ export const RelationshipTable: React.FC = (pro Table: NewTable, } = await getTableState({ collectionSlug: relationTo, - columns: defaultColumns, + columns: transformColumnsToPreferences(query?.columns) || defaultColumns, docs, enableRowSelections: false, parent, @@ -154,7 +154,6 @@ export const RelationshipTable: React.FC = (pro [ field.defaultLimit, field.defaultSort, - field.admin.defaultColumns, collectionConfig?.admin?.pagination?.defaultLimit, collectionConfig?.defaultSort, query, @@ -215,8 +214,6 @@ export const RelationshipTable: React.FC = (pro [data?.docs, renderTable], ) - const preferenceKey = `${Array.isArray(relationTo) ? `${parent.collectionSlug}-${parent.joinPath}` : relationTo}-list` - const canCreate = allowCreate !== false && permissions?.collections?.[Array.isArray(relationTo) ? relationTo[0] : relationTo]?.create @@ -326,6 +323,7 @@ export const RelationshipTable: React.FC = (pro {data?.docs && data.docs.length > 0 && ( = (pro } - preferenceKey={preferenceKey} - renderRowTypes - setTable={setTable} - sortColumnProps={{ - appearance: 'condensed', - }} - tableAppearance="condensed" > ({} as ITableColumns) + +export const useTableColumns = (): ITableColumns => useContext(TableColumnContext) diff --git a/packages/ui/src/elements/TableColumns/index.tsx b/packages/ui/src/elements/TableColumns/index.tsx index 5d7120e7a0..0616985fbf 100644 --- a/packages/ui/src/elements/TableColumns/index.tsx +++ b/packages/ui/src/elements/TableColumns/index.tsx @@ -1,293 +1,98 @@ 'use client' -import type { Column, ListPreferences, SanitizedCollectionConfig } from 'payload' +import { type Column } from 'payload' +import { transformColumnsToSearchParams } from 'payload/shared' +import React, { startTransition, useCallback } from 'react' -import React, { createContext, useCallback, useContext, useEffect } from 'react' - -import type { SortColumnProps } from '../SortColumn/index.js' +import type { TableColumnsProviderProps } from './types.js' import { useConfig } from '../../providers/Config/index.js' -import { usePreferences } from '../../providers/Preferences/index.js' -import { useServerFunctions } from '../../providers/ServerFunctions/index.js' -import { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js' +import { useListQuery } from '../../providers/ListQuery/index.js' +import { TableColumnContext } from './context.js' -export interface ITableColumns { - columns: Column[] - LinkedCellOverride?: React.ReactNode - moveColumn: (args: { fromIndex: number; toIndex: number }) => Promise - resetColumnsState: () => Promise - setActiveColumns: (columns: string[]) => Promise - toggleColumn: (column: string) => Promise -} +export { useTableColumns } from './context.js' -export const TableColumnContext = createContext({} as ITableColumns) - -export const useTableColumns = (): ITableColumns => useContext(TableColumnContext) - -type Props = { - readonly children: React.ReactNode - readonly collectionSlug: string | string[] - readonly columnState: Column[] - readonly docs: any[] - readonly enableRowSelections?: boolean - readonly LinkedCellOverride?: React.ReactNode - readonly listPreferences?: ListPreferences - readonly preferenceKey: string - readonly renderRowTypes?: boolean - readonly setTable: (Table: React.ReactNode) => void - readonly sortColumnProps?: Partial - readonly tableAppearance?: 'condensed' | 'default' -} - -// strip out Heading, Label, and renderedCells properties, they cannot be sent to the server -const sanitizeColumns = (columns: Column[]) => { - return columns.map(({ accessor, active }) => ({ - accessor, - active, - })) -} - -export const TableColumnsProvider: React.FC = ({ +export const TableColumnsProvider: React.FC = ({ children, collectionSlug, - columnState, - docs, - enableRowSelections, + columnState: columnStateFromProps, LinkedCellOverride, - listPreferences, - preferenceKey, - renderRowTypes, - setTable, - sortColumnProps, - tableAppearance, }) => { const { getEntityConfig } = useConfig() + const { query: currentQuery, refineListData } = useListQuery() - const { getTableState } = useServerFunctions() - - const { admin: { defaultColumns, useAsTitle } = {}, fields } = getEntityConfig({ + const { admin: { defaultColumns } = {} } = getEntityConfig({ collectionSlug, }) - const prevCollection = React.useRef( - Array.isArray(collectionSlug) ? collectionSlug[0] : collectionSlug, - ) - const { getPreference } = usePreferences() - - const [tableColumns, setTableColumns] = React.useState(columnState) - const abortTableStateRef = React.useRef(null) - const abortToggleColumnRef = React.useRef(null) - - const moveColumn = useCallback( - async (args: { fromIndex: number; toIndex: number }) => { - const controller = handleAbortRef(abortTableStateRef) - - const { fromIndex, toIndex } = args - const withMovedColumn = [...tableColumns] - const [columnToMove] = withMovedColumn.splice(fromIndex, 1) - withMovedColumn.splice(toIndex, 0, columnToMove) - - setTableColumns(withMovedColumn) - - const result = await getTableState({ - collectionSlug, - columns: sanitizeColumns(withMovedColumn), - docs, - enableRowSelections, - renderRowTypes, - signal: controller.signal, - tableAppearance, - }) - - if (result) { - setTableColumns(result.state) - setTable(result.Table) - } - - abortTableStateRef.current = null - }, - [ - tableColumns, - collectionSlug, - docs, - getTableState, - setTable, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + const [columnState, setOptimisticColumnState] = React.useOptimistic( + columnStateFromProps, + (state, action: Column[]) => action, ) const toggleColumn = useCallback( async (column: string) => { - const controller = handleAbortRef(abortToggleColumnRef) - - const { newColumnState, toggledColumns } = tableColumns.reduce<{ - newColumnState: Column[] - toggledColumns: Pick[] - }>( - (acc, col) => { - if (col.accessor === column) { - acc.newColumnState.push({ - ...col, - accessor: col.accessor, - active: !col.active, - }) - acc.toggledColumns.push({ - accessor: col.accessor, - active: !col.active, - }) - } else { - acc.newColumnState.push(col) - acc.toggledColumns.push({ - accessor: col.accessor, - active: col.active, - }) - } - - return acc - }, - { newColumnState: [], toggledColumns: [] }, - ) - - setTableColumns(newColumnState) - - const result = await getTableState({ - collectionSlug, - columns: toggledColumns, - docs, - enableRowSelections, - renderRowTypes, - signal: controller.signal, - tableAppearance, + const newColumnState = (columnState || []).map((col) => { + if (col.accessor === column) { + return { ...col, active: !col.active } + } + return col }) - if (result) { - setTableColumns(result.state) - setTable(result.Table) - } + startTransition(() => { + setOptimisticColumnState(newColumnState) + }) - abortToggleColumnRef.current = null + await refineListData({ + columns: transformColumnsToSearchParams(newColumnState), + }) }, - [ - tableColumns, - getTableState, - setTable, - collectionSlug, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + [refineListData, columnState, setOptimisticColumnState], ) - const setActiveColumns = React.useCallback( - async (activeColumnAccessors: string[]) => { - const activeColumns: Pick[] = tableColumns - .map((col) => { - return { - accessor: col.accessor, - active: activeColumnAccessors.includes(col.accessor), - } - }) - .sort((first, second) => { - const indexOfFirst = activeColumnAccessors.indexOf(first.accessor) - const indexOfSecond = activeColumnAccessors.indexOf(second.accessor) + const moveColumn = useCallback( + async (args: { fromIndex: number; toIndex: number }) => { + const { fromIndex, toIndex } = args + const newColumnState = [...(columnState || [])] + const [columnToMove] = newColumnState.splice(fromIndex, 1) + newColumnState.splice(toIndex, 0, columnToMove) - if (indexOfFirst === -1 || indexOfSecond === -1) { - return 0 - } - - return indexOfFirst > indexOfSecond ? 1 : -1 - }) - - const { state: columnState, Table } = await getTableState({ - collectionSlug, - columns: activeColumns, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, + startTransition(() => { + setOptimisticColumnState(newColumnState) }) - setTableColumns(columnState) - setTable(Table) + await refineListData({ + columns: transformColumnsToSearchParams(newColumnState), + }) }, - [ - tableColumns, - getTableState, - setTable, - collectionSlug, - docs, - enableRowSelections, - renderRowTypes, - tableAppearance, - ], + [columnState, refineListData, setOptimisticColumnState], + ) + + const setActiveColumns = useCallback( + async (columns: string[]) => { + const newColumnState = currentQuery.columns + + columns.forEach((colName) => { + const colIndex = newColumnState.findIndex((c) => colName === c) + + // ensure the name does not begin with a `-` which denotes an inactive column + if (colIndex !== undefined && newColumnState[colIndex][0] === '-') { + newColumnState[colIndex] = colName.slice(1) + } + }) + + await refineListData({ columns: newColumnState }) + }, + [currentQuery, refineListData], ) const resetColumnsState = React.useCallback(async () => { await setActiveColumns(defaultColumns) }, [defaultColumns, setActiveColumns]) - // ////////////////////////////////////////////// - // Get preferences on collection change (drawers) - // ////////////////////////////////////////////// - - React.useEffect(() => { - const sync = async () => { - const defaultCollection = Array.isArray(collectionSlug) ? collectionSlug[0] : collectionSlug - const collectionHasChanged = prevCollection.current !== defaultCollection - - if (collectionHasChanged || !listPreferences) { - const currentPreferences = await getPreference<{ - columns: ListPreferences['columns'] - }>(preferenceKey) - - prevCollection.current = defaultCollection - - if (currentPreferences?.columns) { - // setTableColumns() - // buildColumnState({ - // beforeRows, - // columnPreferences: currentPreferences?.columns, - // columns: initialColumns, - // enableRowSelections, - // fields, - // sortColumnProps, - // useAsTitle, - // }), - } - } - } - - void sync() - }, [ - preferenceKey, - getPreference, - collectionSlug, - fields, - defaultColumns, - useAsTitle, - listPreferences, - enableRowSelections, - sortColumnProps, - ]) - - useEffect(() => { - setTableColumns(columnState) - }, [columnState]) - - useEffect(() => { - const abortTableState = abortTableStateRef.current - - return () => { - abortAndIgnore(abortTableState) - } - }, []) - return ( Promise + resetColumnsState: () => Promise + setActiveColumns: (columns: string[]) => Promise + toggleColumn: (column: string) => Promise +} + +export type TableColumnsProviderProps = { + readonly children: React.ReactNode + readonly collectionSlug: string | string[] + readonly columnState: Column[] + /** + * @deprecated + */ + readonly docs?: any[] + /** + * @deprecated + */ + readonly enableRowSelections?: boolean + readonly LinkedCellOverride?: React.ReactNode + /** + * @deprecated + */ + readonly listPreferences?: ListPreferences + /** + * @deprecated + */ + readonly preferenceKey?: string + /** + * @deprecated + */ + readonly renderRowTypes?: boolean + /** + * @deprecated + */ + readonly setTable?: (Table: React.ReactNode) => void + /** + * @deprecated + */ + readonly sortColumnProps?: Partial + /** + * @deprecated + */ + readonly tableAppearance?: 'condensed' | 'default' +} diff --git a/packages/ui/src/elements/WhereBuilder/Condition/index.tsx b/packages/ui/src/elements/WhereBuilder/Condition/index.tsx index 73850bec4d..644ee39215 100644 --- a/packages/ui/src/elements/WhereBuilder/Condition/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/Condition/index.tsx @@ -1,7 +1,7 @@ 'use client' import React, { useCallback, useEffect, useState } from 'react' -import type { AddCondition, ReducedField, UpdateCondition } from '../types.js' +import type { AddCondition, ReducedField, RemoveCondition, UpdateCondition } from '../types.js' export type Props = { readonly addCondition: AddCondition @@ -11,7 +11,7 @@ export type Props = { readonly operator: Operator readonly orIndex: number readonly reducedFields: ReducedField[] - readonly removeCondition: ({ andIndex, orIndex }: { andIndex: number; orIndex: number }) => void + readonly removeCondition: RemoveCondition readonly RenderedFilter: React.ReactNode readonly updateCondition: UpdateCondition readonly value: string @@ -67,9 +67,9 @@ export const Condition: React.FC = (props) => { valueOptions = reducedField.field.options } - const updateValue = useEffectEvent((debouncedValue) => { + const updateValue = useEffectEvent(async (debouncedValue) => { if (operator) { - updateCondition({ + await updateCondition({ andIndex, field: reducedField, operator, @@ -80,7 +80,7 @@ export const Condition: React.FC = (props) => { }) useEffect(() => { - updateValue(debouncedValue) + void updateValue(debouncedValue) }, [debouncedValue]) const disabled = @@ -88,9 +88,9 @@ export const Condition: React.FC = (props) => { reducedField?.field?.admin?.disableListFilter const handleFieldChange = useCallback( - (field: Option) => { + async (field: Option) => { setInternalValue(undefined) - updateCondition({ + await updateCondition({ andIndex, field: reducedFields.find((option) => option.value === field.value), operator, @@ -102,8 +102,8 @@ export const Condition: React.FC = (props) => { ) const handleOperatorChange = useCallback( - (operator: Option) => { - updateCondition({ + async (operator: Option) => { + await updateCondition({ andIndex, field: reducedField, operator: operator.value, diff --git a/packages/ui/src/elements/WhereBuilder/index.tsx b/packages/ui/src/elements/WhereBuilder/index.tsx index 4a83fe75b0..4c2644175d 100644 --- a/packages/ui/src/elements/WhereBuilder/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/index.tsx @@ -4,18 +4,17 @@ import type { Operator, Where } from 'payload' import { getTranslation } from '@payloadcms/translations' import React, { useMemo } from 'react' -import type { AddCondition, UpdateCondition, WhereBuilderProps } from './types.js' +import type { AddCondition, RemoveCondition, UpdateCondition, WhereBuilderProps } from './types.js' -import { useEffectEvent } from '../../hooks/useEffectEvent.js' import { useListQuery } from '../../providers/ListQuery/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { Button } from '../Button/index.js' import { Condition } from './Condition/index.js' import fieldTypes from './field-types.js' import { reduceFields } from './reduceFields.js' -import './index.scss' import { transformWhereQuery } from './transformWhereQuery.js' import validateWhereQuery from './validateWhereQuery.js' +import './index.scss' const baseClass = 'where-builder' @@ -32,7 +31,6 @@ export const WhereBuilder: React.FC = (props) => { const reducedFields = useMemo(() => reduceFields({ fields, i18n }), [fields, i18n]) const { handleWhereChange, query } = useListQuery() - const [shouldUpdateQuery, setShouldUpdateQuery] = React.useState(false) const [conditions, setConditions] = React.useState(() => { const whereFromSearch = query.where @@ -56,7 +54,7 @@ export const WhereBuilder: React.FC = (props) => { }) const addCondition: AddCondition = React.useCallback( - ({ andIndex, field, orIndex, relation }) => { + async ({ andIndex, field, orIndex, relation }) => { const newConditions = [...conditions] const defaultOperator = fieldTypes[field.field.type].operators[0].value @@ -80,12 +78,13 @@ export const WhereBuilder: React.FC = (props) => { } setConditions(newConditions) + await handleWhereChange({ or: conditions }) }, - [conditions], + [conditions, handleWhereChange], ) const updateCondition: UpdateCondition = React.useCallback( - ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => { + async ({ andIndex, field, operator: incomingOperator, orIndex, value: valueArg }) => { const existingRowCondition = conditions[orIndex].and[andIndex] const defaults = fieldTypes[field.field.type] @@ -102,14 +101,14 @@ export const WhereBuilder: React.FC = (props) => { newConditions[orIndex].and[andIndex] = newRowCondition setConditions(newConditions) - setShouldUpdateQuery(true) + await handleWhereChange({ or: conditions }) } }, - [conditions], + [conditions, handleWhereChange], ) - const removeCondition = React.useCallback( - ({ andIndex, orIndex }) => { + const removeCondition: RemoveCondition = React.useCallback( + async ({ andIndex, orIndex }) => { const newConditions = [...conditions] newConditions[orIndex].and.splice(andIndex, 1) @@ -118,21 +117,10 @@ export const WhereBuilder: React.FC = (props) => { } setConditions(newConditions) - setShouldUpdateQuery(true) - }, - [conditions], - ) - - const handleChange = useEffectEvent(async (conditions: Where[]) => { - if (shouldUpdateQuery) { await handleWhereChange({ or: conditions }) - setShouldUpdateQuery(false) - } - }) - - React.useEffect(() => { - void handleChange(conditions) - }, [conditions]) + }, + [conditions, handleWhereChange], + ) return (
@@ -191,8 +179,8 @@ export const WhereBuilder: React.FC = (props) => { icon="plus" iconPosition="left" iconStyle="with-border" - onClick={() => { - addCondition({ + onClick={async () => { + await addCondition({ andIndex: 0, field: reducedFields[0], orIndex: conditions.length, @@ -213,9 +201,9 @@ export const WhereBuilder: React.FC = (props) => { icon="plus" iconPosition="left" iconStyle="with-border" - onClick={() => { + onClick={async () => { if (reducedFields.length > 0) { - addCondition({ + await addCondition({ andIndex: 0, field: reducedFields.find((field) => !field.field.admin?.disableListFilter), orIndex: conditions.length, diff --git a/packages/ui/src/elements/WhereBuilder/types.ts b/packages/ui/src/elements/WhereBuilder/types.ts index 86cc7f530c..e7bd61fb6d 100644 --- a/packages/ui/src/elements/WhereBuilder/types.ts +++ b/packages/ui/src/elements/WhereBuilder/types.ts @@ -65,7 +65,7 @@ export type AddCondition = ({ field: ReducedField orIndex: number relation: 'and' | 'or' -}) => void +}) => Promise | void export type UpdateCondition = ({ andIndex, @@ -79,4 +79,12 @@ export type UpdateCondition = ({ operator: string orIndex: number value: string -}) => void +}) => Promise | void + +export type RemoveCondition = ({ + andIndex, + orIndex, +}: { + andIndex: number + orIndex: number +}) => Promise | void diff --git a/packages/ui/src/providers/ListQuery/context.ts b/packages/ui/src/providers/ListQuery/context.ts new file mode 100644 index 0000000000..d45c88849b --- /dev/null +++ b/packages/ui/src/providers/ListQuery/context.ts @@ -0,0 +1,7 @@ +import { createContext, useContext } from 'react' + +import type { IListQueryContext } from './types.js' + +export const ListQueryContext = createContext({} as IListQueryContext) + +export const useListQuery = (): IListQueryContext => useContext(ListQueryContext) diff --git a/packages/ui/src/providers/ListQuery/index.tsx b/packages/ui/src/providers/ListQuery/index.tsx index b445bb8668..de7938f4ad 100644 --- a/packages/ui/src/providers/ListQuery/index.tsx +++ b/packages/ui/src/providers/ListQuery/index.tsx @@ -1,57 +1,39 @@ 'use client' -import type { ListQuery, PaginatedDocs, Sort, Where } from 'payload' - import { useRouter, useSearchParams } from 'next/navigation.js' -import { isNumber } from 'payload/shared' +import { type ListQuery, type Where } from 'payload' +import { isNumber, transformColumnsToSearchParams } from 'payload/shared' import * as qs from 'qs-esm' -import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' + +import type { ListQueryProps } from './types.js' import { useListDrawerContext } from '../../elements/ListDrawer/Provider.js' +import { useEffectEvent } from '../../hooks/useEffectEvent.js' +import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { parseSearchParams } from '../../utilities/parseSearchParams.js' +import { ListQueryContext } from './context.js' -type ContextHandlers = { - handlePageChange?: (page: number) => Promise - handlePerPageChange?: (limit: number) => Promise - handleSearchChange?: (search: string) => Promise - handleSortChange?: (sort: string) => Promise - handleWhereChange?: (where: Where) => Promise -} - -export type ListQueryProps = { - readonly children: React.ReactNode - readonly collectionSlug?: string - readonly data: PaginatedDocs - readonly defaultLimit?: number - readonly defaultSort?: Sort - readonly modifySearchParams?: boolean - readonly onQueryChange?: (query: ListQuery) => void - readonly preferenceKey?: string -} - -export type ListQueryContext = { - data: PaginatedDocs - defaultLimit?: number - defaultSort?: Sort - query: ListQuery - refineListData: (args: ListQuery) => Promise -} & ContextHandlers - -const Context = createContext({} as ListQueryContext) - -export const useListQuery = (): ListQueryContext => useContext(Context) +export { useListQuery } from './context.js' export const ListQueryProvider: React.FC = ({ children, + columns, data, defaultLimit, defaultSort, + listPreferences, modifySearchParams, onQueryChange: onQueryChangeFromProps, }) => { 'use no memo' const router = useRouter() const rawSearchParams = useSearchParams() - const searchParams = useMemo(() => parseSearchParams(rawSearchParams), [rawSearchParams]) + const { startRouteTransition } = useRouteTransition() + + const searchParams = useMemo( + () => parseSearchParams(rawSearchParams), + [rawSearchParams], + ) const { onQueryChange } = useListDrawerContext() @@ -63,8 +45,6 @@ export const ListQueryProvider: React.FC = ({ } }) - const currentQueryRef = React.useRef(currentQuery) - // If the search params change externally, update the current query useEffect(() => { if (modifySearchParams) { @@ -82,6 +62,7 @@ export const ListQueryProvider: React.FC = ({ } const newQuery: ListQuery = { + columns: 'columns' in query ? query.columns : currentQuery.columns, limit: 'limit' in query ? query.limit : (currentQuery?.limit ?? String(defaultLimit)), page, search: 'search' in query ? query.search : currentQuery?.search, @@ -90,7 +71,14 @@ export const ListQueryProvider: React.FC = ({ } if (modifySearchParams) { - router.replace(`${qs.stringify(newQuery, { addQueryPrefix: true })}`) + startRouteTransition(() => + router.replace( + `${qs.stringify( + { ...newQuery, columns: JSON.stringify(newQuery.columns) }, + { addQueryPrefix: true }, + )}`, + ), + ) } else if ( typeof onQueryChange === 'function' || typeof onQueryChangeFromProps === 'function' @@ -102,11 +90,13 @@ export const ListQueryProvider: React.FC = ({ setCurrentQuery(newQuery) }, [ - currentQuery?.page, + currentQuery?.columns, currentQuery?.limit, + currentQuery?.page, currentQuery?.search, currentQuery?.sort, currentQuery?.where, + startRouteTransition, defaultLimit, defaultSort, modifySearchParams, @@ -152,35 +142,50 @@ export const ListQueryProvider: React.FC = ({ [refineListData], ) + const syncQuery = useEffectEvent(() => { + let shouldUpdateQueryString = false + const newQuery = { ...(currentQuery || {}) } + + // Allow the URL to override the default limit + if (isNumber(defaultLimit) && !('limit' in currentQuery)) { + newQuery.limit = String(defaultLimit) + shouldUpdateQueryString = true + } + + // Allow the URL to override the default sort + if (defaultSort && !('sort' in currentQuery)) { + newQuery.sort = defaultSort + shouldUpdateQueryString = true + } + + // Only modify columns if they originated from preferences + // We can assume they did if `listPreferences.columns` is defined + if (columns && listPreferences?.columns && !('columns' in currentQuery)) { + newQuery.columns = transformColumnsToSearchParams(columns) + shouldUpdateQueryString = true + } + + if (shouldUpdateQueryString) { + setCurrentQuery(newQuery) + // Do not use router.replace here to avoid re-rendering on initial load + window.history.replaceState( + null, + '', + `?${qs.stringify({ ...newQuery, columns: JSON.stringify(newQuery.columns) })}`, + ) + } + }) + // If `defaultLimit` or `defaultSort` are updated externally, update the query // I.e. when HMR runs, these properties may be different useEffect(() => { if (modifySearchParams) { - let shouldUpdateQueryString = false - const newQuery = { ...(currentQueryRef.current || {}) } - - // Allow the URL to override the default limit - if (isNumber(defaultLimit) && !('limit' in currentQueryRef.current)) { - newQuery.limit = String(defaultLimit) - shouldUpdateQueryString = true - } - - // Allow the URL to override the default sort - if (defaultSort && !('sort' in currentQueryRef.current)) { - newQuery.sort = defaultSort - shouldUpdateQueryString = true - } - - if (shouldUpdateQueryString) { - setCurrentQuery(newQuery) - // Do not use router.replace here to avoid re-rendering on initial load - window.history.replaceState(null, '', `?${qs.stringify(newQuery)}`) - } + syncQuery() } - }, [defaultSort, defaultLimit, router, modifySearchParams]) + }, [defaultSort, defaultLimit, modifySearchParams, columns]) return ( - = ({ }} > {children} - + ) } diff --git a/packages/ui/src/providers/ListQuery/types.ts b/packages/ui/src/providers/ListQuery/types.ts new file mode 100644 index 0000000000..accd66a906 --- /dev/null +++ b/packages/ui/src/providers/ListQuery/types.ts @@ -0,0 +1,42 @@ +import type { + ColumnPreference, + ListPreferences, + ListQuery, + PaginatedDocs, + Sort, + Where, +} from 'payload' + +type ContextHandlers = { + handlePageChange?: (page: number) => Promise + handlePerPageChange?: (limit: number) => Promise + handleSearchChange?: (search: string) => Promise + handleSortChange?: (sort: string) => Promise + handleWhereChange?: (where: Where) => Promise +} + +export type OnListQueryChange = (query: ListQuery) => void + +export type ListQueryProps = { + readonly children: React.ReactNode + readonly collectionSlug?: string + readonly columns?: ColumnPreference[] + readonly data: PaginatedDocs + readonly defaultLimit?: number + readonly defaultSort?: Sort + readonly listPreferences?: ListPreferences + readonly modifySearchParams?: boolean + readonly onQueryChange?: OnListQueryChange + /** + * @deprecated + */ + readonly preferenceKey?: string +} + +export type IListQueryContext = { + data: PaginatedDocs + defaultLimit?: number + defaultSort?: Sort + query: ListQuery + refineListData: (args: ListQuery) => Promise +} & ContextHandlers diff --git a/packages/ui/src/views/List/index.tsx b/packages/ui/src/views/List/index.tsx index 9a5c862541..6aa5a49201 100644 --- a/packages/ui/src/views/List/index.tsx +++ b/packages/ui/src/views/List/index.tsx @@ -49,9 +49,7 @@ export function DefaultListView(props: ListViewClientProps) { enableRowSelections, hasCreatePermission: hasCreatePermissionFromProps, listMenuItems, - listPreferences, newDocumentURL, - preferenceKey, renderedFilters, resolvedFilterOptions, Table: InitialTable, @@ -153,15 +151,7 @@ export function DefaultListView(props: ListViewClientProps) { }, [setStepNav, labels, drawerDepth]) return ( - +
{BeforeList} diff --git a/test/admin/e2e/list-view/e2e.spec.ts b/test/admin/e2e/list-view/e2e.spec.ts index 2e063210e7..4aeddcb2cd 100644 --- a/test/admin/e2e/list-view/e2e.spec.ts +++ b/test/admin/e2e/list-view/e2e.spec.ts @@ -1,17 +1,17 @@ import type { Page } from '@playwright/test' +import type { User as PayloadUser } from 'payload' import { expect, test } from '@playwright/test' import { mapAsync } from 'payload' import * as qs from 'qs-esm' -import type { Config, Geo, Post } from '../../payload-types.js' +import type { Config, Geo, Post, User } from '../../payload-types.js' import { ensureCompilationIsDone, exactText, getRoutes, initPageConsoleErrorCatch, - openDocDrawer, } from '../../../helpers.js' import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' @@ -31,11 +31,15 @@ const description = 'Description' let payload: PayloadTestSDK +import { devUser } from 'credentials.js' import { addListFilter } from 'helpers/e2e/addListFilter.js' import { goToFirstCell } from 'helpers/e2e/navigateToDoc.js' import { openListColumns } from 'helpers/e2e/openListColumns.js' import { openListFilters } from 'helpers/e2e/openListFilters.js' -import { toggleColumn } from 'helpers/e2e/toggleColumn.js' +import { deletePreferences } from 'helpers/e2e/preferences.js' +import { toggleColumn, waitForColumnInURL } from 'helpers/e2e/toggleColumn.js' +import { openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' +import { closeListDrawer } from 'helpers/e2e/toggleListDrawer.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -58,6 +62,7 @@ describe('List View', () => { let customViewsUrl: AdminUrlUtil let with300DocumentsUrl: AdminUrlUtil let withListViewUrl: AdminUrlUtil + let user: any let serverURL: string let adminRoutes: ReturnType @@ -87,6 +92,14 @@ describe('List View', () => { await ensureCompilationIsDone({ customAdminRoutes, page, serverURL }) adminRoutes = getRoutes({ customAdminRoutes }) + + user = await payload.login({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) }) beforeEach(async () => { @@ -831,49 +844,91 @@ describe('List View', () => { ).toBeVisible() }) - test('should toggle columns', async () => { - const columnCountLocator = 'table > thead > tr > th' - await createPost() + test('should toggle columns and effect table', async () => { + const tableHeaders = 'table > thead > tr > th' + await openListColumns(page, {}) - const numberOfColumns = await page.locator(columnCountLocator).count() + const numberOfColumns = await page.locator(tableHeaders).count() await expect(page.locator('.column-selector')).toBeVisible() await expect(page.locator('table > thead > tr > th:nth-child(2)')).toHaveText('ID') - await toggleColumn(page, { columnLabel: 'ID', targetState: 'off' }) + + await toggleColumn(page, { columnLabel: 'ID', columnName: 'id', targetState: 'off' }) + await page.locator('#heading-id').waitFor({ state: 'detached' }) await page.locator('.cell-id').first().waitFor({ state: 'detached' }) - await expect(page.locator(columnCountLocator)).toHaveCount(numberOfColumns - 1) + await expect(page.locator(tableHeaders)).toHaveCount(numberOfColumns - 1) await expect(page.locator('table > thead > tr > th:nth-child(2)')).toHaveText('Number') - await toggleColumn(page, { columnLabel: 'ID', targetState: 'on' }) + + await toggleColumn(page, { columnLabel: 'ID', columnName: 'id', targetState: 'on' }) + await expect(page.locator('.cell-id').first()).toBeVisible() - await expect(page.locator(columnCountLocator)).toHaveCount(numberOfColumns) + await expect(page.locator(tableHeaders)).toHaveCount(numberOfColumns) await expect(page.locator('table > thead > tr > th:nth-child(2)')).toHaveText('ID') + + await toggleColumn(page, { columnLabel: 'ID', columnName: 'id', targetState: 'off' }) + }) + + test('should toggle columns and save to preferences', async () => { + const tableHeaders = 'table > thead > tr > th' + const numberOfColumns = await page.locator(tableHeaders).count() + + await toggleColumn(page, { columnLabel: 'ID', columnName: 'id', targetState: 'off' }) + + await page.reload() + + await expect(page.locator('#heading-id')).toBeHidden() + await expect(page.locator('.cell-id').first()).toBeHidden() + await expect(page.locator(tableHeaders)).toHaveCount(numberOfColumns - 1) + await expect(page.locator('table > thead > tr > th:nth-child(2)')).toHaveText('Number') + }) + + test('should inject preferred columns into URL search params on load', async () => { + await toggleColumn(page, { columnLabel: 'ID', columnName: 'id', targetState: 'off' }) + + // reload to ensure the columns were stored and loaded from preferences + await page.reload() + + // The `columns` search params _should_ contain "-id" + await waitForColumnInURL({ page, columnName: 'id', state: 'off' }) + + expect(true).toBe(true) + }) + + test('should not inject default columns into URL search params on load', async () => { + // clear preferences first, ensure that they don't automatically populate in the URL on load + await deletePreferences({ + payload, + key: `${postsCollectionSlug}.list`, + user, + }) + + // wait for the URL search params to populate + await page.waitForURL(/posts\?/) + + // The `columns` search params should _not_ appear in the URL + expect(page.url()).not.toMatch(/columns=/) }) test('should drag to reorder columns and save to preferences', async () => { - await createPost() - await reorderColumns(page, { fromColumn: 'Number', toColumn: 'ID' }) - // reload to ensure the preferred order was stored in the database + // reload to ensure the columns were stored and loaded from preferences await page.reload() + await expect( page.locator('.list-controls .column-selector .column-selector__column').first(), ).toHaveText('Number') + await expect(page.locator('table thead tr th').nth(1)).toHaveText('Number') }) - test('should render drawer columns in order', async () => { - // Re-order columns like done in the previous test - await createPost() + test('should render list drawer columns in proper order', async () => { await reorderColumns(page, { fromColumn: 'Number', toColumn: 'ID' }) await page.reload() - await createPost() await page.goto(postsUrl.create) - - await openDocDrawer(page, '.rich-text .list-drawer__toggler') - + await openDocDrawer({ page, selector: '.rich-text .list-drawer__toggler' }) const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() @@ -883,17 +938,17 @@ describe('List View', () => { // select the "Post" collection await collectionSelector.click() + await page .locator('[id^=list-drawer_1_] .list-header__select-collection.react-select .rs__option', { hasText: exactText('Post'), }) .click() - // open the column controls - const columnSelector = page.locator('[id^=list-drawer_1_] .list-controls__toggle-columns') - await columnSelector.click() - // wait until the column toggle UI is visible and fully expanded - await expect(page.locator('.list-controls__columns.rah-static--height-auto')).toBeVisible() + await openListColumns(page, { + columnContainerSelector: '.list-controls__columns', + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + }) // ensure that the columns are in the correct order await expect( @@ -903,48 +958,94 @@ describe('List View', () => { ).toHaveText('Number') }) + test('should toggle columns in list drawer', async () => { + await page.goto(postsUrl.create) + + // Open the drawer + await openDocDrawer({ page, selector: '.rich-text .list-drawer__toggler' }) + const listDrawer = page.locator('[id^=list-drawer_1_]') + await expect(listDrawer).toBeVisible() + + await openListColumns(page, { + columnContainerSelector: '.list-controls__columns', + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + }) + + await toggleColumn(page, { + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + columnContainerSelector: '.list-controls__columns', + columnLabel: 'ID', + targetState: 'off', + expectURLChange: false, + }) + + await closeListDrawer({ page }) + + await openDocDrawer({ page, selector: '.rich-text .list-drawer__toggler' }) + + await openListColumns(page, { + columnContainerSelector: '.list-controls__columns', + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + }) + + const columnContainer = page.locator('.list-controls__columns').first() + + const column = columnContainer.locator(`.column-selector .column-selector__column`, { + hasText: exactText('ID'), + }) + + await expect(column).not.toHaveClass(/column-selector__column--active/) + }) + test('should retain preferences when changing drawer collections', async () => { await page.goto(postsUrl.create) // Open the drawer - await openDocDrawer(page, '.rich-text .list-drawer__toggler') + await openDocDrawer({ page, selector: '.rich-text .list-drawer__toggler' }) const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() + await openListColumns(page, { + columnContainerSelector: '.list-controls__columns', + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + }) + const collectionSelector = page.locator( '[id^=list-drawer_1_] .list-header__select-collection.react-select', ) - const columnSelector = page.locator('[id^=list-drawer_1_] .list-controls__toggle-columns') - // open the column controls - await columnSelector.click() // wait until the column toggle UI is visible and fully expanded await expect(page.locator('.list-controls__columns.rah-static--height-auto')).toBeVisible() // deselect the "id" column - await page - .locator('[id^=list-drawer_1_] .list-controls .column-selector .column-selector__column', { - hasText: exactText('ID'), - }) - .click() + await toggleColumn(page, { + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + columnContainerSelector: '.list-controls__columns', + columnLabel: 'ID', + targetState: 'off', + expectURLChange: false, + }) // select the "Post" collection await collectionSelector.click() + await page .locator('[id^=list-drawer_1_] .list-header__select-collection.react-select .rs__option', { hasText: exactText('Post'), }) .click() - // deselect the "number" column - await page - .locator('[id^=list-drawer_1_] .list-controls .column-selector .column-selector__column', { - hasText: exactText('Number'), - }) - .click() + await toggleColumn(page, { + togglerSelector: '[id^=list-drawer_1_] .list-controls__toggle-columns', + columnContainerSelector: '.list-controls__columns', + columnLabel: 'Number', + targetState: 'off', + expectURLChange: false, + }) // select the "User" collection again await collectionSelector.click() + await page .locator('[id^=list-drawer_1_] .list-header__select-collection.react-select .rs__option', { hasText: exactText('User'), @@ -1139,7 +1240,9 @@ describe('List View', () => { test('should sort with existing filters', async () => { await page.goto(postsUrl.list) - await toggleColumn(page, { columnLabel: 'ID', targetState: 'off' }) + + await toggleColumn(page, { columnLabel: 'ID', targetState: 'off', columnName: 'id' }) + await page.locator('#heading-id').waitFor({ state: 'detached' }) await page.locator('#heading-title button.sort-column__asc').click() await page.waitForURL(/sort=title/) @@ -1157,13 +1260,10 @@ describe('List View', () => { }) test('should sort without resetting column preferences', async () => { - await payload.delete({ - collection: 'payload-preferences', - where: { - key: { - equals: `${postsCollectionSlug}.list`, - }, - }, + await deletePreferences({ + key: `${postsCollectionSlug}.list`, + payload, + user, }) await page.goto(postsUrl.list) @@ -1173,7 +1273,8 @@ describe('List View', () => { await page.waitForURL(/sort=title/) // enable a column that is _not_ part of this collection's default columns - await toggleColumn(page, { columnLabel: 'Status', targetState: 'on' }) + await toggleColumn(page, { columnLabel: 'Status', targetState: 'on', columnName: '_status' }) + await page.locator('#heading-_status').waitFor({ state: 'visible' }) const columnAfterSort = page.locator( diff --git a/test/fields-relationship/e2e.spec.ts b/test/fields-relationship/e2e.spec.ts index b68204071a..14e97b8b1a 100644 --- a/test/fields-relationship/e2e.spec.ts +++ b/test/fields-relationship/e2e.spec.ts @@ -3,6 +3,7 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' import { addListFilter } from 'helpers/e2e/addListFilter.js' import { openDocControls } from 'helpers/e2e/openDocControls.js' +import { openCreateDocDrawer, openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -19,13 +20,7 @@ import type { VersionedRelationshipField, } from './payload-types.js' -import { - ensureCompilationIsDone, - initPageConsoleErrorCatch, - openCreateDocDrawer, - openDocDrawer, - saveDocAndAssert, -} from '../helpers.js' +import { ensureCompilationIsDone, initPageConsoleErrorCatch, saveDocAndAssert } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' import { trackNetworkRequests } from '../helpers/e2e/trackNetworkRequests.js' import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' @@ -495,10 +490,11 @@ describe('Relationship Field', () => { const editURL = url.edit(docWithExistingRelations.id) await page.goto(editURL) - await openDocDrawer( + await openDocDrawer({ page, - '#field-relationshipReadOnly button.relationship--single-value__drawer-toggler.doc-drawer__toggler', - ) + selector: + '#field-relationshipReadOnly button.relationship--single-value__drawer-toggler.doc-drawer__toggler', + }) const documentDrawer = page.locator('[id^=doc-drawer_relation-one_1_]') await expect(documentDrawer).toBeVisible() @@ -506,7 +502,7 @@ describe('Relationship Field', () => { test('should open document drawer and append newly created docs onto the parent field', async () => { await page.goto(url.edit(docWithExistingRelations.id)) - await openCreateDocDrawer(page, '#field-relationshipHasMany') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationshipHasMany' }) const documentDrawer = page.locator('[id^=doc-drawer_relation-one_1_]') await expect(documentDrawer).toBeVisible() const drawerField = documentDrawer.locator('#field-name') @@ -532,10 +528,10 @@ describe('Relationship Field', () => { const saveButton = page.locator('#action-save') await expect(saveButton).toBeDisabled() - await openDocDrawer( + await openDocDrawer({ page, - '#field-relationship button.relationship--single-value__drawer-toggler ', - ) + selector: '#field-relationship button.relationship--single-value__drawer-toggler', + }) const field = page.locator('#field-name') await field.fill('Updated') diff --git a/test/fields/collections/Relationship/e2e.spec.ts b/test/fields/collections/Relationship/e2e.spec.ts index 34bbfadfa6..cf55f3444e 100644 --- a/test/fields/collections/Relationship/e2e.spec.ts +++ b/test/fields/collections/Relationship/e2e.spec.ts @@ -4,7 +4,7 @@ import { expect, test } from '@playwright/test' import { addListFilter } from 'helpers/e2e/addListFilter.js' import { navigateToDoc } from 'helpers/e2e/navigateToDoc.js' import { openDocControls } from 'helpers/e2e/openDocControls.js' -import { openListFilters } from 'helpers/e2e/openListFilters.js' +import { openCreateDocDrawer, openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -16,8 +16,6 @@ import { ensureCompilationIsDone, exactText, initPageConsoleErrorCatch, - openCreateDocDrawer, - openDocDrawer, saveDocAndAssert, saveDocHotkeyAndAssert, } from '../../../helpers.js' @@ -78,7 +76,7 @@ describe('relationship', () => { test('should create inline relationship within field with many relations', async () => { await page.goto(url.create) - await openCreateDocDrawer(page, '#field-relationship') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationship' }) await page .locator('#field-relationship .relationship-add-new__relation-button--text-fields') .click() @@ -100,7 +98,7 @@ describe('relationship', () => { await page.goto(url.create) // Open first modal - await openCreateDocDrawer(page, '#field-relationToSelf') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationToSelf' }) // Fill first modal's required relationship field await page.locator('[id^=doc-drawer_relationship-fields_1_] #field-relationship').click() @@ -298,7 +296,7 @@ describe('relationship', () => { await page.goto(url.create) // First fill out the relationship field, as it's required - await openCreateDocDrawer(page, '#field-relationship') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationship' }) await page .locator('#field-relationship .relationship-add-new__relation-button--text-fields') .click() @@ -313,7 +311,7 @@ describe('relationship', () => { // Create a new doc for the `relationshipHasMany` field await expect.poll(() => page.url(), { timeout: POLL_TOPASS_TIMEOUT }).not.toContain('create') - await openCreateDocDrawer(page, '#field-relationshipHasMany') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationshipHasMany' }) const value = 'Hello, world!' await page.locator('.drawer__content #field-text').fill(value) @@ -326,10 +324,10 @@ describe('relationship', () => { // Mimic real user behavior by typing into the field with spaces and backspaces // Explicitly use both `down` and `type` to cover edge cases - await openDocDrawer( + await openDocDrawer({ page, - '#field-relationshipHasMany button.relationship--multi-value-label__drawer-toggler', - ) + selector: '#field-relationshipHasMany button.relationship--multi-value-label__drawer-toggler', + }) await page.locator('[id^=doc-drawer_text-fields_1_] #field-text').click() await page.keyboard.down('1') @@ -365,7 +363,7 @@ describe('relationship', () => { test('should save using hotkey in document drawer', async () => { await page.goto(url.create) // First fill out the relationship field, as it's required - await openCreateDocDrawer(page, '#field-relationship') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationship' }) await page.locator('#field-relationship .value-container').click() await wait(500) // Select "Seeded text document" relationship @@ -413,7 +411,10 @@ describe('relationship', () => { .locator('#field-relationship .relationship--single-value') .textContent() - await openDocDrawer(page, '#field-relationship .relationship--single-value__drawer-toggler') + await openDocDrawer({ + page, + selector: '#field-relationship .relationship--single-value__drawer-toggler', + }) const drawer1Content = page.locator('[id^=doc-drawer_text-fields_1_] .drawer__content') const originalDrawerID = await drawer1Content.locator('.id-label').textContent() await openDocControls(drawer1Content) @@ -469,7 +470,10 @@ describe('relationship', () => { }), ).toBeVisible() - await openDocDrawer(page, '#field-relationship .relationship--single-value__drawer-toggler') + await openDocDrawer({ + page, + selector: '#field-relationship .relationship--single-value__drawer-toggler', + }) const drawer1Content = page.locator('[id^=doc-drawer_text-fields_1_] .drawer__content') const originalID = await drawer1Content.locator('.id-label').textContent() const originalText = 'Text' @@ -527,10 +531,10 @@ describe('relationship', () => { }), ).toBeVisible() - await openDocDrawer( + await openDocDrawer({ page, - '#field-relationship button.relationship--single-value__drawer-toggler', - ) + selector: '#field-relationship button.relationship--single-value__drawer-toggler', + }) const drawer1Content = page.locator('[id^=doc-drawer_text-fields_1_] .drawer__content') const originalID = await drawer1Content.locator('.id-label').textContent() @@ -573,7 +577,7 @@ describe('relationship', () => { test.skip('should bypass min rows validation when no rows present and field is not required', async () => { await page.goto(url.create) // First fill out the relationship field, as it's required - await openCreateDocDrawer(page, '#field-relationship') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationship' }) await page.locator('#field-relationship .value-container').click() await page.getByText('Seeded text document', { exact: true }).click() @@ -585,7 +589,7 @@ describe('relationship', () => { await page.goto(url.create) // First fill out the relationship field, as it's required - await openCreateDocDrawer(page, '#field-relationship') + await openCreateDocDrawer({ page, fieldSelector: '#field-relationship' }) await page.locator('#field-relationship .value-container').click() await page.getByText('Seeded text document', { exact: true }).click() diff --git a/test/fields/collections/Text/e2e.spec.ts b/test/fields/collections/Text/e2e.spec.ts index ea23a70c14..935c80cd6d 100644 --- a/test/fields/collections/Text/e2e.spec.ts +++ b/test/fields/collections/Text/e2e.spec.ts @@ -3,8 +3,8 @@ import type { GeneratedTypes } from 'helpers/sdk/types.js' import { expect, test } from '@playwright/test' import { openListColumns } from 'helpers/e2e/openListColumns.js' +import { upsertPreferences } from 'helpers/e2e/preferences.js' import { toggleColumn } from 'helpers/e2e/toggleColumn.js' -import { upsertPrefs } from 'helpers/e2e/upsertPrefs.js' import path from 'path' import { fileURLToPath } from 'url' @@ -165,7 +165,7 @@ describe('Text', () => { }) test('should respect admin.disableListColumn despite preferences', async () => { - await upsertPrefs>({ + await upsertPreferences>({ payload, user: client.user, key: 'text-fields-list', @@ -198,6 +198,7 @@ describe('Text', () => { await toggleColumn(page, { targetState: 'on', columnLabel: 'Text en', + columnName: 'localizedText', }) const textCell = page.locator('.row-1 .cell-i18nText') diff --git a/test/fields/collections/Upload/e2e.spec.ts b/test/fields/collections/Upload/e2e.spec.ts index 47383f57ca..62e3e0bb5d 100644 --- a/test/fields/collections/Upload/e2e.spec.ts +++ b/test/fields/collections/Upload/e2e.spec.ts @@ -1,6 +1,7 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' +import { openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -11,7 +12,6 @@ import type { Config } from '../../payload-types.js' import { ensureCompilationIsDone, initPageConsoleErrorCatch, - openDocDrawer, saveDocAndAssert, } from '../../../helpers.js' import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' @@ -155,14 +155,16 @@ describe('Upload', () => { await wait(1000) // Open the media drawer and create a png upload - await openDocDrawer(page, '#field-media .upload__createNewToggler') + await openDocDrawer({ page, selector: '#field-media .upload__createNewToggler' }) await page .locator('[id^=doc-drawer_uploads_1_] .file-field__upload input[type="file"]') .setInputFiles(path.resolve(dirname, './uploads/payload.png')) + await expect( page.locator('[id^=doc-drawer_uploads_1_] .file-field__upload .file-field__filename'), ).toHaveValue('payload.png') + await page.locator('[id^=doc-drawer_uploads_1_] #action-save').click() await expect(page.locator('.payload-toast-container')).toContainText('successfully') @@ -170,9 +172,11 @@ describe('Upload', () => { await expect( page.locator('.field-type.upload .upload-relationship-details__filename a'), ).toHaveAttribute('href', '/api/uploads/file/payload-1.png') + await expect( page.locator('.field-type.upload .upload-relationship-details__filename a'), ).toContainText('payload-1.png') + await expect( page.locator('.field-type.upload .upload-relationship-details img'), ).toHaveAttribute('src', '/api/uploads/file/payload-1.png') @@ -184,7 +188,7 @@ describe('Upload', () => { await wait(1000) // Open the media drawer and create a png upload - await openDocDrawer(page, '#field-media .upload__createNewToggler') + await openDocDrawer({ page, selector: '#field-media .upload__createNewToggler' }) await page .locator('[id^=doc-drawer_uploads_1_] .file-field__upload input[type="file"]') @@ -222,7 +226,7 @@ describe('Upload', () => { await uploadImage() await wait(1000) // TODO: Fix this. Need to wait a bit until the form in the drawer mounted, otherwise values sometimes disappear. This is an issue for all drawers - await openDocDrawer(page, '#field-media .upload__createNewToggler') + await openDocDrawer({ page, selector: '#field-media .upload__createNewToggler' }) await wait(1000) @@ -240,7 +244,7 @@ describe('Upload', () => { test('should select using the list drawer and restrict mimetype based on filterOptions', async () => { await uploadImage() - await openDocDrawer(page, '.field-type.upload .upload__listToggler') + await openDocDrawer({ page, selector: '.field-type.upload .upload__listToggler' }) const jpgImages = page.locator('[id^=list-drawer_1_] .upload-gallery img[src$=".jpg"]') await expect @@ -262,7 +266,7 @@ describe('Upload', () => { await wait(200) // open drawer - await openDocDrawer(page, '.field-type.upload .list-drawer__toggler') + await openDocDrawer({ page, selector: '.field-type.upload .list-drawer__toggler' }) // check title await expect(page.locator('.list-drawer__header-text')).toContainText('Uploads 3') }) diff --git a/test/helpers/e2e/upsertPrefs.ts b/test/helpers/e2e/preferences.ts similarity index 72% rename from test/helpers/e2e/upsertPrefs.ts rename to test/helpers/e2e/preferences.ts index dc6254ace4..bd17d3a459 100644 --- a/test/helpers/e2e/upsertPrefs.ts +++ b/test/helpers/e2e/preferences.ts @@ -1,8 +1,8 @@ import type { PayloadTestSDK } from 'helpers/sdk/index.js' import type { GeneratedTypes } from 'helpers/sdk/types.js' -import type { TypedUser } from 'payload' +import type { TypedUser, User } from 'payload' -export const upsertPrefs = async < +export const upsertPreferences = async < TConfig extends GeneratedTypes, TGeneratedTypes extends GeneratedTypes, >({ @@ -71,3 +71,28 @@ export const upsertPrefs = async < console.error('Error upserting prefs', e) } } + +export const deletePreferences = async >({ + payload, + user, + key, +}: { + key: string + payload: PayloadTestSDK + user: User +}): Promise => { + try { + await payload.delete({ + collection: 'payload-preferences', + where: { + and: [ + { key: { equals: key } }, + { 'user.value': { equals: user.id } }, + { 'user.relationTo': { equals: user.collection } }, + ], + }, + }) + } catch (e) { + console.error('Error deleting prefs', e) + } +} diff --git a/test/helpers/e2e/toggleColumn.ts b/test/helpers/e2e/toggleColumn.ts index 74e44956a5..442ddea1d9 100644 --- a/test/helpers/e2e/toggleColumn.ts +++ b/test/helpers/e2e/toggleColumn.ts @@ -12,9 +12,13 @@ export const toggleColumn = async ( columnContainerSelector, columnLabel, targetState: targetStateFromArgs, + columnName, + expectURLChange = true, }: { columnContainerSelector?: string columnLabel: string + columnName?: string + expectURLChange?: boolean targetState?: 'off' | 'on' togglerSelector?: string }, @@ -34,10 +38,10 @@ export const toggleColumn = async ( await expect(column).toBeVisible() - if ( - (isActiveBeforeClick && targetState === 'off') || - (!isActiveBeforeClick && targetState === 'on') - ) { + const requiresToggle = + (isActiveBeforeClick && targetState === 'off') || (!isActiveBeforeClick && targetState === 'on') + + if (requiresToggle) { await column.click() } @@ -49,5 +53,30 @@ export const toggleColumn = async ( await expect(column).toHaveClass(/column-selector__column--active/) } + if (expectURLChange && columnName && requiresToggle) { + await waitForColumnInURL({ page, columnName, state: targetState }) + } + return column } + +export const waitForColumnInURL = async ({ + page, + columnName, + state, +}: { + columnName: string + page: Page + state: 'off' | 'on' +}): Promise => { + await page.waitForURL(/.*\?.*/) + + const identifier = `${state === 'off' ? '-' : ''}${columnName}` + + // Test that the identifier is in the URL + // It must appear in the `columns` query parameter, i.e. after `columns=...` and before the next `&` + // It must also appear in it entirety to prevent partially matching other values, i.e. between quotation marks + const regex = new RegExp(`columns=([^&]*${encodeURIComponent(`"${identifier}"`)}[^&]*)`) + + await page.waitForURL(regex) +} diff --git a/test/helpers/e2e/toggleDocDrawer.ts b/test/helpers/e2e/toggleDocDrawer.ts new file mode 100644 index 0000000000..2da64d041e --- /dev/null +++ b/test/helpers/e2e/toggleDocDrawer.ts @@ -0,0 +1,32 @@ +import type { Page } from '@playwright/test' + +import { expect } from '@playwright/test' +import { wait } from 'payload/shared' + +export async function openDocDrawer({ + page, + selector, +}: { + page: Page + selector: string +}): Promise { + await wait(500) // wait for parent form state to initialize + await page.locator(selector).click() + await wait(500) // wait for drawer form state to initialize +} + +export async function openCreateDocDrawer({ + page, + fieldSelector, +}: { + fieldSelector: string + page: Page +}): Promise { + await wait(500) // wait for parent form state to initialize + const relationshipField = page.locator(fieldSelector) + await expect(relationshipField.locator('input')).toBeEnabled() + const addNewButton = relationshipField.locator('.relationship-add-new__add-button') + await expect(addNewButton).toBeVisible() + await addNewButton.click() + await wait(500) // wait for drawer form state to initialize +} diff --git a/test/helpers/e2e/toggleListDrawer.ts b/test/helpers/e2e/toggleListDrawer.ts new file mode 100644 index 0000000000..5be807f098 --- /dev/null +++ b/test/helpers/e2e/toggleListDrawer.ts @@ -0,0 +1,14 @@ +import type { Page } from '@playwright/test' + +import { expect } from '@playwright/test' + +export const closeListDrawer = async ({ + page, + drawerSelector = '[id^=list-drawer_1_]', +}: { + drawerSelector?: string + page: Page +}): Promise => { + await page.locator('[id^=list-drawer_1_] .list-drawer__header-close').click() + await expect(page.locator(drawerSelector)).not.toBeVisible() +} diff --git a/test/localization/e2e.spec.ts b/test/localization/e2e.spec.ts index 69be0abd5e..04ecc3c2a1 100644 --- a/test/localization/e2e.spec.ts +++ b/test/localization/e2e.spec.ts @@ -4,7 +4,8 @@ import type { GeneratedTypes } from 'helpers/sdk/types.js' import { expect, test } from '@playwright/test' import { navigateToDoc } from 'helpers/e2e/navigateToDoc.js' import { openDocControls } from 'helpers/e2e/openDocControls.js' -import { upsertPrefs } from 'helpers/e2e/upsertPrefs.js' +import { upsertPreferences } from 'helpers/e2e/preferences.js' +import { openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' import { RESTClient } from 'helpers/rest.js' import path from 'path' import { fileURLToPath } from 'url' @@ -17,7 +18,6 @@ import { closeLocaleSelector, ensureCompilationIsDone, initPageConsoleErrorCatch, - openDocDrawer, openLocaleSelector, saveDocAndAssert, throttleTest, @@ -318,7 +318,7 @@ describe('Localization', () => { }) test('should not render default locale in locale selector when prefs are not default', async () => { - await upsertPrefs>({ + await upsertPreferences>({ payload, user: client.user, key: 'locale', @@ -349,7 +349,7 @@ describe('Localization', () => { const drawerToggler = '#field-relationMultiRelationTo .relationship--single-value__drawer-toggler' await expect(page.locator(drawerToggler)).toBeEnabled() - await openDocDrawer(page, drawerToggler) + await openDocDrawer({ page, selector: drawerToggler }) await expect(page.locator('.doc-drawer__header-text')).toContainText('spanish-relation2') await page.locator('.doc-drawer__header-close').click() }) diff --git a/test/localization/payload-types.ts b/test/localization/payload-types.ts index cfc3e07d4c..9abedba4f3 100644 --- a/test/localization/payload-types.ts +++ b/test/localization/payload-types.ts @@ -64,6 +64,7 @@ export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { richText: RichText; 'blocks-fields': BlocksField; diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 28b1f747f2..c8b7c4d1cd 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -1,6 +1,7 @@ import type { Page } from '@playwright/test' import { expect, test } from '@playwright/test' +import { openDocDrawer } from 'helpers/e2e/toggleDocDrawer.js' import path from 'path' import { wait } from 'payload/shared' import { fileURLToPath } from 'url' @@ -12,7 +13,6 @@ import { ensureCompilationIsDone, exactText, initPageConsoleErrorCatch, - openDocDrawer, saveDocAndAssert, } from '../helpers.js' import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' @@ -381,7 +381,7 @@ describe('Uploads', () => { await page.locator('#field-versionedImage .icon--x').click() // choose from existing - await openDocDrawer(page, '#field-versionedImage .upload__listToggler') + await openDocDrawer({ page, selector: '#field-versionedImage .upload__listToggler' }) await expect(page.locator('.row-3 .cell-title')).toContainText('draft') }) @@ -402,12 +402,15 @@ describe('Uploads', () => { await wait(500) // flake workaround await page.locator('#field-audio .upload-relationship-details__remove').click() - await openDocDrawer(page, '#field-audio .upload__listToggler') + await openDocDrawer({ page, selector: '#field-audio .upload__listToggler' }) const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() - await openDocDrawer(page, 'button.list-drawer__create-new-button.doc-drawer__toggler') + await openDocDrawer({ + page, + selector: 'button.list-drawer__create-new-button.doc-drawer__toggler', + }) await expect(page.locator('[id^=doc-drawer_media_1_]')).toBeVisible() // upload an image and try to select it @@ -444,7 +447,7 @@ describe('Uploads', () => { await wait(500) // flake workaround await page.locator('#field-audio .upload-relationship-details__remove').click() - await openDocDrawer(page, '.upload__listToggler') + await openDocDrawer({ page, selector: '.upload__listToggler' }) const listDrawer = page.locator('[id^=list-drawer_1_]') await expect(listDrawer).toBeVisible() diff --git a/test/versions/e2e.spec.ts b/test/versions/e2e.spec.ts index 0348e303d1..8d70fc5028 100644 --- a/test/versions/e2e.spec.ts +++ b/test/versions/e2e.spec.ts @@ -861,7 +861,7 @@ describe('Versions', () => { const publishOptions = page.locator('.doc-controls__controls .popup') await publishOptions.click() - const publishSpecificLocale = page.locator('.popup-button-list button').first() + const publishSpecificLocale = page.locator('#publish-locale') await expect(publishSpecificLocale).toContainText('English') await publishSpecificLocale.click() diff --git a/tsconfig.base.json b/tsconfig.base.json index a12b54a3a6..28020e04ad 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/access-control/config.ts"], + "@payload-config": ["./test/admin/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], From 41c7413f59aaeda437c0a812a6e5a0d470238f22 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 27 Feb 2025 20:30:17 -0700 Subject: [PATCH 029/127] feat(db-*): add updateMany method to database adapter (#11441) This PR adds a new `payload.db.updateMany` method, which is a more performant way to update multiple documents compared to using `payload.update`. --- packages/db-mongodb/src/index.ts | 4 + packages/db-mongodb/src/updateMany.ts | 61 +++++++++++++++ packages/db-postgres/src/index.ts | 2 + packages/db-sqlite/src/index.ts | 2 + packages/db-vercel-postgres/src/index.ts | 2 + packages/drizzle/src/index.ts | 1 + packages/drizzle/src/updateMany.ts | 97 ++++++++++++++++++++++++ packages/payload/src/database/types.ts | 25 ++++++ packages/payload/src/index.ts | 3 + test/database/config.ts | 46 ++++++----- test/database/int.spec.ts | 84 ++++++++++++++++++++ test/database/seed.ts | 26 +++++++ test/database/shared.ts | 35 +++++++++ 13 files changed, 370 insertions(+), 18 deletions(-) create mode 100644 packages/db-mongodb/src/updateMany.ts create mode 100644 packages/drizzle/src/updateMany.ts create mode 100644 test/database/seed.ts diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 911677c143..0e9a4e2786 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -16,6 +16,7 @@ import type { TypeWithVersion, UpdateGlobalArgs, UpdateGlobalVersionArgs, + UpdateManyArgs, UpdateOneArgs, UpdateVersionArgs, } from 'payload' @@ -53,6 +54,7 @@ import { commitTransaction } from './transactions/commitTransaction.js' import { rollbackTransaction } from './transactions/rollbackTransaction.js' import { updateGlobal } from './updateGlobal.js' import { updateGlobalVersion } from './updateGlobalVersion.js' +import { updateMany } from './updateMany.js' import { updateOne } from './updateOne.js' import { updateVersion } from './updateVersion.js' import { upsert } from './upsert.js' @@ -160,6 +162,7 @@ declare module 'payload' { updateGlobalVersion: ( args: { options?: QueryOptions } & UpdateGlobalVersionArgs, ) => Promise> + updateOne: (args: { options?: QueryOptions } & UpdateOneArgs) => Promise updateVersion: ( args: { options?: QueryOptions } & UpdateVersionArgs, @@ -200,6 +203,7 @@ export function mongooseAdapter({ mongoMemoryServer, sessions: {}, transactionOptions: transactionOptions === false ? undefined : transactionOptions, + updateMany, url, versions: {}, // DatabaseAdapter diff --git a/packages/db-mongodb/src/updateMany.ts b/packages/db-mongodb/src/updateMany.ts new file mode 100644 index 0000000000..47bafc86ec --- /dev/null +++ b/packages/db-mongodb/src/updateMany.ts @@ -0,0 +1,61 @@ +import type { MongooseUpdateQueryOptions } from 'mongoose' +import type { UpdateMany } from 'payload' + +import type { MongooseAdapter } from './index.js' + +import { buildQuery } from './queries/buildQuery.js' +import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getSession } from './utilities/getSession.js' +import { handleError } from './utilities/handleError.js' +import { transform } from './utilities/transform.js' + +export const updateMany: UpdateMany = async function updateMany( + this: MongooseAdapter, + { collection, data, locale, options: optionsArgs = {}, req, returning, select, where }, +) { + const Model = this.collections[collection] + const fields = this.payload.collections[collection].config.fields + + const options: MongooseUpdateQueryOptions = { + ...optionsArgs, + lean: true, + new: true, + projection: buildProjectionFromSelect({ + adapter: this, + fields: this.payload.collections[collection].config.flattenedFields, + select, + }), + session: await getSession(this, req), + } + + const query = await buildQuery({ + adapter: this, + collectionSlug: collection, + fields: this.payload.collections[collection].config.flattenedFields, + locale, + where, + }) + + transform({ adapter: this, data, fields, operation: 'write' }) + + try { + await Model.updateMany(query, data, options) + } catch (error) { + handleError({ collection, error, req }) + } + + if (returning === false) { + return null + } + + const result = await Model.find(query, {}, options) + + transform({ + adapter: this, + data: result, + fields, + operation: 'read', + }) + + return result +} diff --git a/packages/db-postgres/src/index.ts b/packages/db-postgres/src/index.ts index d08366be54..484a327f61 100644 --- a/packages/db-postgres/src/index.ts +++ b/packages/db-postgres/src/index.ts @@ -33,6 +33,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -185,6 +186,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, upsert: updateOne, diff --git a/packages/db-sqlite/src/index.ts b/packages/db-sqlite/src/index.ts index 2bd3e0a674..0bedf75450 100644 --- a/packages/db-sqlite/src/index.ts +++ b/packages/db-sqlite/src/index.ts @@ -34,6 +34,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -120,6 +121,7 @@ export function sqliteAdapter(args: Args): DatabaseAdapterObj { tableNameMap: new Map(), tables: {}, transactionOptions: args.transactionOptions || undefined, + updateMany, versionsSuffix: args.versionsSuffix || '_v', // DatabaseAdapter diff --git a/packages/db-vercel-postgres/src/index.ts b/packages/db-vercel-postgres/src/index.ts index ca8594c993..703db3ce7f 100644 --- a/packages/db-vercel-postgres/src/index.ts +++ b/packages/db-vercel-postgres/src/index.ts @@ -33,6 +33,7 @@ import { rollbackTransaction, updateGlobal, updateGlobalVersion, + updateMany, updateOne, updateVersion, } from '@payloadcms/drizzle' @@ -186,6 +187,7 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj doc.id) + + // If id wasn't passed but `where` without any joins, retrieve it with findFirst + } else if (whereToUse && !joins.length) { + const _db = db as LibSQLDatabase + + const table = this.tables[tableName] + + const docsToUpdate = await _db + .select({ + id: table.id, + }) + .from(table) + .where(where) + + idsToUpdate = docsToUpdate?.map((doc) => doc.id) + } + + if (!idsToUpdate.length) { + return [] + } + + const results = [] + + // TODO: We need to batch this to reduce the amount of db calls. This can get very slow if we are updating a lot of rows. + for (const idToUpdate of idsToUpdate) { + const result = await upsertRow({ + id: idToUpdate, + adapter: this, + data, + db, + fields: collection.flattenedFields, + ignoreResult: returning === false, + joinQuery, + operation: 'update', + req, + select, + tableName, + }) + results.push(result) + } + + if (returning === false) { + return null + } + + return results +} diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 2cc4db957a..78dbf248b2 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -145,6 +145,8 @@ export interface BaseDatabaseAdapter { updateGlobalVersion: UpdateGlobalVersion + updateMany: UpdateMany + updateOne: UpdateOne updateVersion: UpdateVersion @@ -510,6 +512,29 @@ export type UpdateOneArgs = { */ export type UpdateOne = (args: UpdateOneArgs) => Promise +export type UpdateManyArgs = { + collection: CollectionSlug + data: Record + draft?: boolean + joins?: JoinQuery + locale?: string + /** + * Additional database adapter specific options to pass to the query + */ + options?: Record + req?: Partial + /** + * If true, returns the updated documents + * + * @default true + */ + returning?: boolean + select?: SelectType + where: Where +} + +export type UpdateMany = (args: UpdateManyArgs) => Promise + export type UpsertArgs = { collection: CollectionSlug data: Record diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index 978181ff1a..a657cddaae 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1112,6 +1112,7 @@ export type { Connect, Count, CountArgs, + CountGlobalVersionArgs, CountGlobalVersions, CountVersions, Create, @@ -1156,6 +1157,8 @@ export type { UpdateGlobalArgs, UpdateGlobalVersion, UpdateGlobalVersionArgs, + UpdateMany, + UpdateManyArgs, UpdateOne, UpdateOneArgs, UpdateVersion, diff --git a/test/database/config.ts b/test/database/config.ts index 8342cfcf1f..14a086186c 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -8,7 +8,21 @@ import { v4 as uuid } from 'uuid' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' -import { errorOnUnnamedFieldsSlug, postsSlug } from './shared.js' +import { seed } from './seed.js' +import { + customIDsSlug, + customSchemaSlug, + defaultValuesSlug, + errorOnUnnamedFieldsSlug, + fakeCustomIDsSlug, + fieldsPersistanceSlug, + pgMigrationSlug, + placesSlug, + postsSlug, + relationASlug, + relationBSlug, + relationshipsMigrationSlug, +} from './shared.js' const defaultValueField: TextField = { name: 'defaultValue', @@ -183,7 +197,7 @@ export default buildConfigWithDefaults({ ], }, { - slug: 'default-values', + slug: defaultValuesSlug, fields: [ { name: 'title', @@ -222,7 +236,7 @@ export default buildConfigWithDefaults({ ], }, { - slug: 'relation-a', + slug: relationASlug, fields: [ { name: 'title', @@ -239,7 +253,7 @@ export default buildConfigWithDefaults({ }, }, { - slug: 'relation-b', + slug: relationBSlug, fields: [ { name: 'title', @@ -261,7 +275,7 @@ export default buildConfigWithDefaults({ }, }, { - slug: 'pg-migrations', + slug: pgMigrationSlug, fields: [ { name: 'relation1', @@ -329,7 +343,7 @@ export default buildConfigWithDefaults({ versions: true, }, { - slug: 'custom-schema', + slug: customSchemaSlug, dbName: 'customs', fields: [ { @@ -404,7 +418,7 @@ export default buildConfigWithDefaults({ }, }, { - slug: 'places', + slug: placesSlug, fields: [ { name: 'country', @@ -417,7 +431,7 @@ export default buildConfigWithDefaults({ ], }, { - slug: 'fields-persistance', + slug: fieldsPersistanceSlug, fields: [ { name: 'text', @@ -475,7 +489,7 @@ export default buildConfigWithDefaults({ ], }, { - slug: 'custom-ids', + slug: customIDsSlug, fields: [ { name: 'id', @@ -502,7 +516,7 @@ export default buildConfigWithDefaults({ versions: { drafts: true }, }, { - slug: 'fake-custom-ids', + slug: fakeCustomIDsSlug, fields: [ { name: 'title', @@ -535,7 +549,7 @@ export default buildConfigWithDefaults({ ], }, { - slug: 'relationships-migration', + slug: relationshipsMigrationSlug, fields: [ { type: 'relationship', @@ -587,13 +601,9 @@ export default buildConfigWithDefaults({ locales: ['en', 'es'], }, onInit: async (payload) => { - await payload.create({ - collection: 'users', - data: { - email: devUser.email, - password: devUser.password, - }, - }) + if (process.env.SEED_IN_CONFIG_ONINIT !== 'false') { + await seed(payload) + } }, typescript: { outputFile: path.resolve(dirname, 'payload-types.ts'), diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index bf19875381..02143b0967 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -28,6 +28,7 @@ import { devUser } from '../credentials.js' import { initPayloadInt } from '../helpers/initPayloadInt.js' import { isMongoose } from '../helpers/isMongoose.js' import removeFiles from '../helpers/removeFiles.js' +import { seed } from './seed.js' import { errorOnUnnamedFieldsSlug, postsSlug } from './shared.js' const filename = fileURLToPath(import.meta.url) @@ -43,9 +44,17 @@ process.env.PAYLOAD_CONFIG_PATH = path.join(dirname, 'config.ts') describe('database', () => { beforeAll(async () => { + process.env.SEED_IN_CONFIG_ONINIT = 'false' // Makes it so the payload config onInit seed is not run. Otherwise, the seed would be run unnecessarily twice for the initial test run - once for beforeEach and once for onInit ;({ payload, restClient } = await initPayloadInt(dirname)) payload.db.migrationDir = path.join(dirname, './migrations') + await seed(payload) + + await restClient.login({ + slug: 'users', + credentials: devUser, + }) + const loginResult = await payload.login({ collection: 'users', data: { @@ -794,6 +803,7 @@ describe('database', () => { data: { title, }, + depth: 0, disableTransaction: true, }) }) @@ -876,6 +886,80 @@ describe('database', () => { expect(result.point).toEqual([5, 10]) }) + + it('ensure updateMany updates all docs and respects where query', async () => { + await payload.db.deleteMany({ + collection: postsSlug, + where: { + id: { + exists: true, + }, + }, + }) + + await payload.create({ + collection: postsSlug, + data: { + title: 'notupdated', + }, + }) + + // Create 5 posts + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: postsSlug, + data: { + title: `v1 ${i}`, + }, + }) + } + + const result = await payload.db.updateMany({ + collection: postsSlug, + data: { + title: 'updated', + }, + where: { + title: { + not_equals: 'notupdated', + }, + }, + }) + + expect(result?.length).toBe(5) + expect(result?.[0]?.title).toBe('updated') + expect(result?.[4]?.title).toBe('updated') + + // Ensure all posts minus the one we don't want updated are updated + const { docs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + equals: 'updated', + }, + }, + }) + + expect(docs).toHaveLength(5) + expect(docs?.[0]?.title).toBe('updated') + expect(docs?.[4]?.title).toBe('updated') + + const { docs: notUpdatedDocs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + not_equals: 'updated', + }, + }, + }) + + expect(notUpdatedDocs).toHaveLength(1) + expect(notUpdatedDocs?.[0]?.title).toBe('notupdated') + }) }) describe('Error Handler', () => { diff --git a/test/database/seed.ts b/test/database/seed.ts new file mode 100644 index 0000000000..921273e4bb --- /dev/null +++ b/test/database/seed.ts @@ -0,0 +1,26 @@ +import type { Payload } from 'payload' + +import path from 'path' +import { getFileByPath } from 'payload' +import { fileURLToPath } from 'url' + +import { devUser } from '../credentials.js' +import { seedDB } from '../helpers/seed.js' +import { collectionSlugs } from './shared.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +export const _seed = async (_payload: Payload) => { + await _payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) +} + +export async function seed(_payload: Payload) { + return await _seed(_payload) +} diff --git a/test/database/shared.ts b/test/database/shared.ts index 0c2fe99672..7600f66547 100644 --- a/test/database/shared.ts +++ b/test/database/shared.ts @@ -1,2 +1,37 @@ export const postsSlug = 'posts' export const errorOnUnnamedFieldsSlug = 'error-on-unnamed-fields' + +export const defaultValuesSlug = 'default-values' + +export const relationASlug = 'relation-a' + +export const relationBSlug = 'relation-b' + +export const pgMigrationSlug = 'pg-migrations' + +export const customSchemaSlug = 'custom-schema' + +export const placesSlug = 'places' + +export const fieldsPersistanceSlug = 'fields-persistance' + +export const customIDsSlug = 'custom-ids' + +export const fakeCustomIDsSlug = 'fake-custom-ids' + +export const relationshipsMigrationSlug = 'relationships-migration' + +export const collectionSlugs = [ + postsSlug, + errorOnUnnamedFieldsSlug, + defaultValuesSlug, + relationASlug, + relationBSlug, + pgMigrationSlug, + customSchemaSlug, + placesSlug, + fieldsPersistanceSlug, + customIDsSlug, + fakeCustomIDsSlug, + relationshipsMigrationSlug, +] From e055565ca8f7bc7bbc735685203dbb59fef8b82e Mon Sep 17 00:00:00 2001 From: Patrik Date: Fri, 28 Feb 2025 09:32:09 -0500 Subject: [PATCH 030/127] ci: repro guide to use `create-payload-app@latest` instead of `@beta` (#11451) This PR updates the reproduction guide to reference `create-payload-app@latest -t blank` instead of `@beta`, ensuring users follow the latest stable release when setting up a minimal reproduction. --- .github/comments/invalid-reproduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/comments/invalid-reproduction.md b/.github/comments/invalid-reproduction.md index 7c11c7106a..3612fde604 100644 --- a/.github/comments/invalid-reproduction.md +++ b/.github/comments/invalid-reproduction.md @@ -4,7 +4,7 @@ Depending on the quality of reproduction steps, this issue may be closed if no r ### Why was this issue marked with the `invalid-reproduction` label? -To be able to investigate, we need access to a reproduction to identify what triggered the issue. We prefer a link to a public GitHub repository created with `create-payload-app@beta -t blank` or a forked/branched version of this repository with tests added (more info in the [reproduction-guide](https://github.com/payloadcms/payload/blob/main/.github/reproduction-guide.md)). +To be able to investigate, we need access to a reproduction to identify what triggered the issue. We prefer a link to a public GitHub repository created with `create-payload-app@latest -t blank` or a forked/branched version of this repository with tests added (more info in the [reproduction-guide](https://github.com/payloadcms/payload/blob/main/.github/reproduction-guide.md)). To make sure the issue is resolved as quickly as possible, please make sure that the reproduction is as **minimal** as possible. This means that you should **remove unnecessary code, files, and dependencies** that do not contribute to the issue. Ensure your reproduction does not depend on secrets, 3rd party registries, private dependencies, or any other data that cannot be made public. Avoid a reproduction including a whole monorepo (unless relevant to the issue). The easier it is to reproduce the issue, the quicker we can help. From dfddee2125c8a5def02cc2c983764225c1ffa288 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:34:00 +0200 Subject: [PATCH 031/127] fix(storage-*): ensure client handler is always added to the import map, even if the plugin is disabled (#11438) Ensures that even if you pass `enabled: false` to the storage adapter options, e.g: ```ts s3Storage({ enabled: false, collections: { [mediaSlug]: true, }, bucket: process.env.S3_BUCKET, config: { credentials: { accessKeyId: process.env.S3_ACCESS_KEY_ID, secretAccessKey: process.env.S3_SECRET_ACCESS_KEY, }, }, }) ``` the client handler component is added to the import map. This prevents errors when you use the adapter only on production, but you don't regenerate the import map before running the build --- packages/storage-azure/src/index.ts | 12 +++-- packages/storage-gcs/src/index.ts | 62 ++++++++--------------- packages/storage-s3/src/index.ts | 12 +++-- packages/storage-uploadthing/src/index.ts | 24 +++++---- packages/storage-vercel-blob/src/index.ts | 23 +++++---- 5 files changed, 61 insertions(+), 72 deletions(-) diff --git a/packages/storage-azure/src/index.ts b/packages/storage-azure/src/index.ts index babc0810e2..dd965c450e 100644 --- a/packages/storage-azure/src/index.ts +++ b/packages/storage-azure/src/index.ts @@ -64,21 +64,19 @@ type AzureStoragePlugin = (azureStorageArgs: AzureStorageOptions) => Plugin export const azureStorage: AzureStoragePlugin = (azureStorageOptions: AzureStorageOptions) => (incomingConfig: Config): Config => { - if (azureStorageOptions.enabled === false) { - return incomingConfig - } - const getStorageClient = () => getStorageClientFunc({ connectionString: azureStorageOptions.connectionString, containerName: azureStorageOptions.containerName, }) + const isPluginDisabled = azureStorageOptions.enabled === false + initClientUploads({ clientHandler: '@payloadcms/storage-azure/client#AzureClientUploadHandler', collections: azureStorageOptions.collections, config: incomingConfig, - enabled: !!azureStorageOptions.clientUploads, + enabled: !isPluginDisabled && Boolean(azureStorageOptions.clientUploads), serverHandler: getGenerateSignedURLHandler({ access: typeof azureStorageOptions.clientUploads === 'object' @@ -91,6 +89,10 @@ export const azureStorage: AzureStoragePlugin = serverHandlerPath: '/storage-azure-generate-signed-url', }) + if (isPluginDisabled) { + return incomingConfig + } + const adapter = azureStorageInternal(getStorageClient, azureStorageOptions) // Add adapter to each collection option object diff --git a/packages/storage-gcs/src/index.ts b/packages/storage-gcs/src/index.ts index 2b06b2a373..aca5f9b5c1 100644 --- a/packages/storage-gcs/src/index.ts +++ b/packages/storage-gcs/src/index.ts @@ -10,6 +10,7 @@ import type { Config, Plugin, UploadCollectionSlug } from 'payload' import { Storage } from '@google-cloud/storage' import { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage' +import { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities' import { getGenerateSignedURLHandler } from './generateSignedURL.js' import { getGenerateURL } from './generateURL.js' @@ -52,10 +53,6 @@ type GcsStoragePlugin = (gcsStorageArgs: GcsStorageOptions) => Plugin export const gcsStorage: GcsStoragePlugin = (gcsStorageOptions: GcsStorageOptions) => (incomingConfig: Config): Config => { - if (gcsStorageOptions.enabled === false) { - return incomingConfig - } - let storageClient: null | Storage = null const getStorageClient = (): Storage => { @@ -69,46 +66,27 @@ export const gcsStorage: GcsStoragePlugin = const adapter = gcsStorageInternal(getStorageClient, gcsStorageOptions) - if (gcsStorageOptions.clientUploads) { - if (!incomingConfig.endpoints) { - incomingConfig.endpoints = [] - } + const isPluginDisabled = gcsStorageOptions.enabled === false - incomingConfig.endpoints.push({ - handler: getGenerateSignedURLHandler({ - access: - typeof gcsStorageOptions.clientUploads === 'object' - ? gcsStorageOptions.clientUploads.access - : undefined, - bucket: gcsStorageOptions.bucket, - collections: gcsStorageOptions.collections, - getStorageClient, - }), - method: 'post', - path: '/storage-gcs-generate-signed-url', - }) - } + initClientUploads({ + clientHandler: '@payloadcms/storage-gcs/client#GcsClientUploadHandler', + collections: gcsStorageOptions.collections, + config: incomingConfig, + enabled: !isPluginDisabled && Boolean(gcsStorageOptions.enabled), + serverHandler: getGenerateSignedURLHandler({ + access: + typeof gcsStorageOptions.clientUploads === 'object' + ? gcsStorageOptions.clientUploads.access + : undefined, + bucket: gcsStorageOptions.bucket, + collections: gcsStorageOptions.collections, + getStorageClient, + }), + serverHandlerPath: '/storage-gcs-generate-signed-url', + }) - if (!incomingConfig.admin) { - incomingConfig.admin = {} - } - - if (!incomingConfig.admin.components) { - incomingConfig.admin.components = {} - } - - if (!incomingConfig.admin.components.providers) { - incomingConfig.admin.components.providers = [] - } - - for (const collectionSlug in gcsStorageOptions.collections) { - incomingConfig.admin.components.providers.push({ - clientProps: { - collectionSlug, - enabled: !!gcsStorageOptions.clientUploads, - }, - path: '@payloadcms/storage-gcs/client#GcsClientUploadHandler', - }) + if (isPluginDisabled) { + return incomingConfig } // Add adapter to each collection option object diff --git a/packages/storage-s3/src/index.ts b/packages/storage-s3/src/index.ts index 2fba35cc2a..e5d9baa3e4 100644 --- a/packages/storage-s3/src/index.ts +++ b/packages/storage-s3/src/index.ts @@ -67,10 +67,6 @@ type S3StoragePlugin = (storageS3Args: S3StorageOptions) => Plugin export const s3Storage: S3StoragePlugin = (s3StorageOptions: S3StorageOptions) => (incomingConfig: Config): Config => { - if (s3StorageOptions.enabled === false) { - return incomingConfig - } - let storageClient: AWS.S3 | null = null const getStorageClient: () => AWS.S3 = () => { @@ -81,11 +77,13 @@ export const s3Storage: S3StoragePlugin = return storageClient } + const isPluginDisabled = s3StorageOptions.enabled === false + initClientUploads({ clientHandler: '@payloadcms/storage-s3/client#S3ClientUploadHandler', collections: s3StorageOptions.collections, config: incomingConfig, - enabled: !!s3StorageOptions.clientUploads, + enabled: !isPluginDisabled && Boolean(s3StorageOptions.clientUploads), serverHandler: getGenerateSignedURLHandler({ access: typeof s3StorageOptions.clientUploads === 'object' @@ -99,6 +97,10 @@ export const s3Storage: S3StoragePlugin = serverHandlerPath: '/storage-s3-generate-signed-url', }) + if (isPluginDisabled) { + return incomingConfig + } + const adapter = s3StorageInternal(getStorageClient, s3StorageOptions) // Add adapter to each collection option object diff --git a/packages/storage-uploadthing/src/index.ts b/packages/storage-uploadthing/src/index.ts index b7af504a3a..96c7186c91 100644 --- a/packages/storage-uploadthing/src/index.ts +++ b/packages/storage-uploadthing/src/index.ts @@ -56,22 +56,13 @@ export type ACL = 'private' | 'public-read' export const uploadthingStorage: UploadthingPlugin = (uploadthingStorageOptions: UploadthingStorageOptions) => (incomingConfig: Config): Config => { - if (uploadthingStorageOptions.enabled === false) { - return incomingConfig - } - - // Default ACL to public-read - if (!uploadthingStorageOptions.options.acl) { - uploadthingStorageOptions.options.acl = 'public-read' - } - - const adapter = uploadthingInternal(uploadthingStorageOptions) + const isPluginDisabled = uploadthingStorageOptions.enabled === false initClientUploads({ clientHandler: '@payloadcms/storage-uploadthing/client#UploadthingClientUploadHandler', collections: uploadthingStorageOptions.collections, config: incomingConfig, - enabled: !!uploadthingStorageOptions.clientUploads, + enabled: !isPluginDisabled && Boolean(uploadthingStorageOptions.clientUploads), serverHandler: getClientUploadRoute({ access: typeof uploadthingStorageOptions.clientUploads === 'object' @@ -83,6 +74,17 @@ export const uploadthingStorage: UploadthingPlugin = serverHandlerPath: '/storage-uploadthing-client-upload-route', }) + if (isPluginDisabled) { + return incomingConfig + } + + // Default ACL to public-read + if (!uploadthingStorageOptions.options.acl) { + uploadthingStorageOptions.options.acl = 'public-read' + } + + const adapter = uploadthingInternal(uploadthingStorageOptions) + // Add adapter to each collection option object const collectionsWithAdapter: CloudStoragePluginOptions['collections'] = Object.entries( uploadthingStorageOptions.collections, diff --git a/packages/storage-vercel-blob/src/index.ts b/packages/storage-vercel-blob/src/index.ts index 3097c6ebe0..dc8c4ebf7b 100644 --- a/packages/storage-vercel-blob/src/index.ts +++ b/packages/storage-vercel-blob/src/index.ts @@ -80,15 +80,15 @@ type VercelBlobStoragePlugin = (vercelBlobStorageOpts: VercelBlobStorageOptions) export const vercelBlobStorage: VercelBlobStoragePlugin = (options: VercelBlobStorageOptions) => (incomingConfig: Config): Config => { - // If the plugin is disabled or no token is provided, do not enable the plugin - if (options.enabled === false || !options.token) { - return incomingConfig - } - // Parse storeId from token - const storeId = options.token.match(/^vercel_blob_rw_([a-z\d]+)_[a-z\d]+$/i)?.[1]?.toLowerCase() + const storeId = options.token + ?.match(/^vercel_blob_rw_([a-z\d]+)_[a-z\d]+$/i)?.[1] + ?.toLowerCase() - if (!storeId) { + const isPluginDisabled = options.enabled === false || !options.token + + // Don't throw if the plugin is disabled + if (!storeId && !isPluginDisabled) { throw new Error( 'Invalid token format for Vercel Blob adapter. Should be vercel_blob_rw__.', ) @@ -108,7 +108,7 @@ export const vercelBlobStorage: VercelBlobStoragePlugin = clientHandler: '@payloadcms/storage-vercel-blob/client#VercelBlobClientUploadHandler', collections: options.collections, config: incomingConfig, - enabled: !!options.clientUploads, + enabled: !isPluginDisabled && Boolean(options.clientUploads), extraClientHandlerProps: (collection) => ({ addRandomSuffix: !!optionsWithDefaults.addRandomSuffix, baseURL: baseUrl, @@ -119,11 +119,16 @@ export const vercelBlobStorage: VercelBlobStoragePlugin = typeof options.clientUploads === 'object' ? options.clientUploads.access : undefined, addRandomSuffix: optionsWithDefaults.addRandomSuffix, cacheControlMaxAge: options.cacheControlMaxAge, - token: options.token, + token: options.token ?? '', }), serverHandlerPath: '/vercel-blob-client-upload-route', }) + // If the plugin is disabled or no token is provided, do not enable the plugin + if (isPluginDisabled) { + return incomingConfig + } + const adapter = vercelBlobStorageInternal({ ...optionsWithDefaults, baseUrl }) // Add adapter to each collection option object From d53f16647620ed127fb4ce5d7d529a6b4e9bd2a0 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 09:00:56 -0700 Subject: [PATCH 032/127] fix: ensure errors returned from tasks are properly logged (#11443) Fixes https://github.com/payloadcms/payload/issues/9767 We allow failing a job queue task by returning `{ state: 'failed' }` from the task, instead of throwing an error. However, previously, this threw an error when trying to update the task in the database. Additionally, it was not possible to customize the error message. This PR fixes that by letting you return `errorMessage` alongside `{ state: 'failed' }`, and by ensuring the error is transformed into proper json before saving it to the `error` column. --- .../src/queues/config/types/taskTypes.ts | 33 ++++++---- .../runJobs/runJob/getRunTaskFunction.ts | 64 +++++++++--------- test/queues/config.ts | 38 +++++++++++ test/queues/int.spec.ts | 65 +++++++++++++++++++ 4 files changed, 160 insertions(+), 40 deletions(-) diff --git a/packages/payload/src/queues/config/types/taskTypes.ts b/packages/payload/src/queues/config/types/taskTypes.ts index e225bc8bcb..0a698905a0 100644 --- a/packages/payload/src/queues/config/types/taskTypes.ts +++ b/packages/payload/src/queues/config/types/taskTypes.ts @@ -7,14 +7,19 @@ export type TaskInputOutput = { } export type TaskHandlerResult< TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] | TaskInputOutput, -> = { - output: TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] - ? TypedJobs['tasks'][TTaskSlugOrInputOutput]['output'] - : TTaskSlugOrInputOutput extends TaskInputOutput // Check if it's actually TaskInputOutput type - ? TTaskSlugOrInputOutput['output'] - : never - state?: 'failed' | 'succeeded' -} +> = + | { + errorMessage?: string + state: 'failed' + } + | { + output: TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] + ? TypedJobs['tasks'][TTaskSlugOrInputOutput]['output'] + : TTaskSlugOrInputOutput extends TaskInputOutput // Check if it's actually TaskInputOutput type + ? TTaskSlugOrInputOutput['output'] + : never + state?: 'succeeded' + } export type TaskHandlerArgs< TTaskSlugOrInputOutput extends keyof TypedJobs['tasks'] | TaskInputOutput, @@ -84,6 +89,8 @@ export type RunTaskFunctions = { [TTaskSlug in keyof TypedJobs['tasks']]: RunTaskFunction } +type MaybePromise = Promise | T + export type RunInlineTaskFunction = ( taskID: string, taskArgs: { @@ -103,12 +110,16 @@ export type RunInlineTaskFunction = req: PayloadRequest tasks: RunTaskFunctions - }) => + }) => MaybePromise< + | { + errorMessage?: string + state: 'failed' + } | { output: TTaskOutput - state?: 'failed' | 'succeeded' + state?: 'succeeded' } - | Promise<{ output: TTaskOutput; state?: 'failed' | 'succeeded' }> + > }, ) => Promise diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts index f2b9f6ad39..9feea2fa13 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts @@ -48,9 +48,9 @@ export async function handleTaskFailed({ parent, req, retriesConfig, - runnerOutput, state, taskConfig, + taskHandlerResult, taskID, taskSlug, taskStatus, @@ -65,9 +65,9 @@ export async function handleTaskFailed({ parent?: TaskParent req: PayloadRequest retriesConfig: number | RetryConfig - runnerOutput?: TaskHandlerResult state: RunTaskFunctionState taskConfig?: TaskConfig + taskHandlerResult?: TaskHandlerResult taskID: string taskSlug: string taskStatus: null | SingleTaskStatus @@ -88,7 +88,12 @@ export async function handleTaskFailed({ message: error.message, stack: error.stack, } - : runnerOutput.state + : { + message: + taskHandlerResult.state === 'failed' + ? (taskHandlerResult.errorMessage ?? taskHandlerResult.state) + : 'failed', + } job.log.push({ completedAt: new Date().toISOString(), @@ -262,8 +267,6 @@ export const getRunTaskFunction = ( return } - let output: object = {} - let maxRetries: number | undefined = finalRetriesConfig?.attempts if (maxRetries === undefined || maxRetries === null) { @@ -278,8 +281,11 @@ export const getRunTaskFunction = ( } } + let taskHandlerResult: TaskHandlerResult + let output: object = {} + try { - const runnerOutput = await runner({ + taskHandlerResult = await runner({ inlineTask: getRunTaskFunction(state, job, workflowConfig, req, true, updateJob, { taskID, taskSlug, @@ -292,29 +298,6 @@ export const getRunTaskFunction = ( taskSlug, }), }) - - if (runnerOutput.state === 'failed') { - await handleTaskFailed({ - executedAt, - input, - job, - maxRetries, - output, - parent, - req, - retriesConfig: finalRetriesConfig, - runnerOutput, - state, - taskConfig, - taskID, - taskSlug, - taskStatus, - updateJob, - }) - throw new Error('Task failed') - } else { - output = runnerOutput.output - } } catch (err) { await handleTaskFailed({ error: err, @@ -336,6 +319,29 @@ export const getRunTaskFunction = ( throw new Error('Task failed') } + if (taskHandlerResult.state === 'failed') { + await handleTaskFailed({ + executedAt, + input, + job, + maxRetries, + output, + parent, + req, + retriesConfig: finalRetriesConfig, + state, + taskConfig, + taskHandlerResult, + taskID, + taskSlug, + taskStatus, + updateJob, + }) + throw new Error('Task failed') + } else { + output = taskHandlerResult.output + } + if (taskConfig?.onSuccess) { await taskConfig.onSuccess() } diff --git a/test/queues/config.ts b/test/queues/config.ts index 67e1c91265..ac886e2bf4 100644 --- a/test/queues/config.ts +++ b/test/queues/config.ts @@ -323,6 +323,44 @@ export default buildConfigWithDefaults({ ], handler: path.resolve(dirname, 'runners/externalTask.ts') + '#externalTaskHandler', } as TaskConfig<'ExternalTask'>, + { + retries: 0, + slug: 'ThrowError', + inputSchema: [], + outputSchema: [], + handler: () => { + throw new Error('failed') + }, + } as TaskConfig<'ThrowError'>, + { + retries: 0, + slug: 'ReturnError', + inputSchema: [], + outputSchema: [], + handler: () => { + return { + state: 'failed', + } + }, + } as TaskConfig<'ReturnError'>, + { + retries: 0, + slug: 'ReturnCustomError', + inputSchema: [ + { + name: 'errorMessage', + type: 'text', + required: true, + }, + ], + outputSchema: [], + handler: ({ input }) => { + return { + state: 'failed', + errorMessage: input.errorMessage, + } + }, + } as TaskConfig<'ReturnCustomError'>, ], workflows: [ updatePostWorkflow, diff --git a/test/queues/int.spec.ts b/test/queues/int.spec.ts index 8193988c53..7dd030b9c4 100644 --- a/test/queues/int.spec.ts +++ b/test/queues/int.spec.ts @@ -1128,4 +1128,69 @@ describe('Queues', () => { // @ts-expect-error expect(jobAfterRun.input.amountTask1Retried).toBe(0) }) + + it('can tasks throw error', async () => { + payload.config.jobs.deleteJobOnComplete = false + + const job = await payload.jobs.queue({ + task: 'ThrowError', + input: {}, + }) + + await payload.jobs.run() + + const jobAfterRun = await payload.findByID({ + collection: 'payload-jobs', + id: job.id, + }) + + expect(jobAfterRun.hasError).toBe(true) + expect(jobAfterRun.log?.length).toBe(1) + expect(jobAfterRun.log[0].error.message).toBe('failed') + expect(jobAfterRun.log[0].state).toBe('failed') + }) + + it('can tasks return error', async () => { + payload.config.jobs.deleteJobOnComplete = false + + const job = await payload.jobs.queue({ + task: 'ReturnError', + input: {}, + }) + + await payload.jobs.run() + + const jobAfterRun = await payload.findByID({ + collection: 'payload-jobs', + id: job.id, + }) + + expect(jobAfterRun.hasError).toBe(true) + expect(jobAfterRun.log?.length).toBe(1) + expect(jobAfterRun.log[0].error.message).toBe('failed') + expect(jobAfterRun.log[0].state).toBe('failed') + }) + + it('can tasks return error with custom error message', async () => { + payload.config.jobs.deleteJobOnComplete = false + + const job = await payload.jobs.queue({ + task: 'ReturnCustomError', + input: { + errorMessage: 'custom error message', + }, + }) + + await payload.jobs.run() + + const jobAfterRun = await payload.findByID({ + collection: 'payload-jobs', + id: job.id, + }) + + expect(jobAfterRun.hasError).toBe(true) + expect(jobAfterRun.log?.length).toBe(1) + expect(jobAfterRun.log[0].error.message).toBe('custom error message') + expect(jobAfterRun.log[0].state).toBe('failed') + }) }) From c8c578f5ef3ba099053bd18f94403158a91006df Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 09:25:03 -0700 Subject: [PATCH 033/127] perf(next): reduce initReq calls from 3 to 1 per page load (#11312) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR significantly improves performance when navigating through the admin panel by reducing the number of times `initReq` is called. Previously, `initReq`—which handles expensive tasks like initializing Payload and running access control—was called **three times** for a single page load (for the root layout, the root page, and the notFound page). We initially tried to use React Cache to ensure `initReq` only ran once per request. However, because React Cache performs a shallow object reference check on function arguments, the configuration object we passed (`configPromise`) and the `overrides` object never maintained the same reference, causing the cache to miss. ### What’s Changed * **New `getInitReqContainer` Helper** We introduced a helper that provides a stable object reference throughout the entire request. This allows React to properly cache the output, ensuring `initReq` doesn’t get triggered multiple times by mistake. * **Splitting `initReq` into Two Functions** The `initReq` logic was split into: * **`initPartialReq`:** Runs only **once** per request, handling tasks that do not depend on page-level data (e.g., calling `.auth`, which performs a DB request). * **`initReq`:** Runs **twice** (once for Layout+NotFound page and once for main page), handling tasks, most notably access control, that rely on page-level data such as locale or query parameters. The NotFound page will share the same req as the layout page, as it's not localized, and its access control wouldn't need to access page query / url / locale, just like the layout. * **Remove duplicative logic** * Previously, a lot of logic was run in **both** `initReq` **and** the respective page / layout. This was completely unnecessary, as `initReq` was already running that logic. This PR returns the calculated variables from `initReq`, so they don't have to be duplicatively calculated again. ### Performance Gains * Previously: * `.auth` call ran **3 times** * Access control ran **3 times** * Now: * `.auth` call runs **1 time** * Access control runs **2 times** This change yields a noticeable performance improvement by cutting down on redundant work. --- packages/next/src/layouts/Root/index.tsx | 27 ++- .../src/utilities/handleServerFunctions.ts | 6 +- packages/next/src/utilities/initPage/index.ts | 39 +++-- packages/next/src/utilities/initPage/types.ts | 11 ++ packages/next/src/utilities/initReq.ts | 157 +++++++++++------- packages/next/src/utilities/selectiveCache.ts | 57 +++++++ packages/next/src/views/NotFound/index.tsx | 1 + 7 files changed, 209 insertions(+), 89 deletions(-) create mode 100644 packages/next/src/utilities/selectiveCache.ts diff --git a/packages/next/src/layouts/Root/index.tsx b/packages/next/src/layouts/Root/index.tsx index d8f6ac5f0a..7f72e347d2 100644 --- a/packages/next/src/layouts/Root/index.tsx +++ b/packages/next/src/layouts/Root/index.tsx @@ -4,8 +4,7 @@ import type { ImportMap, LanguageOptions, SanitizedConfig, ServerFunctionClient import { rtlLanguages } from '@payloadcms/translations' import { ProgressBar, RootProvider } from '@payloadcms/ui' import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig' -import { headers as getHeaders, cookies as nextCookies } from 'next/headers.js' -import { getPayload, getRequestLanguage, parseCookies } from 'payload' +import { cookies as nextCookies } from 'next/headers.js' import React from 'react' import { getNavPrefs } from '../../elements/Nav/getNavPrefs.js' @@ -34,16 +33,16 @@ export const RootLayout = async ({ }) => { checkDependencies() - const config = await configPromise - - const headers = await getHeaders() - const cookies = parseCookies(headers) - - const languageCode = getRequestLanguage({ - config, + const { cookies, headers, - }) + languageCode, + permissions, + req, + req: { + payload: { config }, + }, + } = await initReq({ configPromise, importMap, key: 'RootLayout' }) const theme = getRequestTheme({ config, @@ -51,10 +50,6 @@ export const RootLayout = async ({ headers, }) - const payload = await getPayload({ config, importMap }) - - const { permissions, req } = await initReq(config) - const dir = (rtlLanguages as unknown as AcceptedLanguages[]).includes(languageCode) ? 'RTL' : 'LTR' @@ -134,11 +129,11 @@ export const RootLayout = async ({ {Array.isArray(config.admin?.components?.providers) && config.admin?.components?.providers.length > 0 ? ( { const { name: fnKey, args: fnArgs, config: configPromise, importMap } = args - const { req } = await initReq(configPromise) + const { req } = await initReq({ + configPromise, + importMap, + key: 'RootLayout', + }) const augmentedArgs: Parameters[0] = { ...fnArgs, diff --git a/packages/next/src/utilities/initPage/index.ts b/packages/next/src/utilities/initPage/index.ts index 3cfc65bb6c..f0f6554d7f 100644 --- a/packages/next/src/utilities/initPage/index.ts +++ b/packages/next/src/utilities/initPage/index.ts @@ -18,31 +18,38 @@ export const initPage = async ({ importMap, route, searchParams, + useLayoutReq, }: Args): Promise => { - const headers = await getHeaders() - const payload = await getPayload({ config: configPromise, importMap }) const queryString = `${qs.stringify(searchParams ?? {}, { addQueryPrefix: true })}` + const { + cookies, + locale, + permissions, + req, + req: { payload }, + } = await initReq({ + configPromise, + importMap, + key: useLayoutReq ? 'RootLayout' : 'initPage', + overrides: { + fallbackLocale: false, + req: { + query: qs.parse(queryString, { + depth: 10, + ignoreQueryPrefix: true, + }), + }, + }, + urlSuffix: `${route}${searchParams ? queryString : ''}`, + }) + const { collections, globals, routes: { admin: adminRoute }, } = payload.config - const cookies = parseCookies(headers) - - const { locale, permissions, req } = await initReq(payload.config, { - fallbackLocale: false, - req: { - headers, - query: qs.parse(queryString, { - depth: 10, - ignoreQueryPrefix: true, - }), - url: `${payload.config.serverURL}${route}${searchParams ? queryString : ''}`, - }, - }) - const languageOptions = Object.entries(payload.config.i18n.supportedLanguages || {}).reduce( (acc, [language, languageConfig]) => { if (Object.keys(payload.config.i18n.supportedLanguages).includes(language)) { diff --git a/packages/next/src/utilities/initPage/types.ts b/packages/next/src/utilities/initPage/types.ts index ca85a88f9b..11dfb13d46 100644 --- a/packages/next/src/utilities/initPage/types.ts +++ b/packages/next/src/utilities/initPage/types.ts @@ -20,4 +20,15 @@ export type Args = { * The search parameters of the current route provided to all pages in Next.js. */ searchParams: { [key: string]: string | string[] | undefined } + /** + * If `useLayoutReq` is `true`, this page will use the cached `req` created by the root layout + * instead of creating a new one. + * + * This improves performance for pages that are able to share the same `req` as the root layout, + * as permissions do not need to be re-calculated. + * + * If the page has unique query and url params that need to be part of the `req` object, or if you + * need permissions calculation to respect those you should not use this property. + */ + useLayoutReq?: boolean } diff --git a/packages/next/src/utilities/initReq.ts b/packages/next/src/utilities/initReq.ts index ce1c9cba52..3ddf1eb7ce 100644 --- a/packages/next/src/utilities/initReq.ts +++ b/packages/next/src/utilities/initReq.ts @@ -1,5 +1,13 @@ -import type { I18n, I18nClient } from '@payloadcms/translations' -import type { Locale, PayloadRequest, SanitizedConfig, SanitizedPermissions } from 'payload' +import type { AcceptedLanguages, I18n, I18nClient } from '@payloadcms/translations' +import type { + ImportMap, + Locale, + Payload, + PayloadRequest, + SanitizedConfig, + SanitizedPermissions, + User, +} from 'payload' import { initI18n } from '@payloadcms/translations' import { headers as getHeaders } from 'next/headers.js' @@ -11,78 +19,115 @@ import { getRequestLanguage, parseCookies, } from 'payload' -import { cache } from 'react' import { getRequestLocale } from './getRequestLocale.js' +import { selectiveCache } from './selectiveCache.js' type Result = { + cookies: Map + headers: Awaited> + languageCode: AcceptedLanguages locale?: Locale permissions: SanitizedPermissions req: PayloadRequest } -export const initReq = cache(async function ( - configPromise: Promise | SanitizedConfig, - overrides?: Parameters[0], -): Promise { - const config = await configPromise - const payload = await getPayload({ config }) +type PartialResult = { + i18n: I18nClient + languageCode: AcceptedLanguages + payload: Payload + responseHeaders: Headers + user: null | User +} +// Create cache instances for different parts of our application +const partialReqCache = selectiveCache('partialReq') +const reqCache = selectiveCache('req') + +/** + * Initializes a full request object, including the `req` object and access control. + * As access control and getting the request locale is dependent on the current URL and + */ +export const initReq = async function ({ + configPromise, + importMap, + key, + overrides, + urlSuffix, +}: { + configPromise: Promise | SanitizedConfig + importMap: ImportMap + key: string + overrides?: Parameters[0] + urlSuffix?: string +}): Promise { const headers = await getHeaders() const cookies = parseCookies(headers) - const languageCode = getRequestLanguage({ - config, - cookies, - headers, - }) + const partialResult = await partialReqCache.get(async () => { + const config = await configPromise + const payload = await getPayload({ config, importMap }) + const languageCode = getRequestLanguage({ + config, + cookies, + headers, + }) + const i18n: I18nClient = await initI18n({ + config: config.i18n, + context: 'client', + language: languageCode, + }) - const i18n: I18nClient = await initI18n({ - config: config.i18n, - context: 'client', - language: languageCode, - }) + const { responseHeaders, user } = await executeAuthStrategies({ + headers, + payload, + }) - /** - * Cannot simply call `payload.auth` here, as we need the user to get the locale, and we need the locale to get the access results - * I.e. the `payload.auth` function would call `getAccessResults` without a fully-formed `req` object - */ - const { responseHeaders, user } = await executeAuthStrategies({ - headers, - payload, - }) + return { + i18n, + languageCode, + payload, + responseHeaders, + user, + } + }, 'global') - const { req: reqOverrides, ...optionsOverrides } = overrides || {} + return reqCache.get(async () => { + const { i18n, languageCode, payload, responseHeaders, user } = partialResult - const req = await createLocalReq( - { - req: { - headers, - host: headers.get('host'), - i18n: i18n as I18n, - responseHeaders, - url: `${payload.config.serverURL}`, - user, - ...(reqOverrides || {}), + const { req: reqOverrides, ...optionsOverrides } = overrides || {} + const req = await createLocalReq( + { + req: { + headers, + host: headers.get('host'), + i18n: i18n as I18n, + responseHeaders, + url: `${payload.config.serverURL}${urlSuffix || ''}`, + user, + ...(reqOverrides || {}), + }, + ...(optionsOverrides || {}), }, - ...(optionsOverrides || {}), - }, - payload, - ) + payload, + ) - const locale = await getRequestLocale({ - req, - }) + const locale = await getRequestLocale({ + req, + }) + req.locale = locale?.code - req.locale = locale?.code + const permissions = await getAccessResults({ + req, + }) - const permissions = await getAccessResults({ - req, - }) - - return { - locale, - permissions, - req, - } -}) + return { + cookies, + headers, + languageCode, + locale, + permissions, + req, + } + }, key) +} diff --git a/packages/next/src/utilities/selectiveCache.ts b/packages/next/src/utilities/selectiveCache.ts new file mode 100644 index 0000000000..728835f43d --- /dev/null +++ b/packages/next/src/utilities/selectiveCache.ts @@ -0,0 +1,57 @@ +import { cache } from 'react' + +type CachedValue = object + +// Module-scoped cache container that holds all cached, stable containers +// - these may hold the stable value, or a promise to the stable value +const globalCacheContainer: Record< + string, + ( + ...args: unknown[] + ) => { + value: null | Promise | TValue + } +> = {} + +/** + * Creates a selective cache function that provides more control over React's request-level caching behavior. + * + * @param namespace - A namespace to group related cached values + * @returns A function that manages cached values within the specified namespace + */ +export function selectiveCache(namespace: string) { + // Create a stable namespace container if it doesn't exist + if (!globalCacheContainer[namespace]) { + globalCacheContainer[namespace] = cache((...args) => ({ + value: null, + })) + } + + /** + * Gets or creates a cached value for a specific key within the namespace + * + * @param key - The key to identify the cached value + * @param factory - A function that produces the value if not cached + * @returns The cached or newly created value + */ + const getCached = async (factory: () => Promise, ...cacheArgs): Promise => { + const stableObjectFn = globalCacheContainer[namespace] + const stableObject = stableObjectFn(...cacheArgs) + + if ( + stableObject?.value && + 'then' in stableObject.value && + typeof stableObject.value?.then === 'function' + ) { + return await stableObject.value + } + + stableObject.value = factory() + + return await stableObject.value + } + + return { + get: getCached, + } +} diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index 235585025b..45f24d76c3 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -58,6 +58,7 @@ export const NotFoundPage = async ({ redirectUnauthenticatedUser: true, route: formatAdminURL({ adminRoute, path: '/not-found' }), searchParams, + useLayoutReq: true, }) const params = await paramsPromise From 428c1330330930f8c9c97bb49df44c43492748cc Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury <67977755+JessChowdhury@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:06:32 +0000 Subject: [PATCH 034/127] fix(ui): copyToLocale should not pass id in data, throws error in postgres (#11402) --- packages/ui/src/utilities/copyDataFromLocale.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/utilities/copyDataFromLocale.ts b/packages/ui/src/utilities/copyDataFromLocale.ts index 2fbc404e31..c934b7f0c1 100644 --- a/packages/ui/src/utilities/copyDataFromLocale.ts +++ b/packages/ui/src/utilities/copyDataFromLocale.ts @@ -288,11 +288,13 @@ export const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => { throw new Error(`Error fetching data from locale "${toLocale}"`) } + const { id, ...fromLocaleDataWithoutID } = fromLocaleData.value + return globalSlug ? await payload.updateGlobal({ slug: globalSlug, data: overrideData - ? fromLocaleData.value + ? fromLocaleDataWithoutID : mergeData( fromLocaleData.value, toLocaleData.value, @@ -309,7 +311,7 @@ export const copyDataFromLocale = async (args: CopyDataFromLocaleArgs) => { id: docID, collection: collectionSlug, data: overrideData - ? fromLocaleData.value + ? fromLocaleDataWithoutID : mergeData( fromLocaleData.value, toLocaleData.value, From 48e613b61f20f200adac1b3ed4ddff0d9530ab78 Mon Sep 17 00:00:00 2001 From: Roy Barber Date: Fri, 28 Feb 2025 17:13:46 +0000 Subject: [PATCH 035/127] fix(examples): replace depreciated 'mergeHeaders' import in the MultiTenant example (#11306) --- .../src/collections/Users/hooks/setCookieBasedOnDomain.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts index 229d0500ad..36f6a70d22 100644 --- a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts +++ b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts @@ -1,7 +1,6 @@ import type { CollectionAfterLoginHook } from 'payload' -import { mergeHeaders } from '@payloadcms/next/utilities' -import { generateCookie, getCookieExpiration } from 'payload' +import { mergeHeaders, generateCookie, getCookieExpiration } from 'payload' export const setCookieBasedOnDomain: CollectionAfterLoginHook = async ({ req, user }) => { const relatedOrg = await req.payload.find({ From 8b55e7b51a079f95e0e7022ce5140f8a9c276086 Mon Sep 17 00:00:00 2001 From: Martijn Luyckx Date: Fri, 28 Feb 2025 18:15:00 +0100 Subject: [PATCH 036/127] docs: replace HTML entity ' with literal apostrophe (#11321) --- docs/plugins/build-your-own.mdx | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/plugins/build-your-own.mdx b/docs/plugins/build-your-own.mdx index f4a92d1489..9c99082d4c 100644 --- a/docs/plugins/build-your-own.mdx +++ b/docs/plugins/build-your-own.mdx @@ -6,7 +6,7 @@ desc: Starting to build your own plugin? Find everything you need and learn best keywords: plugins, template, config, configuration, extensions, custom, documentation, Content Management System, cms, headless, javascript, node, react, nextjs --- -Building your own [Payload Plugin](./overview) is easy, and if you're already familiar with Payload then you'll have everything you need to get started. You can either start from scratch or use the [Plugin Template](#plugin-template) to get up and running quickly. +Building your own [Payload Plugin](./overview) is easy, and if you're already familiar with Payload then you'll have everything you need to get started. You can either start from scratch or use the [Plugin Template](#plugin-template) to get up and running quickly. To use the template, run `npx create-payload-app@latest --template plugin` directly in @@ -19,7 +19,7 @@ Our plugin template includes everything you need to build a full life-cycle plug - A local dev environment to develop the plugin - Test suite with integrated GitHub workflow -By abstracting your code into a plugin, you'll be able to reuse your feature across multiple projects and make it available for other developers to use. +By abstracting your code into a plugin, you'll be able to reuse your feature across multiple projects and make it available for other developers to use. ## Plugins Recap @@ -75,7 +75,7 @@ The purpose of the **dev** folder is to provide a sanitized local Payload projec Do **not** store any of the plugin functionality in this folder - it is purely an environment to _assist_ you with developing the plugin. -If you're starting from scratch, you can easily setup a dev environment like this: +If you're starting from scratch, you can easily setup a dev environment like this: ``` mkdir dev @@ -83,7 +83,7 @@ cd dev npx create-payload-app@latest ``` -If you're using the plugin template, the dev folder is built out for you and the `samplePlugin` has already been installed in `dev/payload.config.ts`. +If you're using the plugin template, the dev folder is built out for you and the `samplePlugin` has already been installed in `dev/payload.config.ts`. ``` plugins: [ @@ -96,7 +96,7 @@ If you're using the plugin template, the dev folder is built out for you an You can add to the `dev/payload.config.ts` and build out the dev project as needed to test your plugin. -When you're ready to start development, navigate into this folder with `cd dev` +When you're ready to start development, navigate into this folder with `cd dev` And then start the project with `pnpm dev` and pull up `http://localhost:3000` in your browser. @@ -108,7 +108,7 @@ A good test suite is essential to ensure quality and stability in your plugin. P Jest organizes tests into test suites and cases. We recommend creating tests based on the expected behavior of your plugin from start to finish. Read more about tests in the [Jest documentation.](https://jestjs.io/) -The plugin template provides a stubbed out test suite at `dev/plugin.spec.ts` which is ready to go - just add in your own test conditions and you're all set! +The plugin template provides a stubbed out test suite at `dev/plugin.spec.ts` which is ready to go - just add in your own test conditions and you're all set! ``` let payload: Payload @@ -160,7 +160,7 @@ export const seed = async (payload: Payload): Promise => { ## Building a Plugin -Now that we have our environment setup and dev project ready to go - it's time to build the plugin! +Now that we have our environment setup and dev project ready to go - it's time to build the plugin! ``` @@ -217,7 +217,7 @@ To reiterate, the essence of a [Payload Plugin](./overview) is simply to extend We are going to use spread syntax to allow us to add data to existing arrays without losing the existing data. It is crucial to spread the existing data correctly, else this can cause adverse behavior and conflicts with Payload Config and other plugins. -Let's say you want to build a plugin that adds a new collection: +Let's say you want to build a plugin that adds a new collection: ``` config.collections = [ @@ -227,7 +227,7 @@ config.collections = [ ] ``` -First, you need to spread the `config.collections` to ensure that we don't lose the existing collections. Then you can add any additional collections, just as you would in a regular Payload Config. +First, you need to spread the `config.collections` to ensure that we don't lose the existing collections. Then you can add any additional collections, just as you would in a regular Payload Config. This same logic is applied to other array and object like properties such as admin, globals and hooks: @@ -284,7 +284,7 @@ For a better user experience, provide a way to disable the plugin without uninst ### Include tests in your GitHub CI workflow -If you've configured tests for your package, integrate them into your workflow to run the tests each time you commit to the plugin repository. Learn more about [how to configure tests into your GitHub CI workflow.](https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs) +If you've configured tests for your package, integrate them into your workflow to run the tests each time you commit to the plugin repository. Learn more about [how to configure tests into your GitHub CI workflow.](https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs) ### Publish your finished plugin to npm From 4a1b74952f2a243220de3989f2d622892123b0e7 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 10:18:09 -0700 Subject: [PATCH 037/127] chore(richtext-lexical): improve UploadData jsdocs (#11292) --- .../RichText/converter/converters/upload.tsx | 30 ++++++++++--------- .../upload/server/nodes/UploadNode.tsx | 22 ++++++++++---- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx b/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx index 76ac03781c..bf9ad0c08c 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx +++ b/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx @@ -1,4 +1,4 @@ -import type { FileSizeImproved } from 'payload' +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' import type { UploadDataImproved } from '../../../../../../features/upload/server/nodes/UploadNode.js' import type { SerializedUploadNode } from '../../../../../../nodeTypes.js' @@ -7,21 +7,21 @@ import type { JSXConverters } from '../types.js' export const UploadJSXConverter: JSXConverters = { upload: ({ node }) => { // TO-DO (v4): SerializedUploadNode should use UploadData_P4 - const uploadDocument = node as UploadDataImproved - if (typeof uploadDocument?.value !== 'object') { + const uploadNode = node as UploadDataImproved + if (typeof uploadNode.value !== 'object') { return null } - const value = uploadDocument.value - const url = value.url + const uploadDoc = uploadNode.value as FileData & TypeWithID + const url = uploadDoc.url /** * If the upload is not an image, return a link to the upload */ - if (!value.mimeType.startsWith('image')) { + if (!uploadDoc.mimeType.startsWith('image')) { return ( - {value.filename} + {uploadDoc.filename} ) } @@ -29,8 +29,10 @@ export const UploadJSXConverter: JSXConverters = { /** * If the upload is a simple image with no different sizes, return a simple img tag */ - if (!Object.keys(value.sizes).length) { - return {value.filename} + if (!Object.keys(uploadDoc.sizes).length) { + return ( + {uploadDoc.filename} + ) } /** @@ -39,8 +41,8 @@ export const UploadJSXConverter: JSXConverters = { const pictureJSX: React.ReactNode[] = [] // Iterate through each size in the data.sizes object - for (const size in value.sizes) { - const imageSize = value.sizes[size] as FileSizeImproved + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved // Skip if any property of the size object is null if ( @@ -69,11 +71,11 @@ export const UploadJSXConverter: JSXConverters = { // Add the default img tag pictureJSX.push( {value?.filename}, ) return {pictureJSX} diff --git a/packages/richtext-lexical/src/features/upload/server/nodes/UploadNode.tsx b/packages/richtext-lexical/src/features/upload/server/nodes/UploadNode.tsx index a7b004996a..15120f34b7 100644 --- a/packages/richtext-lexical/src/features/upload/server/nodes/UploadNode.tsx +++ b/packages/richtext-lexical/src/features/upload/server/nodes/UploadNode.tsx @@ -25,24 +25,36 @@ import * as React from 'react' export type UploadData = { [TCollectionSlug in CollectionSlug]: { fields: TUploadExtraFieldsData - // Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document + /** + * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document + */ id: string relationTo: TCollectionSlug - // Value can be just the document ID, or the full, populated document + /** + * Value can be just the document ID, or the full, populated document + */ value: DataFromCollectionSlug | number | string } }[CollectionSlug] /** - * @todo Replace UploadData with UploadDataImproved + * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4. + * This type is for internal use only as it will be deprecated in the future. + * @internal + * + * @todo Replace UploadData with UploadDataImproved in 4.0 */ export type UploadDataImproved = { [TCollectionSlug in UploadCollectionSlug]: { fields: TUploadExtraFieldsData - // Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document + /** + * Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document + */ id: string relationTo: TCollectionSlug - // Value can be just the document ID, or the full, populated document + /** + * Value can be just the document ID, or the full, populated document + */ value: number | string | TypedUploadCollection[TCollectionSlug] } }[UploadCollectionSlug] From a65289c211d2179df8dd34d83ae9198c60d9bb7e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 28 Feb 2025 12:26:38 -0500 Subject: [PATCH 038/127] fix: ensures req.origin includes port on localhost (#11454) The `req.origin` property on the `PayloadRequest` object does not include the port when running on localhost, a requirement of the [HTML Living Standard](https://html.spec.whatwg.org/#origin). This was because we were initializing the url with a fallback of `http://localhost` (no port). When constructed via `new URL()`, the port is unable to be extracted. This is fixed by using the `host` property off the headers object, if it exists, which includes the port. Partial fix for #11448. --- .../payload/src/utilities/createLocalReq.ts | 23 +++++++++++++------ tsconfig.base.json | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/payload/src/utilities/createLocalReq.ts b/packages/payload/src/utilities/createLocalReq.ts index 21931e6b49..b1de9c28c5 100644 --- a/packages/payload/src/utilities/createLocalReq.ts +++ b/packages/payload/src/utilities/createLocalReq.ts @@ -26,22 +26,26 @@ function getRequestContext( const attachFakeURLProperties = (req: Partial) => { /** * *NOTE* - * If no URL is provided, the local API was called directly outside + * If no URL is provided, the local API was called outside * the context of a request. Therefore we create a fake URL object. - * `ts-expect-error` is used below for properties that are 'read-only' - * since they do not exist yet we can safely ignore the error. + * `ts-expect-error` is used below for properties that are 'read-only'. + * Since they do not exist yet we can safely ignore the error. */ - let urlObject + let urlObject: undefined | URL function getURLObject() { if (urlObject) { return urlObject } - const urlToUse = req?.url || req.payload.config?.serverURL || 'http://localhost' + + const fallbackURL = `http://${req.host || 'localhost'}` + + const urlToUse = req?.url || req.payload.config?.serverURL || fallbackURL + try { urlObject = new URL(urlToUse) - } catch (error) { - urlObject = new URL('http://localhost') + } catch (_err) { + urlObject = new URL(fallbackURL) } return urlObject @@ -50,20 +54,25 @@ const attachFakeURLProperties = (req: Partial) => { if (!req.host) { req.host = getURLObject().host } + if (!req.protocol) { req.protocol = getURLObject().protocol } + if (!req.pathname) { req.pathname = getURLObject().pathname } + if (!req.searchParams) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.searchParams = getURLObject().searchParams } + if (!req.origin) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.origin = getURLObject().origin } + if (!req?.url) { // @ts-expect-error eslint-disable-next-line no-param-reassign req.url = getURLObject().href diff --git a/tsconfig.base.json b/tsconfig.base.json index 28020e04ad..26c3c9821e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/admin/config.ts"], + "@payload-config": ["./test/_community/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], From 9e97319c6f17d3fcd3629fa0ef48f84dd3fb8b47 Mon Sep 17 00:00:00 2001 From: Jessica Chowdhury <67977755+JessChowdhury@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:37:07 +0000 Subject: [PATCH 039/127] fix(ui): locale selector in versions view should remove filtered locales (#11447) ### What? The `locale selector` in the version comparison view shows all locales on first load. It does not accomodate the `filterAvailableLocales` option and shows locales which should be filtered. ### How? Pass the initial locales through the `filterAvailableLocales` function. Closes #11408 #### Testing Use test suite `localization` and the `localized-drafts` collection. Test added to `test/localization/e2e`. --- packages/next/src/views/Version/index.tsx | 28 +++++++++++-------- .../collections/LocalizedDrafts/index.ts | 17 +++++++++++ test/localization/config.ts | 3 +- test/localization/e2e.spec.ts | 19 +++++++++++++ test/localization/payload-types.ts | 27 ++++++++++++++++++ test/localization/shared.ts | 2 ++ 6 files changed, 83 insertions(+), 13 deletions(-) create mode 100644 test/localization/collections/LocalizedDrafts/index.ts diff --git a/packages/next/src/views/Version/index.tsx b/packages/next/src/views/Version/index.tsx index 4cb614dbc9..e2563f658f 100644 --- a/packages/next/src/views/Version/index.tsx +++ b/packages/next/src/views/Version/index.tsx @@ -1,6 +1,7 @@ import type { Document, DocumentViewServerProps, + Locale, OptionObject, SanitizedCollectionPermission, SanitizedGlobalPermission, @@ -142,26 +143,29 @@ export async function VersionView(props: DocumentViewServerProps) { } } - const selectedLocales: OptionObject[] = [] + let selectedLocales: OptionObject[] = [] if (localization) { + let locales: Locale[] = [] if (localeCodesFromParams) { for (const code of localeCodesFromParams) { const locale = localization.locales.find((locale) => locale.code === code) - if (locale) { - selectedLocales.push({ - label: locale.label, - value: locale.code, - }) + if (!locale) { + continue } + locales.push(locale) } } else { - for (const { code, label } of localization.locales) { - selectedLocales.push({ - label, - value: code, - }) - } + locales = localization.locales } + + if (localization.filterAvailableLocales) { + locales = (await localization.filterAvailableLocales({ locales, req })) || [] + } + + selectedLocales = locales.map((locale) => ({ + label: locale.label, + value: locale.code, + })) } const latestVersion = diff --git a/test/localization/collections/LocalizedDrafts/index.ts b/test/localization/collections/LocalizedDrafts/index.ts new file mode 100644 index 0000000000..aad14940b1 --- /dev/null +++ b/test/localization/collections/LocalizedDrafts/index.ts @@ -0,0 +1,17 @@ +import type { CollectionConfig } from 'payload' + +import { localizedDraftsSlug } from '../../shared.js' + +export const LocalizedDrafts: CollectionConfig = { + slug: localizedDraftsSlug, + versions: { + drafts: true, + }, + fields: [ + { + type: 'text', + name: 'title', + localized: true, + }, + ], +} diff --git a/test/localization/config.ts b/test/localization/config.ts index b91b0eb0ae..fea76d5e60 100644 --- a/test/localization/config.ts +++ b/test/localization/config.ts @@ -11,6 +11,7 @@ import { devUser } from '../credentials.js' import { ArrayCollection } from './collections/Array/index.js' import { BlocksCollection } from './collections/Blocks/index.js' import { Group } from './collections/Group/index.js' +import { LocalizedDrafts } from './collections/LocalizedDrafts/index.js' import { LocalizedWithinLocalized } from './collections/LocalizedWithinLocalized/index.js' import { NestedArray } from './collections/NestedArray/index.js' import { NestedFields } from './collections/NestedFields/index.js' @@ -37,7 +38,6 @@ import { withLocalizedRelSlug, withRequiredLocalizedFields, } from './shared.js' - export type LocalizedPostAllLocale = { title: { en?: string @@ -63,6 +63,7 @@ export default buildConfigWithDefaults({ BlocksCollection, NestedArray, NestedFields, + LocalizedDrafts, { admin: { listSearchableFields: 'name', diff --git a/test/localization/e2e.spec.ts b/test/localization/e2e.spec.ts index 04ecc3c2a1..2803e3df82 100644 --- a/test/localization/e2e.spec.ts +++ b/test/localization/e2e.spec.ts @@ -17,6 +17,7 @@ import { changeLocale, closeLocaleSelector, ensureCompilationIsDone, + findTableRow, initPageConsoleErrorCatch, openLocaleSelector, saveDocAndAssert, @@ -30,6 +31,7 @@ import { richTextSlug } from './collections/RichText/index.js' import { defaultLocale, englishTitle, + localizedDraftsSlug, localizedPostsSlug, relationshipLocalizedSlug, spanishLocale, @@ -53,6 +55,7 @@ let url: AdminUrlUtil let urlWithRequiredLocalizedFields: AdminUrlUtil let urlRelationshipLocalized: AdminUrlUtil let urlCannotCreateDefaultLocale: AdminUrlUtil +let urlPostsWithDrafts: AdminUrlUtil const title = 'english title' const spanishTitle = 'spanish title' @@ -76,6 +79,7 @@ describe('Localization', () => { richTextURL = new AdminUrlUtil(serverURL, richTextSlug) urlWithRequiredLocalizedFields = new AdminUrlUtil(serverURL, withRequiredLocalizedFields) urlCannotCreateDefaultLocale = new AdminUrlUtil(serverURL, 'cannot-create-default-locale') + urlPostsWithDrafts = new AdminUrlUtil(serverURL, localizedDraftsSlug) context = await browser.newContext() page = await context.newPage() @@ -111,6 +115,21 @@ describe('Localization', () => { await expect(page.locator('.localizer .popup.popup--active')).not.toContainText('FILTERED') }) + test('should filter version locale selector with filterAvailableLocales', async () => { + await page.goto(urlPostsWithDrafts.create) + await page.locator('#field-title').fill('title') + await page.locator('#action-save').click() + + await page.locator('text=Versions').click() + const firstVersion = findTableRow(page, 'Current Published Version') + await firstVersion.locator('a').click() + + await expect(page.locator('.select-version-locales__label')).toBeVisible() + await expect(page.locator('.select-version-locales .react-select')).not.toContainText( + 'FILTERED', + ) + }) + test('should disable control for active locale', async () => { await page.goto(url.create) diff --git a/test/localization/payload-types.ts b/test/localization/payload-types.ts index 9abedba4f3..5230914c15 100644 --- a/test/localization/payload-types.ts +++ b/test/localization/payload-types.ts @@ -70,6 +70,7 @@ export interface Config { 'blocks-fields': BlocksField; 'nested-arrays': NestedArray; 'nested-field-tables': NestedFieldTable; + 'localized-drafts': LocalizedDraft; users: User; 'localized-posts': LocalizedPost; 'no-localized-fields': NoLocalizedField; @@ -94,6 +95,7 @@ export interface Config { 'blocks-fields': BlocksFieldsSelect | BlocksFieldsSelect; 'nested-arrays': NestedArraysSelect | NestedArraysSelect; 'nested-field-tables': NestedFieldTablesSelect | NestedFieldTablesSelect; + 'localized-drafts': LocalizedDraftsSelect | LocalizedDraftsSelect; users: UsersSelect | UsersSelect; 'localized-posts': LocalizedPostsSelect | LocalizedPostsSelect; 'no-localized-fields': NoLocalizedFieldsSelect | NoLocalizedFieldsSelect; @@ -316,6 +318,17 @@ export interface NestedFieldTable { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localized-drafts". + */ +export interface LocalizedDraft { + id: string; + title?: string | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users". @@ -695,6 +708,10 @@ export interface PayloadLockedDocument { relationTo: 'nested-field-tables'; value: string | NestedFieldTable; } | null) + | ({ + relationTo: 'localized-drafts'; + value: string | LocalizedDraft; + } | null) | ({ relationTo: 'users'; value: string | User; @@ -924,6 +941,16 @@ export interface NestedFieldTablesSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localized-drafts_select". + */ +export interface LocalizedDraftsSelect { + title?: T; + updatedAt?: T; + createdAt?: T; + _status?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users_select". diff --git a/test/localization/shared.ts b/test/localization/shared.ts index 2dd6856466..747d755b18 100644 --- a/test/localization/shared.ts +++ b/test/localization/shared.ts @@ -16,6 +16,8 @@ export const withLocalizedRelSlug = 'with-localized-relationship' export const relationshipLocalizedSlug = 'relationship-localized' export const withRequiredLocalizedFields = 'localized-required' export const localizedSortSlug = 'localized-sort' + +export const localizedDraftsSlug = 'localized-drafts' export const usersSlug = 'users' export const blocksWithLocalizedSameName = 'blocks-same-name' export const cannotCreateDefaultLocale = 'cannot-create-default-locale' From 96d1d90e78894dc53a23b6999216b2d7292731cb Mon Sep 17 00:00:00 2001 From: Patrik Date: Fri, 28 Feb 2025 12:47:02 -0500 Subject: [PATCH 040/127] fix(ui): use full image url for upload previews instead of thumbnail url (#11435) --- .../ui/src/fields/Upload/HasMany/index.tsx | 17 ++++- .../ui/src/fields/Upload/HasOne/index.tsx | 21 +++-- .../Upload/RelationshipContent/index.tsx | 4 +- test/uploads/collections/Upload1/index.ts | 11 +++ test/uploads/e2e.spec.ts | 66 ++++++++++++++++ test/uploads/payload-types.ts | 76 ++++++++++--------- 6 files changed, 149 insertions(+), 46 deletions(-) diff --git a/packages/ui/src/fields/Upload/HasMany/index.tsx b/packages/ui/src/fields/Upload/HasMany/index.tsx index bd2aacbd4f..ef747f5d3c 100644 --- a/packages/ui/src/fields/Upload/HasMany/index.tsx +++ b/packages/ui/src/fields/Upload/HasMany/index.tsx @@ -67,14 +67,22 @@ export function UploadComponentHasMany(props: Props) { > {fileDocs.map(({ relationTo, value }, index) => { const id = String(value.id) - const url: string = value.thumbnailURL || value.url let src: string + let thumbnailSrc: string - if (url) { + if (value.url) { try { - src = new URL(url, serverURL).toString() + src = new URL(value.url, serverURL).toString() } catch { - src = `${serverURL}${url}` + src = `${serverURL}${value.url}` + } + } + + if (value.thumbnailURL) { + try { + thumbnailSrc = new URL(value.thumbnailURL, serverURL).toString() + } catch { + thumbnailSrc = `${serverURL}${value.thumbnailURL}` } } @@ -118,6 +126,7 @@ export function UploadComponentHasMany(props: Props) { onRemove={() => removeItem(index)} reloadDoc={reloadDoc} src={src} + thumbnailSrc={thumbnailSrc || src} withMeta={false} x={value?.width as number} y={value?.height as number} diff --git a/packages/ui/src/fields/Upload/HasOne/index.tsx b/packages/ui/src/fields/Upload/HasOne/index.tsx index a5d805c360..a808656f1c 100644 --- a/packages/ui/src/fields/Upload/HasOne/index.tsx +++ b/packages/ui/src/fields/Upload/HasOne/index.tsx @@ -29,13 +29,23 @@ export function UploadComponentHasOne(props: Props) { const { relationTo, value } = fileDoc const id = String(value?.id) - const url: string = value.thumbnailURL || value.url let src: string + let thumbnailSrc: string - try { - src = new URL(url, serverURL).toString() - } catch { - src = `${serverURL}${url}` + if (value.url) { + try { + src = new URL(value.url, serverURL).toString() + } catch { + src = `${serverURL}${value.url}` + } + } + + if (value.thumbnailURL) { + try { + thumbnailSrc = new URL(value.thumbnailURL, serverURL).toString() + } catch { + thumbnailSrc = `${serverURL}${value.thumbnailURL}` + } } return ( @@ -52,6 +62,7 @@ export function UploadComponentHasOne(props: Props) { onRemove={onRemove} reloadDoc={reloadDoc} src={src} + thumbnailSrc={thumbnailSrc || src} x={value?.width as number} y={value?.height as number} /> diff --git a/packages/ui/src/fields/Upload/RelationshipContent/index.tsx b/packages/ui/src/fields/Upload/RelationshipContent/index.tsx index ec6bbf64f4..6a2a805076 100644 --- a/packages/ui/src/fields/Upload/RelationshipContent/index.tsx +++ b/packages/ui/src/fields/Upload/RelationshipContent/index.tsx @@ -27,6 +27,7 @@ type Props = { readonly onRemove: () => void readonly reloadDoc: ReloadDoc readonly src: string + readonly thumbnailSrc: string readonly withMeta?: boolean readonly x?: number readonly y?: number @@ -45,6 +46,7 @@ export function RelationshipContent(props: Props) { onRemove, reloadDoc, src, + thumbnailSrc, withMeta = true, x, y, @@ -86,7 +88,7 @@ export function RelationshipContent(props: Props) { alt={alt} className={`${baseClass}__thumbnail`} filename={filename} - fileSrc={src} + fileSrc={thumbnailSrc} size="small" />
diff --git a/test/uploads/collections/Upload1/index.ts b/test/uploads/collections/Upload1/index.ts index bc6580611e..c6d327fde9 100644 --- a/test/uploads/collections/Upload1/index.ts +++ b/test/uploads/collections/Upload1/index.ts @@ -41,6 +41,17 @@ export const Uploads1: CollectionConfig = { }, }, }, + { + type: 'upload', + name: 'hasManyThumbnailUpload', + relationTo: 'admin-thumbnail-size', + hasMany: true, + }, + { + type: 'upload', + name: 'singleThumbnailUpload', + relationTo: 'admin-thumbnail-size', + }, { type: 'richText', name: 'richText', diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index c8b7c4d1cd..6d1032b9cc 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -696,6 +696,72 @@ describe('Uploads', () => { await expect(clientText).toHaveText('This text was rendered on the client') }) + test('should show original image url on a single upload card for an upload with adminThumbnail defined', async () => { + await page.goto(uploadsOne.create) + + const singleThumbnailButton = page.locator('#field-singleThumbnailUpload button', { + hasText: exactText('Create New'), + }) + + await singleThumbnailButton.click() + + const singleThumbnailModal = page.locator('[id^="doc-drawer_admin-thumbnail-size"]') + await expect(singleThumbnailModal).toBeVisible() + + await page.setInputFiles( + '[id^="doc-drawer_admin-thumbnail-size"] input[type="file"]', + path.resolve(dirname, './test-image.png'), + ) + const filename = page.locator('[id^="doc-drawer_admin-thumbnail-size"] .file-field__filename') + await expect(filename).toHaveValue('test-image.png') + + await page.waitForSelector('[id^="doc-drawer_admin-thumbnail-size"] #action-save') + await page.locator('[id^="doc-drawer_admin-thumbnail-size"] #action-save').click() + + await expect(page.locator('.payload-toast-container')).toContainText('successfully') + + const href = await page.locator('#field-singleThumbnailUpload a').getAttribute('href') + + // Ensure the URL starts correctly + expect(href).toMatch(/^\/api\/admin-thumbnail-size\/file\/test-image(-\d+)?\.png$/i) + + // Ensure no "-100x100" or any similar suffix + expect(href).not.toMatch(/-\d+x\d+\.png$/) + }) + + test('should show original image url on a hasMany upload card for an upload with adminThumbnail defined', async () => { + await page.goto(uploadsOne.create) + + const hasManyThumbnailButton = page.locator('#field-hasManyThumbnailUpload button', { + hasText: exactText('Create New'), + }) + await hasManyThumbnailButton.click() + + const hasManyThumbnailModal = page.locator('#bulk-upload-drawer-slug-1') + await expect(hasManyThumbnailModal).toBeVisible() + + await page.setInputFiles('#bulk-upload-drawer-slug-1 .dropzone input[type="file"]', [ + path.resolve(dirname, './test-image.png'), + ]) + + const saveButton = page.locator('.bulk-upload--actions-bar__saveButtons button') + await saveButton.click() + + await page.waitForSelector('#field-hasManyThumbnailUpload .upload--has-many__dragItem') + const itemCount = await page + .locator('#field-hasManyThumbnailUpload .upload--has-many__dragItem') + .count() + expect(itemCount).toEqual(1) + + await page.waitForSelector('#field-hasManyThumbnailUpload .upload--has-many__dragItem a') + const href = await page + .locator('#field-hasManyThumbnailUpload .upload--has-many__dragItem a') + .getAttribute('href') + + expect(href).toMatch(/^\/api\/admin-thumbnail-size\/file\/test-image(-\d+)?\.png$/i) + expect(href).not.toMatch(/-\d+x\d+\.png$/) + }) + describe('bulk uploads', () => { test('should bulk upload multiple files', async () => { // Navigate to the upload creation page diff --git a/test/uploads/payload-types.ts b/test/uploads/payload-types.ts index 038b568d30..1956fbcdba 100644 --- a/test/uploads/payload-types.ts +++ b/test/uploads/payload-types.ts @@ -1002,6 +1002,8 @@ export interface Uploads1 { id: string; hasManyUpload?: (string | Uploads2)[] | null; singleUpload?: (string | null) | Uploads2; + hasManyThumbnailUpload?: (string | AdminThumbnailSize)[] | null; + singleThumbnailUpload?: (string | null) | AdminThumbnailSize; richText?: { root: { type: string; @@ -1049,42 +1051,6 @@ export interface Uploads2 { focalX?: number | null; focalY?: number | null; } -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "admin-thumbnail-function". - */ -export interface AdminThumbnailFunction { - id: string; - updatedAt: string; - createdAt: string; - url?: string | null; - thumbnailURL?: string | null; - filename?: string | null; - mimeType?: string | null; - filesize?: number | null; - width?: number | null; - height?: number | null; - focalX?: number | null; - focalY?: number | null; -} -/** - * This interface was referenced by `Config`'s JSON-Schema - * via the `definition` "admin-thumbnail-with-search-queries". - */ -export interface AdminThumbnailWithSearchQuery { - id: string; - updatedAt: string; - createdAt: string; - url?: string | null; - thumbnailURL?: string | null; - filename?: string | null; - mimeType?: string | null; - filesize?: number | null; - width?: number | null; - height?: number | null; - focalX?: number | null; - focalY?: number | null; -} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "admin-thumbnail-size". @@ -1121,6 +1087,42 @@ export interface AdminThumbnailSize { }; }; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "admin-thumbnail-function". + */ +export interface AdminThumbnailFunction { + id: string; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "admin-thumbnail-with-search-queries". + */ +export interface AdminThumbnailWithSearchQuery { + id: string; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "optional-file". @@ -2344,6 +2346,8 @@ export interface ExternallyServedMediaSelect { export interface Uploads1Select { hasManyUpload?: T; singleUpload?: T; + hasManyThumbnailUpload?: T; + singleThumbnailUpload?: T; richText?: T; updatedAt?: T; createdAt?: T; From 38131ed2c360df5c15a2412435d00f30b0beba39 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 10:58:43 -0700 Subject: [PATCH 041/127] feat: ability to cancel jobs (#11409) This adds new `payload.jobs.cancel` and `payload.jobs.cancelByID` methods that allow you to cancel already-running jobs, or prevent queued jobs from running. While it's not possible to cancel a function mid-execution, this will stop job execution the next time the job makes a request to the db, which happens after every task. --- docs/jobs-queue/jobs.mdx | 28 +++++ .../src/queues/config/jobsCollection.ts | 15 +++ packages/payload/src/queues/localAPI.ts | 117 +++++++++++++++--- .../runJobs/runJob/getRunTaskFunction.ts | 2 +- .../runJobs/runJob/getUpdateJobFunction.ts | 4 + test/queues/config.ts | 2 + test/queues/int.spec.ts | 73 +++++++++++ test/queues/payload-types.ts | 9 ++ test/queues/workflows/longRunning.ts | 22 ++++ 9 files changed, 256 insertions(+), 16 deletions(-) create mode 100644 test/queues/workflows/longRunning.ts diff --git a/docs/jobs-queue/jobs.mdx b/docs/jobs-queue/jobs.mdx index 3824504976..2ecc1125a7 100644 --- a/docs/jobs-queue/jobs.mdx +++ b/docs/jobs-queue/jobs.mdx @@ -44,3 +44,31 @@ const createdJob = await payload.jobs.queue({ }, }) ``` + +#### Cancelling Jobs + +Payload allows you to cancel jobs that are either queued or currently running. When cancelling a running job, the current task will finish executing, but no subsequent tasks will run. This happens because the job checks its cancellation status between tasks. + +##### Cancel a Single Job + +To cancel a specific job, use the `payload.jobs.cancelByID` method with the job's ID: + +```ts +await payload.jobs.cancelByID({ + id: createdJob.id, +}) +``` + +##### Cancel Multiple Jobs + +To cancel multiple jobs at once, use the `payload.jobs.cancel` method with a `Where` query: + +```ts +await payload.jobs.cancel({ + where: { + workflowSlug: { + equals: 'createPost', + }, + }, +}) +``` diff --git a/packages/payload/src/queues/config/jobsCollection.ts b/packages/payload/src/queues/config/jobsCollection.ts index 87fcd1ffe5..545a16bd80 100644 --- a/packages/payload/src/queues/config/jobsCollection.ts +++ b/packages/payload/src/queues/config/jobsCollection.ts @@ -221,6 +221,21 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu return doc }, ], + /** + * If another update comes in after a job as already been cancelled, we need to make sure that update doesn't + * change the state of the job. + */ + beforeChange: [ + ({ data, originalDoc }) => { + if (originalDoc?.error?.cancelled) { + data.processing = false + data.hasError = true + delete data.completedAt + delete data.waitUntil + } + return data + }, + ], }, lockDocuments: false, } diff --git a/packages/payload/src/queues/localAPI.ts b/packages/payload/src/queues/localAPI.ts index 6ef1d9cab1..0ecb0060ac 100644 --- a/packages/payload/src/queues/localAPI.ts +++ b/packages/payload/src/queues/localAPI.ts @@ -1,4 +1,3 @@ -// @ts-strict-ignore import type { BaseJob, RunningJobFromTask } from './config/types/workflowTypes.js' import { @@ -41,7 +40,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({ ? RunningJob : RunningJobFromTask > => { - let queue: string + let queue: string | undefined = undefined // If user specifies queue, use that if (args.queue) { @@ -55,15 +54,26 @@ export const getJobsLocalAPI = (payload: Payload) => ({ } } + const data: Partial = { + input: args.input, + } + + if (queue) { + data.queue = queue + } + if (args.waitUntil) { + data.waitUntil = args.waitUntil?.toISOString() + } + if (args.workflow) { + data.workflowSlug = args.workflow as string + } + if (args.task) { + data.taskSlug = args.task as string + } + return (await payload.create({ collection: 'payload-jobs', - data: { - input: args.input, - queue, - taskSlug: 'task' in args ? args.task : undefined, - waitUntil: args.waitUntil?.toISOString() ?? undefined, - workflowSlug: 'workflow' in args ? args.workflow : undefined, - } as BaseJob, + data, req: args.req, })) as TTaskOrWorkflowSlug extends keyof TypedJobs['workflows'] ? RunningJob @@ -78,14 +88,14 @@ export const getJobsLocalAPI = (payload: Payload) => ({ where?: Where }): Promise> => { const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload)) - const result = await runJobs({ + + return await runJobs({ limit: args?.limit, overrideAccess: args?.overrideAccess !== false, queue: args?.queue, req: newReq, where: args?.where, }) - return result }, runByID: async (args: { @@ -93,12 +103,89 @@ export const getJobsLocalAPI = (payload: Payload) => ({ overrideAccess?: boolean req?: PayloadRequest }): Promise> => { - const newReq: PayloadRequest = args?.req ?? (await createLocalReq({}, payload)) - const result = await runJobs({ + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + return await runJobs({ id: args.id, - overrideAccess: args?.overrideAccess !== false, + overrideAccess: args.overrideAccess !== false, + req: newReq, + }) + }, + + cancel: async (args: { + overrideAccess?: boolean + queue?: string + req?: PayloadRequest + where: Where + }): Promise => { + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + const and: Where[] = [ + args.where, + { + completedAt: { + exists: false, + }, + }, + { + hasError: { + not_equals: true, + }, + }, + ] + + if (args.queue) { + and.push({ + queue: { + equals: args.queue, + }, + }) + } + + await payload.db.updateMany({ + collection: 'payload-jobs', + data: { + completedAt: null, + error: { + cancelled: true, + }, + hasError: true, + processing: false, + waitUntil: null, + } as Partial< + { + completedAt: null + waitUntil: null + } & BaseJob + >, + req: newReq, + where: { and }, + }) + }, + + cancelByID: async (args: { + id: number | string + overrideAccess?: boolean + req?: PayloadRequest + }): Promise => { + const newReq: PayloadRequest = args.req ?? (await createLocalReq({}, payload)) + + await payload.db.updateOne({ + id: args.id, + collection: 'payload-jobs', + data: { + completedAt: null, + error: { + cancelled: true, + }, + hasError: true, + processing: false, + waitUntil: null, + } as { + completedAt: null + waitUntil: null + } & BaseJob, req: newReq, }) - return result }, }) diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts index 9feea2fa13..eb4be61d77 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getRunTaskFunction.ts @@ -264,7 +264,7 @@ export const getRunTaskFunction = ( processing: false, }) - return + throw new Error(errorMessage) } let maxRetries: number | undefined = finalRetriesConfig?.attempts diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts index 9bfa8f71e2..7390dcc9ca 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts @@ -19,6 +19,10 @@ export function getUpdateJobFunction(job: BaseJob, req: PayloadRequest): UpdateJ job[key] = updatedJob[key] } + if ((updatedJob.error as any)?.cancelled) { + throw new Error('Job cancelled') + } + return updatedJob } } diff --git a/test/queues/config.ts b/test/queues/config.ts index ac886e2bf4..6ca475f3bf 100644 --- a/test/queues/config.ts +++ b/test/queues/config.ts @@ -10,6 +10,7 @@ import { updatePostStep1, updatePostStep2 } from './runners/updatePost.js' import { clearAndSeedEverything } from './seed.js' import { externalWorkflow } from './workflows/externalWorkflow.js' import { inlineTaskTestWorkflow } from './workflows/inlineTaskTest.js' +import { longRunningWorkflow } from './workflows/longRunning.js' import { noRetriesSetWorkflow } from './workflows/noRetriesSet.js' import { retries0Workflow } from './workflows/retries0.js' import { retriesBackoffTestWorkflow } from './workflows/retriesBackoffTest.js' @@ -378,6 +379,7 @@ export default buildConfigWithDefaults({ retriesBackoffTestWorkflow, subTaskWorkflow, subTaskFailsWorkflow, + longRunningWorkflow, ], }, editor: lexicalEditor(), diff --git a/test/queues/int.spec.ts b/test/queues/int.spec.ts index 7dd030b9c4..13818e1081 100644 --- a/test/queues/int.spec.ts +++ b/test/queues/int.spec.ts @@ -1129,6 +1129,79 @@ describe('Queues', () => { expect(jobAfterRun.input.amountTask1Retried).toBe(0) }) + + it('ensure jobs can be cancelled using payload.jobs.cancelByID', async () => { + payload.config.jobs.deleteJobOnComplete = false + + const job = await payload.jobs.queue({ + workflow: 'longRunning', + input: {}, + }) + void payload.jobs.run().catch((_ignored) => {}) + await new Promise((resolve) => setTimeout(resolve, 1000)) + + // Should be in processing - cancel job + await payload.jobs.cancelByID({ + id: job.id, + }) + + // Wait 4 seconds. This ensures that the job has enough time to finish + // if it hadn't been cancelled. That way we can be sure that the job was + // actually cancelled. + await new Promise((resolve) => setTimeout(resolve, 4000)) + + // Ensure job is not completed and cancelled + const jobAfterRun = await payload.findByID({ + collection: 'payload-jobs', + id: job.id, + depth: 0, + }) + + expect(Boolean(jobAfterRun.completedAt)).toBe(false) + expect(jobAfterRun.hasError).toBe(true) + // @ts-expect-error error is not typed + expect(jobAfterRun.error?.cancelled).toBe(true) + expect(jobAfterRun.processing).toBe(false) + }) + + it('ensure jobs can be cancelled using payload.jobs.cancel', async () => { + payload.config.jobs.deleteJobOnComplete = false + + const job = await payload.jobs.queue({ + workflow: 'longRunning', + input: {}, + }) + void payload.jobs.run().catch((_ignored) => {}) + await new Promise((resolve) => setTimeout(resolve, 1000)) + + // Cancel all jobs + await payload.jobs.cancel({ + where: { + id: { + exists: true, + }, + }, + }) + + // Wait 4 seconds. This ensures that the job has enough time to finish + // if it hadn't been cancelled. That way we can be sure that the job was + // actually cancelled. + await new Promise((resolve) => setTimeout(resolve, 4000)) + + // Ensure job is not completed and cancelled + const jobAfterRun = await payload.findByID({ + collection: 'payload-jobs', + id: job.id, + depth: 0, + }) + + expect(Boolean(jobAfterRun.completedAt)).toBe(false) + expect(jobAfterRun.hasError).toBe(true) + // @ts-expect-error error is not typed + expect(jobAfterRun.error?.cancelled).toBe(true) + expect(jobAfterRun.processing).toBe(false) + }) + it('can tasks throw error', async () => { payload.config.jobs.deleteJobOnComplete = false diff --git a/test/queues/payload-types.ts b/test/queues/payload-types.ts index abd3433930..5d34c054f3 100644 --- a/test/queues/payload-types.ts +++ b/test/queues/payload-types.ts @@ -123,6 +123,7 @@ export interface Config { retriesBackoffTest: WorkflowRetriesBackoffTest; subTask: WorkflowSubTask; subTaskFails: WorkflowSubTaskFails; + longRunning: WorkflowLongRunning; }; }; } @@ -308,6 +309,7 @@ export interface PayloadJob { | 'retriesBackoffTest' | 'subTask' | 'subTaskFails' + | 'longRunning' ) | null; taskSlug?: @@ -718,6 +720,13 @@ export interface WorkflowSubTaskFails { message: string; }; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "WorkflowLongRunning". + */ +export interface WorkflowLongRunning { + input?: unknown; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "auth". diff --git a/test/queues/workflows/longRunning.ts b/test/queues/workflows/longRunning.ts new file mode 100644 index 0000000000..34c0ce265c --- /dev/null +++ b/test/queues/workflows/longRunning.ts @@ -0,0 +1,22 @@ +import type { WorkflowConfig } from 'payload' + +/** + * Should finish after 2 seconds + */ +export const longRunningWorkflow: WorkflowConfig<'longRunning'> = { + slug: 'longRunning', + inputSchema: [], + handler: async ({ inlineTask }) => { + for (let i = 0; i < 4; i += 1) { + await inlineTask(String(i), { + task: async () => { + // Wait 500ms + await new Promise((resolve) => setTimeout(resolve, 500)) + return { + output: {}, + } + }, + }) + } + }, +} From 67c4a20237731ad97a87f38757064e3fad2b945a Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 28 Feb 2025 13:04:26 -0500 Subject: [PATCH 042/127] fix(next): properly instantiates req.url on localhost (#11455) The `req.url` property at the page level was not reflective of the actual URL on localhost. This was because we were passing an incompatible `url` override into `createLocalReq` (lacking protocol). This would silently fail to construct the URL object, ultimately losing the top-level domain on `req.url` as well as the port on `req.origin` (see #11454). Closes #11448. --- packages/next/src/utilities/initPage/index.ts | 5 ++--- packages/next/src/utilities/initReq.ts | 5 ++--- .../payload/src/utilities/createLocalReq.ts | 18 +++++++++++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/next/src/utilities/initPage/index.ts b/packages/next/src/utilities/initPage/index.ts index f0f6554d7f..6e47632d40 100644 --- a/packages/next/src/utilities/initPage/index.ts +++ b/packages/next/src/utilities/initPage/index.ts @@ -1,8 +1,7 @@ import type { InitPageResult, VisibleEntities } from 'payload' -import { headers as getHeaders } from 'next/headers.js' import { notFound } from 'next/navigation.js' -import { getPayload, isEntityHidden, parseCookies } from 'payload' +import { isEntityHidden } from 'payload' import * as qs from 'qs-esm' import type { Args } from './types.js' @@ -40,8 +39,8 @@ export const initPage = async ({ ignoreQueryPrefix: true, }), }, + urlSuffix: `${route}${searchParams ? queryString : ''}`, }, - urlSuffix: `${route}${searchParams ? queryString : ''}`, }) const { diff --git a/packages/next/src/utilities/initReq.ts b/packages/next/src/utilities/initReq.ts index 3ddf1eb7ce..140b21ee7c 100644 --- a/packages/next/src/utilities/initReq.ts +++ b/packages/next/src/utilities/initReq.ts @@ -53,13 +53,11 @@ export const initReq = async function ({ importMap, key, overrides, - urlSuffix, }: { configPromise: Promise | SanitizedConfig importMap: ImportMap key: string overrides?: Parameters[0] - urlSuffix?: string }): Promise { const headers = await getHeaders() const cookies = parseCookies(headers) @@ -96,6 +94,7 @@ export const initReq = async function ({ const { i18n, languageCode, payload, responseHeaders, user } = partialResult const { req: reqOverrides, ...optionsOverrides } = overrides || {} + const req = await createLocalReq( { req: { @@ -103,7 +102,6 @@ export const initReq = async function ({ host: headers.get('host'), i18n: i18n as I18n, responseHeaders, - url: `${payload.config.serverURL}${urlSuffix || ''}`, user, ...(reqOverrides || {}), }, @@ -115,6 +113,7 @@ export const initReq = async function ({ const locale = await getRequestLocale({ req, }) + req.locale = locale?.code const permissions = await getAccessResults({ diff --git a/packages/payload/src/utilities/createLocalReq.ts b/packages/payload/src/utilities/createLocalReq.ts index b1de9c28c5..9ee2a980bf 100644 --- a/packages/payload/src/utilities/createLocalReq.ts +++ b/packages/payload/src/utilities/createLocalReq.ts @@ -23,7 +23,7 @@ function getRequestContext( } } -const attachFakeURLProperties = (req: Partial) => { +const attachFakeURLProperties = (req: Partial, urlSuffix?: string) => { /** * *NOTE* * If no URL is provided, the local API was called outside @@ -38,13 +38,20 @@ const attachFakeURLProperties = (req: Partial) => { return urlObject } - const fallbackURL = `http://${req.host || 'localhost'}` + const fallbackURL = `http://${req.host || 'localhost'}${urlSuffix || ''}` - const urlToUse = req?.url || req.payload.config?.serverURL || fallbackURL + const urlToUse = + req?.url || req.payload.config?.serverURL + ? `${req.payload.config.serverURL}${urlSuffix || ''}` + : fallbackURL try { urlObject = new URL(urlToUse) } catch (_err) { + req.payload.logger.error( + `Failed to create URL object from URL: ${urlToUse}, falling back to ${fallbackURL}`, + ) + urlObject = new URL(fallbackURL) } @@ -85,13 +92,14 @@ type CreateLocalReq = ( fallbackLocale?: false | TypedLocale locale?: string req?: Partial + urlSuffix?: string user?: User }, payload: Payload, ) => Promise export const createLocalReq: CreateLocalReq = async ( - { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, user }, + { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, urlSuffix, user }, payload, ) => { const localization = payload.config?.localization @@ -131,7 +139,7 @@ export const createLocalReq: CreateLocalReq = async ( req.routeParams = req?.routeParams || {} req.query = req?.query || {} - attachFakeURLProperties(req) + attachFakeURLProperties(req, urlSuffix) return req as PayloadRequest } From 206b4b9d88ce5c215adefe7e4925ee2ab1fdf3a4 Mon Sep 17 00:00:00 2001 From: Adrian Maj Date: Fri, 28 Feb 2025 19:27:40 +0100 Subject: [PATCH 043/127] docs: broken ' char entity instead of ' in plugins/build-your-own (#11363) From fcaf59176df315630b32bd480a0ded307aa10134 Mon Sep 17 00:00:00 2001 From: Violet Rosenzweig Date: Fri, 28 Feb 2025 13:30:29 -0500 Subject: [PATCH 044/127] docs: custom auth strategy requires the collection slug in return value (#11327) --- docs/authentication/custom-strategies.mdx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/authentication/custom-strategies.mdx b/docs/authentication/custom-strategies.mdx index c8fdb2dbd6..f42973b358 100644 --- a/docs/authentication/custom-strategies.mdx +++ b/docs/authentication/custom-strategies.mdx @@ -62,9 +62,12 @@ export const Users: CollectionConfig = { }) return { - // Send the user back to authenticate, + // Send the user with the collection slug back to authenticate, // or send null if no user should be authenticated - user: usersQuery.docs[0] || null, + user: usersQuery.docs[0] ? { + collection: 'users' + ...usersQuery.docs[0], + } : null, // Optionally, you can return headers // that you'd like Payload to set here when From 77395b6483b66bc0a9fb214228a45370cc7d0040 Mon Sep 17 00:00:00 2001 From: Said Akhrarov <36972061+akhrarovsaid@users.noreply.github.com> Date: Fri, 28 Feb 2025 13:43:00 -0500 Subject: [PATCH 045/127] docs: adds info and example for headersWithCors (#11141) --- docs/rest-api/overview.mdx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/rest-api/overview.mdx b/docs/rest-api/overview.mdx index 64c038b992..11b7b2f747 100644 --- a/docs/rest-api/overview.mdx +++ b/docs/rest-api/overview.mdx @@ -703,6 +703,31 @@ import { addLocalesToRequestFromData } from 'payload' } ``` +`headersWithCors` + +By default, custom endpoints don't handle CORS headers in responses. The `headersWithCors` function checks the Payload config and sets the appropriate CORS headers in the response accordingly. + +```ts +import { headersWithCors } from 'payload' + +// custom endpoint example +{ + path: '/:id/tracking', + method: 'post', + handler: async (req) => { + return Response.json( + { message: 'success' }, + { + headers: headersWithCors({ + headers: new Headers(), + req, + }) + }, + ) + } +} +``` + ## Method Override for GET Requests Payload supports a method override feature that allows you to send GET requests using the HTTP POST method. This can be particularly useful in scenarios when the query string in a regular GET request is too long. From bef98c8d6ed3d4723f2217a1768c35ae4faa3b53 Mon Sep 17 00:00:00 2001 From: Said Akhrarov <36972061+akhrarovsaid@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:05:39 -0500 Subject: [PATCH 046/127] fix(ui): scope rah-static and progress-bar styles to payload-default layer (#11442) --- .../ui/src/elements/AnimateHeight/index.scss | 12 ++++--- .../RouteTransition/ProgressBar/index.scss | 36 ++++++++++--------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/packages/ui/src/elements/AnimateHeight/index.scss b/packages/ui/src/elements/AnimateHeight/index.scss index 72e908213e..9504eb2214 100644 --- a/packages/ui/src/elements/AnimateHeight/index.scss +++ b/packages/ui/src/elements/AnimateHeight/index.scss @@ -1,8 +1,10 @@ -.rah-static { - interpolate-size: allow-keywords; - height: 0; +@layer payload-default { + .rah-static { + interpolate-size: allow-keywords; + height: 0; - &--height-auto { - height: auto; + &--height-auto { + height: auto; + } } } diff --git a/packages/ui/src/providers/RouteTransition/ProgressBar/index.scss b/packages/ui/src/providers/RouteTransition/ProgressBar/index.scss index 376bdce01c..6b147f508f 100644 --- a/packages/ui/src/providers/RouteTransition/ProgressBar/index.scss +++ b/packages/ui/src/providers/RouteTransition/ProgressBar/index.scss @@ -1,21 +1,23 @@ -.progress-bar { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 2px; - z-index: 9999; - opacity: 1; +@layer payload-default { + .progress-bar { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 2px; + z-index: 9999; + opacity: 1; - &__progress { - height: 100%; - background-color: var(--theme-elevation-1000); - transition: width ease-in var(--transition-duration); - } + &__progress { + height: 100%; + background-color: var(--theme-elevation-1000); + transition: width ease-in var(--transition-duration); + } - &--fade-out { - opacity: 0; - transition: opacity linear var(--transition-duration); - transition-delay: var(--transition-duration); + &--fade-out { + opacity: 0; + transition: opacity linear var(--transition-duration); + transition-delay: var(--transition-duration); + } } } From 19b4ec2562d6ccf0efeef7981cb0c857c66649b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Li=C3=A8ge=20Arthur?= Date: Fri, 28 Feb 2025 20:18:54 +0100 Subject: [PATCH 047/127] docs: use local API to upload a local file (#10839) --- docs/upload/overview.mdx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index c37b669c98..aa88c68702 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -347,6 +347,32 @@ fetch('api/:upload-slug', { }) ``` +## Uploading Files stored locally + +If you want to upload a file stored on your machine directly using the `payload.create` method, for example, during a seed script, +you can use the `filePath` property to specify the local path of the file. + +```ts +const localFilePath = path.resolve(__dirname, filename) + +await payload.create({ + collection: 'media', + data: { + alt, + }, + filePath: localFilePath, +}) +``` + +The `data` property should still include all the required fields of your `media` collection. + + + **Important:** + + Remember that all custom hooks attached to the `media` collection will still trigger. + Ensure that files match the specified mimeTypes or sizes defined in the collection's `formatOptions` or custom `hooks`. + + ## Uploading Files from Remote URLs The `pasteURL` option allows users to fetch files from remote URLs by pasting them into an Upload field. This option is **enabled by default** and can be configured to either **allow unrestricted client-side fetching** or **restrict server-side fetching** to specific trusted domains. From 8b5bc3de33a013860e847e99355b135c5e241e21 Mon Sep 17 00:00:00 2001 From: nomad-dev <116424218+n0mad-d3v@users.noreply.github.com> Date: Fri, 28 Feb 2025 20:27:27 +0100 Subject: [PATCH 048/127] docs: fix method useAllFormFields on admin/hooks.mdx (#10935) --- docs/admin/react-hooks.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/react-hooks.mdx b/docs/admin/react-hooks.mdx index 391a584470..6a37767a9a 100644 --- a/docs/admin/react-hooks.mdx +++ b/docs/admin/react-hooks.mdx @@ -135,7 +135,7 @@ const ExampleComponent: React.FC = () => { #### Updating other fields' values -If you are building a Custom Component, then you should use `setValue` which is returned from the `useField` hook to programmatically set your field's value. But if you're looking to update _another_ field's value, you can use `dispatchFields` returned from `useFormFields`. +If you are building a Custom Component, then you should use `setValue` which is returned from the `useField` hook to programmatically set your field's value. But if you're looking to update _another_ field's value, you can use `dispatchFields` returned from `useAllFormFields`. You can send the following actions to the `dispatchFields` function. From d4d2bf4617f839c4654927af9683c659dac090b5 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Fri, 28 Feb 2025 21:30:00 +0200 Subject: [PATCH 049/127] perf(db-mongodb): faster join field aggregation by replacing `mongoose-aggregate-paginate-v2` with a custom implementation (#10936) Fixes https://github.com/payloadcms/payload/discussions/10165#discussioncomment-12034047 As described in the discussion, we have an incorrect order of aggregation pipeline when using aggregations with the join field. We must use `$sort`, `$skip`, `$limit` before the `$lookup` or otherwise mongodb scans all the docs, applies `$lookup` for them and only after applies `$limit`, `$skip`. Replaces `mongoose-aggregate-paginate-v2` with a custom `aggregatePaginate` because we need a custom solution here. This was considered in https://github.com/payloadcms/payload/pull/9594 but it was reverted as for now. Fixes https://github.com/payloadcms/payload/issues/11187 --- packages/db-mongodb/package.json | 2 - packages/db-mongodb/src/find.ts | 16 ++- packages/db-mongodb/src/findOne.ts | 14 ++- packages/db-mongodb/src/index.ts | 5 +- packages/db-mongodb/src/init.ts | 11 +- .../src/models/buildCollectionSchema.ts | 8 -- packages/db-mongodb/src/queryDrafts.ts | 19 +++- packages/db-mongodb/src/types.ts | 14 +-- .../src/utilities/aggregatePaginate.ts | 104 ++++++++++++++++++ .../src/utilities/buildJoinAggregation.ts | 26 +---- pnpm-lock.yaml | 29 ----- 11 files changed, 156 insertions(+), 92 deletions(-) create mode 100644 packages/db-mongodb/src/utilities/aggregatePaginate.ts diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index a297aad66a..95af5b604f 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -47,14 +47,12 @@ }, "dependencies": { "mongoose": "8.9.5", - "mongoose-aggregate-paginate-v2": "1.1.2", "mongoose-paginate-v2": "1.8.5", "prompts": "2.4.2", "uuid": "10.0.0" }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", - "@types/mongoose-aggregate-paginate-v2": "1.0.12", "mongodb": "6.12.0", "mongodb-memory-server": "^10", "payload": "workspace:*" diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index 65f556ec33..e9886cc2b6 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -7,6 +7,7 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' import { getSession } from './utilities/getSession.js' @@ -128,7 +129,20 @@ export const find: Find = async function find( }) // build join aggregation if (aggregate) { - result = await Model.aggregatePaginate(Model.aggregate(aggregate), paginationOptions) + result = await aggregatePaginate({ + adapter: this, + collation: paginationOptions.collation, + joinAggregation: aggregate, + limit: paginationOptions.limit, + Model, + page: paginationOptions.page, + pagination: paginationOptions.pagination, + projection: paginationOptions.projection, + query, + session: paginationOptions.options?.session, + sort: paginationOptions.sort as object, + useEstimatedCount: paginationOptions.useEstimatedCount, + }) } else { result = await Model.paginate(query, paginationOptions) } diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index 7fec58d949..ae69e78779 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -4,6 +4,7 @@ import type { FindOne } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' import { getSession } from './utilities/getSession.js' @@ -40,7 +41,6 @@ export const findOne: FindOne = async function findOne( collection, collectionConfig, joins, - limit: 1, locale, projection, query, @@ -48,7 +48,17 @@ export const findOne: FindOne = async function findOne( let doc if (aggregate) { - ;[doc] = await Model.aggregate(aggregate, { session }) + const { docs } = await aggregatePaginate({ + adapter: this, + joinAggregation: aggregate, + limit: 1, + Model, + pagination: false, + projection, + query, + session, + }) + doc = docs[0] } else { ;(options as Record).projection = projection doc = await Model.findOne(query, {}, options) diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 0e9a4e2786..93d87a653a 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -92,7 +92,10 @@ export interface Args { /** Extra configuration options */ connectOptions?: { - /** Set false to disable $facet aggregation in non-supporting databases, Defaults to true */ + /** + * Set false to disable $facet aggregation in non-supporting databases, Defaults to true + * @deprecated Payload doesn't use `$facet` anymore anywhere. + */ useFacet?: boolean } & ConnectOptions /** Set to true to disable hinting to MongoDB to use 'id' as index. This is currently done when counting documents for pagination. Disabling this optimization might fix some problems with AWS DocumentDB. Defaults to false */ diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index de82610f2b..d7b8e144f2 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -2,7 +2,6 @@ import type { PaginateOptions } from 'mongoose' import type { Init, SanitizedCollectionConfig } from 'payload' import mongoose from 'mongoose' -import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2' import paginate from 'mongoose-paginate-v2' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' @@ -48,10 +47,6 @@ export const init: Init = function init(this: MongooseAdapter) { }), ) - if (Object.keys(collection.joins).length > 0) { - versionSchema.plugin(mongooseAggregatePaginate) - } - const versionCollectionName = this.autoPluralization === true && !collection.dbName ? undefined : versionModelName @@ -59,14 +54,14 @@ export const init: Init = function init(this: MongooseAdapter) { versionModelName, versionSchema, versionCollectionName, - ) as CollectionModel + ) as unknown as CollectionModel } const modelName = getDBName({ config: collection }) const collectionName = this.autoPluralization === true && !collection.dbName ? undefined : modelName - this.collections[collection.slug] = mongoose.model( + this.collections[collection.slug] = mongoose.model( modelName, schema, collectionName, @@ -101,7 +96,7 @@ export const init: Init = function init(this: MongooseAdapter) { }), ) - this.versions[global.slug] = mongoose.model( + this.versions[global.slug] = mongoose.model( versionModelName, versionSchema, versionModelName, diff --git a/packages/db-mongodb/src/models/buildCollectionSchema.ts b/packages/db-mongodb/src/models/buildCollectionSchema.ts index da3c40df50..2e182afb5b 100644 --- a/packages/db-mongodb/src/models/buildCollectionSchema.ts +++ b/packages/db-mongodb/src/models/buildCollectionSchema.ts @@ -1,7 +1,6 @@ import type { PaginateOptions, Schema } from 'mongoose' import type { Payload, SanitizedCollectionConfig } from 'payload' -import mongooseAggregatePaginate from 'mongoose-aggregate-paginate-v2' import paginate from 'mongoose-paginate-v2' import { getBuildQueryPlugin } from '../queries/getBuildQueryPlugin.js' @@ -44,12 +43,5 @@ export const buildCollectionSchema = ( .plugin(paginate, { useEstimatedCount: true }) .plugin(getBuildQueryPlugin({ collectionSlug: collection.slug })) - if ( - Object.keys(collection.joins).length > 0 || - Object.keys(collection.polymorphicJoins).length > 0 - ) { - schema.plugin(mongooseAggregatePaginate) - } - return schema } diff --git a/packages/db-mongodb/src/queryDrafts.ts b/packages/db-mongodb/src/queryDrafts.ts index 1a8ba6269b..0b1e395e99 100644 --- a/packages/db-mongodb/src/queryDrafts.ts +++ b/packages/db-mongodb/src/queryDrafts.ts @@ -7,6 +7,7 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' +import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' import { getSession } from './utilities/getSession.js' @@ -116,10 +117,20 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( // build join aggregation if (aggregate) { - result = await VersionModel.aggregatePaginate( - VersionModel.aggregate(aggregate), - paginationOptions, - ) + result = await aggregatePaginate({ + adapter: this, + collation: paginationOptions.collation, + joinAggregation: aggregate, + limit: paginationOptions.limit, + Model: VersionModel, + page: paginationOptions.page, + pagination: paginationOptions.pagination, + projection: paginationOptions.projection, + query: versionQuery, + session: paginationOptions.options?.session, + sort: paginationOptions.sort as object, + useEstimatedCount: paginationOptions.useEstimatedCount, + }) } else { result = await VersionModel.paginate(versionQuery, paginationOptions) } diff --git a/packages/db-mongodb/src/types.ts b/packages/db-mongodb/src/types.ts index b521efd8a2..f1b130631e 100644 --- a/packages/db-mongodb/src/types.ts +++ b/packages/db-mongodb/src/types.ts @@ -1,12 +1,5 @@ import type { ClientSession } from 'mongodb' -import type { - AggregatePaginateModel, - IndexDefinition, - IndexOptions, - Model, - PaginateModel, - SchemaOptions, -} from 'mongoose' +import type { IndexDefinition, IndexOptions, Model, PaginateModel, SchemaOptions } from 'mongoose' import type { ArrayField, BlocksField, @@ -37,10 +30,7 @@ import type { import type { BuildQueryArgs } from './queries/getBuildQueryPlugin.js' -export interface CollectionModel - extends Model, - PaginateModel, - AggregatePaginateModel { +export interface CollectionModel extends Model, PaginateModel { /** buildQuery is used to transform payload's where operator into what can be used by mongoose (e.g. id => _id) */ buildQuery: (args: BuildQueryArgs) => Promise> // TODO: Delete this } diff --git a/packages/db-mongodb/src/utilities/aggregatePaginate.ts b/packages/db-mongodb/src/utilities/aggregatePaginate.ts new file mode 100644 index 0000000000..b2b6ae3c50 --- /dev/null +++ b/packages/db-mongodb/src/utilities/aggregatePaginate.ts @@ -0,0 +1,104 @@ +import type { CollationOptions } from 'mongodb' +import type { ClientSession, Model, PipelineStage } from 'mongoose' +import type { PaginatedDocs } from 'payload' + +import type { MongooseAdapter } from '../index.js' + +export const aggregatePaginate = async ({ + adapter, + collation, + joinAggregation, + limit, + Model, + page, + pagination, + projection, + query, + session, + sort, + useEstimatedCount, +}: { + adapter: MongooseAdapter + collation?: CollationOptions + joinAggregation?: PipelineStage[] + limit?: number + Model: Model + page?: number + pagination?: boolean + projection?: Record + query: Record + session?: ClientSession + sort?: object + useEstimatedCount?: boolean +}): Promise> => { + const aggregation: PipelineStage[] = [{ $match: query }] + + if (sort) { + const $sort: Record = {} + + Object.entries(sort).forEach(([key, value]) => { + $sort[key] = value === 'desc' ? -1 : 1 + }) + + aggregation.push({ $sort }) + } + + if (page) { + aggregation.push({ $skip: (page - 1) * (limit ?? 0) }) + } + + if (limit) { + aggregation.push({ $limit: limit }) + } + + if (joinAggregation) { + for (const stage of joinAggregation) { + aggregation.push(stage) + } + } + + if (projection) { + aggregation.push({ $project: projection }) + } + + let countPromise: Promise = Promise.resolve(null) + + if (pagination !== false && limit) { + if (useEstimatedCount) { + countPromise = Model.estimatedDocumentCount(query) + } else { + const hint = adapter.disableIndexHints !== true ? { _id: 1 } : undefined + countPromise = Model.countDocuments(query, { collation, hint, session }) + } + } + + const [docs, countResult] = await Promise.all([ + Model.aggregate(aggregation, { collation, session }), + countPromise, + ]) + + const count = countResult === null ? docs.length : countResult + + const totalPages = + pagination !== false && typeof limit === 'number' && limit !== 0 ? Math.ceil(count / limit) : 1 + + const hasPrevPage = pagination !== false && page > 1 + const hasNextPage = pagination !== false && totalPages > page + const pagingCounter = + pagination !== false && typeof limit === 'number' ? (page - 1) * limit + 1 : 1 + + const result: PaginatedDocs = { + docs, + hasNextPage, + hasPrevPage, + limit, + nextPage: hasNextPage ? page + 1 : null, + page, + pagingCounter, + prevPage: hasPrevPage ? page - 1 : null, + totalDocs: count, + totalPages, + } + + return result +} diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 85f2355bdb..4e60bd6755 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -19,8 +19,6 @@ type BuildJoinAggregationArgs = { collection: CollectionSlug collectionConfig: SanitizedCollectionConfig joins: JoinQuery - // the number of docs to get at the top collection level - limit?: number locale: string projection?: Record // the where clause for the top collection @@ -34,10 +32,8 @@ export const buildJoinAggregation = async ({ collection, collectionConfig, joins, - limit, locale, projection, - query, versions, }: BuildJoinAggregationArgs): Promise => { if ( @@ -49,24 +45,8 @@ export const buildJoinAggregation = async ({ } const joinConfig = adapter.payload.collections[collection].config.joins + const aggregate: PipelineStage[] = [] const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins - const aggregate: PipelineStage[] = [ - { - $sort: { createdAt: -1 }, - }, - ] - - if (query) { - aggregate.push({ - $match: query, - }) - } - - if (limit) { - aggregate.push({ - $limit: limit, - }) - } for (const join of polymorphicJoinsConfig) { if (projection && !projection[join.joinPath]) { @@ -448,9 +428,5 @@ export const buildJoinAggregation = async ({ } } - if (projection) { - aggregate.push({ $project: projection }) - } - return aggregate } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28536d68aa..88445dc6b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -251,9 +251,6 @@ importers: mongoose: specifier: 8.9.5 version: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) - mongoose-aggregate-paginate-v2: - specifier: 1.1.2 - version: 1.1.2 mongoose-paginate-v2: specifier: 1.8.5 version: 1.8.5 @@ -267,9 +264,6 @@ importers: '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config - '@types/mongoose-aggregate-paginate-v2': - specifier: 1.0.12 - version: 1.0.12(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) mongodb: specifier: 6.12.0 version: 6.12.0(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) @@ -5355,9 +5349,6 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/mongoose-aggregate-paginate-v2@1.0.12': - resolution: {integrity: sha512-wL8pgJQxqJagv5f5mR7aI8WgUu22nS6rVLoJm71W2Uu+iKfS8jgph2rRLfXrjo+dFt1s7ik5Zl+uGZ4f5GM6Vw==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -8353,10 +8344,6 @@ packages: socks: optional: true - mongoose-aggregate-paginate-v2@1.1.2: - resolution: {integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==} - engines: {node: '>=4.0.0'} - mongoose-paginate-v2@1.8.5: resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} engines: {node: '>=4.0.0'} @@ -14808,20 +14795,6 @@ snapshots: '@types/minimist@1.2.5': {} - '@types/mongoose-aggregate-paginate-v2@1.0.12(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3)': - dependencies: - '@types/node': 22.5.4 - mongoose: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) - transitivePeerDependencies: - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - gcp-metadata - - kerberos - - mongodb-client-encryption - - snappy - - socks - - supports-color - '@types/ms@0.7.34': {} '@types/mysql@2.15.26': @@ -18496,8 +18469,6 @@ snapshots: '@aws-sdk/credential-providers': 3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)) socks: 2.8.3 - mongoose-aggregate-paginate-v2@1.1.2: {} - mongoose-paginate-v2@1.8.5: {} mongoose@8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3): From 9bb89b7b52d69fc8f90de5b7f88ce537c0f0a018 Mon Sep 17 00:00:00 2001 From: Mike Newberry <152027074+MikeNewXYZ@users.noreply.github.com> Date: Fri, 28 Feb 2025 19:31:57 +0000 Subject: [PATCH 050/127] feat(ui): close the nav when the user navigates away on small screens (#10932) --- packages/ui/src/elements/Nav/context.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/elements/Nav/context.tsx b/packages/ui/src/elements/Nav/context.tsx index c074c285f8..a778c5cd8d 100644 --- a/packages/ui/src/elements/Nav/context.tsx +++ b/packages/ui/src/elements/Nav/context.tsx @@ -1,5 +1,6 @@ 'use client' import { useWindowInfo } from '@faceless-ui/window-info' +import { usePathname } from 'next/navigation.js' import React, { useEffect, useRef } from 'react' import { usePreferences } from '../../providers/Preferences/index.js' @@ -40,6 +41,8 @@ export const NavProvider: React.FC<{ breakpoints: { l: largeBreak, m: midBreak, s: smallBreak }, } = useWindowInfo() + const pathname = usePathname() + const { getPreference } = usePreferences() const navRef = useRef(null) @@ -64,8 +67,13 @@ export const NavProvider: React.FC<{ } }, [largeBreak, getPreference, setNavOpen]) - // TODO: on smaller screens where the nav is a modal + // on smaller screens where the nav is a modal // close the nav when the user navigates away + useEffect(() => { + if (smallBreak === true) { + setNavOpen(false) + } + }, [pathname]) // on open and close, lock the body scroll // do not do this on desktop, the sidebar is not a modal From 81e8a9d50d9508e32db55b759a8522e30a2df9d1 Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Fri, 28 Feb 2025 14:57:58 -0500 Subject: [PATCH 051/127] chore(examples): update multi-tenant example (#11459) Bumps deps inside examples repo lockfile. Fixes import map, supersedes https://github.com/payloadcms/payload/pull/10804 --- examples/draft-preview/pnpm-lock.yaml | 5404 ----------------- examples/multi-tenant/pnpm-lock.yaml | 3066 ++++++---- .../src/app/(payload)/admin/importMap.js | 12 +- 3 files changed, 1738 insertions(+), 6744 deletions(-) delete mode 100644 examples/draft-preview/pnpm-lock.yaml diff --git a/examples/draft-preview/pnpm-lock.yaml b/examples/draft-preview/pnpm-lock.yaml deleted file mode 100644 index e400d9ecf5..0000000000 --- a/examples/draft-preview/pnpm-lock.yaml +++ /dev/null @@ -1,5404 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@payloadcms/db-mongodb': - specifier: latest - version: 3.20.0(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) - '@payloadcms/next': - specifier: latest - version: 3.20.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - '@payloadcms/richtext-slate': - specifier: latest - version: 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - '@payloadcms/ui': - specifier: latest - version: 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - dotenv: - specifier: ^8.2.0 - version: 8.6.0 - escape-html: - specifier: ^1.0.3 - version: 1.0.3 - graphql: - specifier: ^16.9.0 - version: 16.10.0 - next: - specifier: ^15.0.0 - version: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - payload: - specifier: latest - version: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - payload-admin-bar: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react: - specifier: 19.0.0 - version: 19.0.0 - react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) - devDependencies: - '@payloadcms/graphql': - specifier: latest - version: 3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) - '@swc/core': - specifier: ^1.6.13 - version: 1.10.12(@swc/helpers@0.5.15) - '@types/escape-html': - specifier: ^1.0.2 - version: 1.0.4 - '@types/react': - specifier: 19.0.1 - version: 19.0.1 - '@types/react-dom': - specifier: 19.0.1 - version: 19.0.1 - eslint: - specifier: ^8.57.0 - version: 8.57.1 - eslint-config-next: - specifier: ^15.0.0 - version: 15.1.6(eslint@8.57.1)(typescript@5.5.2) - slate: - specifier: ^0.82.0 - version: 0.82.1 - tsx: - specifier: ^4.16.2 - version: 4.19.2 - typescript: - specifier: 5.5.2 - version: 5.5.2 - -packages: - - '@apidevtools/json-schema-ref-parser@11.9.0': - resolution: {integrity: sha512-8Q/r5mXLa8Rfyh6r4SgEEFJgISVN5cDNFlcfSWLgFn3odzQhTfHAqzI3hMGdcROViL+8NrDNVVFQtEUrYOksDg==} - engines: {node: '>= 16'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.7': - resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.26.7': - resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.7': - resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} - engines: {node: '>=6.9.0'} - - '@dnd-kit/accessibility@3.1.1': - resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} - peerDependencies: - react: '>=16.8.0' - - '@dnd-kit/core@6.0.8': - resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@dnd-kit/sortable@7.0.2': - resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} - peerDependencies: - '@dnd-kit/core': ^6.0.7 - react: '>=16.8.0' - - '@dnd-kit/utilities@3.2.2': - resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} - peerDependencies: - react: '>=16.8.0' - - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/css@11.13.5': - resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} - - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} - peerDependencies: - react: '>=16.8.0' - - '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} - - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@faceless-ui/modal@3.0.0-beta.2': - resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - - '@faceless-ui/scroll-info@2.0.0-beta.0': - resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} - peerDependencies: - react: ^19.0.0-rc-f994737d14-20240522 - react-dom: ^19.0.0-rc-f994737d14-20240522 - - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.27.3': - resolution: {integrity: sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==} - peerDependencies: - react: '>=17.0.0' - react-dom: '>=17.0.0' - - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} - cpu: [x64] - os: [linux] - - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jsdevtools/ono@7.1.3': - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@monaco-editor/loader@1.4.0': - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' - - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} - - '@next/env@15.1.6': - resolution: {integrity: sha512-d9AFQVPEYNr+aqokIiPLNK/MTyt3DWa/dpKveiAaVccUadFbhFEvY6FXYX2LJO2Hv7PHnLBu2oWwB4uBuHjr/w==} - - '@next/eslint-plugin-next@15.1.6': - resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} - - '@next/swc-darwin-arm64@15.1.6': - resolution: {integrity: sha512-u7lg4Mpl9qWpKgy6NzEkz/w0/keEHtOybmIl0ykgItBxEM5mYotS5PmqTpo+Rhg8FiOiWgwr8USxmKQkqLBCrw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@15.1.6': - resolution: {integrity: sha512-x1jGpbHbZoZ69nRuogGL2MYPLqohlhnT9OCU6E6QFewwup+z+M6r8oU47BTeJcWsF2sdBahp5cKiAcDbwwK/lg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@15.1.6': - resolution: {integrity: sha512-jar9sFw0XewXsBzPf9runGzoivajeWJUc/JkfbLTC4it9EhU8v7tCRLH7l5Y1ReTMN6zKJO0kKAGqDk8YSO2bg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.1.6': - resolution: {integrity: sha512-+n3u//bfsrIaZch4cgOJ3tXCTbSxz0s6brJtU3SzLOvkJlPQMJ+eHVRi6qM2kKKKLuMY+tcau8XD9CJ1OjeSQQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.1.6': - resolution: {integrity: sha512-SpuDEXixM3PycniL4iVCLyUyvcl6Lt0mtv3am08sucskpG0tYkW1KlRhTgj4LI5ehyxriVVcfdoxuuP8csi3kQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.1.6': - resolution: {integrity: sha512-L4druWmdFSZIIRhF+G60API5sFB7suTbDRhYWSjiw0RbE+15igQvE2g2+S973pMGvwN3guw7cJUjA/TmbPWTHQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@15.1.6': - resolution: {integrity: sha512-s8w6EeqNmi6gdvM19tqKKWbCyOBvXFbndkGHl+c9YrzsLARRdCHsD9S1fMj8gsXm9v8vhC8s3N8rjuC/XrtkEg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.1.6': - resolution: {integrity: sha512-6xomMuu54FAFxttYr5PJbEfu96godcxBTRk1OhAvJq0/EnmFU/Ybiax30Snis4vdWZ9LGpf7Roy5fSs7v/5ROQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - - '@payloadcms/db-mongodb@3.20.0': - resolution: {integrity: sha512-Zg+A2KRKyPCDEhalskLVqA1IV48XtE6lWkImzvvRse9PZHQUXSnZ/VdAgY0SdruyRJ5GJHD/Crn34fFw5nXkwQ==} - peerDependencies: - payload: 3.20.0 - - '@payloadcms/graphql@3.20.0': - resolution: {integrity: sha512-tX02oa9V5Uoe2ra1aK4zX9CGQV7iNxoDZorbBbj2GZD7H6ADQHnlevpy1edMmR1Jv2Hf4TB92awXfE6PkdNQew==} - hasBin: true - peerDependencies: - graphql: ^16.8.1 - payload: 3.20.0 - - '@payloadcms/next@3.20.0': - resolution: {integrity: sha512-xAOUxKuZVu49YOhysCxSss9Ku2tv5WW1rT/cwtaQaqVZ0DPL7jLS706wm71enJs36hGe0uDMGlSE8yB+dAludQ==} - engines: {node: ^18.20.2 || >=20.9.0} - peerDependencies: - graphql: ^16.8.1 - next: ^15.0.0 - payload: 3.20.0 - - '@payloadcms/richtext-slate@3.20.0': - resolution: {integrity: sha512-5Bqj5HBuEpCaYmxAYTThaKU7gfeDPOIj/8QULxO97kmO2i4QaPOu/GTzEjcOk2j8NmbV6zDdtheALe4PcfeX8g==} - engines: {node: ^18.20.2 || >=20.9.0} - peerDependencies: - payload: 3.20.0 - react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - - '@payloadcms/translations@3.20.0': - resolution: {integrity: sha512-pZVcqysyZGH02gjtaRwNVusHgAwO1sRBKCHQAft7w9KFl7ZoCZAm+r3+SUhAE8Kp+fj9gHArtGsIfr/Yqn/zfA==} - - '@payloadcms/ui@3.20.0': - resolution: {integrity: sha512-ZCXPVOlVmNzPrVI7qFjUe7QMrmVoO1QSP4940Z30wJQpIpJW6t0W+HgjUfuDHEZ9xWRPCOniO101r50wLzIdNQ==} - engines: {node: ^18.20.2 || >=20.9.0} - peerDependencies: - next: ^15.0.0 - payload: 3.20.0 - react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.10.5': - resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - - '@swc/core-darwin-arm64@1.10.12': - resolution: {integrity: sha512-pOANQegUTAriW7jq3SSMZGM5l89yLVMs48R0F2UG6UZsH04SiViCnDctOGlA/Sa++25C+rL9MGMYM1jDLylBbg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.10.12': - resolution: {integrity: sha512-m4kbpIDDsN1FrwfNQMU+FTrss356xsXvatLbearwR+V0lqOkjLBP0VmRvQfHEg+uy13VPyrT9gj4HLoztlci7w==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.10.12': - resolution: {integrity: sha512-OY9LcupgqEu8zVK+rJPes6LDJJwPDmwaShU96beTaxX2K6VrXbpwm5WbPS/8FfQTsmpnuA7dCcMPUKhNgmzTrQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.10.12': - resolution: {integrity: sha512-nJD587rO0N4y4VZszz3xzVr7JIiCzSMhEMWnPjuh+xmPxDBz0Qccpr8xCr1cSxpl1uY7ERkqAGlKr6CwoV5kVg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.10.12': - resolution: {integrity: sha512-oqhSmV+XauSf0C//MoQnVErNUB/5OzmSiUzuazyLsD5pwqKNN+leC3JtRQ/QVzaCpr65jv9bKexT9+I2Tt3xDw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.10.12': - resolution: {integrity: sha512-XldSIHyjD7m1Gh+/8rxV3Ok711ENLI420CU2EGEqSe3VSGZ7pHJvJn9ZFbYpWhsLxPqBYMFjp3Qw+J6OXCPXCA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.10.12': - resolution: {integrity: sha512-wvPXzJxzPgTqhyp1UskOx1hRTtdWxlyFD1cGWOxgLsMik0V9xKRgqKnMPv16Nk7L9xl6quQ6DuUHj9ID7L3oVw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.10.12': - resolution: {integrity: sha512-TUYzWuu1O7uyIcRfxdm6Wh1u+gNnrW5M1DUgDOGZLsyQzgc2Zjwfh2llLhuAIilvCVg5QiGbJlpibRYJ/8QGsg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.10.12': - resolution: {integrity: sha512-4Qrw+0Xt+Fe2rz4OJ/dEPMeUf/rtuFWWAj/e0vL7J5laUHirzxawLRE5DCJLQTarOiYR6mWnmadt9o3EKzV6Xg==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.10.12': - resolution: {integrity: sha512-YiloZXLW7rUxJpALwHXaGjVaAEn+ChoblG7/3esque+Y7QCyheoBUJp2DVM1EeVA43jBfZ8tvYF0liWd9Tpz1A==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.10.12': - resolution: {integrity: sha512-+iUL0PYpPm6N9AdV1wvafakvCqFegQus1aoEDxgFsv3/uNVNIyRaupf/v/Zkp5hbep2EzhtoJR0aiJIzDbXWHg==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '*' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} - - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - - '@types/busboy@1.5.4': - resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} - - '@types/escape-html@1.0.4': - resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} - - '@types/is-hotkey@0.1.10': - resolution: {integrity: sha512-RvC8KMw5BCac1NvRRyaHgMMEtBaZ6wh0pyPTBu7izn4Sj/AX9Y4aXU5c7rX8PnM/knsuUpC1IeoBkANtxBypsQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/lodash@4.17.15': - resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} - - '@types/node@22.12.0': - resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/react-dom@19.0.1': - resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} - - '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} - peerDependencies: - '@types/react': '*' - - '@types/react@19.0.1': - resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} - - '@types/webidl-conversions@7.0.3': - resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} - - '@types/whatwg-url@11.0.5': - resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - - '@typescript-eslint/eslint-plugin@8.22.0': - resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/parser@8.22.0': - resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/scope-manager@8.22.0': - resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@8.22.0': - resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/types@8.22.0': - resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.22.0': - resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/utils@8.22.0': - resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' - - '@typescript-eslint/visitor-keys@8.22.0': - resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.10.2: - resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} - engines: {node: '>=4'} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - body-scroll-lock@4.0.0-beta.0: - resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - bson-objectid@2.0.4: - resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - - bson@6.10.1: - resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} - engines: {node: '>=16.20.1'} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001696: - resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - ci-info@4.1.0: - resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} - engines: {node: '>=8'} - - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - compute-scroll-into-view@1.0.20: - resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - console-table-printer@2.12.1: - resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - croner@9.0.0: - resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} - engines: {node: '>=18.0'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - - cssfilter@0.0.10: - resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - dataloader@2.2.3: - resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} - - date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - direction@1.0.4: - resolution: {integrity: sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==} - hasBin: true - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} - engines: {node: '>=10.13.0'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-next@15.1.6: - resolution: {integrity: sha512-Wd1uy6y7nBbXUSg9QAuQ+xYEKli5CgUhLjz1QHW11jLDis5vK5XB3PemL6jEmy7HrdhaRFDz+GTZ/3FoH+EUjg==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.31.0: - resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - fast-copy@3.0.2: - resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-type@19.3.0: - resolution: {integrity: sha512-mROwiKLZf/Kwa/2Rol+OOZQn1eyTkPB3ZTwC0ExY6OLFCbgxHYZvBm7xI77NvfZFMKBsmuXfmLJnD4eEftEhrA==} - engines: {node: '>=18'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - - focus-trap@7.5.4: - resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - - for-each@0.3.4: - resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} - engines: {node: '>= 0.4'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - graphql-http@1.22.4: - resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} - engines: {node: '>=12'} - peerDependencies: - graphql: '>=0.11 <=16' - - graphql-playground-html@1.6.30: - resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} - - graphql-scalars@1.22.2: - resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==} - engines: {node: '>=10'} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - - graphql@16.10.0: - resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - http-status@2.1.0: - resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} - engines: {node: '>= 0.4.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - image-size@1.2.0: - resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} - engines: {node: '>=16.x'} - hasBin: true - - immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} - engines: {node: '>= 0.4'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-bun-module@1.3.0: - resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hotkey@0.1.8: - resolution: {integrity: sha512-qs3NZ1INIS+H+yeo7cD9pDfwYV/jqRh1JG9S9zYrNudkoUQg7OL7ziXqRKu+InFjUIDoP2o6HIkLYMh1pcWgyQ==} - - is-hotkey@0.2.0: - resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jose@5.9.6: - resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-to-typescript@15.0.3: - resolution: {integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==} - engines: {node: '>=16.0.0'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - kareem@2.6.3: - resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} - engines: {node: '>=12.0.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - - memoize-one@6.0.0: - resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - - memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - - mongodb-connection-string-url@3.0.2: - resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - - mongodb@6.12.0: - resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} - engines: {node: '>=16.20.1'} - peerDependencies: - '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 - gcp-metadata: ^5.2.0 - kerberos: ^2.0.1 - mongodb-client-encryption: '>=6.0.0 <7' - snappy: ^7.2.2 - socks: ^2.7.1 - peerDependenciesMeta: - '@aws-sdk/credential-providers': - optional: true - '@mongodb-js/zstd': - optional: true - gcp-metadata: - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - socks: - optional: true - - mongoose-aggregate-paginate-v2@1.1.2: - resolution: {integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==} - engines: {node: '>=4.0.0'} - - mongoose-paginate-v2@1.8.5: - resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} - engines: {node: '>=4.0.0'} - - mongoose@8.9.5: - resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} - engines: {node: '>=16.20.1'} - - mpath@0.9.0: - resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} - engines: {node: '>=4.0.0'} - - mquery@5.0.0: - resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} - engines: {node: '>=14.0.0'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - next@15.1.6: - resolution: {integrity: sha512-Hch4wzbaX0vKQtalpXvUiw5sYivBy4cm5rzUKrBnUB/y436LGrvOUqYvlSeNVCWFO/770gDlltR9gqZH62ct4Q==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-to-formdata@4.5.1: - resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - payload-admin-bar@1.0.6: - resolution: {integrity: sha512-hpQdOiPq4LpWTkbuAnvxDf5wQ2ysMp9kQt+X2U+FfvBwD1U6qoxJfmUymG1OjLlaZzCZ93FlOdTl4u4Z0/m/SA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - payload@3.20.0: - resolution: {integrity: sha512-JtMLLncmXSvhsfpnECZeY1QGjwTcOm7limpct+gmM8tWBdQKi2fVXOsBTkyQtpn4VdA5h4fgnetHR/txCDu9OQ==} - engines: {node: ^18.20.2 || >=20.9.0} - hasBin: true - peerDependencies: - graphql: ^16.8.1 - - peek-readable@5.4.2: - resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} - engines: {node: '>=14.16'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pino-abstract-transport@2.0.0: - resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - - pino-pretty@13.0.0: - resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} - hasBin: true - - pino-std-serializers@7.0.0: - resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - - pino@9.5.0: - resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} - hasBin: true - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} - engines: {node: '>=14'} - hasBin: true - - process-warning@4.0.1: - resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs-esm@7.0.2: - resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} - engines: {node: '>=18'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - - react-datepicker@7.6.0: - resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} - peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 - - react-diff-viewer-continued@4.0.4: - resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} - engines: {node: '>= 16'} - peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 - - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} - peerDependencies: - react: ^19.0.0 - - react-image-crop@10.1.8: - resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==} - peerDependencies: - react: '>=16.13.1' - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-select@5.9.0: - resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} - peerDependencies: - react: 19.0.0 - react-dom: 19.0.0 - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: '>=16.6.0' - react-dom: '>=16.6.0' - - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - - sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - - sass@1.77.4: - resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} - engines: {node: '>=14.0.0'} - hasBin: true - - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} - - scmp@2.1.0: - resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} - - scroll-into-view-if-needed@2.2.31: - resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.0: - resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - sift@17.1.3: - resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - simple-wcswidth@1.0.1: - resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slate-history@0.86.0: - resolution: {integrity: sha512-OxObL9tbhgwvSlnKSCpGIh7wnuaqvOj5jRExGjEyCU2Ke8ctf22HjT+jw7GEi9ttLzNTUmTEU3YIzqKGeqN+og==} - peerDependencies: - slate: '>=0.65.3' - - slate-hyperscript@0.81.3: - resolution: {integrity: sha512-A/jvoLTAgeRcJaUPQCYOikCJxSws6+/jkL7mM+QuZljNd7EA5YqafGA7sVBJRFpcoSsDRUIah1yNiC/7vxZPYg==} - peerDependencies: - slate: '>=0.65.3' - - slate-react@0.92.0: - resolution: {integrity: sha512-xEDKu5RKw5f0N95l1UeNQnrB0Pxh4JPjpIZR/BVsMo0ININnLAknR99gLo46bl/Ffql4mr7LeaxQRoXxbFtJOQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - slate: '>=0.65.3' - - slate@0.82.1: - resolution: {integrity: sha512-3mdRdq7U3jSEoyFrGvbeb28hgrvrr4NdFCtJX+IjaNvSFozY0VZd/CGHF0zf/JDx7aEov864xd5uj0HQxxEWTQ==} - - slate@0.91.4: - resolution: {integrity: sha512-aUJ3rpjrdi5SbJ5G1Qjr3arytfRkEStTmHjBfWq2A2Q8MybacIzkScSvGJjQkdTk3djCK9C9SEOt39sSeZFwTw==} - - sonic-boom@4.2.0: - resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - - sonner@1.7.3: - resolution: {integrity: sha512-KXLWQfyR6AHpYZuQk8eO8fCbZSJY3JOpgsu/tbGc++jgPjj8JsR1ZpO8vFhqR/OxvWMQCSAmnSShY0gr4FPqHg==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} - - state-local@1.0.7: - resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strtok3@8.1.0: - resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} - engines: {node: '>=16'} - - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - - tiny-invariant@1.0.6: - resolution: {integrity: sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==} - - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} - engines: {node: '>=14.16'} - - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - - ts-api-utils@2.0.0: - resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-essentials@10.0.3: - resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} - peerDependencies: - typescript: '>=4.5.0' - peerDependenciesMeta: - typescript: - optional: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsx@4.19.2: - resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} - engines: {node: '>=18.0.0'} - hasBin: true - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} - engines: {node: '>=14.17'} - hasBin: true - - uint8array-extras@1.4.0: - resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} - engines: {node: '>=18'} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - use-context-selector@2.0.0: - resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} - peerDependencies: - react: '>=18.0.0' - scheduler: '>=0.19.0' - - use-isomorphic-layout-effect@1.2.0: - resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - whatwg-url@14.1.0: - resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} - engines: {node: '>=18'} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xss@1.0.15: - resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} - engines: {node: '>= 0.10.0'} - hasBin: true - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@apidevtools/json-schema-ref-parser@11.9.0': - dependencies: - '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.15 - js-yaml: 4.1.0 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/generator@7.26.5': - dependencies: - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.26.7 - '@babel/types': 7.26.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/parser@7.26.7': - dependencies: - '@babel/types': 7.26.7 - - '@babel/runtime@7.26.7': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.7 - '@babel/types': 7.26.7 - - '@babel/traverse@7.26.7': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.7 - '@babel/template': 7.25.9 - '@babel/types': 7.26.7 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.26.7': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@dnd-kit/accessibility@3.1.1(react@19.0.0)': - dependencies: - react: 19.0.0 - tslib: 2.8.1 - - '@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@dnd-kit/accessibility': 3.1.1(react@19.0.0) - '@dnd-kit/utilities': 3.2.2(react@19.0.0) - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - tslib: 2.8.1 - - '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)': - dependencies: - '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@dnd-kit/utilities': 3.2.2(react@19.0.0) - react: 19.0.0 - tslib: 2.8.1 - - '@dnd-kit/utilities@3.2.2(react@19.0.0)': - dependencies: - react: 19.0.0 - tslib: 2.8.1 - - '@emnapi/runtime@1.3.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emotion/babel-plugin@11.13.5': - dependencies: - '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.7 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/cache@11.14.0': - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - - '@emotion/css@11.13.5': - dependencies: - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - transitivePeerDependencies: - - supports-color - - '@emotion/hash@0.9.2': {} - - '@emotion/memoize@0.9.0': {} - - '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': - dependencies: - '@babel/runtime': 7.26.7 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - transitivePeerDependencies: - - supports-color - - '@emotion/serialize@1.3.3': - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.2 - csstype: 3.1.3 - - '@emotion/sheet@1.4.0': {} - - '@emotion/unitless@0.10.0': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': - dependencies: - react: 19.0.0 - - '@emotion/utils@1.4.2': {} - - '@emotion/weak-memoize@0.4.0': {} - - '@esbuild/aix-ppc64@0.23.1': - optional: true - - '@esbuild/android-arm64@0.23.1': - optional: true - - '@esbuild/android-arm@0.23.1': - optional: true - - '@esbuild/android-x64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/freebsd-arm64@0.23.1': - optional: true - - '@esbuild/freebsd-x64@0.23.1': - optional: true - - '@esbuild/linux-arm64@0.23.1': - optional: true - - '@esbuild/linux-arm@0.23.1': - optional: true - - '@esbuild/linux-ia32@0.23.1': - optional: true - - '@esbuild/linux-loong64@0.23.1': - optional: true - - '@esbuild/linux-mips64el@0.23.1': - optional: true - - '@esbuild/linux-ppc64@0.23.1': - optional: true - - '@esbuild/linux-riscv64@0.23.1': - optional: true - - '@esbuild/linux-s390x@0.23.1': - optional: true - - '@esbuild/linux-x64@0.23.1': - optional: true - - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': - optional: true - - '@esbuild/openbsd-x64@0.23.1': - optional: true - - '@esbuild/sunos-x64@0.23.1': - optional: true - - '@esbuild/win32-arm64@0.23.1': - optional: true - - '@esbuild/win32-ia32@0.23.1': - optional: true - - '@esbuild/win32-x64@0.23.1': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - body-scroll-lock: 4.0.0-beta.0 - focus-trap: 7.5.4 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@floating-ui/core@1.6.9': - dependencies: - '@floating-ui/utils': 0.2.9 - - '@floating-ui/dom@1.6.13': - dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 - - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/dom': 1.6.13 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@floating-ui/react@0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.9 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.9': {} - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true - - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true - - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true - - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true - - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true - - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true - - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.3.1 - optional: true - - '@img/sharp-win32-ia32@0.33.5': - optional: true - - '@img/sharp-win32-x64@0.33.5': - optional: true - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jsdevtools/ono@7.1.3': {} - - '@juggle/resize-observer@3.4.0': {} - - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': - dependencies: - monaco-editor: 0.52.2 - state-local: 1.0.7 - - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': - dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) - monaco-editor: 0.52.2 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - '@mongodb-js/saslprep@1.1.9': - dependencies: - sparse-bitfield: 3.0.3 - - '@next/env@15.1.6': {} - - '@next/eslint-plugin-next@15.1.6': - dependencies: - fast-glob: 3.3.1 - - '@next/swc-darwin-arm64@15.1.6': - optional: true - - '@next/swc-darwin-x64@15.1.6': - optional: true - - '@next/swc-linux-arm64-gnu@15.1.6': - optional: true - - '@next/swc-linux-arm64-musl@15.1.6': - optional: true - - '@next/swc-linux-x64-gnu@15.1.6': - optional: true - - '@next/swc-linux-x64-musl@15.1.6': - optional: true - - '@next/swc-win32-arm64-msvc@15.1.6': - optional: true - - '@next/swc-win32-x64-msvc@15.1.6': - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 - - '@nolyfill/is-core-module@1.0.39': {} - - '@payloadcms/db-mongodb@3.20.0(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': - dependencies: - mongoose: 8.9.5 - mongoose-aggregate-paginate-v2: 1.1.2 - mongoose-paginate-v2: 1.8.5 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - prompts: 2.4.2 - uuid: 10.0.0 - transitivePeerDependencies: - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - gcp-metadata - - kerberos - - mongodb-client-encryption - - snappy - - socks - - supports-color - - '@payloadcms/graphql@3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2)': - dependencies: - graphql: 16.10.0 - graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - pluralize: 8.0.0 - ts-essentials: 10.0.3(typescript@5.5.2) - tsx: 4.19.2 - transitivePeerDependencies: - - typescript - - '@payloadcms/next@3.20.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': - dependencies: - '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.20.0(graphql@16.10.0)(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) - '@payloadcms/translations': 3.20.0 - '@payloadcms/ui': 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - busboy: 1.6.0 - dequal: 2.0.3 - file-type: 19.3.0 - graphql: 16.10.0 - graphql-http: 1.22.4(graphql@16.10.0) - graphql-playground-html: 1.6.30 - http-status: 2.1.0 - next: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - path-to-regexp: 6.3.0 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - qs-esm: 7.0.2 - react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - sass: 1.77.4 - sonner: 1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - uuid: 10.0.0 - transitivePeerDependencies: - - '@types/react' - - monaco-editor - - react - - react-dom - - supports-color - - typescript - - '@payloadcms/richtext-slate@3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': - dependencies: - '@payloadcms/translations': 3.20.0 - '@payloadcms/ui': 3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - is-hotkey: 0.2.0 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - react: 19.0.0 - slate: 0.91.4 - slate-history: 0.86.0(slate@0.91.4) - slate-hyperscript: 0.81.3(slate@0.91.4) - slate-react: 0.92.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(slate@0.91.4) - transitivePeerDependencies: - - '@types/react' - - monaco-editor - - next - - react-dom - - supports-color - - typescript - - '@payloadcms/translations@3.20.0': - dependencies: - date-fns: 4.1.0 - - '@payloadcms/ui@3.20.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': - dependencies: - '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) - '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.20.0 - body-scroll-lock: 4.0.0-beta.0 - bson-objectid: 2.0.4 - date-fns: 4.1.0 - dequal: 2.0.3 - md5: 2.3.0 - next: 15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - object-to-formdata: 4.5.1 - payload: 3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - qs-esm: 7.0.2 - react: 19.0.0 - react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-dom: 19.0.0(react@19.0.0) - react-image-crop: 10.1.8(react@19.0.0) - react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - scheduler: 0.25.0 - sonner: 1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - ts-essentials: 10.0.3(typescript@5.5.2) - use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) - uuid: 10.0.0 - transitivePeerDependencies: - - '@types/react' - - monaco-editor - - supports-color - - typescript - - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.10.5': {} - - '@swc/core-darwin-arm64@1.10.12': - optional: true - - '@swc/core-darwin-x64@1.10.12': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.10.12': - optional: true - - '@swc/core-linux-arm64-gnu@1.10.12': - optional: true - - '@swc/core-linux-arm64-musl@1.10.12': - optional: true - - '@swc/core-linux-x64-gnu@1.10.12': - optional: true - - '@swc/core-linux-x64-musl@1.10.12': - optional: true - - '@swc/core-win32-arm64-msvc@1.10.12': - optional: true - - '@swc/core-win32-ia32-msvc@1.10.12': - optional: true - - '@swc/core-win32-x64-msvc@1.10.12': - optional: true - - '@swc/core@1.10.12(@swc/helpers@0.5.15)': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 - optionalDependencies: - '@swc/core-darwin-arm64': 1.10.12 - '@swc/core-darwin-x64': 1.10.12 - '@swc/core-linux-arm-gnueabihf': 1.10.12 - '@swc/core-linux-arm64-gnu': 1.10.12 - '@swc/core-linux-arm64-musl': 1.10.12 - '@swc/core-linux-x64-gnu': 1.10.12 - '@swc/core-linux-x64-musl': 1.10.12 - '@swc/core-win32-arm64-msvc': 1.10.12 - '@swc/core-win32-ia32-msvc': 1.10.12 - '@swc/core-win32-x64-msvc': 1.10.12 - '@swc/helpers': 0.5.15 - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - - '@swc/types@0.1.17': - dependencies: - '@swc/counter': 0.1.3 - - '@tokenizer/token@0.3.0': {} - - '@types/busboy@1.5.4': - dependencies: - '@types/node': 22.12.0 - - '@types/escape-html@1.0.4': {} - - '@types/is-hotkey@0.1.10': {} - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/lodash@4.17.15': {} - - '@types/node@22.12.0': - dependencies: - undici-types: 6.20.0 - - '@types/parse-json@4.0.2': {} - - '@types/react-dom@19.0.1': - dependencies: - '@types/react': 19.0.1 - - '@types/react-transition-group@4.4.12(@types/react@19.0.1)': - dependencies: - '@types/react': 19.0.1 - - '@types/react@19.0.1': - dependencies: - csstype: 3.1.3 - - '@types/webidl-conversions@7.0.3': {} - - '@types/whatwg-url@11.0.5': - dependencies: - '@types/webidl-conversions': 7.0.3 - - '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/type-utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.22.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.5.2) - typescript: 5.5.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.22.0 - debug: 4.4.0 - eslint: 8.57.1 - typescript: 5.5.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.22.0': - dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 - - '@typescript-eslint/type-utils@8.22.0(eslint@8.57.1)(typescript@5.5.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) - '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - debug: 4.4.0 - eslint: 8.57.1 - ts-api-utils: 2.0.0(typescript@5.5.2) - typescript: 5.5.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.22.0': {} - - '@typescript-eslint/typescript-estree@8.22.0(typescript@5.5.2)': - dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 - debug: 4.4.0 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.0 - ts-api-utils: 2.0.0(typescript@5.5.2) - typescript: 5.5.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.22.0(eslint@8.57.1)(typescript@5.5.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.5.2) - eslint: 8.57.1 - typescript: 5.5.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.22.0': - dependencies: - '@typescript-eslint/types': 8.22.0 - eslint-visitor-keys: 4.2.0 - - '@ungap/structured-clone@1.3.0': {} - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 - - acorn@8.14.0: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.3 - is-array-buffer: 3.0.5 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 - is-string: 1.1.1 - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - is-array-buffer: 3.0.5 - - ast-types-flow@0.0.8: {} - - async-function@1.0.0: {} - - atomic-sleep@1.0.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axe-core@4.10.2: {} - - axobject-query@4.1.0: {} - - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.26.7 - cosmiconfig: 7.1.0 - resolve: 1.22.10 - - balanced-match@1.0.2: {} - - binary-extensions@2.3.0: {} - - body-scroll-lock@4.0.0-beta.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - bson-objectid@2.0.4: {} - - bson@6.10.1: {} - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - call-bind-apply-helpers@1.0.1: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.1 - es-define-property: 1.0.1 - get-intrinsic: 1.2.7 - set-function-length: 1.2.2 - - call-bound@1.0.3: - dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001696: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - charenc@0.0.2: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - ci-info@4.1.0: {} - - classnames@2.5.1: {} - - client-only@0.0.1: {} - - clsx@2.1.1: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - - colorette@2.0.20: {} - - commander@2.20.3: {} - - compute-scroll-into-view@1.0.20: {} - - concat-map@0.0.1: {} - - console-table-printer@2.12.1: - dependencies: - simple-wcswidth: 1.0.1 - - convert-source-map@1.9.0: {} - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - croner@9.0.0: {} - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypt@0.0.2: {} - - cssfilter@0.0.10: {} - - csstype@3.1.3: {} - - damerau-levenshtein@1.0.8: {} - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - dataloader@2.2.3: {} - - date-fns@3.6.0: {} - - date-fns@4.1.0: {} - - dateformat@4.6.3: {} - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - dequal@2.0.3: {} - - detect-libc@2.0.3: - optional: true - - diff@5.2.0: {} - - direction@1.0.4: {} - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-helpers@5.2.1: - dependencies: - '@babel/runtime': 7.26.7 - csstype: 3.1.3 - - dotenv@8.6.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - emoji-regex@9.2.2: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.18.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.9: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.3 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.0 - math-intrinsics: 1.1.0 - object-inspect: 1.13.3 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - 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 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.7 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - - escape-html@1.0.3: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-next@15.1.6(eslint@8.57.1)(typescript@5.5.2): - dependencies: - '@next/eslint-plugin-next': 15.1.6 - '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.4(eslint@8.57.1) - eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) - optionalDependencies: - typescript: 5.5.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 - enhanced-resolve: 5.18.0 - eslint: 8.57.1 - fast-glob: 3.3.3 - get-tsconfig: 4.10.0 - is-bun-module: 1.3.0 - is-glob: 4.0.3 - stable-hash: 0.0.4 - optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.5.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.2 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.4(eslint@8.57.1): - 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 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - 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-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.0: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - fast-copy@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.1: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-redact@3.5.0: {} - - fast-safe-stringify@2.1.1: {} - - fast-uri@3.0.6: {} - - fastq@1.18.0: - dependencies: - reusify: 1.0.4 - - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - file-type@19.3.0: - dependencies: - strtok3: 8.1.0 - token-types: 6.0.0 - uint8array-extras: 1.4.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-root@1.1.0: {} - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.2 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.2: {} - - focus-trap@7.5.4: - dependencies: - tabbable: 6.2.0 - - for-each@0.3.4: - dependencies: - is-callable: 1.2.7 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - get-intrinsic@1.2.7: - dependencies: - call-bind-apply-helpers: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - get-tsconfig@4.8.1: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - graphql-http@1.22.4(graphql@16.10.0): - dependencies: - graphql: 16.10.0 - - graphql-playground-html@1.6.30: - dependencies: - xss: 1.0.15 - - graphql-scalars@1.22.2(graphql@16.10.0): - dependencies: - graphql: 16.10.0 - tslib: 2.8.1 - - graphql@16.10.0: {} - - has-bigints@1.1.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - help-me@5.0.0: {} - - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - http-status@2.1.0: {} - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - image-size@1.2.0: - dependencies: - queue: 6.0.2 - - immer@9.0.21: {} - - immutable@4.3.7: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: - optional: true - - is-async-function@2.1.1: - dependencies: - 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: - dependencies: - has-bigints: 1.1.0 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.2.1: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - - is-buffer@1.1.6: {} - - is-bun-module@1.3.0: - dependencies: - semver: 7.7.0 - - is-callable@1.2.7: {} - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.3 - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.3 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hotkey@0.1.8: {} - - is-hotkey@0.2.0: {} - - is-map@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-object@5.0.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.3 - - is-string@1.1.1: - dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.3 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.18 - - is-weakmap@2.0.2: {} - - is-weakref@1.1.0: - dependencies: - call-bound: 1.0.3 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jose@5.9.6: {} - - joycon@3.1.1: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-to-typescript@15.0.3: - dependencies: - '@apidevtools/json-schema-ref-parser': 11.9.0 - '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.15 - is-glob: 4.0.3 - js-yaml: 4.1.0 - lodash: 4.17.21 - minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - - kareem@2.6.3: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kleur@3.0.3: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lines-and-columns@1.2.4: {} - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - lodash@4.17.21: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - math-intrinsics@1.1.0: {} - - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - - memoize-one@6.0.0: {} - - memory-pager@1.5.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - monaco-editor@0.52.2: {} - - mongodb-connection-string-url@3.0.2: - dependencies: - '@types/whatwg-url': 11.0.5 - whatwg-url: 14.1.0 - - mongodb@6.12.0: - dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 - mongodb-connection-string-url: 3.0.2 - - mongoose-aggregate-paginate-v2@1.1.2: {} - - mongoose-paginate-v2@1.8.5: {} - - mongoose@8.9.5: - dependencies: - bson: 6.10.1 - kareem: 2.6.3 - mongodb: 6.12.0 - mpath: 0.9.0 - mquery: 5.0.0 - ms: 2.1.3 - sift: 17.1.3 - transitivePeerDependencies: - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - gcp-metadata - - kerberos - - mongodb-client-encryption - - snappy - - socks - - supports-color - - mpath@0.9.0: {} - - mquery@5.0.0: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - ms@2.1.3: {} - - nanoid@3.3.8: {} - - natural-compare@1.4.0: {} - - next@15.1.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): - dependencies: - '@next/env': 15.1.6 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001696 - postcss: 8.4.31 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - styled-jsx: 5.1.6(react@19.0.0) - optionalDependencies: - '@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 - sass: 1.77.4 - sharp: 0.33.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - normalize-path@3.0.0: {} - - object-assign@4.1.1: {} - - object-inspect@1.13.3: {} - - object-keys@1.1.1: {} - - object-to-formdata@4.5.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - on-exit-leak-free@2.1.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.2.7 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-to-regexp@6.3.0: {} - - path-type@4.0.0: {} - - payload-admin-bar@1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - payload@3.20.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2): - dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.6 - '@payloadcms/translations': 3.20.0 - '@types/busboy': 1.5.4 - ajv: 8.17.1 - bson-objectid: 2.0.4 - busboy: 1.6.0 - ci-info: 4.1.0 - console-table-printer: 2.12.1 - croner: 9.0.0 - dataloader: 2.2.3 - deepmerge: 4.3.1 - file-type: 19.3.0 - get-tsconfig: 4.8.1 - graphql: 16.10.0 - http-status: 2.1.0 - image-size: 1.2.0 - jose: 5.9.6 - json-schema-to-typescript: 15.0.3 - minimist: 1.2.8 - path-to-regexp: 6.3.0 - pino: 9.5.0 - pino-pretty: 13.0.0 - pluralize: 8.0.0 - qs-esm: 7.0.2 - sanitize-filename: 1.6.3 - scmp: 2.1.0 - ts-essentials: 10.0.3(typescript@5.5.2) - tsx: 4.19.2 - uuid: 10.0.0 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - monaco-editor - - react - - react-dom - - typescript - - utf-8-validate - - peek-readable@5.4.2: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pino-abstract-transport@2.0.0: - dependencies: - split2: 4.2.0 - - pino-pretty@13.0.0: - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.2 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 2.0.0 - pump: 3.0.2 - secure-json-parse: 2.7.0 - sonic-boom: 4.2.0 - strip-json-comments: 3.1.1 - - pino-std-serializers@7.0.0: {} - - pino@9.5.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.5.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 2.0.0 - pino-std-serializers: 7.0.0 - process-warning: 4.0.1 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.5.0 - sonic-boom: 4.2.0 - thread-stream: 3.1.0 - - pluralize@8.0.0: {} - - possible-typed-array-names@1.0.0: {} - - postcss@8.4.31: - dependencies: - nanoid: 3.3.8 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prelude-ls@1.2.1: {} - - prettier@3.4.2: {} - - process-warning@4.0.1: {} - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - punycode@2.3.1: {} - - qs-esm@7.0.2: {} - - queue-microtask@1.2.3: {} - - queue@6.0.2: - dependencies: - inherits: 2.0.4 - - quick-format-unescaped@4.0.4: {} - - react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@floating-ui/react': 0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - clsx: 2.1.1 - date-fns: 3.6.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) - classnames: 2.5.1 - diff: 5.2.0 - memoize-one: 6.0.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - supports-color - - react-dom@19.0.0(react@19.0.0): - dependencies: - react: 19.0.0 - scheduler: 0.25.0 - - react-image-crop@10.1.8(react@19.0.0): - dependencies: - react: 19.0.0 - - react-is@16.13.1: {} - - react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@babel/runtime': 7.26.7 - '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) - '@floating-ui/dom': 1.6.13 - '@types/react-transition-group': 4.4.12(@types/react@19.0.1) - memoize-one: 6.0.0 - prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.1)(react@19.0.0) - transitivePeerDependencies: - - '@types/react' - - supports-color - - react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@babel/runtime': 7.26.7 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react@19.0.0: {} - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - real-require@0.2.0: {} - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regenerator-runtime@0.14.1: {} - - regexp.prototype.flags@1.5.4: - dependencies: - 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 - - require-from-string@2.0.2: {} - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safe-stable-stringify@2.5.0: {} - - sanitize-filename@1.6.3: - dependencies: - truncate-utf8-bytes: 1.0.2 - - sass@1.77.4: - dependencies: - chokidar: 3.6.0 - immutable: 4.3.7 - source-map-js: 1.2.1 - - scheduler@0.25.0: {} - - scmp@2.1.0: {} - - scroll-into-view-if-needed@2.2.31: - dependencies: - compute-scroll-into-view: 1.0.20 - - secure-json-parse@2.7.0: {} - - semver@6.3.1: {} - - semver@7.7.0: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.7 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.0 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - optional: true - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.3 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.3 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - sift@17.1.3: {} - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - - simple-wcswidth@1.0.1: {} - - sisteransi@1.0.5: {} - - slate-history@0.86.0(slate@0.91.4): - dependencies: - is-plain-object: 5.0.0 - slate: 0.91.4 - - slate-hyperscript@0.81.3(slate@0.91.4): - dependencies: - is-plain-object: 5.0.0 - slate: 0.91.4 - - slate-react@0.92.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(slate@0.91.4): - dependencies: - '@juggle/resize-observer': 3.4.0 - '@types/is-hotkey': 0.1.10 - '@types/lodash': 4.17.15 - direction: 1.0.4 - is-hotkey: 0.1.8 - is-plain-object: 5.0.0 - lodash: 4.17.21 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - scroll-into-view-if-needed: 2.2.31 - slate: 0.91.4 - tiny-invariant: 1.0.6 - - slate@0.82.1: - dependencies: - immer: 9.0.21 - is-plain-object: 5.0.0 - tiny-warning: 1.0.3 - - slate@0.91.4: - dependencies: - immer: 9.0.21 - is-plain-object: 5.0.0 - tiny-warning: 1.0.3 - - sonic-boom@4.2.0: - dependencies: - atomic-sleep: 1.0.0 - - sonner@1.7.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - source-map-js@1.2.1: {} - - source-map@0.5.7: {} - - sparse-bitfield@3.0.3: - dependencies: - memory-pager: 1.5.0 - - split2@4.2.0: {} - - stable-hash@0.0.4: {} - - state-local@1.0.7: {} - - streamsearch@1.1.0: {} - - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.9 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.3 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - - strip-json-comments@3.1.1: {} - - strtok3@8.1.0: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 - - styled-jsx@5.1.6(react@19.0.0): - dependencies: - client-only: 0.0.1 - react: 19.0.0 - - stylis@4.2.0: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - tabbable@6.2.0: {} - - tapable@2.2.1: {} - - text-table@0.2.0: {} - - thread-stream@3.1.0: - dependencies: - real-require: 0.2.0 - - tiny-invariant@1.0.6: {} - - tiny-warning@1.0.3: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - token-types@6.0.0: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - - tr46@5.0.0: - dependencies: - punycode: 2.3.1 - - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 - - ts-api-utils@2.0.0(typescript@5.5.2): - dependencies: - typescript: 5.5.2 - - ts-essentials@10.0.3(typescript@5.5.2): - optionalDependencies: - typescript: 5.5.2 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.8.1: {} - - tsx@4.19.2: - dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.10.0 - optionalDependencies: - fsevents: 2.3.3 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.4 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.4 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.4 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.10 - - typescript@5.5.2: {} - - uint8array-extras@1.4.0: {} - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.3 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - undici-types@6.20.0: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0): - dependencies: - react: 19.0.0 - scheduler: 0.25.0 - - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): - dependencies: - react: 19.0.0 - optionalDependencies: - '@types/react': 19.0.1 - - utf8-byte-length@1.0.5: {} - - uuid@10.0.0: {} - - webidl-conversions@7.0.0: {} - - whatwg-url@14.1.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.1 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.3 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.0 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.18 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.18: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - wrappy@1.0.2: {} - - ws@8.18.0: {} - - xss@1.0.15: - dependencies: - commander: 2.20.3 - cssfilter: 0.0.10 - - yaml@1.10.2: {} - - yocto-queue@0.1.0: {} diff --git a/examples/multi-tenant/pnpm-lock.yaml b/examples/multi-tenant/pnpm-lock.yaml index aacbbb99c1..0a8c1a5f12 100644 --- a/examples/multi-tenant/pnpm-lock.yaml +++ b/examples/multi-tenant/pnpm-lock.yaml @@ -10,19 +10,19 @@ importers: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.0.2(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) '@payloadcms/next': specifier: latest - version: 3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@payloadcms/plugin-multi-tenant': - specifier: file:payloadcms-plugin-multi-tenant-3.15.1.tgz - version: file:payloadcms-plugin-multi-tenant-3.15.1.tgz(@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)) + specifier: latest + version: 3.25.0(@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) '@payloadcms/richtext-lexical': specifier: latest - version: 3.0.2(6qerb26rs4bgoavayjhmleobf4) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)(yjs@13.6.23) '@payloadcms/ui': specifier: latest - version: 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -31,13 +31,13 @@ importers: version: 8.6.0 graphql: specifier: ^16.9.0 - version: 16.9.0 + version: 16.10.0 next: specifier: ^15.0.0 - version: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: latest - version: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + version: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: specifier: 7.0.2 version: 7.0.2 @@ -53,10 +53,10 @@ importers: devDependencies: '@payloadcms/graphql': specifier: latest - version: 3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) + version: 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) '@swc/core': specifier: ^1.6.13 - version: 1.9.2(@swc/helpers@0.5.13) + version: 1.11.5(@swc/helpers@0.5.15) '@types/react': specifier: 19.0.1 version: 19.0.1 @@ -68,26 +68,26 @@ importers: version: 8.57.1 eslint-config-next: specifier: ^15.0.0 - version: 15.0.3(eslint@8.57.1)(typescript@5.5.2) + version: 15.2.0(eslint@8.57.1)(typescript@5.5.2) tsx: specifier: ^4.16.2 - version: 4.19.2 + version: 4.19.3 typescript: specifier: 5.5.2 version: 5.5.2 packages: - '@apidevtools/json-schema-ref-parser@11.7.2': - resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -102,37 +102,40 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} - '@dnd-kit/accessibility@3.1.0': - resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: react: '>=16.8.0' '@dnd-kit/core@6.0.8': resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: 19.0.0-rc-65a56d0e-20241020 + react-dom: 19.0.0-rc-65a56d0e-20241020 '@dnd-kit/sortable@7.0.2': resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} @@ -151,8 +154,8 @@ packages: '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - '@emotion/cache@11.13.5': - resolution: {integrity: sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==} + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/css@11.13.5': resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} @@ -163,8 +166,8 @@ packages: '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.5': - resolution: {integrity: sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==} + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -181,8 +184,8 @@ packages: '@emotion/unitless@0.10.0': resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0': - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' @@ -198,144 +201,294 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -360,23 +513,23 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/scroll-info@2.0.0-beta.0': - resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -384,14 +537,14 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} @@ -511,8 +664,8 @@ packages: cpu: [x64] os: [win32] - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -532,145 +685,143 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@lexical/clipboard@0.20.0': - resolution: {integrity: sha512-oHmb9kSVHjeFCd2q8VrEXW22doUHMJ6cGXqo7Ican7Ljl4/9OgRWr+cq55yntoSaJfCrRYkTiZCLDejF2ciSiA==} + '@lexical/clipboard@0.21.0': + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} - '@lexical/code@0.20.0': - resolution: {integrity: sha512-zFsVGuzIn4CQxEnlW4AG/Hq6cyATVZ4fZTxozE/f5oK4vDPvnY/goRxrzSuAMX73A/HRX3kTEzMDcm4taRM3Mg==} + '@lexical/code@0.21.0': + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} - '@lexical/devtools-core@0.20.0': - resolution: {integrity: sha512-/CnL+Dfpzw4koy2BTdUICkvrCkMIYG8Y73KB/S1Bt5UzJpD+PV300puWJ0NvUvAj24H78r73jxvK2QUG67Tdaw==} + '@lexical/devtools-core@0.21.0': + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/dragon@0.20.0': - resolution: {integrity: sha512-3DAHF8mSKiPZtXCqu2P8ynSwS3fGXzg4G/V0lXNjBxhmozjzUzWZRWIWtmTlWdEu9GXsoyeM3agcaxyDPJJwkA==} + '@lexical/dragon@0.21.0': + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} - '@lexical/hashtag@0.20.0': - resolution: {integrity: sha512-ldOP/d9tA6V9qvLyr3mRYkcYY5ySOHJ2BFOW/jZPxQcj6lWafS8Lk7XdMUpHHDjRpY2Hizsi5MHJkIqFglYXbw==} + '@lexical/hashtag@0.21.0': + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} - '@lexical/headless@0.20.0': - resolution: {integrity: sha512-PZ9Yxud7UOpVoq3oJ1wb3wb7NHyFt8XLc1IhdNAzTzbZ+L6c9lyomgBFvDs11u/3t9vjtLxGbzkzYKryQE80Ig==} + '@lexical/headless@0.21.0': + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} - '@lexical/history@0.20.0': - resolution: {integrity: sha512-dXtIS31BU6RmLX2KwLAi1EgGl+USeyi+rshh19azACXHPFqONZgPd2t21LOLSFn7C1/W+cSp/kqVDlQVbZUZRA==} + '@lexical/history@0.21.0': + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} - '@lexical/html@0.20.0': - resolution: {integrity: sha512-ob7QHkEv+mhaZjlurDj90UmEyN9G4rzBPR5QV42PLnu1qMSviMEdI5V3a5/A5aFf/FDDQ+0GAgWBFnA/MEDczQ==} + '@lexical/html@0.21.0': + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} - '@lexical/link@0.20.0': - resolution: {integrity: sha512-zicDcfgRZPRFZ8WOZv5er0Aqkde+i7QoFVkLQD4dNLLORjoMSJOISJH6VEdjBl3k7QJTxbfrt+xT5d/ZsAN5GA==} + '@lexical/link@0.21.0': + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} - '@lexical/list@0.20.0': - resolution: {integrity: sha512-ufSse8ui3ooUe0HA/yF/9STrG8wYhIDLMRhELOw80GFCkPJaxs6yRvjfmJooH5IC88rpUJ5XXFFiZKfGxEZLEw==} + '@lexical/list@0.21.0': + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} - '@lexical/mark@0.20.0': - resolution: {integrity: sha512-1P2izmkgZ4VDp+49rWO1KfWivL5aA30y5kkYbFZ/CS05fgbO7ogMjLSajpz+RN/zzW79v3q4YfikrMgaD23InA==} + '@lexical/mark@0.21.0': + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} - '@lexical/markdown@0.20.0': - resolution: {integrity: sha512-ZoGsECejp9z6MEvc8l81b1h1aWbB3sTq6xOFeUTbDL5vKpA67z5CmQQLi0uZWrygrbO9dSE3Q/JGcodUrczxbw==} + '@lexical/markdown@0.21.0': + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} - '@lexical/offset@0.20.0': - resolution: {integrity: sha512-VMhxsxxDGnpVw0jgC8UlDf0Q2RHIHbS49uZgs3l9nP+O+G8s3b76Ta4Tb+iJOK2FY6874/TcQMbSuXGhfpQk8A==} + '@lexical/offset@0.21.0': + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} - '@lexical/overflow@0.20.0': - resolution: {integrity: sha512-z4lElzLm1FVifc7bzBZN4VNKeTuwygpyHQvCJVWXzF2Kbvex43PEYMi8u4A83idVqbmzbyBLASwUJS0voLoPLw==} + '@lexical/overflow@0.21.0': + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} - '@lexical/plain-text@0.20.0': - resolution: {integrity: sha512-LvoC+9mm2Im1iO8GgtgaqSfW0T3mIE5GQl1xGxbVNdANmtHmBgRAJn2KfQm1XHZP6zydLRMhZkzC+jfInh2yfQ==} + '@lexical/plain-text@0.21.0': + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} - '@lexical/react@0.20.0': - resolution: {integrity: sha512-5QbN5AFtZ9efXxU/M01ADhUZgthR0e8WKi5K/w5EPpWtYFDPQnUte3rKUjYJ7uwG1iwcvaCpuMbxJjHQ+i6pDQ==} + '@lexical/react@0.21.0': + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: - react: 19.0.0-rc-65a56d0e-20241020 - react-dom: 19.0.0-rc-65a56d0e-20241020 + react: '>=17.x' + react-dom: '>=17.x' - '@lexical/rich-text@0.20.0': - resolution: {integrity: sha512-BR1pACdMA+Ymef0f5EN1y+9yP8w7S+9MgmBP1yjr3w4KdqRnfSaGWyxwcHU8eA+zu16QfivpB6501VJ90YeuXw==} + '@lexical/rich-text@0.21.0': + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} - '@lexical/selection@0.20.0': - resolution: {integrity: sha512-YnkH5UCMNN/em95or/6uwAV31vcENh1Roj+JOg5KD+gJuA7VGdDCy0vZl/o0+1badXozeZ2VRxXNC6JSK7T4+A==} + '@lexical/selection@0.21.0': + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} - '@lexical/table@0.20.0': - resolution: {integrity: sha512-qHuK2rvQUoQDx62YpvJE3Ev4yK9kjRFo79IDBapxrhoXg/wCGQOjMBzVD3G5PWkhyl/GDnww80GwYjLloQLQzg==} + '@lexical/table@0.21.0': + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} - '@lexical/text@0.20.0': - resolution: {integrity: sha512-Fu64i5CIlEOlgucSdp9XFqB2XqoRsw4at76n93+6RF4+LgGDnu4nLXQVCVxNmLcGyh2WgczuTpnk5P2mHNAIUA==} + '@lexical/text@0.21.0': + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} - '@lexical/utils@0.20.0': - resolution: {integrity: sha512-sXIa2nowrNxY8VcjjuxZbJ/HovIql8bmInNaxBR03JAYfqMiL5I5/dYgjOQJV49NJnuR1uTY2GwVxVTXCTFUCw==} + '@lexical/utils@0.21.0': + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} - '@lexical/yjs@0.20.0': - resolution: {integrity: sha512-TiHNhu2VkhXN69V+fXVS3xjOQ6aLnheQUGwOAhuFkDPL3VLCb0yl2Mgydpayn+3Grwii4ZBHcF7oCC84GiU5bw==} + '@lexical/yjs@0.21.0': + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} peerDependencies: yjs: '>=13.5.22' - '@monaco-editor/loader@1.4.0': - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: 19.0.0 + react-dom: 19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.0.3': - resolution: {integrity: sha512-t9Xy32pjNOvVn2AS+Utt6VmyrshbpfUMhIjFO60gI58deSo/KgLOp31XZ4O+kY/Is8WAGYwA5gR7kOb1eORDBA==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/eslint-plugin-next@15.0.3': - resolution: {integrity: sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==} + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} - '@next/swc-darwin-arm64@15.0.3': - resolution: {integrity: sha512-s3Q/NOorCsLYdCKvQlWU+a+GeAd3C8Rb3L1YnetsgwXzhc3UTWrtQpB/3eCjFOdGUj5QmXfRak12uocd1ZiiQw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.0.3': - resolution: {integrity: sha512-Zxl/TwyXVZPCFSf0u2BNj5sE0F2uR6iSKxWpq4Wlk/Sv9Ob6YCKByQTkV2y6BCic+fkabp9190hyrDdPA/dNrw==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.0.3': - resolution: {integrity: sha512-T5+gg2EwpsY3OoaLxUIofmMb7ohAUlcNZW0fPQ6YAutaWJaxt1Z1h+8zdl4FRIOr5ABAAhXtBcpkZNwUcKI2fw==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.0.3': - resolution: {integrity: sha512-WkAk6R60mwDjH4lG/JBpb2xHl2/0Vj0ZRu1TIzWuOYfQ9tt9NFsIinI1Epma77JVgy81F32X/AeD+B2cBu/YQA==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.0.3': - resolution: {integrity: sha512-gWL/Cta1aPVqIGgDb6nxkqy06DkwJ9gAnKORdHWX1QBbSZZB+biFYPFti8aKIQL7otCE1pjyPaXpFzGeG2OS2w==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.0.3': - resolution: {integrity: sha512-QQEMwFd8r7C0GxQS62Zcdy6GKx999I/rTO2ubdXEe+MlZk9ZiinsrjwoiBL5/57tfyjikgh6GOU2WRQVUej3UA==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.0.3': - resolution: {integrity: sha512-9TEp47AAd/ms9fPNgtgnT7F3M1Hf7koIYYWCMQ9neOwjbVWJsHZxrFbI3iEDJ8rf1TDGpmHbKxXf2IFpAvheIQ==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.0.3': - resolution: {integrity: sha512-VNAz+HN4OGgvZs6MOoVfnn41kBzT+M+tB+OK4cww6DNyWS6wKaDpaAm/qLeOUbnMh0oVx1+mg0uoYARF69dJyA==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -691,135 +842,124 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@payloadcms/db-mongodb@3.0.2': - resolution: {integrity: sha512-BgwB0wSDUzsJeJyIOIVsr93JyHxoutRiPBYi4gRAQIFpQJ5fJOMoHR4u8ikpItnAsJ01laOPSnlhadLxvRiIXw==} + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} peerDependencies: - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/graphql@3.0.2': - resolution: {integrity: sha512-7xNTt+8aDddgyU09fKUUtt1VoqxrrRzM40gU8X7oyQbJO1FMti141/7GEUeukFo1w8gXDaMu4xBgFwa+7dQcaw==} + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/next@3.0.2': - resolution: {integrity: sha512-ju/bLNmR2oEunhLa3qfkVy8No/p9bGt7T1ee0/QbuCQMw3HAJ3KrIOhJUIv6X1fZmG63aNQGbefdnDtgMok5JQ==} + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.0.2 + payload: 3.25.0 - '@payloadcms/plugin-multi-tenant@file:payloadcms-plugin-multi-tenant-3.15.1.tgz': - resolution: {integrity: sha512-bRuvmbrCLQr9ZL1jL4KLz+Zuv6vC4WTGKXcFkhdZoFY5tP80t78WUsxJP71FM1d1U+udJGvEA5K2bMJc9tQWOA==, tarball: file:payloadcms-plugin-multi-tenant-3.15.1.tgz} - version: 3.15.1 + '@payloadcms/plugin-multi-tenant@3.25.0': + resolution: {integrity: sha512-Xh/twsM09a+VceoezgM0sQnXBmeUGaTN3MukkYFLrXPZ15WSDyjaS+smFD9GfuZikOALbh8ffgoNqkjUa+QEcA==} peerDependencies: - '@payloadcms/ui': 3.15.1 + '@payloadcms/ui': 3.25.0 next: ^15.0.3 - payload: 3.15.1 + payload: 3.25.0 - '@payloadcms/richtext-lexical@3.0.2': - resolution: {integrity: sha512-NHxnIi8qIa5ug3JQ/oX4je+94FLGhofmP02RL7BoyknNIw8Jv0zZY4NJCgrUBpmRw4CVxCc+dikMY+5243B9vA==} + '@payloadcms/richtext-lexical@3.25.0': + resolution: {integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: '@faceless-ui/modal': 3.0.0-beta.2 - '@faceless-ui/scroll-info': 2.0.0-beta.0 - '@lexical/headless': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.0.2 - lexical: 0.20.0 - payload: 3.0.2 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.0.2': - resolution: {integrity: sha512-qwixoVF5ECL4/O/I2y9qIymjrXSOF5eE0wo2bGm3g+XEg+vI/lqeQ2CEOduhETmy5r+aZtd6eE90ZsX5/N840w==} + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.0.2': - resolution: {integrity: sha512-oztpIVZnbGs0IWqinzogEHf+zTBa7rRv/HK5o7ixjSE43DZ7tLiCYYmEJjiKt7XA3U2S5aI3YdMgHyGlx7KQTA==} + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.0.2 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@swc/core-darwin-arm64@1.9.2': - resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==} + '@swc/core-darwin-arm64@1.11.5': + resolution: {integrity: sha512-GEd1hzEx0mSGkJYMFMGLnrGgjL2rOsOsuYWyjyiA3WLmhD7o+n/EWBDo6mzD/9aeF8dzSPC0TnW216gJbvrNzA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.9.2': - resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==} + '@swc/core-darwin-x64@1.11.5': + resolution: {integrity: sha512-toz04z9wAClVvQSEY3xzrgyyeWBAfMWcKG4K0ugNvO56h/wczi2ZHRlnAXZW1tghKBk3z6MXqa/srfXgNhffKw==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.9.2': - resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==} + '@swc/core-linux-arm-gnueabihf@1.11.5': + resolution: {integrity: sha512-5SjmKxXdwbBpsYGTpgeXOXMIjS563/ntRGn8Zc12H/c4VfPrRLGhgbJ/48z2XVFyBLcw7BCHZyFuVX1+ZI3W0Q==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.9.2': - resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==} + '@swc/core-linux-arm64-gnu@1.11.5': + resolution: {integrity: sha512-pydIlInHRzRIwB0NHblz3Dx58H/bsi0I5F2deLf9iOmwPNuOGcEEZF1Qatc7YIjP5DFbXK+Dcz+pMUZb2cc2MQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==} + '@swc/core-linux-arm64-musl@1.11.5': + resolution: {integrity: sha512-LhBHKjkZq5tJF1Lh0NJFpx7ROnCWLckrlIAIdSt9XfOV+zuEXJQOj+NFcM1eNk17GFfFyUMOZyGZxzYq5dveEQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.9.2': - resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==} + '@swc/core-linux-x64-gnu@1.11.5': + resolution: {integrity: sha512-dCi4xkxXlsk5sQYb3i413Cfh7+wMJeBYTvBZTD5xh+/DgRtIcIJLYJ2tNjWC4/C2i5fj+Ze9bKNSdd8weRWZ3A==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==} + '@swc/core-linux-x64-musl@1.11.5': + resolution: {integrity: sha512-K0AC4TreM5Oo/tXNXnE/Gf5+5y/HwUdd7xvUjOpZddcX/RlsbYOKWLgOtA3fdFIuta7XC+vrGKmIhm5l70DSVQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.9.2': - resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==} + '@swc/core-win32-arm64-msvc@1.11.5': + resolution: {integrity: sha512-wzum8sYUsvPY7kgUfuqVYTgIPYmBC8KPksoNM1fz5UfhudU0ciQuYvUBD47GIGOevaoxhLkjPH4CB95vh1mJ9w==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.9.2': - resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==} + '@swc/core-win32-ia32-msvc@1.11.5': + resolution: {integrity: sha512-lco7mw0TPRTpVPR6NwggJpjdUkAboGRkLrDHjIsUaR+Y5+0m5FMMkHOMxWXAbrBS5c4ph7QErp4Lma4r9Mn5og==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.9.2': - resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==} + '@swc/core-win32-x64-msvc@1.11.5': + resolution: {integrity: sha512-E+DApLSC6JRK8VkDa4bNsBdD7Qoomx1HvKVZpOXl9v94hUZI5GMExl4vU5isvb+hPWL7rZ0NeI7ITnVLgLJRbA==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.9.2': - resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==} + '@swc/core@1.11.5': + resolution: {integrity: sha512-EVY7zfpehxhTZXOfy508gb3D78ihoGGmvyiTWtlBPjgIaidP1Xw0naHMD78CWiFlZmeDjKXJufGtsEGOnZdmNA==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -830,11 +970,11 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@swc/types@0.1.19': + resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -863,17 +1003,17 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.15': + resolution: {integrity: sha512-w/P33JFeySuhN6JLkysYUK2gEmy9kHHFN7E8ro0tkfmlDOgxBDzWEZ/J8cWA+fHqFevpswDTFZnDx+R9lbL6xw==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.9.1': - resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==} + '@types/node@22.13.5': + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -881,8 +1021,10 @@ packages: '@types/react-dom@19.0.1': resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} - '@types/react-transition-group@4.4.11': - resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} @@ -902,70 +1044,55 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -1007,8 +1134,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -1023,25 +1150,29 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1068,20 +1199,30 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.4.0: - resolution: {integrity: sha512-sd96/aZ8LjF1uJbEHzIo1LrERPKRFPEy1nZ1eOILftBxrVsFDAQkimHIIq87xrHcubzjNeETsD9PwN0wp+vLiQ==} + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1109,8 +1250,8 @@ packages: bson-objectid@2.0.4: resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.0: - resolution: {integrity: sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} buffer@5.7.1: @@ -1120,16 +1261,24 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001683: - resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1232,20 +1381,20 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - dataloader@2.2.2: - resolution: {integrity: sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==} + dataloader@2.2.3: + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} @@ -1264,8 +1413,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1329,48 +1478,53 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} esbuild@0.23.1: @@ -1378,6 +1532,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} + engines: {node: '>=18'} + hasBin: true + escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -1385,8 +1544,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-next@15.0.3: - resolution: {integrity: sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg==} + eslint-config-next@15.2.0: + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -1397,8 +1556,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.6.3: - resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1447,14 +1606,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.0.0: - resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -1520,8 +1679,8 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1537,14 +1696,14 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1574,14 +1733,15 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -1597,21 +1757,28 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -1642,8 +1809,9 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -1651,8 +1819,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-http@1.22.3: - resolution: {integrity: sha512-sgUz/2DZt+QvY6WrpAsAXUvhnIkp2eX9jN78V8DAtFcpZi/nfDrzDt2byYjyoJzRcWuqhE0K63g1QMewt73U6A==} + graphql-http@1.22.4: + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' @@ -1666,12 +1834,13 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql@16.9.0: - resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + graphql@16.10.0: + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1680,12 +1849,12 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -1702,8 +1871,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - http-status@1.6.2: - resolution: {integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==} + http-status@2.1.0: + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} engines: {node: '>= 0.4.0'} ieee754@1.2.1: @@ -1713,16 +1882,16 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} engines: {node: '>=16.x'} hasBin: true immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1739,8 +1908,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} is-alphabetical@2.0.1: @@ -1749,8 +1918,8 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: @@ -1759,41 +1928,42 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - is-bun-module@1.2.1: - resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-decimal@2.0.1: @@ -1803,11 +1973,12 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -1821,12 +1992,8 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -1837,39 +2004,40 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} isarray@2.0.5: @@ -1881,8 +2049,8 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - iterator.prototype@1.1.3: - resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} jose@5.9.6: @@ -1899,8 +2067,8 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true @@ -1928,6 +2096,10 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsox@1.2.121: + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -1954,11 +2126,11 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lexical@0.20.0: - resolution: {integrity: sha512-lJEHLFACXqRf3u/VlIOu9T7MJ51O4la92uOBwiS9Sx+juDK3Nrru5Vgl1aUirV1qK8XEM3h6Org2HcrsrzZ3ZA==} + lexical@0.21.0: + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} - lib0@0.2.98: - resolution: {integrity: sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==} + lib0@0.2.99: + resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} engines: {node: '>=16'} hasBin: true @@ -1982,6 +2154,10 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5@2.3.0: resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} @@ -2010,8 +2186,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} @@ -2070,17 +2246,17 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.3: - resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} @@ -2103,18 +2279,18 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - monaco-editor@0.52.0: - resolution: {integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==} + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.10.0: - resolution: {integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==} + mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -2144,8 +2320,8 @@ packages: resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} engines: {node: '>=4.0.0'} - mongoose@8.8.1: - resolution: {integrity: sha512-l7DgeY1szT98+EKU8GYnga5WnyatAu+kOQ2VlVX1Mxif6A0Umt0YkSiksCiyGxzx8SPhGe9a53ND1GD4yVDrPA==} + mongoose@8.9.5: + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -2159,27 +2335,27 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.0.3: - resolution: {integrity: sha512-ontCbCRKJUIoivAdGB34yCaOcPgYXr9AAkV/IwqFfWWTXEPUgLYkSkqBhIk9KK7gGmgjc64B+RdoeIDM13Irnw==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-66855b96-20241106 - react-dom: ^18.2.0 || 19.0.0-rc-66855b96-20241106 + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': @@ -2191,8 +2367,8 @@ packages: sass: optional: true - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -2206,8 +2382,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -2217,8 +2393,8 @@ packages: object-to-formdata@4.5.1: resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -2233,8 +2409,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} on-exit-leak-free@2.1.2: @@ -2248,6 +2424,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -2260,8 +2440,8 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -2289,15 +2469,15 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - payload@3.0.2: - resolution: {integrity: sha512-w7E+WI+tRlmiQVxHxLmTXIGrQTiNbmsCBohhJjXY5nMuKMt2AnV1SllX1z63gccXzyVvs+L+hSjdi0vuvegKzw==} + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: graphql: ^16.8.1 - peek-readable@5.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} picocolors@1.1.1: @@ -2329,16 +2509,16 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} hasBin: true @@ -2346,8 +2526,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} engines: {node: '>=14'} hasBin: true @@ -2355,8 +2535,8 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -2379,9 +2559,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} @@ -2392,25 +2569,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-animate-height@2.1.2: - resolution: {integrity: sha512-A9jfz/4CTdsIsE7WCQtO9UkOpMBcBRh8LxyHl2eoZz1ki02jpyUL5xt58gabd0CyeLQ8fRyQ+s2lyV2Ufu8Owg==} - engines: {node: '>= 6.0.0'} + react-datepicker@7.6.0: + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: - react: '>=15.6.2' - react-dom: '>=15.6.2' + react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-datepicker@6.9.0: - resolution: {integrity: sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==} + react-diff-viewer-continued@4.0.4: + resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + engines: {node: '>= 16'} peerDependencies: - react: ^16.9.0 || ^17 || ^18 - react-dom: ^16.9.0 || ^17 || ^18 - - react-diff-viewer-continued@3.2.6: - resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} - engines: {node: '>= 8'} - peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} @@ -2423,8 +2593,8 @@ packages: peerDependencies: react: '>=16.13.1' - react-error-boundary@4.0.13: - resolution: {integrity: sha512-b6PwbdSv8XeOSYvjt8LpgpKrZ0yGdtZokYwkwV2wlcZbxgopHX/hgPl5VgpnoVOWd868n1hktM8Qm4b+02MiLQ==} + react-error-boundary@4.1.2: + resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: react: '>=16.13.1' @@ -2436,17 +2606,11 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-onclickoutside@6.13.1: - resolution: {integrity: sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==} + react-select@5.9.0: + resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: - react: ^15.5.x || ^16.x || ^17.x || ^18.x - react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x - - react-select@5.8.0: - resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} @@ -2470,15 +2634,15 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} require-from-string@2.0.2: @@ -2492,16 +2656,17 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: @@ -2512,15 +2677,19 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: @@ -2535,9 +2704,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.0.0-experimental-3edc000d-20240926: - resolution: {integrity: sha512-360BMNajOhMyrirau0pzWVgeakvrfjbfdqHnX2K+tSGTmn6tBN+6K5NhhaebqeXXWyCU3rl5FApjgF2GN0W5JA==} - scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -2551,8 +2717,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2564,6 +2730,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -2580,8 +2750,20 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} sift@17.1.3: @@ -2605,8 +2787,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.0: - resolution: {integrity: sha512-W6dH7m5MujEPyug3lpI2l3TC3Pp1+LTgK0Efg+IHDrBbtEjyCmCHHo6yfNBOsf1tFZ6zf+jceWwB38baC8yO9g==} + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -2626,6 +2808,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} @@ -2633,26 +2818,27 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.20.2: - resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -2715,11 +2901,11 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -2728,8 +2914,8 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - text-decoder@1.2.1: - resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -2737,8 +2923,8 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -2749,18 +2935,18 @@ packages: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} - tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@1.4.0: - resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} - engines: {node: '>=16'} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-essentials@10.0.3: resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} @@ -2781,6 +2967,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + tsx@4.19.3: + resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + engines: {node: '>=18.0.0'} + hasBin: true + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -2792,20 +2983,20 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typescript@5.5.2: @@ -2817,11 +3008,12 @@ packages: resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} engines: {node: '>=18'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -2847,11 +3039,11 @@ packages: react: '>=18.0.0' scheduler: '>=0.19.0' - use-isomorphic-layout-effect@1.1.2: - resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + use-isomorphic-layout-effect@1.2.0: + resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} peerDependencies: '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -2873,23 +3065,24 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -2904,8 +3097,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2925,8 +3118,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yjs@13.6.20: - resolution: {integrity: sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==} + yjs@13.6.23: + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: @@ -2938,7 +3131,7 @@ packages: snapshots: - '@apidevtools/json-schema-ref-parser@11.7.2': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -2950,18 +3143,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.2': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -2969,45 +3162,47 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.2': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.25.9': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@dnd-kit/accessibility@3.1.0(react@19.0.0)': + '@date-fns/tz@1.2.0': {} + + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 tslib: 2.8.1 '@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@dnd-kit/accessibility': 3.1.0(react@19.0.0) + '@dnd-kit/accessibility': 3.1.1(react@19.0.0) '@dnd-kit/utilities': 3.2.2(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -3033,7 +3228,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -3046,7 +3241,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/cache@11.13.5': + '@emotion/cache@11.14.0': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 @@ -3057,7 +3252,7 @@ snapshots: '@emotion/css@11.13.5': dependencies: '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.13.5 + '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 '@emotion/sheet': 1.4.0 '@emotion/utils': 1.4.2 @@ -3068,13 +3263,13 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.5(@types/react@19.0.1)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.13.5 + '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@19.0.0) + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.0.0) '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 @@ -3096,7 +3291,7 @@ snapshots: '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@19.0.0)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.0.0)': dependencies: react: 19.0.0 @@ -3107,75 +3302,150 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.25.0': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.25.0': + optional: true + '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.25.0': + optional: true + '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.25.0': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.25.0': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.25.0': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.25.0': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.25.0': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.25.0': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.25.0': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.25.0': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.25.0': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.25.0': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.25.0': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.25.0': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.25.0': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.25.0': + optional: true + + '@esbuild/netbsd-arm64@0.25.0': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.25.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.25.0': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.25.0': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.25.0': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.25.0': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.25.0': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.25.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -3186,11 +3456,11 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -3207,45 +3477,45 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/core@1.6.8': + '@floating-ui/core@1.6.9': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': + '@floating-ui/dom@1.6.13': dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.8': {} + '@floating-ui/utils@0.2.9': {} '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3329,7 +3599,7 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -3348,201 +3618,200 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@lexical/clipboard@0.20.0': + '@lexical/clipboard@0.21.0': dependencies: - '@lexical/html': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/code@0.20.0': + '@lexical/code@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 prismjs: 1.29.0 - '@lexical/devtools-core@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@lexical/devtools-core@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@lexical/dragon@0.20.0': + '@lexical/dragon@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/hashtag@0.20.0': + '@lexical/hashtag@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/headless@0.20.0': + '@lexical/headless@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/history@0.20.0': + '@lexical/history@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/html@0.20.0': + '@lexical/html@0.21.0': dependencies: - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/link@0.20.0': + '@lexical/link@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/list@0.20.0': + '@lexical/list@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/mark@0.20.0': + '@lexical/mark@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/markdown@0.20.0': + '@lexical/markdown@0.21.0': dependencies: - '@lexical/code': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/code': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/offset@0.20.0': + '@lexical/offset@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/overflow@0.20.0': + '@lexical/overflow@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/plain-text@0.20.0': + '@lexical/plain-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/react@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20)': + '@lexical/react@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23)': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/code': 0.20.0 - '@lexical/devtools-core': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/dragon': 0.20.0 - '@lexical/hashtag': 0.20.0 - '@lexical/history': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/markdown': 0.20.0 - '@lexical/overflow': 0.20.0 - '@lexical/plain-text': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - '@lexical/yjs': 0.20.0(yjs@13.6.20) - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/code': 0.21.0 + '@lexical/devtools-core': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/dragon': 0.21.0 + '@lexical/hashtag': 0.21.0 + '@lexical/history': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/markdown': 0.21.0 + '@lexical/overflow': 0.21.0 + '@lexical/plain-text': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + '@lexical/yjs': 0.21.0(yjs@13.6.23) + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 3.1.4(react@19.0.0) transitivePeerDependencies: - yjs - '@lexical/rich-text@0.20.0': + '@lexical/rich-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/selection@0.20.0': + '@lexical/selection@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/table@0.20.0': + '@lexical/table@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/text@0.20.0': + '@lexical/text@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/utils@0.20.0': + '@lexical/utils@0.21.0': dependencies: - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - lexical: 0.20.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + lexical: 0.21.0 - '@lexical/yjs@0.20.0(yjs@13.6.20)': + '@lexical/yjs@0.21.0(yjs@13.6.23)': dependencies: - '@lexical/offset': 0.20.0 - '@lexical/selection': 0.20.0 - lexical: 0.20.0 - yjs: 13.6.20 + '@lexical/offset': 0.21.0 + '@lexical/selection': 0.21.0 + lexical: 0.21.0 + yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.0 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0) - monaco-editor: 0.52.0 + '@monaco-editor/loader': 1.5.0 + monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.0.3': {} + '@next/env@15.2.0': {} - '@next/eslint-plugin-next@15.0.3': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.0.3': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.0.3': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.0.3': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.0.3': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.0.3': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.0.3': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.0.3': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.0.3': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3555,17 +3824,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@payloadcms/db-mongodb@3.0.2(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': + '@payloadcms/db-mongodb@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))': dependencies: - http-status: 1.6.2 - mongoose: 8.8.1 + mongoose: 8.9.5 mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -3578,36 +3846,36 @@ snapshots: - socks - supports-color - '@payloadcms/graphql@3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2)': dependencies: - graphql: 16.9.0 - graphql-scalars: 1.22.2(graphql@16.9.0) - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + graphql: 16.10.0 + graphql-scalars: 1.22.2(graphql@16.10.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/next@3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.0.2(graphql@16.9.0)(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(typescript@5.5.2) - '@payloadcms/translations': 3.0.2 - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 - graphql: 16.9.0 - graphql-http: 1.22.3(graphql@16.9.0) + graphql: 16.10.0 + graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 - http-status: 1.6.2 - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + http-status: 2.1.0 + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -3617,41 +3885,43 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-multi-tenant@file:payloadcms-plugin-multi-tenant-3.15.1.tgz(@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))': + '@payloadcms/plugin-multi-tenant@3.25.0(@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))': dependencies: - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) - '@payloadcms/richtext-lexical@3.0.2(6qerb26rs4bgoavayjhmleobf4)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/headless': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20) - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.0.2(@types/react@19.0.1)(graphql@16.9.0)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) - '@payloadcms/translations': 3.0.2 - '@payloadcms/ui': 3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/headless': 0.21.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/react': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23) + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 dequal: 2.0.3 escape-html: 1.0.3 - lexical: 0.20.0 + jsox: 1.2.121 + lexical: 0.21.0 mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-error-boundary: 4.0.13(react@19.0.0) + react-error-boundary: 4.1.2(react@19.0.0) ts-essentials: 10.0.3(typescript@5.5.2) uuid: 10.0.0 transitivePeerDependencies: @@ -3660,39 +3930,39 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.0.2': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.0.2(@types/react@19.0.1)(monaco-editor@0.52.0)(next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': + '@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.0.2 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) qs-esm: 7.0.2 react: 19.0.0 - react-animate-height: 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-datepicker: 6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) - react-select: 5.8.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - scheduler: 0.0.0-experimental-3edc000d-20240926 - sonner: 1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + scheduler: 0.25.0 + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.5.2) - use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.0.0-experimental-3edc000d-20240926) + use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -3702,62 +3972,62 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} + '@rushstack/eslint-patch@1.10.5': {} - '@swc/core-darwin-arm64@1.9.2': + '@swc/core-darwin-arm64@1.11.5': optional: true - '@swc/core-darwin-x64@1.9.2': + '@swc/core-darwin-x64@1.11.5': optional: true - '@swc/core-linux-arm-gnueabihf@1.9.2': + '@swc/core-linux-arm-gnueabihf@1.11.5': optional: true - '@swc/core-linux-arm64-gnu@1.9.2': + '@swc/core-linux-arm64-gnu@1.11.5': optional: true - '@swc/core-linux-arm64-musl@1.9.2': + '@swc/core-linux-arm64-musl@1.11.5': optional: true - '@swc/core-linux-x64-gnu@1.9.2': + '@swc/core-linux-x64-gnu@1.11.5': optional: true - '@swc/core-linux-x64-musl@1.9.2': + '@swc/core-linux-x64-musl@1.11.5': optional: true - '@swc/core-win32-arm64-msvc@1.9.2': + '@swc/core-win32-arm64-msvc@1.11.5': optional: true - '@swc/core-win32-ia32-msvc@1.9.2': + '@swc/core-win32-ia32-msvc@1.11.5': optional: true - '@swc/core-win32-x64-msvc@1.9.2': + '@swc/core-win32-x64-msvc@1.11.5': optional: true - '@swc/core@1.9.2(@swc/helpers@0.5.13)': + '@swc/core@1.11.5(@swc/helpers@0.5.15)': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 + '@swc/types': 0.1.19 optionalDependencies: - '@swc/core-darwin-arm64': 1.9.2 - '@swc/core-darwin-x64': 1.9.2 - '@swc/core-linux-arm-gnueabihf': 1.9.2 - '@swc/core-linux-arm64-gnu': 1.9.2 - '@swc/core-linux-arm64-musl': 1.9.2 - '@swc/core-linux-x64-gnu': 1.9.2 - '@swc/core-linux-x64-musl': 1.9.2 - '@swc/core-win32-arm64-msvc': 1.9.2 - '@swc/core-win32-ia32-msvc': 1.9.2 - '@swc/core-win32-x64-msvc': 1.9.2 - '@swc/helpers': 0.5.13 + '@swc/core-darwin-arm64': 1.11.5 + '@swc/core-darwin-x64': 1.11.5 + '@swc/core-linux-arm-gnueabihf': 1.11.5 + '@swc/core-linux-arm64-gnu': 1.11.5 + '@swc/core-linux-arm64-musl': 1.11.5 + '@swc/core-linux-x64-gnu': 1.11.5 + '@swc/core-linux-x64-musl': 1.11.5 + '@swc/core-win32-arm64-msvc': 1.11.5 + '@swc/core-win32-ia32-msvc': 1.11.5 + '@swc/core-win32-x64-msvc': 1.11.5 + '@swc/helpers': 0.5.15 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.13': + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 - '@swc/types@0.1.17': + '@swc/types@0.1.19': dependencies: '@swc/counter': 0.1.3 @@ -3769,11 +4039,11 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 22.9.1 + '@types/node': 22.13.5 '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 '@types/estree-jsx@1.0.5': dependencies: @@ -3789,17 +4059,17 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.15': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/ms@0.7.34': {} + '@types/ms@2.1.0': {} - '@types/node@22.9.1': + '@types/node@22.13.5': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/parse-json@4.0.2': {} @@ -3807,7 +4077,7 @@ snapshots: dependencies: '@types/react': 19.0.1 - '@types/react-transition-group@4.4.11': + '@types/react-transition-group@4.4.12(@types/react@19.0.1)': dependencies: '@types/react': 19.0.1 @@ -3827,89 +4097,84 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 eslint: 8.57.1 - optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.15.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/type-utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.5.2) - debug: 4.3.7 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) + '@typescript-eslint/utils': 8.25.0(eslint@8.57.1)(typescript@5.5.2) + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.5.2)': dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7 - fast-glob: 3.3.2 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.5.2) - optionalDependencies: + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.5.2)': + '@typescript-eslint/utils@8.25.0(eslint@8.57.1)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.5.2) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.5.2) eslint: 8.57.1 - optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.15.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} acorn-jsx@5.3.2(acorn@8.14.0): dependencies: @@ -3929,7 +4194,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3948,78 +4213,79 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} + async-function@1.0.0: {} + atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} @@ -4029,33 +4295,37 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 - resolve: 1.22.8 + resolve: 1.22.10 balanced-match@1.0.2: {} - bare-events@2.5.0: + bare-events@2.5.4: optional: true - bare-fs@2.3.5: + bare-fs@4.0.1: dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.4.0 + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer optional: true - bare-os@2.4.4: + bare-os@3.5.1: optional: true - bare-path@2.1.3: + bare-path@3.0.0: dependencies: - bare-os: 2.4.4 + bare-os: 3.5.1 optional: true - bare-stream@2.4.0: + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.20.2 + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 optional: true base64-js@1.5.1: {} @@ -4085,7 +4355,7 @@ snapshots: bson-objectid@2.0.4: {} - bson@6.10.0: {} + bson@6.10.3: {} buffer@5.7.1: dependencies: @@ -4096,17 +4366,26 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind@1.0.7: + call-bind-apply-helpers@1.0.2: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} - caniuse-lite@1.0.30001683: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -4178,7 +4457,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -4203,25 +4482,25 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - dataloader@2.2.2: {} + dataloader@2.2.3: {} date-fns@3.6.0: {} @@ -4233,7 +4512,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4253,9 +4532,9 @@ snapshots: define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -4283,18 +4562,24 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 csstype: 3.1.3 dotenv@8.6.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + emoji-regex@9.2.2: {} end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -4303,98 +4588,103 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.5: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.3 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + 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 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.3 - safe-array-concat: 1.1.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild@0.23.1: optionalDependencies: @@ -4423,23 +4713,51 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.25.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 + escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - eslint-config-next@15.0.3(eslint@8.57.1)(typescript@5.5.2): + eslint-config-next@15.2.0(eslint@8.57.1)(typescript@5.5.2): dependencies: - '@next/eslint-plugin-next': 15.0.3 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@next/eslint-plugin-next': 15.2.0 + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) - eslint-plugin-react: 7.37.2(eslint@8.57.1) - eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) + eslint-plugin-react: 7.37.4(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: @@ -4450,65 +4768,61 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7 - enhanced-resolve: 5.17.1 + debug: 4.4.0 + enhanced-resolve: 5.18.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 + get-tsconfig: 4.10.0 + is-bun-module: 1.3.0 + stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1) transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.8.3)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@8.57.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 - string.prototype.trimend: 1.0.8 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.5.2) + '@typescript-eslint/parser': 8.25.0(eslint@8.57.1)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -4518,7 +4832,7 @@ snapshots: dependencies: aria-query: 5.3.2 array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 axe-core: 4.10.2 axobject-query: 4.1.0 @@ -4530,21 +4844,21 @@ snapshots: language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 + safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react@7.37.2(eslint@8.57.1): + eslint-plugin-react@7.37.4(eslint@8.57.1): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.0 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -4552,11 +4866,11 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + 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.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-scope@7.2.2: @@ -4577,11 +4891,11 @@ snapshots: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4652,7 +4966,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -4668,13 +4982,13 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -4701,17 +5015,17 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -4724,28 +5038,44 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} - get-intrinsic@1.2.4: + get-intrinsic@1.3.0: dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.7 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -4779,46 +5109,46 @@ snapshots: globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} - graphql-http@1.22.3(graphql@16.9.0): + graphql-http@1.22.4(graphql@16.10.0): dependencies: - graphql: 16.9.0 + graphql: 16.10.0 graphql-playground-html@1.6.30: dependencies: xss: 1.0.15 - graphql-scalars@1.22.2(graphql@16.9.0): + graphql-scalars@1.22.2(graphql@16.10.0): dependencies: - graphql: 16.9.0 + graphql: 16.10.0 tslib: 2.8.1 - graphql@16.9.0: {} + graphql@16.10.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -4830,19 +5160,19 @@ snapshots: dependencies: react-is: 16.13.1 - http-status@1.6.2: {} + http-status@2.1.0: {} ieee754@1.2.1: {} ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4858,11 +5188,11 @@ snapshots: ini@1.3.8: {} - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 is-alphabetical@2.0.1: {} @@ -4871,63 +5201,74 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + 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.0.4: + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@1.1.6: {} - is-bun-module@1.2.1: + is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-decimal@2.0.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -4937,49 +5278,53 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-path-inside@3.0.3: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 isarray@2.0.5: {} @@ -4987,12 +5332,13 @@ snapshots: isomorphic.js@0.2.5: {} - iterator.prototype@1.1.3: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 set-function-name: 2.0.2 jose@5.9.6: {} @@ -5005,7 +5351,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@3.0.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -5013,15 +5359,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.2 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.15 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.3.3 - tinyglobby: 0.2.10 + prettier: 3.5.2 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -5033,12 +5379,14 @@ snapshots: dependencies: minimist: 1.2.8 + jsox@1.2.121: {} + jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 kareem@2.6.3: {} @@ -5059,9 +5407,9 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lexical@0.20.0: {} + lexical@0.21.0: {} - lib0@0.2.98: + lib0@0.2.99: dependencies: isomorphic.js: 0.2.5 @@ -5081,6 +5429,8 @@ snapshots: dependencies: js-tokens: 4.0.0 + math-intrinsics@1.1.0: {} + md5@2.3.0: dependencies: charenc: 0.0.2 @@ -5094,12 +5444,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -5114,7 +5464,7 @@ snapshots: devlop: 1.1.0 mdast-util-from-markdown: 2.0.2 mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 @@ -5148,7 +5498,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -5163,9 +5513,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -5178,21 +5528,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -5202,33 +5552,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -5238,12 +5588,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -5266,7 +5616,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -5277,7 +5627,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -5285,24 +5635,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -5312,9 +5662,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -5337,28 +5687,28 @@ snapshots: mkdirp-classic@0.5.3: {} - monaco-editor@0.52.0: {} + monaco-editor@0.52.2: {} - mongodb-connection-string-url@3.0.1: + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 + whatwg-url: 14.1.1 - mongodb@6.10.0: + mongodb@6.12.0: dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.0 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 + mongodb-connection-string-url: 3.0.2 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.8.1: + mongoose@8.9.5: dependencies: - bson: 6.10.0 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.10.0 + mongodb: 6.12.0 mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -5377,47 +5727,47 @@ snapshots: mquery@5.0.0: dependencies: - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color ms@2.1.3: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - next@15.0.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.0.3 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001683 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.0.3 - '@next/swc-darwin-x64': 15.0.3 - '@next/swc-linux-arm64-gnu': 15.0.3 - '@next/swc-linux-arm64-musl': 15.0.3 - '@next/swc-linux-x64-gnu': 15.0.3 - '@next/swc-linux-x64-musl': 15.0.3 - '@next/swc-win32-arm64-msvc': 15.0.3 - '@next/swc-win32-x64-msvc': 15.0.3 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.71.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -5425,43 +5775,46 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} object-to-formdata@4.5.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 on-exit-leak-free@2.1.2: {} @@ -5478,6 +5831,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5490,10 +5849,9 @@ snapshots: dependencies: callsites: 3.1.0 - parse-entities@4.0.1: + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 - character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 decode-named-character-reference: 1.0.2 @@ -5520,45 +5878,44 @@ snapshots: path-type@4.0.0: {} - payload@3.0.2(graphql@16.9.0)(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2): + payload@3.25.0(graphql@16.10.0)(typescript@5.5.2): dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.0.3 - '@payloadcms/translations': 3.0.2 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 + busboy: 1.6.0 ci-info: 4.1.0 console-table-printer: 2.12.1 croner: 9.0.0 - dataloader: 2.2.2 + dataloader: 2.2.3 deepmerge: 4.3.1 file-type: 19.3.0 get-tsconfig: 4.8.1 - graphql: 16.9.0 - http-status: 1.6.2 - image-size: 1.1.1 + graphql: 16.10.0 + http-status: 2.1.0 + image-size: 1.2.0 jose: 5.9.6 json-schema-to-typescript: 15.0.3 minimist: 1.2.8 + path-to-regexp: 6.3.0 pino: 9.5.0 pino-pretty: 13.0.0 pluralize: 8.0.0 + qs-esm: 7.0.2 sanitize-filename: 1.6.3 scmp: 2.1.0 ts-essentials: 10.0.3(typescript@5.5.2) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} picocolors@1.1.1: {} @@ -5595,7 +5952,7 @@ snapshots: on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 4.0.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -5604,36 +5961,36 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.4.31: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.71.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} - prettier@3.3.3: {} + prettier@3.5.2: {} prismjs@1.29.0: {} - process-warning@4.0.0: {} + process-warning@4.0.1: {} prompts@2.4.2: dependencies: @@ -5657,8 +6014,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -5672,33 +6027,25 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-animate-height@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - classnames: 2.5.1 - prop-types: 15.8.1 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react-datepicker@6.9.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-onclickoutside: 6.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - supports-color react-dom@19.0.0(react@19.0.0): @@ -5708,12 +6055,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 - react-error-boundary@4.0.13(react@19.0.0): + react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-image-crop@10.1.8(react@19.0.0): @@ -5722,31 +6069,26 @@ snapshots: react-is@16.13.1: {} - react-onclickoutside@6.13.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) - - react-select@5.8.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): - dependencies: - '@babel/runtime': 7.26.0 - '@emotion/cache': 11.13.5 - '@emotion/react': 11.13.5(@types/react@19.0.1)(react@19.0.0) - '@floating-ui/dom': 1.6.12 - '@types/react-transition-group': 4.4.11 + '@babel/runtime': 7.26.9 + '@emotion/cache': 11.14.0 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) + '@floating-ui/dom': 1.6.13 + '@types/react-transition-group': 4.4.12(@types/react@19.0.1) memoize-one: 6.0.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.1.2(@types/react@19.0.1)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.1)(react@19.0.0) transitivePeerDependencies: - '@types/react' - supports-color react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -5767,23 +6109,26 @@ snapshots: real-require@0.2.0: {} - reflect.getprototypeof@1.0.6: + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: 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 require-from-string@2.0.2: {} @@ -5792,19 +6137,19 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} rimraf@3.0.2: dependencies: @@ -5814,20 +6159,26 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - is-regex: 1.1.4 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} @@ -5841,8 +6192,6 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - scheduler@0.0.0-experimental-3edc000d-20240926: {} - scheduler@0.25.0: {} scmp@2.1.0: {} @@ -5851,15 +6200,15 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -5869,22 +6218,30 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + sharp@0.32.6: dependencies: color: 4.2.3 detect-libc: 2.0.3 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 - tar-fs: 3.0.6 + tar-fs: 3.0.8 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -5913,12 +6270,33 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 sift@17.1.3: {} @@ -5942,7 +6320,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -5957,62 +6335,68 @@ snapshots: split2@4.2.0: {} + stable-hash@0.0.4: {} + state-local@1.0.7: {} streamsearch@1.1.0: {} - streamx@2.20.2: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.1 + text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.5.0 + bare-events: 2.5.4 string.prototype.includes@2.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.3 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.5 + es-abstract: 1.23.9 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@1.3.0: dependencies: @@ -6036,7 +6420,7 @@ snapshots: strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -6055,20 +6439,22 @@ snapshots: tapable@2.2.1: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.6: + tar-fs@3.0.8: dependencies: pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer tar-stream@2.2.0: dependencies: @@ -6082,9 +6468,11 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.20.2 + streamx: 2.22.0 - text-decoder@1.2.1: {} + text-decoder@1.2.3: + dependencies: + b4a: 1.6.7 text-table@0.2.0: {} @@ -6092,9 +6480,9 @@ snapshots: dependencies: real-require: 0.2.0 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: @@ -6106,7 +6494,7 @@ snapshots: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - tr46@4.1.1: + tr46@5.0.0: dependencies: punycode: 2.3.1 @@ -6114,7 +6502,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.4.0(typescript@5.5.2): + ts-api-utils@2.0.1(typescript@5.5.2): dependencies: typescript: 5.5.2 @@ -6134,7 +6522,14 @@ snapshots: tsx@4.19.2: dependencies: esbuild: 0.23.1 - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 + optionalDependencies: + fsevents: 2.3.3 + + tsx@4.19.3: + dependencies: + esbuild: 0.25.0 + get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 @@ -6148,50 +6543,51 @@ snapshots: type-fest@0.20.2: {} - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 typescript@5.5.2: {} uint8array-extras@1.4.0: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - undici-types@6.19.8: {} + undici-types@6.20.0: {} unist-util-is@6.0.0: dependencies: @@ -6220,12 +6616,12 @@ snapshots: dependencies: punycode: 2.3.1 - use-context-selector@2.0.0(react@19.0.0)(scheduler@0.0.0-experimental-3edc000d-20240926): + use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0): dependencies: react: 19.0.0 - scheduler: 0.0.0-experimental-3edc000d-20240926 + scheduler: 0.25.0 - use-isomorphic-layout-effect@1.1.2(@types/react@19.0.1)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: @@ -6244,47 +6640,49 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@13.0.0: + whatwg-url@14.1.1: dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.1.4: + which-builtin-type@1.2.1: dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 - which-typed-array@1.1.15: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.5 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: @@ -6295,7 +6693,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: @@ -6304,9 +6702,9 @@ snapshots: yaml@1.10.2: {} - yjs@13.6.20: + yjs@13.6.23: dependencies: - lib0: 0.2.98 + lib0: 0.2.99 yocto-queue@0.1.0: {} diff --git a/examples/multi-tenant/src/app/(payload)/admin/importMap.js b/examples/multi-tenant/src/app/(payload)/admin/importMap.js index 694b5399ad..f24146b1be 100644 --- a/examples/multi-tenant/src/app/(payload)/admin/importMap.js +++ b/examples/multi-tenant/src/app/(payload)/admin/importMap.js @@ -1,12 +1,12 @@ import { TenantField as TenantField_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' -import { TenantSelector as TenantSelector_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' -import { TenantSelectionProvider as TenantSelectionProvider_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' +import { TenantSelector as TenantSelector_1d0591e3cf4f332c83a86da13a0de59a } from '@payloadcms/plugin-multi-tenant/client' +import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' export const importMap = { '@payloadcms/plugin-multi-tenant/client#TenantField': TenantField_1d0591e3cf4f332c83a86da13a0de59a, - '@payloadcms/plugin-multi-tenant/rsc#TenantSelector': - TenantSelector_d6d5f193a167989e2ee7d14202901e62, - '@payloadcms/plugin-multi-tenant/client#TenantSelectionProvider': - TenantSelectionProvider_1d0591e3cf4f332c83a86da13a0de59a, + '@payloadcms/plugin-multi-tenant/client#TenantSelector': + TenantSelector_1d0591e3cf4f332c83a86da13a0de59a, + '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider': + TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62, } From 83b4548fc1c5f914118936f97dd9ce29d4da5bf5 Mon Sep 17 00:00:00 2001 From: Patrik Date: Fri, 28 Feb 2025 15:14:21 -0500 Subject: [PATCH 052/127] fix(next): active nav item not clickable in edit view (#11457) This fixes an issue where the active collection nav item was non-clickable inside documents. Now, it remains clickable when viewing a document, allowing users to return to the list view from the nav items in the sidebar. The active state indicator still appears in both cases. --- packages/next/src/elements/Nav/index.client.tsx | 14 ++++++++------ packages/next/src/elements/Nav/index.scss | 5 +++++ test/admin/e2e/general/e2e.spec.ts | 11 ++++++++++- test/admin/payload-types.ts | 1 - 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index 1bb703545e..cdc357758b 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -44,17 +44,19 @@ export const DefaultNavClient: React.FC<{ id = `nav-global-${slug}` } - const activeCollection = - pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]) + const isActive = pathname.startsWith(href) const Label = ( - {getTranslation(label, i18n)} + <> + {isActive &&
} + {getTranslation(label, i18n)} + ) - if (activeCollection) { + // If the URL matches the link exactly + if (pathname === href) { return ( -
-
+
{Label}
) diff --git a/packages/next/src/elements/Nav/index.scss b/packages/next/src/elements/Nav/index.scss index 636b6b103d..76ce29f562 100644 --- a/packages/next/src/elements/Nav/index.scss +++ b/packages/next/src/elements/Nav/index.scss @@ -121,6 +121,11 @@ } } + &__link:has(.nav__link-indicator) { + font-weight: 600; + padding-left: 0; + } + &__link-indicator { position: absolute; display: block; diff --git a/test/admin/e2e/general/e2e.spec.ts b/test/admin/e2e/general/e2e.spec.ts index 6c84a828c8..e62eb98682 100644 --- a/test/admin/e2e/general/e2e.spec.ts +++ b/test/admin/e2e/general/e2e.spec.ts @@ -409,12 +409,21 @@ describe('General', () => { test('should disable active nav item', async () => { await page.goto(postsUrl.list) await openNav(page) - const activeItem = page.locator('.nav .nav__link.active') + const activeItem = page.locator('.nav .nav__link:has(.nav__link-indicator)') await expect(activeItem).toBeVisible() const tagName = await activeItem.evaluate((el) => el.tagName.toLowerCase()) expect(tagName).toBe('div') }) + test('should keep active nav item enabled in the edit view', async () => { + await page.goto(postsUrl.create) + await openNav(page) + const activeItem = page.locator('.nav .nav__link:has(.nav__link-indicator)') + await expect(activeItem).toBeVisible() + const tagName = await activeItem.evaluate((el) => el.tagName.toLowerCase()) + expect(tagName).toBe('a') + }) + test('breadcrumbs — should navigate from list to dashboard', async () => { await page.goto(postsUrl.list) await page.locator(`.step-nav a[href="${adminRoutes.routes.admin}"]`).click() diff --git a/test/admin/payload-types.ts b/test/admin/payload-types.ts index 08f3e7a75e..639d13eac3 100644 --- a/test/admin/payload-types.ts +++ b/test/admin/payload-types.ts @@ -64,7 +64,6 @@ export interface Config { auth: { users: UserAuthOperations; }; - blocks: {}; collections: { uploads: Upload; posts: Post; From fc42c40883b2f21a3dd7a73cc7204850dedfe977 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:50:23 +0200 Subject: [PATCH 053/127] fix(storage-s3, storage-azure, storage-gcs): client uploads when a collection has `prefix` configured (#11436) ### What? Fixes client uploads when storage collection config has the `prefix` property configured. Previously, it failed with "Object key was not found". ### Why? This is expected to work. ### How? The client upload handler now receives to its props `prefix`. Then it threads it to the server-side `staticHandler` through `clientUploadContext` and then to `getFilePrefix`, which checks for `clientUploadContext.prefix` and returns if there is. Previously, `staticHandler` tried to load the file without including prefix consideration. This changes only these adapters: * S3 * Azure * GCS With the Vercel Blob adapter, `prefix` works correctly. --- .../src/client/createClientUploadHandler.tsx | 4 ++++ .../src/utilities/getFilePrefix.ts | 12 ++++++++++++ .../src/utilities/initClientUploads.ts | 12 ++++++++++++ .../src/client/AzureClientUploadHandler.ts | 4 +++- packages/storage-azure/src/staticHandler.ts | 4 ++-- .../storage-gcs/src/client/GcsClientUploadHandler.ts | 6 +++++- packages/storage-gcs/src/staticHandler.ts | 4 ++-- .../storage-s3/src/client/S3ClientUploadHandler.ts | 4 +++- packages/storage-s3/src/staticHandler.ts | 4 ++-- 9 files changed, 45 insertions(+), 9 deletions(-) diff --git a/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx index a53c16d551..0aab613fe0 100644 --- a/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx +++ b/packages/plugin-cloud-storage/src/client/createClientUploadHandler.tsx @@ -10,6 +10,7 @@ type ClientUploadHandlerProps> = { collectionSlug: UploadCollectionSlug enabled?: boolean extra: T + prefix?: string serverHandlerPath: string } @@ -21,6 +22,7 @@ export const createClientUploadHandler = >({ collectionSlug: UploadCollectionSlug extra: T file: File + prefix?: string serverHandlerPath: string serverURL: string updateFilename: (value: string) => void @@ -31,6 +33,7 @@ export const createClientUploadHandler = >({ collectionSlug, enabled, extra, + prefix, serverHandlerPath, }: ClientUploadHandlerProps) { const { setUploadHandler } = useUploadHandlers() @@ -51,6 +54,7 @@ export const createClientUploadHandler = >({ collectionSlug, extra, file, + prefix, serverHandlerPath, serverURL, updateFilename, diff --git a/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts b/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts index fd9778acb5..6e2771f51d 100644 --- a/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts +++ b/packages/plugin-cloud-storage/src/utilities/getFilePrefix.ts @@ -1,14 +1,26 @@ import type { CollectionConfig, PayloadRequest, UploadConfig } from 'payload' export async function getFilePrefix({ + clientUploadContext, collection, filename, req, }: { + clientUploadContext?: unknown collection: CollectionConfig filename: string req: PayloadRequest }): Promise { + // Prioritize from clientUploadContext if there is: + if ( + clientUploadContext && + typeof clientUploadContext === 'object' && + 'prefix' in clientUploadContext && + typeof clientUploadContext.prefix === 'string' + ) { + return clientUploadContext.prefix + } + const imageSizes = (collection?.upload as UploadConfig)?.imageSizes || [] const files = await req.payload.find({ diff --git a/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts index 316995c380..6b8b454e73 100644 --- a/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts +++ b/packages/plugin-cloud-storage/src/utilities/initClientUploads.ts @@ -63,11 +63,23 @@ export const initClientUploads = , T> for (const collectionSlug in collections) { const collection = collections[collectionSlug] + let prefix: string | undefined + + if ( + collection && + typeof collection === 'object' && + 'prefix' in collection && + typeof collection.prefix === 'string' + ) { + prefix = collection.prefix + } + config.admin.components.providers.push({ clientProps: { collectionSlug, enabled, extra: extraClientHandlerProps ? extraClientHandlerProps(collection) : undefined, + prefix, serverHandlerPath, }, path: clientHandler, diff --git a/packages/storage-azure/src/client/AzureClientUploadHandler.ts b/packages/storage-azure/src/client/AzureClientUploadHandler.ts index c61251fea6..f615962dc6 100644 --- a/packages/storage-azure/src/client/AzureClientUploadHandler.ts +++ b/packages/storage-azure/src/client/AzureClientUploadHandler.ts @@ -2,7 +2,7 @@ import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' export const AzureClientUploadHandler = createClientUploadHandler({ - handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + handler: async ({ apiRoute, collectionSlug, file, prefix, serverHandlerPath, serverURL }) => { const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { body: JSON.stringify({ collectionSlug, @@ -25,5 +25,7 @@ export const AzureClientUploadHandler = createClientUploadHandler({ }, method: 'PUT', }) + + return { prefix } }, }) diff --git a/packages/storage-azure/src/staticHandler.ts b/packages/storage-azure/src/staticHandler.ts index 0dcc888b7d..58ea821120 100644 --- a/packages/storage-azure/src/staticHandler.ts +++ b/packages/storage-azure/src/staticHandler.ts @@ -13,9 +13,9 @@ interface Args { } export const getHandler = ({ collection, getStorageClient }: Args): StaticHandler => { - return async (req, { params: { filename } }) => { + return async (req, { params: { clientUploadContext, filename } }) => { try { - const prefix = await getFilePrefix({ collection, filename, req }) + const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req }) const blockBlobClient = getStorageClient().getBlockBlobClient( path.posix.join(prefix, filename), ) diff --git a/packages/storage-gcs/src/client/GcsClientUploadHandler.ts b/packages/storage-gcs/src/client/GcsClientUploadHandler.ts index 549c5a3c17..84b8a41320 100644 --- a/packages/storage-gcs/src/client/GcsClientUploadHandler.ts +++ b/packages/storage-gcs/src/client/GcsClientUploadHandler.ts @@ -2,7 +2,7 @@ import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' export const GcsClientUploadHandler = createClientUploadHandler({ - handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + handler: async ({ apiRoute, collectionSlug, file, prefix, serverHandlerPath, serverURL }) => { const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { body: JSON.stringify({ collectionSlug, @@ -20,5 +20,9 @@ export const GcsClientUploadHandler = createClientUploadHandler({ headers: { 'Content-Length': file.size.toString(), 'Content-Type': file.type }, method: 'PUT', }) + + return { + prefix, + } }, }) diff --git a/packages/storage-gcs/src/staticHandler.ts b/packages/storage-gcs/src/staticHandler.ts index 0103c9d700..f6828fe834 100644 --- a/packages/storage-gcs/src/staticHandler.ts +++ b/packages/storage-gcs/src/staticHandler.ts @@ -12,9 +12,9 @@ interface Args { } export const getHandler = ({ bucket, collection, getStorageClient }: Args): StaticHandler => { - return async (req, { params: { filename } }) => { + return async (req, { params: { clientUploadContext, filename } }) => { try { - const prefix = await getFilePrefix({ collection, filename, req }) + const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req }) const file = getStorageClient().bucket(bucket).file(path.posix.join(prefix, filename)) const [metadata] = await file.getMetadata() diff --git a/packages/storage-s3/src/client/S3ClientUploadHandler.ts b/packages/storage-s3/src/client/S3ClientUploadHandler.ts index 7f1748a89d..c4dc148aab 100644 --- a/packages/storage-s3/src/client/S3ClientUploadHandler.ts +++ b/packages/storage-s3/src/client/S3ClientUploadHandler.ts @@ -2,7 +2,7 @@ import { createClientUploadHandler } from '@payloadcms/plugin-cloud-storage/client' export const S3ClientUploadHandler = createClientUploadHandler({ - handler: async ({ apiRoute, collectionSlug, file, serverHandlerPath, serverURL }) => { + handler: async ({ apiRoute, collectionSlug, file, prefix, serverHandlerPath, serverURL }) => { const response = await fetch(`${serverURL}${apiRoute}${serverHandlerPath}`, { body: JSON.stringify({ collectionSlug, @@ -20,5 +20,7 @@ export const S3ClientUploadHandler = createClientUploadHandler({ headers: { 'Content-Length': file.size.toString(), 'Content-Type': file.type }, method: 'PUT', }) + + return { prefix } }, }) diff --git a/packages/storage-s3/src/staticHandler.ts b/packages/storage-s3/src/staticHandler.ts index 7b903e7b52..056ed7678d 100644 --- a/packages/storage-s3/src/staticHandler.ts +++ b/packages/storage-s3/src/staticHandler.ts @@ -35,9 +35,9 @@ const streamToBuffer = async (readableStream: any) => { } export const getHandler = ({ bucket, collection, getStorageClient }: Args): StaticHandler => { - return async (req, { params: { filename } }) => { + return async (req, { params: { clientUploadContext, filename } }) => { try { - const prefix = await getFilePrefix({ collection, filename, req }) + const prefix = await getFilePrefix({ clientUploadContext, collection, filename, req }) const key = path.posix.join(prefix, filename) From 6cbda9e231a446f5d8af2a6af86bdcf71c1dbd5c Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Fri, 28 Feb 2025 16:06:40 -0500 Subject: [PATCH 054/127] fix(ui): bulk editing users throws client-side exception (#11461) When bulk editing an auth-enabled collection such as users, a client-side exception is thrown. This is because we're trying to access the `disableBulkEdit` property on `undefined`. This is due to hidden, auth-specific fields like `salt` and `hash` lacking an admin config. No test is explicitly needed for this as `"strictNullChecks": true` will throw an error at compile time, once enabled. --- packages/ui/src/elements/FieldSelect/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/elements/FieldSelect/index.tsx b/packages/ui/src/elements/FieldSelect/index.tsx index 2ebfe60cec..c50f0eedd5 100644 --- a/packages/ui/src/elements/FieldSelect/index.tsx +++ b/packages/ui/src/elements/FieldSelect/index.tsx @@ -67,7 +67,7 @@ const reduceFields = ({ // escape for a variety of reasons, include ui fields as they have `name`. if ( (fieldAffectsData(field) || field.type === 'ui') && - (field.admin.disableBulkEdit || + (field.admin?.disableBulkEdit || field.unique || fieldIsHiddenOrDisabled(field) || ('readOnly' in field && field.readOnly)) From 25e8799a09db3f7c8e57aa16f084b23c35c0ddbe Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Fri, 28 Feb 2025 23:14:51 +0200 Subject: [PATCH 055/127] docs: add few notes about DocumentDB and Azure Cosmos DB (#11336) Adds few notes about limitations when using Azure Cosmos DB and DocumentDB Discussion: https://github.com/payloadcms/payload/discussions/11333 --- docs/database/mongodb.mdx | 8 ++++++++ docs/fields/join.mdx | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/docs/database/mongodb.mdx b/docs/database/mongodb.mdx index 4febdf4149..c6fcdd45c3 100644 --- a/docs/database/mongodb.mdx +++ b/docs/database/mongodb.mdx @@ -50,3 +50,11 @@ You can access Mongoose models as follows: - Collection models - `payload.db.collections[myCollectionSlug]` - Globals model - `payload.db.globals` - Versions model (both collections and globals) - `payload.db.versions[myEntitySlug]` + +## Using other MongoDB implementations +Limitations with [DocumentDB](https://aws.amazon.com/documentdb/) and [Azure Cosmos DB](https://azure.microsoft.com/en-us/products/cosmos-db): + +* For Azure Cosmos DB you must pass `transactionOptions: false` to the adapter options. Azure Cosmos DB does not support transactions that update two and more documents in different collections, which is a common case when using Payload (via hooks). +* For Azure Cosmos DB the root config property `indexSortableFields` must be set to `true`. +* The [Join Field](../fields/join) is not supported in DocumentDB and Azure Cosmos DB, as we internally use MongoDB aggregations to query data for that field, which are limited there. This can be changed in the future. +* For DocumentDB pass `disableIndexHints: true` to disable hinting to the DB to use `id` as index which can cause problems with DocumentDB. \ No newline at end of file diff --git a/docs/fields/join.mdx b/docs/fields/join.mdx index 2a80619f04..6c006a03e0 100644 --- a/docs/fields/join.mdx +++ b/docs/fields/join.mdx @@ -62,6 +62,10 @@ of relationship types in an easy manner. The Join field is extremely performant and does not add additional query overhead to your API responses until you add depth of 1 or above. It works in all database adapters. In MongoDB, we use **aggregations** to automatically join in related documents, and in relational databases, we use joins. + + The Join Field is not supported in [DocumentDB](https://aws.amazon.com/documentdb/) and [Azure Cosmos DB](https://azure.microsoft.com/en-us/products/cosmos-db), as we internally use MongoDB aggregations to query data for that field, which are limited there. This can be changed in the future. + + ### Schema advice When modeling your database, you might come across many places where you'd like to feature bi-directional relationships. From 45a7c8b76413662ba173c278572a488dd764d5cb Mon Sep 17 00:00:00 2001 From: Michael Bykovski Date: Fri, 28 Feb 2025 22:38:32 +0100 Subject: [PATCH 056/127] fix: response headers from authstrategies are now merged together, even if no user was returned (#10883) ### What? Merges response headers returned from auth strategies --------- Co-authored-by: Jarrod Flesch --- .../payload/src/auth/executeAuthStrategies.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/payload/src/auth/executeAuthStrategies.ts b/packages/payload/src/auth/executeAuthStrategies.ts index 3eb41d9fa2..29c67107ca 100644 --- a/packages/payload/src/auth/executeAuthStrategies.ts +++ b/packages/payload/src/auth/executeAuthStrategies.ts @@ -1,19 +1,31 @@ import type { AuthStrategyFunctionArgs, AuthStrategyResult } from './index.js' + +import { mergeHeaders } from '../utilities/mergeHeaders.js' export const executeAuthStrategies = async ( args: AuthStrategyFunctionArgs, ): Promise => { + let result: AuthStrategyResult = { user: null } + if (!args.payload.authStrategies?.length) { - return { user: null } + return result } for (const strategy of args.payload.authStrategies) { // add the configured AuthStrategy `name` to the strategy function args args.strategyName = strategy.name - const result = await strategy.authenticate(args) + const authResult = await strategy.authenticate(args) + if (authResult.responseHeaders) { + authResult.responseHeaders = mergeHeaders( + result.responseHeaders || new Headers(), + authResult.responseHeaders || new Headers(), + ) + } + result = authResult + if (result.user) { return result } } - return { user: null } + return result } From f7f56510046acf35ee999dff084d355637940e50 Mon Sep 17 00:00:00 2001 From: Vincent Vu Date: Sat, 1 Mar 2025 09:03:42 +1100 Subject: [PATCH 057/127] fix(templates): handle enableLink condition safely (#10728) --- templates/website/src/blocks/Content/config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/templates/website/src/blocks/Content/config.ts b/templates/website/src/blocks/Content/config.ts index 16a01e218c..db9bcdf554 100644 --- a/templates/website/src/blocks/Content/config.ts +++ b/templates/website/src/blocks/Content/config.ts @@ -55,7 +55,9 @@ const columnFields: Field[] = [ link({ overrides: { admin: { - condition: (_, { enableLink }) => Boolean(enableLink), + condition: (_data, siblingData) => { + return Boolean(siblingData?.enableLink); + }, }, }, }), From 79a7b4ad02017e108b89c5ff5387c4ad185a3f89 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Sat, 1 Mar 2025 00:17:24 +0200 Subject: [PATCH 058/127] chore(db-mongodb): tsconfig uses `strict: true` and `noUncheckedIndexedAccess: true` (#11444) Migrates the `db-mongodb` package to use `strict: true` and `noUncheckedIndexedAccess: true` TSConfig properties. This greatly improves code quality and prevents some runtime errors or gives better error messages. --- packages/db-mongodb/package.json | 3 + packages/db-mongodb/src/connect.ts | 8 +- packages/db-mongodb/src/count.ts | 10 +- .../db-mongodb/src/countGlobalVersions.ts | 12 +- packages/db-mongodb/src/countVersions.ts | 16 +- packages/db-mongodb/src/create.ts | 14 +- packages/db-mongodb/src/createGlobal.ts | 14 +- .../db-mongodb/src/createGlobalVersion.ts | 17 +- packages/db-mongodb/src/createMigration.ts | 5 +- packages/db-mongodb/src/createVersion.ts | 21 +- packages/db-mongodb/src/deleteMany.ts | 13 +- packages/db-mongodb/src/deleteOne.ts | 14 +- packages/db-mongodb/src/deleteVersions.ts | 17 +- packages/db-mongodb/src/find.ts | 21 +- packages/db-mongodb/src/findGlobal.ts | 13 +- packages/db-mongodb/src/findGlobalVersions.ts | 25 +- packages/db-mongodb/src/findOne.ts | 14 +- packages/db-mongodb/src/findVersions.ts | 27 +- packages/db-mongodb/src/index.ts | 12 +- packages/db-mongodb/src/init.ts | 6 +- packages/db-mongodb/src/migrateFresh.ts | 2 - .../src/models/buildCollectionSchema.ts | 2 +- packages/db-mongodb/src/models/buildSchema.ts | 1241 +++++++++-------- .../migrateRelationshipsV2_V3.ts | 27 +- .../migrateVersionsV1_V2.ts | 32 +- .../src/queries/buildSearchParams.ts | 139 +- .../db-mongodb/src/queries/buildSortParam.ts | 9 +- .../src/queries/getBuildQueryPlugin.ts | 32 +- .../queries/getLocalizedSortProperty.spec.ts | 8 + .../src/queries/getLocalizedSortProperty.ts | 23 +- .../db-mongodb/src/queries/operatorMap.ts | 2 + .../db-mongodb/src/queries/parseParams.ts | 11 +- .../src/queries/sanitizeQueryValue.ts | 67 +- packages/db-mongodb/src/queryDrafts.ts | 37 +- .../src/transactions/beginTransaction.ts | 6 +- .../src/transactions/commitTransaction.ts | 9 +- .../src/transactions/rollbackTransaction.ts | 9 +- packages/db-mongodb/src/updateGlobal.ts | 18 +- .../db-mongodb/src/updateGlobalVersion.ts | 12 +- packages/db-mongodb/src/updateMany.ts | 27 +- packages/db-mongodb/src/updateOne.ts | 18 +- packages/db-mongodb/src/updateVersion.ts | 37 +- .../src/utilities/aggregatePaginate.ts | 10 +- .../src/utilities/buildJoinAggregation.ts | 77 +- .../utilities/buildProjectionFromSelect.ts | 22 +- .../db-mongodb/src/utilities/getDBName.ts | 10 +- .../db-mongodb/src/utilities/getEntity.ts | 91 ++ .../db-mongodb/src/utilities/handleError.ts | 13 +- .../db-mongodb/src/utilities/transform.ts | 24 +- packages/db-mongodb/tsconfig.json | 5 - pnpm-lock.yaml | 26 + test/queues/int.spec.ts | 3 +- 52 files changed, 1370 insertions(+), 961 deletions(-) create mode 100644 packages/db-mongodb/src/utilities/getEntity.ts diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 95af5b604f..7608eab212 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -53,6 +53,9 @@ }, "devDependencies": { "@payloadcms/eslint-config": "workspace:*", + "@types/mongoose-aggregate-paginate-v2": "1.0.12", + "@types/prompts": "^2.4.5", + "@types/uuid": "10.0.0", "mongodb": "6.12.0", "mongodb-memory-server": "^10", "payload": "workspace:*" diff --git a/packages/db-mongodb/src/connect.ts b/packages/db-mongodb/src/connect.ts index 57eea475b8..040c0c1ab9 100644 --- a/packages/db-mongodb/src/connect.ts +++ b/packages/db-mongodb/src/connect.ts @@ -70,9 +70,15 @@ export const connect: Connect = async function connect( await this.migrate({ migrations: this.prodMigrations }) } } catch (err) { + let msg = `Error: cannot connect to MongoDB.` + + if (typeof err === 'object' && err && 'message' in err && typeof err.message === 'string') { + msg = `${msg} Details: ${err.message}` + } + this.payload.logger.error({ err, - msg: `Error: cannot connect to MongoDB. Details: ${err.message}`, + msg, }) process.exit(1) } diff --git a/packages/db-mongodb/src/count.ts b/packages/db-mongodb/src/count.ts index e79c5964c9..fd0aa284d2 100644 --- a/packages/db-mongodb/src/count.ts +++ b/packages/db-mongodb/src/count.ts @@ -6,13 +6,15 @@ import { flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const count: Count = async function count( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where = {} }, ) { - const Model = this.collections[collection] + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,8 +28,8 @@ export const count: Count = async function count( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) diff --git a/packages/db-mongodb/src/countGlobalVersions.ts b/packages/db-mongodb/src/countGlobalVersions.ts index 0a5b26c522..c91f1c8fd8 100644 --- a/packages/db-mongodb/src/countGlobalVersions.ts +++ b/packages/db-mongodb/src/countGlobalVersions.ts @@ -6,13 +6,15 @@ import { buildVersionGlobalFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const countGlobalVersions: CountGlobalVersions = async function countGlobalVersions( this: MongooseAdapter, - { global, locale, req, where }, + { global: globalSlug, locale, req, where = {} }, ) { - const Model = this.versions[global] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,11 +28,7 @@ export const countGlobalVersions: CountGlobalVersions = async function countGlob const query = await buildQuery({ adapter: this, - fields: buildVersionGlobalFields( - this.payload.config, - this.payload.globals.config.find((each) => each.slug === global), - true, - ), + fields: buildVersionGlobalFields(this.payload.config, globalConfig, true), locale, where, }) diff --git a/packages/db-mongodb/src/countVersions.ts b/packages/db-mongodb/src/countVersions.ts index 87b7fcc55d..bb31931cb0 100644 --- a/packages/db-mongodb/src/countVersions.ts +++ b/packages/db-mongodb/src/countVersions.ts @@ -6,13 +6,19 @@ import { buildVersionCollectionFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const countVersions: CountVersions = async function countVersions( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where = {} }, ) { - const Model = this.versions[collection] + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const options: CountOptions = { session: await getSession(this, req), } @@ -26,11 +32,7 @@ export const countVersions: CountVersions = async function countVersions( const query = await buildQuery({ adapter: this, - fields: buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ), + fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true), locale, where, }) diff --git a/packages/db-mongodb/src/create.ts b/packages/db-mongodb/src/create.ts index f3db852854..f1638ecf39 100644 --- a/packages/db-mongodb/src/create.ts +++ b/packages/db-mongodb/src/create.ts @@ -3,15 +3,17 @@ import type { Create } from 'payload' import type { MongooseAdapter } from './index.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { handleError } from './utilities/handleError.js' import { transform } from './utilities/transform.js' export const create: Create = async function create( this: MongooseAdapter, - { collection, data, req, returning }, + { collection: collectionSlug, data, req, returning }, ) { - const Model = this.collections[collection] + const { collectionConfig, customIDType, Model } = getCollection({ adapter: this, collectionSlug }) + const options: CreateOptions = { session: await getSession(this, req), } @@ -21,18 +23,18 @@ export const create: Create = async function create( transform({ adapter: this, data, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'write', }) - if (this.payload.collections[collection].customIDType) { + if (customIDType) { data._id = data.id } try { ;[doc] = await Model.create([data], options) } catch (error) { - handleError({ collection, error, req }) + handleError({ collection: collectionSlug, error, req }) } if (returning === false) { return null @@ -43,7 +45,7 @@ export const create: Create = async function create( transform({ adapter: this, data: doc, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/createGlobal.ts b/packages/db-mongodb/src/createGlobal.ts index a90d96c8cc..f91c4e5b35 100644 --- a/packages/db-mongodb/src/createGlobal.ts +++ b/packages/db-mongodb/src/createGlobal.ts @@ -1,22 +1,24 @@ import type { CreateOptions } from 'mongoose' -import type { CreateGlobal } from 'payload' + +import { type CreateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const createGlobal: CreateGlobal = async function createGlobal( this: MongooseAdapter, - { slug, data, req, returning }, + { slug: globalSlug, data, req, returning }, ) { - const Model = this.globals + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) transform({ adapter: this, data, - fields: this.payload.config.globals.find((globalConfig) => globalConfig.slug === slug).fields, - globalSlug: slug, + fields: globalConfig.fields, + globalSlug, operation: 'write', }) @@ -34,7 +36,7 @@ export const createGlobal: CreateGlobal = async function createGlobal( transform({ adapter: this, data: result, - fields: this.payload.config.globals.find((globalConfig) => globalConfig.slug === slug).fields, + fields: globalConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/createGlobalVersion.ts b/packages/db-mongodb/src/createGlobalVersion.ts index 979ac04ad8..c5910231e6 100644 --- a/packages/db-mongodb/src/createGlobalVersion.ts +++ b/packages/db-mongodb/src/createGlobalVersion.ts @@ -1,9 +1,8 @@ -import type { CreateOptions } from 'mongoose' - import { buildVersionGlobalFields, type CreateGlobalVersion } from 'payload' import type { MongooseAdapter } from './index.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -22,8 +21,9 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo versionData, }, ) { - const VersionModel = this.versions[globalSlug] - const options: CreateOptions = { + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + + const options = { session: await getSession(this, req), } @@ -38,10 +38,7 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo version: versionData, } - const fields = buildVersionGlobalFields( - this.payload.config, - this.payload.config.globals.find((global) => global.slug === globalSlug), - ) + const fields = buildVersionGlobalFields(this.payload.config, globalConfig) transform({ adapter: this, @@ -50,9 +47,9 @@ export const createGlobalVersion: CreateGlobalVersion = async function createGlo operation: 'write', }) - let [doc] = await VersionModel.create([data], options, req) + let [doc] = await Model.create([data], options, req) - await VersionModel.updateMany( + await Model.updateMany( { $and: [ { diff --git a/packages/db-mongodb/src/createMigration.ts b/packages/db-mongodb/src/createMigration.ts index ae54ba1a68..61b0da7aa6 100644 --- a/packages/db-mongodb/src/createMigration.ts +++ b/packages/db-mongodb/src/createMigration.ts @@ -42,8 +42,9 @@ export const createMigration: CreateMigration = async function createMigration({ const migrationFileContent = migrationTemplate(predefinedMigration) const [yyymmdd, hhmmss] = new Date().toISOString().split('T') - const formattedDate = yyymmdd.replace(/\D/g, '') - const formattedTime = hhmmss.split('.')[0].replace(/\D/g, '') + + const formattedDate = yyymmdd!.replace(/\D/g, '') + const formattedTime = hhmmss!.split('.')[0]!.replace(/\D/g, '') const timestamp = `${formattedDate}_${formattedTime}` diff --git a/packages/db-mongodb/src/createVersion.ts b/packages/db-mongodb/src/createVersion.ts index d81fdf092d..ec733baa83 100644 --- a/packages/db-mongodb/src/createVersion.ts +++ b/packages/db-mongodb/src/createVersion.ts @@ -1,9 +1,8 @@ -import type { CreateOptions } from 'mongoose' - import { buildVersionCollectionFields, type CreateVersion } from 'payload' import type { MongooseAdapter } from './index.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -22,8 +21,13 @@ export const createVersion: CreateVersion = async function createVersion( versionData, }, ) { - const VersionModel = this.versions[collectionSlug] - const options: CreateOptions = { + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + + const options = { session: await getSession(this, req), } @@ -38,10 +42,7 @@ export const createVersion: CreateVersion = async function createVersion( version: versionData, } - const fields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collectionSlug].config, - ) + const fields = buildVersionCollectionFields(this.payload.config, collectionConfig) transform({ adapter: this, @@ -50,7 +51,7 @@ export const createVersion: CreateVersion = async function createVersion( operation: 'write', }) - let [doc] = await VersionModel.create([data], options, req) + let [doc] = await Model.create([data], options, req) const parentQuery = { $or: [ @@ -62,7 +63,7 @@ export const createVersion: CreateVersion = async function createVersion( ], } - await VersionModel.updateMany( + await Model.updateMany( { $and: [ { diff --git a/packages/db-mongodb/src/deleteMany.ts b/packages/db-mongodb/src/deleteMany.ts index 8ba837a617..a40fc7fb61 100644 --- a/packages/db-mongodb/src/deleteMany.ts +++ b/packages/db-mongodb/src/deleteMany.ts @@ -1,24 +1,27 @@ import type { DeleteOptions } from 'mongodb' -import type { DeleteMany } from 'payload' + +import { type DeleteMany } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const deleteMany: DeleteMany = async function deleteMany( this: MongooseAdapter, - { collection, req, where }, + { collection: collectionSlug, req, where }, ) { - const Model = this.collections[collection] + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const options: DeleteOptions = { session: await getSession(this, req), } const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, where, }) diff --git a/packages/db-mongodb/src/deleteOne.ts b/packages/db-mongodb/src/deleteOne.ts index 80ce73e566..1731642780 100644 --- a/packages/db-mongodb/src/deleteOne.ts +++ b/packages/db-mongodb/src/deleteOne.ts @@ -5,18 +5,20 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const deleteOne: DeleteOne = async function deleteOne( this: MongooseAdapter, - { collection, req, returning, select, where }, + { collection: collectionSlug, req, returning, select, where }, ) { - const Model = this.collections[collection] + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const options: MongooseUpdateQueryOptions = { projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.collections[collection].config.flattenedFields, + fields: collectionConfig.flattenedFields, select, }), session: await getSession(this, req), @@ -24,8 +26,8 @@ export const deleteOne: DeleteOne = async function deleteOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, where, }) @@ -43,7 +45,7 @@ export const deleteOne: DeleteOne = async function deleteOne( transform({ adapter: this, data: doc, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/deleteVersions.ts b/packages/db-mongodb/src/deleteVersions.ts index 9317836848..2c38682a8a 100644 --- a/packages/db-mongodb/src/deleteVersions.ts +++ b/packages/db-mongodb/src/deleteVersions.ts @@ -3,26 +3,27 @@ import { buildVersionCollectionFields, type DeleteVersions } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' export const deleteVersions: DeleteVersions = async function deleteVersions( this: MongooseAdapter, - { collection, locale, req, where }, + { collection: collectionSlug, locale, req, where }, ) { - const VersionsModel = this.versions[collection] + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) const session = await getSession(this, req) const query = await buildQuery({ adapter: this, - fields: buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ), + fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true), locale, where, }) - await VersionsModel.deleteMany(query, { session }) + await Model.deleteMany(query, { session }) } diff --git a/packages/db-mongodb/src/find.ts b/packages/db-mongodb/src/find.ts index e9886cc2b6..8dc64c1993 100644 --- a/packages/db-mongodb/src/find.ts +++ b/packages/db-mongodb/src/find.ts @@ -10,13 +10,14 @@ import { buildSortParam } from './queries/buildSortParam.js' import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const find: Find = async function find( this: MongooseAdapter, { - collection, + collection: collectionSlug, joins = {}, limit = 0, locale, @@ -26,11 +27,10 @@ export const find: Find = async function find( req, select, sort: sortArg, - where, + where = {}, }, ) { - const Model = this.collections[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) const session = await getSession(this, req) @@ -54,8 +54,8 @@ export const find: Find = async function find( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) @@ -109,7 +109,8 @@ export const find: Find = async function find( if (limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { @@ -121,7 +122,7 @@ export const find: Find = async function find( const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, locale, @@ -139,7 +140,7 @@ export const find: Find = async function find( pagination: paginationOptions.pagination, projection: paginationOptions.projection, query, - session: paginationOptions.options?.session, + session: paginationOptions.options?.session ?? undefined, sort: paginationOptions.sort as object, useEstimatedCount: paginationOptions.useEstimatedCount, }) @@ -150,7 +151,7 @@ export const find: Find = async function find( transform({ adapter: this, data: result.docs, - fields: this.payload.collections[collection].config.fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/findGlobal.ts b/packages/db-mongodb/src/findGlobal.ts index dbefa258c8..18e3ad5eb6 100644 --- a/packages/db-mongodb/src/findGlobal.ts +++ b/packages/db-mongodb/src/findGlobal.ts @@ -7,15 +7,16 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findGlobal: FindGlobal = async function findGlobal( this: MongooseAdapter, - { slug, locale, req, select, where }, + { slug: globalSlug, locale, req, select, where = {} }, ) { - const Model = this.globals - const globalConfig = this.payload.globals.config.find((each) => each.slug === slug) + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) + const fields = globalConfig.flattenedFields const options: QueryOptions = { lean: true, @@ -30,12 +31,12 @@ export const findGlobal: FindGlobal = async function findGlobal( const query = await buildQuery({ adapter: this, fields, - globalSlug: slug, + globalSlug, locale, - where: combineQueries({ globalType: { equals: slug } }, where), + where: combineQueries({ globalType: { equals: globalSlug } }, where), }) - const doc = (await Model.findOne(query, {}, options)) as any + const doc: any = await Model.findOne(query, {}, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/findGlobalVersions.ts b/packages/db-mongodb/src/findGlobalVersions.ts index 2ecd21edde..1386302f53 100644 --- a/packages/db-mongodb/src/findGlobalVersions.ts +++ b/packages/db-mongodb/src/findGlobalVersions.ts @@ -1,22 +1,34 @@ import type { PaginateOptions, QueryOptions } from 'mongoose' import type { FindGlobalVersions } from 'payload' -import { buildVersionGlobalFields, flattenWhereToOperators } from 'payload' +import { APIError, buildVersionGlobalFields, flattenWhereToOperators } from 'payload' import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findGlobalVersions: FindGlobalVersions = async function findGlobalVersions( this: MongooseAdapter, - { global, limit, locale, page, pagination, req, select, skip, sort: sortArg, where }, + { + global: globalSlug, + limit, + locale, + page, + pagination, + req, + select, + skip, + sort: sortArg, + where = {}, + }, ) { - const globalConfig = this.payload.globals.config.find(({ slug }) => slug === global) - const Model = this.versions[global] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) + const versionFields = buildVersionGlobalFields(this.payload.config, globalConfig, true) const session = await getSession(this, req) @@ -88,10 +100,11 @@ export const findGlobalVersions: FindGlobalVersions = async function findGlobalV } } - if (limit >= 0) { + if (limit && limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { diff --git a/packages/db-mongodb/src/findOne.ts b/packages/db-mongodb/src/findOne.ts index ae69e78779..16f7c8f992 100644 --- a/packages/db-mongodb/src/findOne.ts +++ b/packages/db-mongodb/src/findOne.ts @@ -1,5 +1,6 @@ import type { AggregateOptions, QueryOptions } from 'mongoose' -import type { FindOne } from 'payload' + +import { type FindOne } from 'payload' import type { MongooseAdapter } from './index.js' @@ -7,15 +8,16 @@ import { buildQuery } from './queries/buildQuery.js' import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findOne: FindOne = async function findOne( this: MongooseAdapter, - { collection, joins, locale, req, select, where }, + { collection: collectionSlug, joins, locale, req, select, where = {} }, ) { - const Model = this.collections[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) + const session = await getSession(this, req) const options: AggregateOptions & QueryOptions = { lean: true, @@ -24,7 +26,7 @@ export const findOne: FindOne = async function findOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, + collectionSlug, fields: collectionConfig.flattenedFields, locale, where, @@ -38,7 +40,7 @@ export const findOne: FindOne = async function findOne( const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, locale, diff --git a/packages/db-mongodb/src/findVersions.ts b/packages/db-mongodb/src/findVersions.ts index 0b5eb37459..3872ce98f5 100644 --- a/packages/db-mongodb/src/findVersions.ts +++ b/packages/db-mongodb/src/findVersions.ts @@ -8,15 +8,31 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildSortParam } from './queries/buildSortParam.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const findVersions: FindVersions = async function findVersions( this: MongooseAdapter, - { collection, limit, locale, page, pagination, req = {}, select, skip, sort: sortArg, where }, + { + collection: collectionSlug, + limit, + locale, + page, + pagination, + req = {}, + select, + skip, + sort: sortArg, + where = {}, + }, ) { - const Model = this.versions[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const session = await getSession(this, req) const options: QueryOptions = { limit, @@ -92,10 +108,11 @@ export const findVersions: FindVersions = async function findVersions( } } - if (limit >= 0) { + if (limit && limit >= 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit // Disable pagination if limit is 0 if (limit === 0) { diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index 93d87a653a..ea7dbd90f8 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -11,6 +11,7 @@ import type { BaseDatabaseAdapter, CollectionSlug, DatabaseAdapterObj, + Migration, Payload, TypeWithID, TypeWithVersion, @@ -110,11 +111,7 @@ export interface Args { * typed as any to avoid dependency */ mongoMemoryServer?: MongoMemoryReplSet - prodMigrations?: { - down: (args: MigrateDownArgs) => Promise - name: string - up: (args: MigrateUpArgs) => Promise - }[] + prodMigrations?: Migration[] transactionOptions?: false | TransactionOptions /** The URL to connect to MongoDB or false to start payload and prevent connecting */ @@ -181,7 +178,7 @@ export function mongooseAdapter({ collectionsSchemaOptions = {}, connectOptions, disableIndexHints = false, - ensureIndexes, + ensureIndexes = false, migrationDir: migrationDirArg, mongoMemoryServer, prodMigrations, @@ -198,11 +195,14 @@ export function mongooseAdapter({ // Mongoose-specific autoPluralization, collections: {}, + // @ts-expect-error initialize without a connection connection: undefined, connectOptions: connectOptions || {}, disableIndexHints, ensureIndexes, + // @ts-expect-error don't have globals model yet globals: undefined, + // @ts-expect-error Should not be required mongoMemoryServer, sessions: {}, transactionOptions: transactionOptions === false ? undefined : transactionOptions, diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index d7b8e144f2..f477d65920 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -6,7 +6,7 @@ import paginate from 'mongoose-paginate-v2' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' import type { MongooseAdapter } from './index.js' -import type { CollectionModel } from './types.js' +import type { CollectionModel, GlobalModel } from './types.js' import { buildCollectionSchema } from './models/buildCollectionSchema.js' import { buildGlobalModel } from './models/buildGlobalModel.js' @@ -16,7 +16,7 @@ import { getDBName } from './utilities/getDBName.js' export const init: Init = function init(this: MongooseAdapter) { this.payload.config.collections.forEach((collection: SanitizedCollectionConfig) => { - const schemaOptions = this.collectionsSchemaOptions[collection.slug] + const schemaOptions = this.collectionsSchemaOptions?.[collection.slug] const schema = buildCollectionSchema(collection, this.payload, schemaOptions) @@ -68,7 +68,7 @@ export const init: Init = function init(this: MongooseAdapter) { ) as CollectionModel }) - this.globals = buildGlobalModel(this.payload) + this.globals = buildGlobalModel(this.payload) as GlobalModel this.payload.config.globals.forEach((global) => { if (global.versions) { diff --git a/packages/db-mongodb/src/migrateFresh.ts b/packages/db-mongodb/src/migrateFresh.ts index 4db2e76c42..cd9e538629 100644 --- a/packages/db-mongodb/src/migrateFresh.ts +++ b/packages/db-mongodb/src/migrateFresh.ts @@ -1,5 +1,3 @@ -import type { PayloadRequest } from 'payload' - import { commitTransaction, initTransaction, killTransaction, readMigrationFiles } from 'payload' import prompts from 'prompts' diff --git a/packages/db-mongodb/src/models/buildCollectionSchema.ts b/packages/db-mongodb/src/models/buildCollectionSchema.ts index 2e182afb5b..8c4070f865 100644 --- a/packages/db-mongodb/src/models/buildCollectionSchema.ts +++ b/packages/db-mongodb/src/models/buildCollectionSchema.ts @@ -28,7 +28,7 @@ export const buildCollectionSchema = ( }) if (Array.isArray(collection.upload.filenameCompoundIndex)) { - const indexDefinition: Record = collection.upload.filenameCompoundIndex.reduce( + const indexDefinition = collection.upload.filenameCompoundIndex.reduce>( (acc, index) => { acc[index] = 1 return acc diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index 2c6d5b69ed..bd350ca171 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -2,6 +2,7 @@ import type { IndexOptions, Schema, SchemaOptions, SchemaTypeOptions } from 'mon import mongoose from 'mongoose' import { + APIError, type ArrayField, type BlocksField, type CheckboxField, @@ -45,8 +46,8 @@ export type BuildSchemaOptions = { options?: SchemaOptions } -type FieldSchemaGenerator = ( - field: Field, +type FieldSchemaGenerator = ( + field: T, schema: Schema, config: Payload, buildSchemaOptions: BuildSchemaOptions, @@ -100,7 +101,7 @@ const formatBaseSchema = ({ const localizeSchema = ( entity: NonPresentationalField | Tab, - schema, + schema: SchemaTypeOptions, localization: false | SanitizedLocalizationConfig, parentIsLocalized: boolean, ) => { @@ -149,7 +150,7 @@ export const buildSchema = (args: { } } - const schema = new mongoose.Schema(fields, options) + const schema = new mongoose.Schema(fields, options as any) schemaFields.forEach((field) => { if (fieldIsVirtual(field)) { @@ -157,10 +158,10 @@ export const buildSchema = (args: { } if (!fieldIsPresentationalOnly(field)) { - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[field.type] + const addFieldSchema = getSchemaGenerator(field.type) if (addFieldSchema) { - addFieldSchema(field, schema, payload, buildSchemaOptions, parentIsLocalized) + addFieldSchema(field, schema, payload, buildSchemaOptions, parentIsLocalized ?? false) } } }) @@ -168,181 +169,21 @@ export const buildSchema = (args: { return schema } -const fieldToSchemaMap: Record = { - array: (field: ArrayField, schema, payload, buildSchemaOptions, parentIsLocalized) => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: [ - buildSchema({ - buildSchemaOptions: { - allowIDField: true, - disableUnique: buildSchemaOptions.disableUnique, - draftsEnabled: buildSchemaOptions.draftsEnabled, - options: { - _id: false, - id: false, - minimize: false, - }, - }, - configFields: field.fields, - parentIsLocalized: parentIsLocalized || field.localized, - payload, - }), - ], - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - blocks: (field: BlocksField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const fieldSchema = { - type: [new mongoose.Schema({}, { _id: false, discriminatorKey: 'blockType' })], - } - - schema.add({ - [field.name]: localizeSchema( - field, - fieldSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - ;(field.blockReferences ?? field.blocks).forEach((blockItem) => { - const blockSchema = new mongoose.Schema({}, { _id: false, id: false }) - - const block = typeof blockItem === 'string' ? payload.blocks[blockItem] : blockItem - - block.fields.forEach((blockField) => { - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[blockField.type] - if (addFieldSchema) { - addFieldSchema( - blockField, - blockSchema, - payload, - buildSchemaOptions, - parentIsLocalized || field.localized, - ) - } - }) - - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - payload.config.localization.localeCodes.forEach((localeCode) => { - // @ts-expect-error Possible incorrect typing in mongoose types, this works - schema.path(`${field.name}.${localeCode}`).discriminator(block.slug, blockSchema) - }) - } else { - // @ts-expect-error Possible incorrect typing in mongoose types, this works - schema.path(field.name).discriminator(block.slug, blockSchema) - } - }) - }, - checkbox: ( - field: CheckboxField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: Boolean, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - code: (field: CodeField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - collapsible: ( - field: CollapsibleField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - field.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] - - if (addFieldSchema) { - addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) - } - }) - }, - date: (field: DateField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: Date, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - email: (field: EmailField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - group: (field: GroupField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const formattedBaseSchema = formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }) - - // carry indexSortableFields through to versions if drafts enabled - const indexSortableFields = - buildSchemaOptions.indexSortableFields && - field.name === 'version' && - buildSchemaOptions.draftsEnabled - - const baseSchema = { - ...formattedBaseSchema, - type: buildSchema({ +const array: FieldSchemaGenerator = ( + field: ArrayField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +) => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: [ + buildSchema({ buildSchemaOptions: { + allowIDField: true, disableUnique: buildSchemaOptions.disableUnique, draftsEnabled: buildSchemaOptions.draftsEnabled, - indexSortableFields, options: { _id: false, id: false, @@ -353,426 +194,660 @@ const fieldToSchemaMap: Record = { parentIsLocalized: parentIsLocalized || field.localized, payload, }), + ], + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const blocks: FieldSchemaGenerator = ( + field: BlocksField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const fieldSchema: SchemaTypeOptions = { + type: [new mongoose.Schema({}, { _id: false, discriminatorKey: 'blockType' })], + } + + schema.add({ + [field.name]: localizeSchema( + field, + fieldSchema, + payload.config.localization, + parentIsLocalized, + ), + }) + ;(field.blockReferences ?? field.blocks).forEach((blockItem) => { + const blockSchema = new mongoose.Schema({}, { _id: false, id: false }) + + const block = typeof blockItem === 'string' ? payload.blocks[blockItem] : blockItem + + if (!block) { + return } - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - json: (field: JSONField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: mongoose.Schema.Types.Mixed, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - number: (field: NumberField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: field.hasMany ? [Number] : Number, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - point: (field: PointField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema: SchemaTypeOptions = { - type: { - type: String, - enum: ['Point'], - ...(typeof field.defaultValue !== 'undefined' && { - default: 'Point', - }), - }, - coordinates: { - type: [Number], - default: formatDefaultValue(field), - required: false, - }, - } - if ( - buildSchemaOptions.disableUnique && - field.unique && - fieldShouldBeLocalized({ field, parentIsLocalized }) - ) { - baseSchema.coordinates.sparse = true - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - - if (field.index === true || field.index === undefined) { - const indexOptions: IndexOptions = {} - if (!buildSchemaOptions.disableUnique && field.unique) { - indexOptions.sparse = true - indexOptions.unique = true - } - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - payload.config.localization.locales.forEach((locale) => { - schema.index({ [`${field.name}.${locale.code}`]: '2dsphere' }, indexOptions) - }) - } else { - schema.index({ [field.name]: '2dsphere' }, indexOptions) - } - } - }, - radio: (field: RadioField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - enum: field.options.map((option) => { - if (typeof option === 'object') { - return option.value - } - return option - }), - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - relationship: ( - field: RelationshipField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ) => { - const hasManyRelations = Array.isArray(field.relationTo) - let schemaToReturn: { [key: string]: any } = {} - - const valueType = getRelationshipValueType(field, payload) - - if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - schemaToReturn = { - _id: false, - type: payload.config.localization.localeCodes.reduce((locales, locale) => { - let localeSchema: { [key: string]: any } = {} - - if (hasManyRelations) { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.${locale}.relationTo`, - }, - } - } else { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - } - - return { - ...locales, - [locale]: field.hasMany - ? { type: [localeSchema], default: formatDefaultValue(field) } - : localeSchema, - } - }, {}), - localized: true, - } - } else if (hasManyRelations) { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.relationTo`, - }, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } - } else { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } - } - - schema.add({ - [field.name]: schemaToReturn, - }) - }, - richText: ( - field: RichTextField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: mongoose.Schema.Types.Mixed, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - row: (field: RowField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - field.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] + block.fields.forEach((blockField) => { + const addFieldSchema = getSchemaGenerator(blockField.type) if (addFieldSchema) { - addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + addFieldSchema( + blockField, + blockSchema, + payload, + buildSchemaOptions, + (parentIsLocalized || field.localized) ?? false, + ) } }) - }, - select: (field: SelectField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - enum: field.options.map((option) => { - if (typeof option === 'object') { - return option.value - } - return option - }), - } - - if (buildSchemaOptions.draftsEnabled || !field.required) { - baseSchema.enum.push(null) - } - - schema.add({ - [field.name]: localizeSchema( - field, - field.hasMany ? [baseSchema] : baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - tabs: (field: TabsField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - field.tabs.forEach((tab) => { - if (tabHasName(tab)) { - if (fieldIsVirtual(tab)) { - return - } - const baseSchema = { - type: buildSchema({ - buildSchemaOptions: { - disableUnique: buildSchemaOptions.disableUnique, - draftsEnabled: buildSchemaOptions.draftsEnabled, - options: { - _id: false, - id: false, - minimize: false, - }, - }, - configFields: tab.fields, - parentIsLocalized: parentIsLocalized || tab.localized, - payload, - }), - } - - schema.add({ - [tab.name]: localizeSchema( - tab, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - } else { - tab.fields.forEach((subField: Field) => { - if (fieldIsVirtual(subField)) { - return - } - const addFieldSchema: FieldSchemaGenerator = fieldToSchemaMap[subField.type] - - if (addFieldSchema) { - addFieldSchema( - subField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized || tab.localized, - ) - } - }) - } - }) - }, - text: (field: TextField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: field.hasMany ? [String] : String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - textarea: ( - field: TextareaField, - schema, - payload, - buildSchemaOptions, - parentIsLocalized, - ): void => { - const baseSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: String, - } - - schema.add({ - [field.name]: localizeSchema( - field, - baseSchema, - payload.config.localization, - parentIsLocalized, - ), - }) - }, - upload: (field: UploadField, schema, payload, buildSchemaOptions, parentIsLocalized): void => { - const hasManyRelations = Array.isArray(field.relationTo) - let schemaToReturn: { [key: string]: any } = {} - - const valueType = getRelationshipValueType(field, payload) if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { - schemaToReturn = { - _id: false, - type: payload.config.localization.localeCodes.reduce((locales, locale) => { - let localeSchema: { [key: string]: any } = {} - - if (hasManyRelations) { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.${locale}.relationTo`, - }, - } - } else { - localeSchema = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } - } - - return { - ...locales, - [locale]: field.hasMany - ? { type: [localeSchema], default: formatDefaultValue(field) } - : localeSchema, - } - }, {}), - localized: true, - } - } else if (hasManyRelations) { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - _id: false, - type: mongoose.Schema.Types.Mixed, - relationTo: { type: String, enum: field.relationTo }, - value: { - type: valueType, - refPath: `${field.name}.relationTo`, - }, - } - - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } + payload.config.localization.localeCodes.forEach((localeCode) => { + // @ts-expect-error Possible incorrect typing in mongoose types, this works + schema.path(`${field.name}.${localeCode}`).discriminator(block.slug, blockSchema) + }) } else { - schemaToReturn = { - ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), - type: valueType, - ref: field.relationTo, - } + // @ts-expect-error Possible incorrect typing in mongoose types, this works + schema.path(field.name).discriminator(block.slug, blockSchema) + } + }) +} - if (field.hasMany) { - schemaToReturn = { - type: [schemaToReturn], - default: formatDefaultValue(field), - } - } +const checkbox: FieldSchemaGenerator = ( + field: CheckboxField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: Boolean, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const code: FieldSchemaGenerator = ( + field: CodeField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const collapsible: FieldSchemaGenerator = ( + field: CollapsibleField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return } - schema.add({ - [field.name]: schemaToReturn, - }) - }, + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + } + }) +} + +const date: FieldSchemaGenerator = ( + field: DateField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: Date, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const email: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const group: FieldSchemaGenerator = ( + field: GroupField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const formattedBaseSchema = formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }) + + // carry indexSortableFields through to versions if drafts enabled + const indexSortableFields = + buildSchemaOptions.indexSortableFields && + field.name === 'version' && + buildSchemaOptions.draftsEnabled + + const baseSchema: SchemaTypeOptions = { + ...formattedBaseSchema, + type: buildSchema({ + buildSchemaOptions: { + disableUnique: buildSchemaOptions.disableUnique, + draftsEnabled: buildSchemaOptions.draftsEnabled, + indexSortableFields, + options: { + _id: false, + id: false, + minimize: false, + }, + }, + configFields: field.fields, + parentIsLocalized: parentIsLocalized || field.localized, + payload, + }), + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const json: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: mongoose.Schema.Types.Mixed, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const number: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: field.hasMany ? [Number] : Number, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const point: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + type: { + type: String, + enum: ['Point'], + ...(typeof field.defaultValue !== 'undefined' && { + default: 'Point', + }), + }, + coordinates: { + type: [Number], + default: formatDefaultValue(field), + required: false, + }, + } + + if ( + buildSchemaOptions.disableUnique && + field.unique && + fieldShouldBeLocalized({ field, parentIsLocalized }) + ) { + baseSchema.coordinates.sparse = true + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) + + if (field.index === true || field.index === undefined) { + const indexOptions: IndexOptions = {} + if (!buildSchemaOptions.disableUnique && field.unique) { + indexOptions.sparse = true + indexOptions.unique = true + } + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + payload.config.localization.locales.forEach((locale) => { + schema.index({ [`${field.name}.${locale.code}`]: '2dsphere' }, indexOptions) + }) + } else { + schema.index({ [field.name]: '2dsphere' }, indexOptions) + } + } +} + +const radio: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + enum: field.options.map((option) => { + if (typeof option === 'object') { + return option.value + } + return option + }), + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const relationship: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +) => { + const hasManyRelations = Array.isArray(field.relationTo) + let schemaToReturn: { [key: string]: any } = {} + + const valueType = getRelationshipValueType(field, payload) + + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + schemaToReturn = { + _id: false, + type: payload.config.localization.localeCodes.reduce((locales, locale) => { + let localeSchema: { [key: string]: any } = {} + + if (hasManyRelations) { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.${locale}.relationTo`, + }, + } + } else { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + } + + return { + ...locales, + [locale]: field.hasMany + ? { type: [localeSchema], default: formatDefaultValue(field) } + : localeSchema, + } + }, {}), + localized: true, + } + } else if (hasManyRelations) { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.relationTo`, + }, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } else { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } + + schema.add({ + [field.name]: schemaToReturn, + }) +} + +const richText: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: mongoose.Schema.Types.Mixed, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const row: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return + } + + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema(subField, schema, payload, buildSchemaOptions, parentIsLocalized) + } + }) +} + +const select: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema: SchemaTypeOptions = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + enum: field.options.map((option) => { + if (typeof option === 'object') { + return option.value + } + return option + }), + } + + if (buildSchemaOptions.draftsEnabled || !field.required) { + ;(baseSchema.enum as unknown[]).push(null) + } + + schema.add({ + [field.name]: localizeSchema( + field, + field.hasMany ? [baseSchema] : baseSchema, + payload.config.localization, + parentIsLocalized, + ), + }) +} + +const tabs: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + field.tabs.forEach((tab) => { + if (tabHasName(tab)) { + if (fieldIsVirtual(tab)) { + return + } + const baseSchema = { + type: buildSchema({ + buildSchemaOptions: { + disableUnique: buildSchemaOptions.disableUnique, + draftsEnabled: buildSchemaOptions.draftsEnabled, + options: { + _id: false, + id: false, + minimize: false, + }, + }, + configFields: tab.fields, + parentIsLocalized: parentIsLocalized || tab.localized, + payload, + }), + } + + schema.add({ + [tab.name]: localizeSchema(tab, baseSchema, payload.config.localization, parentIsLocalized), + }) + } else { + tab.fields.forEach((subField: Field) => { + if (fieldIsVirtual(subField)) { + return + } + const addFieldSchema = getSchemaGenerator(subField.type) + + if (addFieldSchema) { + addFieldSchema( + subField, + schema, + payload, + buildSchemaOptions, + (parentIsLocalized || tab.localized) ?? false, + ) + } + }) + } + }) +} + +const text: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: field.hasMany ? [String] : String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const textarea: FieldSchemaGenerator = ( + field: TextareaField, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const baseSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: String, + } + + schema.add({ + [field.name]: localizeSchema(field, baseSchema, payload.config.localization, parentIsLocalized), + }) +} + +const upload: FieldSchemaGenerator = ( + field, + schema, + payload, + buildSchemaOptions, + parentIsLocalized, +): void => { + const hasManyRelations = Array.isArray(field.relationTo) + let schemaToReturn: { [key: string]: any } = {} + + const valueType = getRelationshipValueType(field, payload) + + if (fieldShouldBeLocalized({ field, parentIsLocalized }) && payload.config.localization) { + schemaToReturn = { + _id: false, + type: payload.config.localization.localeCodes.reduce((locales, locale) => { + let localeSchema: { [key: string]: any } = {} + + if (hasManyRelations) { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.${locale}.relationTo`, + }, + } + } else { + localeSchema = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + } + + return { + ...locales, + [locale]: field.hasMany + ? { type: [localeSchema], default: formatDefaultValue(field) } + : localeSchema, + } + }, {}), + localized: true, + } + } else if (hasManyRelations) { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + _id: false, + type: mongoose.Schema.Types.Mixed, + relationTo: { type: String, enum: field.relationTo }, + value: { + type: valueType, + refPath: `${field.name}.relationTo`, + }, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } else { + schemaToReturn = { + ...formatBaseSchema({ buildSchemaOptions, field, parentIsLocalized }), + type: valueType, + ref: field.relationTo, + } + + if (field.hasMany) { + schemaToReturn = { + type: [schemaToReturn], + default: formatDefaultValue(field), + } + } + } + + schema.add({ + [field.name]: schemaToReturn, + }) +} + +const getSchemaGenerator = (fieldType: string): FieldSchemaGenerator | null => { + if (fieldType in fieldToSchemaMap) { + return fieldToSchemaMap[fieldType as keyof typeof fieldToSchemaMap] as FieldSchemaGenerator + } + + return null +} + +const fieldToSchemaMap = { + array, + blocks, + checkbox, + code, + collapsible, + date, + email, + group, + json, + number, + point, + radio, + relationship, + richText, + row, + select, + tabs, + text, + textarea, + upload, } const getRelationshipValueType = (field: RelationshipField | UploadField, payload: Payload) => { if (typeof field.relationTo === 'string') { - const { customIDType } = payload.collections[field.relationTo] + const customIDType = payload.collections[field.relationTo]?.customIDType if (!customIDType) { return mongoose.Schema.Types.ObjectId @@ -788,7 +863,7 @@ const getRelationshipValueType = (field: RelationshipField | UploadField, payloa // has custom id relationTo if ( field.relationTo.some((relationTo) => { - return !!payload.collections[relationTo].customIDType + return !!payload.collections[relationTo]?.customIDType }) ) { return mongoose.Schema.Types.Mixed diff --git a/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts b/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts index 7eabd67769..06665d9d67 100644 --- a/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts +++ b/packages/db-mongodb/src/predefinedMigrations/migrateRelationshipsV2_V3.ts @@ -1,16 +1,16 @@ import type { ClientSession, Model } from 'mongoose' -import type { Field, PayloadRequest, SanitizedConfig } from 'payload' +import type { Field, PayloadRequest } from 'payload' import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' import type { MongooseAdapter } from '../index.js' +import { getCollection, getGlobal } from '../utilities/getEntity.js' import { getSession } from '../utilities/getSession.js' import { transform } from '../utilities/transform.js' const migrateModelWithBatching = async ({ batchSize, - config, db, fields, Model, @@ -18,12 +18,11 @@ const migrateModelWithBatching = async ({ session, }: { batchSize: number - config: SanitizedConfig db: MongooseAdapter fields: Field[] Model: Model parentIsLocalized: boolean - session: ClientSession + session?: ClientSession }): Promise => { let hasNext = true let skip = 0 @@ -55,6 +54,7 @@ const migrateModelWithBatching = async ({ } await Model.collection.bulkWrite( + // @ts-expect-error bulkWrite has a weird type, insertOne, updateMany etc are required here as well. docs.map((doc) => ({ updateOne: { filter: { _id: doc._id }, @@ -123,12 +123,13 @@ export async function migrateRelationshipsV2_V3({ if (hasRelationshipOrUploadField(collection)) { payload.logger.info(`Migrating collection "${collection.slug}"`) + const { Model } = getCollection({ adapter: db, collectionSlug: collection.slug }) + await migrateModelWithBatching({ batchSize, - config, db, fields: collection.fields, - Model: db.collections[collection.slug], + Model, parentIsLocalized: false, session, }) @@ -139,12 +140,17 @@ export async function migrateRelationshipsV2_V3({ if (collection.versions) { payload.logger.info(`Migrating collection versions "${collection.slug}"`) + const { Model } = getCollection({ + adapter: db, + collectionSlug: collection.slug, + versions: true, + }) + await migrateModelWithBatching({ batchSize, - config, db, fields: buildVersionCollectionFields(config, collection), - Model: db.versions[collection.slug], + Model, parentIsLocalized: false, session, }) @@ -193,12 +199,13 @@ export async function migrateRelationshipsV2_V3({ if (global.versions) { payload.logger.info(`Migrating global versions "${global.slug}"`) + const { Model } = getGlobal({ adapter: db, globalSlug: global.slug, versions: true }) + await migrateModelWithBatching({ batchSize, - config, db, fields: buildVersionGlobalFields(config, global), - Model: db.versions[global.slug], + Model, parentIsLocalized: false, session, }) diff --git a/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts b/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts index 17dd82b7fc..c6205cc518 100644 --- a/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts +++ b/packages/db-mongodb/src/predefinedMigrations/migrateVersionsV1_V2.ts @@ -3,18 +3,20 @@ import type { Payload, PayloadRequest } from 'payload' import type { MongooseAdapter } from '../index.js' +import { getCollection, getGlobal } from '../utilities/getEntity.js' import { getSession } from '../utilities/getSession.js' export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { const { payload } = req - const session = await getSession(payload.db as MongooseAdapter, req) + const adapter = payload.db as MongooseAdapter + const session = await getSession(adapter, req) // For each collection for (const { slug, versions } of payload.config.collections) { if (versions?.drafts) { - await migrateCollectionDocs({ slug, payload, session }) + await migrateCollectionDocs({ slug, adapter, payload, session }) payload.logger.info(`Migrated the "${slug}" collection.`) } @@ -23,9 +25,13 @@ export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { // For each global for (const { slug, versions } of payload.config.globals) { if (versions) { - const VersionsModel = payload.db.versions[slug] + const { Model } = getGlobal({ + adapter, + globalSlug: slug, + versions: true, + }) - await VersionsModel.findOneAndUpdate( + await Model.findOneAndUpdate( {}, { latest: true }, { @@ -41,17 +47,23 @@ export async function migrateVersionsV1_V2({ req }: { req: PayloadRequest }) { async function migrateCollectionDocs({ slug, + adapter, docsAtATime = 100, payload, session, }: { + adapter: MongooseAdapter docsAtATime?: number payload: Payload - session: ClientSession + session?: ClientSession slug: string }) { - const VersionsModel = payload.db.versions[slug] - const remainingDocs = await VersionsModel.aggregate( + const { Model } = getCollection({ + adapter, + collectionSlug: slug, + versions: true, + }) + const remainingDocs = await Model.aggregate( [ // Sort so that newest are first { @@ -87,7 +99,7 @@ async function migrateCollectionDocs({ ).exec() if (!remainingDocs || remainingDocs.length === 0) { - const newVersions = await VersionsModel.find( + const newVersions = await Model.find( { latest: { $eq: true, @@ -108,7 +120,7 @@ async function migrateCollectionDocs({ const remainingDocIDs = remainingDocs.map((doc) => doc._versionID) - await VersionsModel.updateMany( + await Model.updateMany( { _id: { $in: remainingDocIDs, @@ -122,5 +134,5 @@ async function migrateCollectionDocs({ }, ) - await migrateCollectionDocs({ slug, payload, session }) + await migrateCollectionDocs({ slug, adapter, payload, session }) } diff --git a/packages/db-mongodb/src/queries/buildSearchParams.ts b/packages/db-mongodb/src/queries/buildSearchParams.ts index fbeefa0911..0e79fd65d4 100644 --- a/packages/db-mongodb/src/queries/buildSearchParams.ts +++ b/packages/db-mongodb/src/queries/buildSearchParams.ts @@ -1,11 +1,14 @@ +import type { FilterQuery } from 'mongoose' import type { FlattenedField, Operator, PathToQuery, Payload } from 'payload' import { Types } from 'mongoose' -import { getLocalizedPaths } from 'payload' +import { APIError, getLocalizedPaths } from 'payload' import { validOperatorSet } from 'payload/shared' import type { MongooseAdapter } from '../index.js' +import type { OperatorMapKey } from './operatorMap.js' +import { getCollection } from '../utilities/getEntity.js' import { operatorMap } from './operatorMap.js' import { sanitizeQueryValue } from './sanitizeQueryValue.js' @@ -43,7 +46,7 @@ export async function buildSearchParam({ parentIsLocalized: boolean payload: Payload val: unknown -}): Promise { +}): Promise { // Replace GraphQL nested field double underscore formatting let sanitizedPath = incomingPath.replace(/__/g, '.') if (sanitizedPath === 'id') { @@ -55,7 +58,9 @@ export async function buildSearchParam({ let hasCustomID = false if (sanitizedPath === '_id') { - const customIDFieldType = payload.collections[collectionSlug]?.customIDType + const customIDFieldType = collectionSlug + ? payload.collections[collectionSlug]?.customIDType + : undefined let idFieldType: 'number' | 'text' = 'text' @@ -71,7 +76,7 @@ export async function buildSearchParam({ name: 'id', type: idFieldType, } as FlattenedField, - parentIsLocalized, + parentIsLocalized: parentIsLocalized ?? false, path: '_id', }) } else { @@ -86,6 +91,10 @@ export async function buildSearchParam({ }) } + if (!paths[0]) { + return undefined + } + const [{ field, path }] = paths if (path) { const sanitizedQueryValue = sanitizeQueryValue({ @@ -109,6 +118,10 @@ export async function buildSearchParam({ return { value: rawQuery } } + if (!formattedOperator) { + return undefined + } + // If there are multiple collections to search through, // Recursively build up a list of query constraints if (paths.length > 1) { @@ -116,84 +129,86 @@ export async function buildSearchParam({ // to work backwards from top const pathsToQuery = paths.slice(1).reverse() - const initialRelationshipQuery = { + let relationshipQuery: SearchParam = { value: {}, - } as SearchParam + } - const relationshipQuery = await pathsToQuery.reduce( - async (priorQuery, { collectionSlug: slug, path: subPath }, i) => { - const priorQueryResult = await priorQuery + for (const [i, { collectionSlug, path: subPath }] of pathsToQuery.entries()) { + if (!collectionSlug) { + throw new APIError(`Collection with the slug ${collectionSlug} was not found.`) + } - const SubModel = (payload.db as MongooseAdapter).collections[slug] + const { Model: SubModel } = getCollection({ + adapter: payload.db as MongooseAdapter, + collectionSlug, + }) - // On the "deepest" collection, - // Search on the value passed through the query - if (i === 0) { - const subQuery = await SubModel.buildQuery({ - locale, - payload, - where: { - [subPath]: { - [formattedOperator]: val, - }, + if (i === 0) { + const subQuery = await SubModel.buildQuery({ + locale, + payload, + where: { + [subPath]: { + [formattedOperator]: val, }, - }) + }, + }) - const result = await SubModel.find(subQuery, subQueryOptions) - - const $in: unknown[] = [] - - result.forEach((doc) => { - const stringID = doc._id.toString() - $in.push(stringID) - - if (Types.ObjectId.isValid(stringID)) { - $in.push(doc._id) - } - }) - - if (pathsToQuery.length === 1) { - return { - path, - value: { $in }, - } - } - - const nextSubPath = pathsToQuery[i + 1].path - - return { - value: { [nextSubPath]: { $in } }, - } - } - - const subQuery = priorQueryResult.value const result = await SubModel.find(subQuery, subQueryOptions) - const $in = result.map((doc) => doc._id) + const $in: unknown[] = [] - // If it is the last recursion - // then pass through the search param - if (i + 1 === pathsToQuery.length) { + result.forEach((doc) => { + const stringID = doc._id.toString() + $in.push(stringID) + + if (Types.ObjectId.isValid(stringID)) { + $in.push(doc._id) + } + }) + + if (pathsToQuery.length === 1) { return { path, value: { $in }, } } - return { + const nextSubPath = pathsToQuery[i + 1]?.path + + if (nextSubPath) { + relationshipQuery = { value: { [nextSubPath]: $in } } + } + + continue + } + + const subQuery = relationshipQuery.value as FilterQuery + const result = await SubModel.find(subQuery, subQueryOptions) + + const $in = result.map((doc) => doc._id) + + // If it is the last recursion + // then pass through the search param + if (i + 1 === pathsToQuery.length) { + relationshipQuery = { + path, + value: { $in }, + } + } else { + relationshipQuery = { value: { _id: { $in }, }, } - }, - Promise.resolve(initialRelationshipQuery), - ) + } + } return relationshipQuery } if (formattedOperator && validOperatorSet.has(formattedOperator as Operator)) { - const operatorKey = operatorMap[formattedOperator] + const operatorKey = operatorMap[formattedOperator as OperatorMapKey] if (field.type === 'relationship' || field.type === 'upload') { let hasNumberIDRelation @@ -210,7 +225,7 @@ export async function buildSearchParam({ if (typeof formattedValue === 'string') { if (Types.ObjectId.isValid(formattedValue)) { - result.value[multiIDCondition].push({ + result.value[multiIDCondition]?.push({ [path]: { [operatorKey]: new Types.ObjectId(formattedValue) }, }) } else { @@ -226,14 +241,16 @@ export async function buildSearchParam({ ) if (hasNumberIDRelation) { - result.value[multiIDCondition].push({ + result.value[multiIDCondition]?.push({ [path]: { [operatorKey]: parseFloat(formattedValue) }, }) } } } - if (result.value[multiIDCondition].length > 1) { + const length = result.value[multiIDCondition]?.length + + if (typeof length === 'number' && length > 1) { return result } } diff --git a/packages/db-mongodb/src/queries/buildSortParam.ts b/packages/db-mongodb/src/queries/buildSortParam.ts index d58dcc6e0a..6aa399eaaf 100644 --- a/packages/db-mongodb/src/queries/buildSortParam.ts +++ b/packages/db-mongodb/src/queries/buildSortParam.ts @@ -1,4 +1,3 @@ -import type { PaginateOptions } from 'mongoose' import type { FlattenedField, SanitizedConfig, Sort } from 'payload' import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' @@ -6,7 +5,7 @@ import { getLocalizedSortProperty } from './getLocalizedSortProperty.js' type Args = { config: SanitizedConfig fields: FlattenedField[] - locale: string + locale?: string parentIsLocalized?: boolean sort: Sort timestamps: boolean @@ -23,10 +22,10 @@ export const buildSortParam = ({ config, fields, locale, - parentIsLocalized, + parentIsLocalized = false, sort, timestamps, -}: Args): PaginateOptions['sort'] => { +}: Args): Record => { if (!sort) { if (timestamps) { sort = '-createdAt' @@ -39,7 +38,7 @@ export const buildSortParam = ({ sort = [sort] } - const sorting = sort.reduce((acc, item) => { + const sorting = sort.reduce>((acc, item) => { let sortProperty: string let sortDirection: SortDirection if (item.indexOf('-') === 0) { diff --git a/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts b/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts index 4ee8a39e85..494d4a49be 100644 --- a/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts +++ b/packages/db-mongodb/src/queries/getBuildQueryPlugin.ts @@ -1,6 +1,6 @@ import type { FlattenedField, Payload, Where } from 'payload' -import { QueryError } from 'payload' +import { APIError } from 'payload' import { parseParams } from './parseParams.js' @@ -23,7 +23,7 @@ export const getBuildQueryPlugin = ({ collectionSlug, versionsFields, }: GetBuildQueryPluginArgs = {}) => { - return function buildQueryPlugin(schema) { + return function buildQueryPlugin(schema: any) { const modifiedSchema = schema async function schemaBuildQuery({ globalSlug, @@ -31,19 +31,35 @@ export const getBuildQueryPlugin = ({ payload, where, }: BuildQueryArgs): Promise> { - let fields = versionsFields - if (!fields) { + let fields: FlattenedField[] | null = null + + if (versionsFields) { + fields = versionsFields + } else { if (globalSlug) { const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug) + + if (!globalConfig) { + throw new APIError(`Global with the slug ${globalSlug} was not found`) + } + fields = globalConfig.flattenedFields } if (collectionSlug) { - const collectionConfig = payload.collections[collectionSlug].config + const collectionConfig = payload.collections[collectionSlug]?.config + + if (!collectionConfig) { + throw new APIError(`Collection with the slug ${globalSlug} was not found`) + } + fields = collectionConfig.flattenedFields } } - const errors = [] + if (fields === null) { + throw new APIError('Fields are not initialized.') + } + const result = await parseParams({ collectionSlug, fields, @@ -54,10 +70,6 @@ export const getBuildQueryPlugin = ({ where, }) - if (errors.length > 0) { - throw new QueryError(errors) - } - return result } modifiedSchema.statics.buildQuery = schemaBuildQuery diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts index cee0b68084..618eb09f32 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.spec.ts @@ -19,6 +19,7 @@ describe('get localized sort property', () => { it('passes through a non-localized sort property', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -35,6 +36,7 @@ describe('get localized sort property', () => { it('properly localizes an un-localized sort property', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -52,6 +54,7 @@ describe('get localized sort property', () => { it('keeps specifically asked-for localized sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: [ { name: 'title', @@ -69,6 +72,7 @@ describe('get localized sort property', () => { it('properly localizes nested sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -94,6 +98,7 @@ describe('get localized sort property', () => { it('keeps requested locale with nested sort properties', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -119,6 +124,7 @@ describe('get localized sort property', () => { it('properly localizes field within row', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -143,6 +149,7 @@ describe('get localized sort property', () => { it('properly localizes field within named tab', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { @@ -172,6 +179,7 @@ describe('get localized sort property', () => { it('properly localizes field within unnamed tab', () => { const result = getLocalizedSortProperty({ config, + parentIsLocalized: false, fields: flattenAllFields({ fields: [ { diff --git a/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts b/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts index 48c23505cf..5e91205e3b 100644 --- a/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts +++ b/packages/db-mongodb/src/queries/getLocalizedSortProperty.ts @@ -5,7 +5,7 @@ import { fieldAffectsData, fieldIsPresentationalOnly, fieldShouldBeLocalized } f type Args = { config: SanitizedConfig fields: FlattenedField[] - locale: string + locale?: string parentIsLocalized: boolean result?: string segments: string[] @@ -36,14 +36,16 @@ export const getLocalizedSortProperty = ({ ) if (matchedField && !fieldIsPresentationalOnly(matchedField)) { - let nextFields: FlattenedField[] + let nextFields: FlattenedField[] | null = null let nextParentIsLocalized = parentIsLocalized const remainingSegments = [...segments] let localizedSegment = matchedField.name - if (fieldShouldBeLocalized({ field: matchedField, parentIsLocalized })) { + if ( + fieldShouldBeLocalized({ field: matchedField, parentIsLocalized: parentIsLocalized ?? false }) + ) { // Check to see if next segment is a locale - if (segments.length > 0) { + if (segments.length > 0 && remainingSegments[0]) { const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0]) // If next segment is locale, remove it from remaining segments @@ -66,16 +68,21 @@ export const getLocalizedSortProperty = ({ ) { nextFields = matchedField.flattenedFields if (!nextParentIsLocalized) { - nextParentIsLocalized = matchedField.localized + nextParentIsLocalized = matchedField.localized ?? false } } if (matchedField.type === 'blocks') { - nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce( + nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce( (flattenedBlockFields, _block) => { // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks const block = - typeof _block === 'string' ? config.blocks.find((b) => b.slug === _block) : _block + typeof _block === 'string' ? config.blocks?.find((b) => b.slug === _block) : _block + + if (!block) { + return [...flattenedBlockFields] + } + return [ ...flattenedBlockFields, ...block.flattenedFields.filter( @@ -93,7 +100,7 @@ export const getLocalizedSortProperty = ({ const result = incomingResult ? `${incomingResult}.${localizedSegment}` : localizedSegment - if (nextFields) { + if (nextFields !== null) { return getLocalizedSortProperty({ config, fields: nextFields, diff --git a/packages/db-mongodb/src/queries/operatorMap.ts b/packages/db-mongodb/src/queries/operatorMap.ts index e4352149d4..4c3a272a72 100644 --- a/packages/db-mongodb/src/queries/operatorMap.ts +++ b/packages/db-mongodb/src/queries/operatorMap.ts @@ -1,3 +1,5 @@ +export type OperatorMapKey = keyof typeof operatorMap + export const operatorMap = { all: '$all', equals: '$eq', diff --git a/packages/db-mongodb/src/queries/parseParams.ts b/packages/db-mongodb/src/queries/parseParams.ts index 45b544ac1d..fc4e75ab38 100644 --- a/packages/db-mongodb/src/queries/parseParams.ts +++ b/packages/db-mongodb/src/queries/parseParams.ts @@ -19,7 +19,7 @@ export async function parseParams({ collectionSlug?: string fields: FlattenedField[] globalSlug?: string - locale: string + locale?: string parentIsLocalized: boolean payload: Payload where: Where @@ -30,7 +30,7 @@ export async function parseParams({ // We need to determine if the whereKey is an AND, OR, or a schema path for (const relationOrPath of Object.keys(where)) { const condition = where[relationOrPath] - let conditionOperator: '$and' | '$or' + let conditionOperator: '$and' | '$or' | null = null if (relationOrPath.toLowerCase() === 'and') { conditionOperator = '$and' } else if (relationOrPath.toLowerCase() === 'or') { @@ -46,7 +46,7 @@ export async function parseParams({ payload, where: condition, }) - if (builtConditions.length > 0) { + if (builtConditions.length > 0 && conditionOperator !== null) { result[conditionOperator] = builtConditions } } else { @@ -58,6 +58,7 @@ export async function parseParams({ const validOperators = Object.keys(pathOperators).filter((operator) => validOperatorSet.has(operator as Operator), ) + for (const operator of validOperators) { const searchParam = await buildSearchParam({ collectionSlug, @@ -68,7 +69,7 @@ export async function parseParams({ operator, parentIsLocalized, payload, - val: pathOperators[operator], + val: (pathOperators as Record)[operator], }) if (searchParam?.value && searchParam?.path) { @@ -83,7 +84,7 @@ export async function parseParams({ result[searchParam.path] = searchParam.value } } else if (typeof searchParam?.value === 'object') { - result = deepMergeWithCombinedArrays(result, searchParam.value, { + result = deepMergeWithCombinedArrays(result, searchParam.value ?? {}, { // dont clone Types.ObjectIDs clone: false, }) diff --git a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts index 75297996ea..c17c239b73 100644 --- a/packages/db-mongodb/src/queries/sanitizeQueryValue.ts +++ b/packages/db-mongodb/src/queries/sanitizeQueryValue.ts @@ -21,7 +21,7 @@ type SanitizeQueryValueArgs = { val: any } -const buildExistsQuery = (formattedValue, path, treatEmptyString = true) => { +const buildExistsQuery = (formattedValue: unknown, path: string, treatEmptyString = true) => { if (formattedValue) { return { rawQuery: { @@ -54,14 +54,17 @@ const getFieldFromSegments = ({ field: FlattenedBlock | FlattenedField payload: Payload segments: string[] -}) => { +}): FlattenedField | undefined => { if ('blocks' in field || 'blockReferences' in field) { const _field: FlattenedBlocksField = field as FlattenedBlocksField for (const _block of _field.blockReferences ?? _field.blocks) { - const block: FlattenedBlock = typeof _block === 'string' ? payload.blocks[_block] : _block - const field = getFieldFromSegments({ field: block, payload, segments }) - if (field) { - return field + const block: FlattenedBlock | undefined = + typeof _block === 'string' ? payload.blocks[_block] : _block + if (block) { + const field = getFieldFromSegments({ field: block, payload, segments }) + if (field) { + return field + } } } } @@ -93,11 +96,13 @@ export const sanitizeQueryValue = ({ path, payload, val, -}: SanitizeQueryValueArgs): { - operator?: string - rawQuery?: unknown - val?: unknown -} => { +}: SanitizeQueryValueArgs): + | { + operator?: string + rawQuery?: unknown + val?: unknown + } + | undefined => { let formattedValue = val let formattedOperator = operator if (['array', 'blocks', 'group', 'tab'].includes(field.type) && path.includes('.')) { @@ -141,24 +146,26 @@ export const sanitizeQueryValue = ({ formattedValue = createArrayFromCommaDelineated(val) } - formattedValue = formattedValue.reduce((formattedValues, inVal) => { - if (!hasCustomID) { - if (Types.ObjectId.isValid(inVal)) { - formattedValues.push(new Types.ObjectId(inVal)) + if (Array.isArray(formattedValue)) { + formattedValue = formattedValue.reduce((formattedValues, inVal) => { + if (!hasCustomID) { + if (Types.ObjectId.isValid(inVal)) { + formattedValues.push(new Types.ObjectId(inVal)) + } } - } - if (field.type === 'number') { - const parsedNumber = parseFloat(inVal) - if (!Number.isNaN(parsedNumber)) { - formattedValues.push(parsedNumber) + if (field.type === 'number') { + const parsedNumber = parseFloat(inVal) + if (!Number.isNaN(parsedNumber)) { + formattedValues.push(parsedNumber) + } + } else { + formattedValues.push(inVal) } - } else { - formattedValues.push(inVal) - } - return formattedValues - }, []) + return formattedValues + }, []) + } } } @@ -175,7 +182,7 @@ export const sanitizeQueryValue = ({ if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') { formattedValue = createArrayFromCommaDelineated(formattedValue) - if (field.type === 'number') { + if (field.type === 'number' && Array.isArray(formattedValue)) { formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal)) } } @@ -264,7 +271,7 @@ export const sanitizeQueryValue = ({ return formattedValues } - if (typeof relationTo === 'string' && payload.collections[relationTo].customIDType) { + if (typeof relationTo === 'string' && payload.collections[relationTo]?.customIDType) { if (payload.collections[relationTo].customIDType === 'number') { const parsedNumber = parseFloat(inVal) if (!Number.isNaN(parsedNumber)) { @@ -279,7 +286,7 @@ export const sanitizeQueryValue = ({ if ( Array.isArray(relationTo) && - relationTo.some((relationTo) => !!payload.collections[relationTo].customIDType) + relationTo.some((relationTo) => !!payload.collections[relationTo]?.customIDType) ) { if (Types.ObjectId.isValid(inVal.toString())) { formattedValues.push(new Types.ObjectId(inVal)) @@ -302,7 +309,7 @@ export const sanitizeQueryValue = ({ (!Array.isArray(relationTo) || !path.endsWith('.relationTo')) ) { if (typeof relationTo === 'string') { - const customIDType = payload.collections[relationTo].customIDType + const customIDType = payload.collections[relationTo]?.customIDType if (customIDType) { if (customIDType === 'number') { @@ -320,7 +327,7 @@ export const sanitizeQueryValue = ({ } } else { const hasCustomIDType = relationTo.some( - (relationTo) => !!payload.collections[relationTo].customIDType, + (relationTo) => !!payload.collections[relationTo]?.customIDType, ) if (hasCustomIDType) { diff --git a/packages/db-mongodb/src/queryDrafts.ts b/packages/db-mongodb/src/queryDrafts.ts index 0b1e395e99..e04c96a48f 100644 --- a/packages/db-mongodb/src/queryDrafts.ts +++ b/packages/db-mongodb/src/queryDrafts.ts @@ -10,15 +10,31 @@ import { buildSortParam } from './queries/buildSortParam.js' import { aggregatePaginate } from './utilities/aggregatePaginate.js' import { buildJoinAggregation } from './utilities/buildJoinAggregation.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const queryDrafts: QueryDrafts = async function queryDrafts( this: MongooseAdapter, - { collection, joins, limit, locale, page, pagination, req, select, sort: sortArg, where }, + { + collection: collectionSlug, + joins, + limit, + locale, + page, + pagination, + req, + select, + sort: sortArg, + where = {}, + }, ) { - const VersionModel = this.versions[collection] - const collectionConfig = this.payload.collections[collection].config + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) + const options: QueryOptions = { session: await getSession(this, req), } @@ -89,24 +105,25 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( // the correct indexed field paginationOptions.useCustomCountFn = () => { return Promise.resolve( - VersionModel.countDocuments(versionQuery, { + Model.countDocuments(versionQuery, { hint: { _id: 1 }, }), ) } } - if (limit > 0) { + if (limit && limit > 0) { paginationOptions.limit = limit // limit must also be set here, it's ignored when pagination is false - paginationOptions.options.limit = limit + + paginationOptions.options!.limit = limit } let result const aggregate = await buildJoinAggregation({ adapter: this, - collection, + collection: collectionSlug, collectionConfig, joins, locale, @@ -122,17 +139,17 @@ export const queryDrafts: QueryDrafts = async function queryDrafts( collation: paginationOptions.collation, joinAggregation: aggregate, limit: paginationOptions.limit, - Model: VersionModel, + Model, page: paginationOptions.page, pagination: paginationOptions.pagination, projection: paginationOptions.projection, query: versionQuery, - session: paginationOptions.options?.session, + session: paginationOptions.options?.session ?? undefined, sort: paginationOptions.sort as object, useEstimatedCount: paginationOptions.useEstimatedCount, }) } else { - result = await VersionModel.paginate(versionQuery, paginationOptions) + result = await Model.paginate(versionQuery, paginationOptions) } transform({ diff --git a/packages/db-mongodb/src/transactions/beginTransaction.ts b/packages/db-mongodb/src/transactions/beginTransaction.ts index 82e681d0b7..022e0a362a 100644 --- a/packages/db-mongodb/src/transactions/beginTransaction.ts +++ b/packages/db-mongodb/src/transactions/beginTransaction.ts @@ -7,6 +7,7 @@ import { v4 as uuid } from 'uuid' import type { MongooseAdapter } from '../index.js' // Needs await to fulfill the interface +// @ts-expect-error TransactionOptions isn't compatible with BeginTransaction of the DatabaseAdapter interface. // eslint-disable-next-line @typescript-eslint/require-await export const beginTransaction: BeginTransaction = async function beginTransaction( this: MongooseAdapter, @@ -20,12 +21,13 @@ export const beginTransaction: BeginTransaction = async function beginTransactio const id = uuid() if (!this.sessions[id]) { + // @ts-expect-error BaseDatabaseAdapter and MongoosAdapter (that extends Base) sessions aren't compatible. this.sessions[id] = client.startSession() } - if (this.sessions[id].inTransaction()) { + if (this.sessions[id]?.inTransaction()) { this.payload.logger.warn('beginTransaction called while transaction already exists') } else { - this.sessions[id].startTransaction(options || (this.transactionOptions as TransactionOptions)) + this.sessions[id]?.startTransaction(options || (this.transactionOptions as TransactionOptions)) } return id diff --git a/packages/db-mongodb/src/transactions/commitTransaction.ts b/packages/db-mongodb/src/transactions/commitTransaction.ts index 32a7517174..6fcbdb838c 100644 --- a/packages/db-mongodb/src/transactions/commitTransaction.ts +++ b/packages/db-mongodb/src/transactions/commitTransaction.ts @@ -1,6 +1,11 @@ import type { CommitTransaction } from 'payload' -export const commitTransaction: CommitTransaction = async function commitTransaction(id) { +import type { MongooseAdapter } from '../index.js' + +export const commitTransaction: CommitTransaction = async function commitTransaction( + this: MongooseAdapter, + id, +) { if (id instanceof Promise) { return } @@ -12,7 +17,7 @@ export const commitTransaction: CommitTransaction = async function commitTransac await this.sessions[id].commitTransaction() try { await this.sessions[id].endSession() - } catch (error) { + } catch (_) { // ending sessions is only best effort and won't impact anything if it fails since the transaction was committed } delete this.sessions[id] diff --git a/packages/db-mongodb/src/transactions/rollbackTransaction.ts b/packages/db-mongodb/src/transactions/rollbackTransaction.ts index c53410e400..78c6f35363 100644 --- a/packages/db-mongodb/src/transactions/rollbackTransaction.ts +++ b/packages/db-mongodb/src/transactions/rollbackTransaction.ts @@ -1,6 +1,9 @@ import type { RollbackTransaction } from 'payload' +import type { MongooseAdapter } from '../index.js' + export const rollbackTransaction: RollbackTransaction = async function rollbackTransaction( + this: MongooseAdapter, incomingID = '', ) { let transactionID: number | string @@ -18,7 +21,7 @@ export const rollbackTransaction: RollbackTransaction = async function rollbackT } // when session exists but is not inTransaction something unexpected is happening to the session - if (!this.sessions[transactionID].inTransaction()) { + if (!this.sessions[transactionID]?.inTransaction()) { this.payload.logger.warn('rollbackTransaction called when no transaction exists') delete this.sessions[transactionID] return @@ -26,8 +29,8 @@ export const rollbackTransaction: RollbackTransaction = async function rollbackT // the first call for rollback should be aborted and deleted causing any other operations with the same transaction to fail try { - await this.sessions[transactionID].abortTransaction() - await this.sessions[transactionID].endSession() + await this.sessions[transactionID]?.abortTransaction() + await this.sessions[transactionID]?.endSession() } catch (error) { // ignore the error as it is likely a race condition from multiple errors } diff --git a/packages/db-mongodb/src/updateGlobal.ts b/packages/db-mongodb/src/updateGlobal.ts index 6d693c00eb..6e883de210 100644 --- a/packages/db-mongodb/src/updateGlobal.ts +++ b/packages/db-mongodb/src/updateGlobal.ts @@ -4,15 +4,17 @@ import type { UpdateGlobal } from 'payload' import type { MongooseAdapter } from './index.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const updateGlobal: UpdateGlobal = async function updateGlobal( this: MongooseAdapter, - { slug, data, options: optionsArgs = {}, req, returning, select }, + { slug: globalSlug, data, options: optionsArgs = {}, req, returning, select }, ) { - const Model = this.globals - const fields = this.payload.config.globals.find((global) => global.slug === slug).fields + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug }) + + const fields = globalConfig.fields const options: MongooseUpdateQueryOptions = { ...optionsArgs, @@ -20,22 +22,22 @@ export const updateGlobal: UpdateGlobal = async function updateGlobal( new: true, projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.config.globals.find((global) => global.slug === slug).flattenedFields, + fields: globalConfig.flattenedFields, select, }), session: await getSession(this, req), } - transform({ adapter: this, data, fields, globalSlug: slug, operation: 'write' }) + transform({ adapter: this, data, fields, globalSlug, operation: 'write' }) if (returning === false) { - await Model.updateOne({ globalType: slug }, data, options) + await Model.updateOne({ globalType: globalSlug }, data, options) return null } - const result: any = await Model.findOneAndUpdate({ globalType: slug }, data, options) + const result: any = await Model.findOneAndUpdate({ globalType: globalSlug }, data, options) - transform({ adapter: this, data: result, fields, globalSlug: slug, operation: 'read' }) + transform({ adapter: this, data: result, fields, globalSlug, operation: 'read' }) return result } diff --git a/packages/db-mongodb/src/updateGlobalVersion.ts b/packages/db-mongodb/src/updateGlobalVersion.ts index 1929cd8669..6e26418ece 100644 --- a/packages/db-mongodb/src/updateGlobalVersion.ts +++ b/packages/db-mongodb/src/updateGlobalVersion.ts @@ -6,6 +6,7 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getGlobal } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' @@ -23,12 +24,11 @@ export async function updateGlobalVersion( where, }: UpdateGlobalVersionArgs, ) { - const VersionModel = this.versions[globalSlug] + const { globalConfig, Model } = getGlobal({ adapter: this, globalSlug, versions: true }) const whereToUse = where || { id: { equals: id } } - const currentGlobal = this.payload.config.globals.find((global) => global.slug === globalSlug) - const fields = buildVersionGlobalFields(this.payload.config, currentGlobal) - const flattenedFields = buildVersionGlobalFields(this.payload.config, currentGlobal, true) + const fields = buildVersionGlobalFields(this.payload.config, globalConfig) + const flattenedFields = buildVersionGlobalFields(this.payload.config, globalConfig, true) const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, @@ -51,11 +51,11 @@ export async function updateGlobalVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) if (returning === false) { - await VersionModel.updateOne(query, versionData, options) + await Model.updateOne(query, versionData, options) return null } - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + const doc = await Model.findOneAndUpdate(query, versionData, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/updateMany.ts b/packages/db-mongodb/src/updateMany.ts index 47bafc86ec..a4ba3f7ac4 100644 --- a/packages/db-mongodb/src/updateMany.ts +++ b/packages/db-mongodb/src/updateMany.ts @@ -5,16 +5,25 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { handleError } from './utilities/handleError.js' import { transform } from './utilities/transform.js' export const updateMany: UpdateMany = async function updateMany( this: MongooseAdapter, - { collection, data, locale, options: optionsArgs = {}, req, returning, select, where }, + { + collection: collectionSlug, + data, + locale, + options: optionsArgs = {}, + req, + returning, + select, + where, + }, ) { - const Model = this.collections[collection] - const fields = this.payload.collections[collection].config.fields + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) const options: MongooseUpdateQueryOptions = { ...optionsArgs, @@ -22,7 +31,7 @@ export const updateMany: UpdateMany = async function updateMany( new: true, projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.collections[collection].config.flattenedFields, + fields: collectionConfig.flattenedFields, select, }), session: await getSession(this, req), @@ -30,18 +39,18 @@ export const updateMany: UpdateMany = async function updateMany( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) - transform({ adapter: this, data, fields, operation: 'write' }) + transform({ adapter: this, data, fields: collectionConfig.fields, operation: 'write' }) try { await Model.updateMany(query, data, options) } catch (error) { - handleError({ collection, error, req }) + handleError({ collection: collectionSlug, error, req }) } if (returning === false) { @@ -53,7 +62,7 @@ export const updateMany: UpdateMany = async function updateMany( transform({ adapter: this, data: result, - fields, + fields: collectionConfig.fields, operation: 'read', }) diff --git a/packages/db-mongodb/src/updateOne.ts b/packages/db-mongodb/src/updateOne.ts index 9d52f23fc3..f5b3ef2e10 100644 --- a/packages/db-mongodb/src/updateOne.ts +++ b/packages/db-mongodb/src/updateOne.ts @@ -5,6 +5,7 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { handleError } from './utilities/handleError.js' import { transform } from './utilities/transform.js' @@ -13,26 +14,27 @@ export const updateOne: UpdateOne = async function updateOne( this: MongooseAdapter, { id, - collection, + collection: collectionSlug, data, locale, options: optionsArgs = {}, req, returning, select, - where: whereArg, + where: whereArg = {}, }, ) { + const { collectionConfig, Model } = getCollection({ adapter: this, collectionSlug }) const where = id ? { id: { equals: id } } : whereArg - const Model = this.collections[collection] - const fields = this.payload.collections[collection].config.fields + const fields = collectionConfig.fields + const options: MongooseUpdateQueryOptions = { ...optionsArgs, lean: true, new: true, projection: buildProjectionFromSelect({ adapter: this, - fields: this.payload.collections[collection].config.flattenedFields, + fields: collectionConfig.flattenedFields, select, }), session: await getSession(this, req), @@ -40,8 +42,8 @@ export const updateOne: UpdateOne = async function updateOne( const query = await buildQuery({ adapter: this, - collectionSlug: collection, - fields: this.payload.collections[collection].config.flattenedFields, + collectionSlug, + fields: collectionConfig.flattenedFields, locale, where, }) @@ -58,7 +60,7 @@ export const updateOne: UpdateOne = async function updateOne( result = await Model.findOneAndUpdate(query, data, options) } } catch (error) { - handleError({ collection, error, req }) + handleError({ collection: collectionSlug, error, req }) } if (!result) { diff --git a/packages/db-mongodb/src/updateVersion.ts b/packages/db-mongodb/src/updateVersion.ts index 6563326ec0..1fcc005ddb 100644 --- a/packages/db-mongodb/src/updateVersion.ts +++ b/packages/db-mongodb/src/updateVersion.ts @@ -6,25 +6,34 @@ import type { MongooseAdapter } from './index.js' import { buildQuery } from './queries/buildQuery.js' import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js' +import { getCollection } from './utilities/getEntity.js' import { getSession } from './utilities/getSession.js' import { transform } from './utilities/transform.js' export const updateVersion: UpdateVersion = async function updateVersion( this: MongooseAdapter, - { id, collection, locale, options: optionsArgs = {}, req, returning, select, versionData, where }, + { + id, + collection: collectionSlug, + locale, + options: optionsArgs = {}, + req, + returning, + select, + versionData, + where, + }, ) { - const VersionModel = this.versions[collection] - const whereToUse = where || { id: { equals: id } } - const fields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - ) + const { collectionConfig, Model } = getCollection({ + adapter: this, + collectionSlug, + versions: true, + }) - const flattenedFields = buildVersionCollectionFields( - this.payload.config, - this.payload.collections[collection].config, - true, - ) + const whereToUse = where || { id: { equals: id } } + const fields = buildVersionCollectionFields(this.payload.config, collectionConfig) + + const flattenedFields = buildVersionCollectionFields(this.payload.config, collectionConfig, true) const options: MongooseUpdateQueryOptions = { ...optionsArgs, @@ -48,11 +57,11 @@ export const updateVersion: UpdateVersion = async function updateVersion( transform({ adapter: this, data: versionData, fields, operation: 'write' }) if (returning === false) { - await VersionModel.updateOne(query, versionData, options) + await Model.updateOne(query, versionData, options) return null } - const doc = await VersionModel.findOneAndUpdate(query, versionData, options) + const doc = await Model.findOneAndUpdate(query, versionData, options) if (!doc) { return null diff --git a/packages/db-mongodb/src/utilities/aggregatePaginate.ts b/packages/db-mongodb/src/utilities/aggregatePaginate.ts index b2b6ae3c50..de6a3ed6bd 100644 --- a/packages/db-mongodb/src/utilities/aggregatePaginate.ts +++ b/packages/db-mongodb/src/utilities/aggregatePaginate.ts @@ -82,16 +82,18 @@ export const aggregatePaginate = async ({ const totalPages = pagination !== false && typeof limit === 'number' && limit !== 0 ? Math.ceil(count / limit) : 1 - const hasPrevPage = pagination !== false && page > 1 - const hasNextPage = pagination !== false && totalPages > page + const hasPrevPage = typeof page === 'number' && pagination !== false && page > 1 + const hasNextPage = typeof page === 'number' && pagination !== false && totalPages > page const pagingCounter = - pagination !== false && typeof limit === 'number' ? (page - 1) * limit + 1 : 1 + typeof page === 'number' && pagination !== false && typeof limit === 'number' + ? (page - 1) * limit + 1 + : 1 const result: PaginatedDocs = { docs, hasNextPage, hasPrevPage, - limit, + limit: limit ?? 0, nextPage: hasNextPage ? page + 1 : null, page, pagingCounter, diff --git a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts index 4e60bd6755..3dd629b004 100644 --- a/packages/db-mongodb/src/utilities/buildJoinAggregation.ts +++ b/packages/db-mongodb/src/utilities/buildJoinAggregation.ts @@ -1,28 +1,29 @@ import type { PipelineStage } from 'mongoose' -import type { - CollectionSlug, - FlattenedField, - JoinQuery, - SanitizedCollectionConfig, - Where, -} from 'payload' +import { + APIError, + type CollectionSlug, + type FlattenedField, + type JoinQuery, + type SanitizedCollectionConfig, +} from 'payload' import { fieldShouldBeLocalized } from 'payload/shared' import type { MongooseAdapter } from '../index.js' import { buildQuery } from '../queries/buildQuery.js' import { buildSortParam } from '../queries/buildSortParam.js' +import { getCollection } from './getEntity.js' type BuildJoinAggregationArgs = { adapter: MongooseAdapter collection: CollectionSlug collectionConfig: SanitizedCollectionConfig - joins: JoinQuery - locale: string + joins?: JoinQuery + locale?: string projection?: Record // the where clause for the top collection - query?: Where + query?: Record /** whether the query is from drafts */ versions?: boolean } @@ -44,9 +45,18 @@ export const buildJoinAggregation = async ({ return } - const joinConfig = adapter.payload.collections[collection].config.joins + const joinConfig = adapter.payload.collections[collection]?.config?.joins + + if (!joinConfig) { + throw new APIError(`Could not retrieve sanitized join config for ${collection}.`) + } + const aggregate: PipelineStage[] = [] - const polymorphicJoinsConfig = adapter.payload.collections[collection].config.polymorphicJoins + const polymorphicJoinsConfig = adapter.payload.collections[collection]?.config?.polymorphicJoins + + if (!polymorphicJoinsConfig) { + throw new APIError(`Could not retrieve sanitized polymorphic joins config for ${collection}.`) + } for (const join of polymorphicJoinsConfig) { if (projection && !projection[join.joinPath]) { @@ -62,12 +72,14 @@ export const buildJoinAggregation = async ({ limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, - where: whereJoin, + where: whereJoin = {}, } = joins?.[join.joinPath] || {} const aggregatedFields: FlattenedField[] = [] for (const collectionSlug of join.field.collection) { - for (const field of adapter.payload.collections[collectionSlug].config.flattenedFields) { + const { collectionConfig } = getCollection({ adapter, collectionSlug }) + + for (const field of collectionConfig.flattenedFields) { if (!aggregatedFields.some((eachField) => eachField.name === field.name)) { aggregatedFields.push(field) } @@ -89,7 +101,7 @@ export const buildJoinAggregation = async ({ where: whereJoin, }) - const sortProperty = Object.keys(sort)[0] + const sortProperty = Object.keys(sort)[0]! // assert because buildSortParam always returns at least 1 key. const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1 const projectSort = sortProperty !== '_id' && sortProperty !== 'relationTo' @@ -124,10 +136,12 @@ export const buildJoinAggregation = async ({ }, ] + const { Model: JoinModel } = getCollection({ adapter, collectionSlug }) + aggregate.push({ $lookup: { as: alias, - from: adapter.collections[collectionSlug].collection.name, + from: JoinModel.collection.name, let: { root_id_: '$_id', }, @@ -159,7 +173,7 @@ export const buildJoinAggregation = async ({ aggregate.push({ $lookup: { as: `${as}.totalDocs.${alias}`, - from: adapter.collections[collectionSlug].collection.name, + from: JoinModel.collection.name, let: { root_id_: '$_id', }, @@ -232,7 +246,13 @@ export const buildJoinAggregation = async ({ } for (const slug of Object.keys(joinConfig)) { - for (const join of joinConfig[slug]) { + const joinsList = joinConfig[slug] + + if (!joinsList) { + throw new APIError(`Failed to retrieve array of joins for ${slug} in collectio ${collection}`) + } + + for (const join of joinsList) { if (projection && !projection[join.joinPath]) { continue } @@ -241,31 +261,34 @@ export const buildJoinAggregation = async ({ continue } + const { collectionConfig, Model: JoinModel } = getCollection({ + adapter, + collectionSlug: join.field.collection as string, + }) + const { count, limit: limitJoin = join.field.defaultLimit ?? 10, page, sort: sortJoin = join.field.defaultSort || collectionConfig.defaultSort, - where: whereJoin, + where: whereJoin = {}, } = joins?.[join.joinPath] || {} if (Array.isArray(join.field.collection)) { throw new Error('Unreachable') } - const joinModel = adapter.collections[join.field.collection] - const sort = buildSortParam({ config: adapter.payload.config, - fields: adapter.payload.collections[slug].config.flattenedFields, + fields: collectionConfig.flattenedFields, locale, sort: sortJoin, timestamps: true, }) - const sortProperty = Object.keys(sort)[0] + const sortProperty = Object.keys(sort)[0]! const sortDirection = sort[sortProperty] === 'asc' ? 1 : -1 - const $match = await joinModel.buildQuery({ + const $match = await JoinModel.buildQuery({ locale, payload: adapter.payload, where: whereJoin, @@ -301,7 +324,7 @@ export const buildJoinAggregation = async ({ $lookup: { as: `${as}.totalDocs`, foreignField, - from: adapter.collections[slug].collection.name, + from: JoinModel.collection.name, localField: versions ? 'parent' : '_id', pipeline: [ { @@ -329,7 +352,7 @@ export const buildJoinAggregation = async ({ $lookup: { as: `${as}.docs`, foreignField: `${join.field.on}${code}${polymorphicSuffix}`, - from: adapter.collections[slug].collection.name, + from: JoinModel.collection.name, localField: versions ? 'parent' : '_id', pipeline, }, @@ -390,7 +413,7 @@ export const buildJoinAggregation = async ({ $lookup: { as: `${as}.docs`, foreignField, - from: adapter.collections[slug].collection.name, + from: JoinModel.collection.name, localField: versions ? 'parent' : '_id', pipeline, }, diff --git a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts index 5ef4f09b89..98a659643c 100644 --- a/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts +++ b/packages/db-mongodb/src/utilities/buildProjectionFromSelect.ts @@ -1,4 +1,10 @@ -import type { FieldAffectingData, FlattenedField, SelectMode, SelectType } from 'payload' +import type { + FieldAffectingData, + FlattenedField, + SelectIncludeType, + SelectMode, + SelectType, +} from 'payload' import { deepCopyObjectSimple, @@ -107,7 +113,7 @@ const traverseFields = ({ const fieldSelect = select[field.name] as SelectType if (field.type === 'array' && selectMode === 'include') { - fieldSelect['id'] = true + fieldSelect.id = true } traverseFields({ @@ -128,6 +134,11 @@ const traverseFields = ({ for (const _block of field.blockReferences ?? field.blocks) { const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block + + if (!block) { + continue + } + if ( (selectMode === 'include' && blocksSelect[block.slug] === true) || (selectMode === 'exclude' && typeof blocksSelect[block.slug] === 'undefined') @@ -155,9 +166,10 @@ const traverseFields = ({ blocksSelect[block.slug] = {} } - if (blockSelectMode === 'include') { - blocksSelect[block.slug]['id'] = true - blocksSelect[block.slug]['blockType'] = true + if (blockSelectMode === 'include' && typeof blocksSelect[block.slug] === 'object') { + const blockSelect = blocksSelect[block.slug] as SelectIncludeType + blockSelect.id = true + blockSelect.blockType = true } traverseFields({ diff --git a/packages/db-mongodb/src/utilities/getDBName.ts b/packages/db-mongodb/src/utilities/getDBName.ts index f7835b25e0..b79e0e94b6 100644 --- a/packages/db-mongodb/src/utilities/getDBName.ts +++ b/packages/db-mongodb/src/utilities/getDBName.ts @@ -1,4 +1,4 @@ -import type { DBIdentifierName } from 'payload' +import { APIError, type DBIdentifierName } from 'payload' type Args = { config: { @@ -22,7 +22,7 @@ export const getDBName = ({ target = 'dbName', versions = false, }: Args): string => { - let result: string + let result: null | string = null let custom = config[target] if (!custom && target === 'enumName') { @@ -32,12 +32,16 @@ export const getDBName = ({ if (custom) { result = typeof custom === 'function' ? custom({}) : custom } else { - result = name ?? slug + result = name ?? slug ?? null } if (versions) { result = `_${result}_versions` } + if (!result) { + throw new APIError(`Assertion for DB name of ${name} ${slug} was failed.`) + } + return result } diff --git a/packages/db-mongodb/src/utilities/getEntity.ts b/packages/db-mongodb/src/utilities/getEntity.ts new file mode 100644 index 0000000000..75eeb7eeb7 --- /dev/null +++ b/packages/db-mongodb/src/utilities/getEntity.ts @@ -0,0 +1,91 @@ +import type { Collection, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload' + +import { APIError } from 'payload' + +import type { MongooseAdapter } from '../index.js' +import type { CollectionModel, GlobalModel } from '../types.js' + +export const getCollection = ({ + adapter, + collectionSlug, + versions = false, +}: { + adapter: MongooseAdapter + collectionSlug: string + versions?: boolean +}): { + collectionConfig: SanitizedCollectionConfig + customIDType: Collection['customIDType'] + + Model: CollectionModel +} => { + const collection = adapter.payload.collections[collectionSlug] + + if (!collection) { + throw new APIError( + `ERROR: Failed to retrieve collection with the slug "${collectionSlug}". Does not exist.`, + ) + } + + if (versions) { + const Model = adapter.versions[collectionSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve collection version model with the slug "${collectionSlug}". Does not exist.`, + ) + } + + return { collectionConfig: collection.config, customIDType: collection.customIDType, Model } + } + + const Model = adapter.collections[collectionSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve collection model with the slug "${collectionSlug}". Does not exist.`, + ) + } + + return { collectionConfig: collection.config, customIDType: collection.customIDType, Model } +} + +type BaseGetGlobalArgs = { + adapter: MongooseAdapter + globalSlug: string +} + +interface GetGlobal { + (args: { versions?: false | undefined } & BaseGetGlobalArgs): { + globalConfig: SanitizedGlobalConfig + Model: GlobalModel + } + (args: { versions?: true } & BaseGetGlobalArgs): { + globalConfig: SanitizedGlobalConfig + Model: CollectionModel + } +} + +export const getGlobal: GetGlobal = ({ adapter, globalSlug, versions = false }) => { + const globalConfig = adapter.payload.config.globals.find((each) => each.slug === globalSlug) + + if (!globalConfig) { + throw new APIError( + `ERROR: Failed to retrieve global with the slug "${globalSlug}". Does not exist.`, + ) + } + + if (versions) { + const Model = adapter.versions[globalSlug] + + if (!Model) { + throw new APIError( + `ERROR: Failed to retrieve global version model with the slug "${globalSlug}". Does not exist.`, + ) + } + + return { globalConfig, Model } + } + + return { globalConfig, Model: adapter.globals } as any +} diff --git a/packages/db-mongodb/src/utilities/handleError.ts b/packages/db-mongodb/src/utilities/handleError.ts index 8cdc20a816..d7a44656ef 100644 --- a/packages/db-mongodb/src/utilities/handleError.ts +++ b/packages/db-mongodb/src/utilities/handleError.ts @@ -9,7 +9,7 @@ export const handleError = ({ req, }: { collection?: string - error: Error + error: unknown global?: string req?: Partial }) => { @@ -18,14 +18,20 @@ export const handleError = ({ } // Handle uniqueness error from MongoDB - if ('code' in error && error.code === 11000 && 'keyValue' in error && error.keyValue) { + if ( + 'code' in error && + error.code === 11000 && + 'keyValue' in error && + error.keyValue && + typeof error.keyValue === 'object' + ) { throw new ValidationError( { collection, errors: [ { message: req?.t ? req.t('error:valueMustBeUnique') : 'Value must be unique', - path: Object.keys(error.keyValue)[0], + path: Object.keys(error.keyValue)[0] ?? '', }, ], global, @@ -34,5 +40,6 @@ export const handleError = ({ ) } + // eslint-disable-next-line @typescript-eslint/only-throw-error throw error } diff --git a/packages/db-mongodb/src/utilities/transform.ts b/packages/db-mongodb/src/utilities/transform.ts index 02c7b63cdf..2f1d2753a1 100644 --- a/packages/db-mongodb/src/utilities/transform.ts +++ b/packages/db-mongodb/src/utilities/transform.ts @@ -234,12 +234,12 @@ export const transform = ({ fields, globalSlug, operation, - parentIsLocalized, + parentIsLocalized = false, validateRelationships = true, }: Args) => { if (Array.isArray(data)) { - for (let i = 0; i < data.length; i++) { - transform({ adapter, data: data[i], fields, globalSlug, operation, validateRelationships }) + for (const item of data) { + transform({ adapter, data: item, fields, globalSlug, operation, validateRelationships }) } return } @@ -262,14 +262,16 @@ export const transform = ({ data.globalType = globalSlug } - const sanitize: TraverseFieldsCallback = ({ field, ref }) => { - if (!ref || typeof ref !== 'object') { + const sanitize: TraverseFieldsCallback = ({ field, ref: incomingRef }) => { + if (!incomingRef || typeof incomingRef !== 'object') { return } - if (field.type === 'date' && operation === 'read' && ref[field.name]) { + const ref = incomingRef as Record + + if (field.type === 'date' && operation === 'read' && field.name in ref && ref[field.name]) { if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) { - const fieldRef = ref[field.name] + const fieldRef = ref[field.name] as Record if (!fieldRef || typeof fieldRef !== 'object') { return } @@ -284,7 +286,7 @@ export const transform = ({ } else { sanitizeDate({ field, - ref: ref as Record, + ref, value: ref[field.name], }) } @@ -302,13 +304,13 @@ export const transform = ({ // handle localized relationships if (config.localization && fieldShouldBeLocalized({ field, parentIsLocalized })) { const locales = config.localization.locales - const fieldRef = ref[field.name] + const fieldRef = ref[field.name] as Record if (typeof fieldRef !== 'object') { return } for (const { code } of locales) { - const value = ref[field.name][code] + const value = fieldRef[code] if (value) { sanitizeRelationship({ config, @@ -328,7 +330,7 @@ export const transform = ({ field, locale: undefined, operation, - ref: ref as Record, + ref, validateRelationships, value: ref[field.name], }) diff --git a/packages/db-mongodb/tsconfig.json b/packages/db-mongodb/tsconfig.json index ce82aadf9c..a181cd4bf9 100644 --- a/packages/db-mongodb/tsconfig.json +++ b/packages/db-mongodb/tsconfig.json @@ -1,9 +1,4 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - /* TODO: remove the following lines */ - "strict": false, - "noUncheckedIndexedAccess": false, - }, "references": [{ "path": "../payload" }, { "path": "../translations" }] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 88445dc6b8..bb86539f22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -264,6 +264,15 @@ importers: '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config + '@types/mongoose-aggregate-paginate-v2': + specifier: 1.0.12 + version: 1.0.12(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) + '@types/prompts': + specifier: ^2.4.5 + version: 2.4.9 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 mongodb: specifier: 6.12.0 version: 6.12.0(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) @@ -5349,6 +5358,9 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/mongoose-aggregate-paginate-v2@1.0.12': + resolution: {integrity: sha512-wL8pgJQxqJagv5f5mR7aI8WgUu22nS6rVLoJm71W2Uu+iKfS8jgph2rRLfXrjo+dFt1s7ik5Zl+uGZ4f5GM6Vw==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -14795,6 +14807,20 @@ snapshots: '@types/minimist@1.2.5': {} + '@types/mongoose-aggregate-paginate-v2@1.0.12(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3)': + dependencies: + '@types/node': 22.5.4 + mongoose: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + - supports-color + '@types/ms@0.7.34': {} '@types/mysql@2.15.26': diff --git a/test/queues/int.spec.ts b/test/queues/int.spec.ts index 13818e1081..089445f1dd 100644 --- a/test/queues/int.spec.ts +++ b/test/queues/int.spec.ts @@ -1129,7 +1129,6 @@ describe('Queues', () => { expect(jobAfterRun.input.amountTask1Retried).toBe(0) }) - it('ensure jobs can be cancelled using payload.jobs.cancelByID', async () => { payload.config.jobs.deleteJobOnComplete = false @@ -1201,7 +1200,7 @@ describe('Queues', () => { expect(jobAfterRun.error?.cancelled).toBe(true) expect(jobAfterRun.processing).toBe(false) }) - + it('can tasks throw error', async () => { payload.config.jobs.deleteJobOnComplete = false From e75d38ca8257b2f7c9db79def8b03b9bd807983a Mon Sep 17 00:00:00 2001 From: Said Akhrarov <36972061+akhrarovsaid@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:18:18 -0500 Subject: [PATCH 059/127] fix(ui): remove stale thumbnails in bulkUpload after partial success (#10651) --- .../BulkUpload/FormsManager/index.tsx | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx index 628d03544f..4bd7fdf52e 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx +++ b/packages/ui/src/elements/BulkUpload/FormsManager/index.tsx @@ -264,10 +264,19 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { [initializeSharedFormState, hasInitializedState, toggleLoadingOverlay], ) - const removeFile: FormsManagerContext['removeFile'] = React.useCallback((index) => { - dispatch({ type: 'REMOVE_FORM', index }) + const removeThumbnails = React.useCallback((indexes: number[]) => { + thumbnailUrlsRef.current = thumbnailUrlsRef.current.filter((_, i) => !indexes.includes(i)) + setRenderedThumbnails([...thumbnailUrlsRef.current]) }, []) + const removeFile: FormsManagerContext['removeFile'] = React.useCallback( + (index) => { + dispatch({ type: 'REMOVE_FORM', index }) + removeThumbnails([index]) + }, + [removeThumbnails], + ) + const setFormTotalErrorCount: FormsManagerContext['setFormTotalErrorCount'] = React.useCallback( ({ errorCount, index }) => { dispatch({ @@ -367,7 +376,17 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { setLoadingText('') setIsUploading(false) - const remainingForms = currentForms.filter(({ errorCount }) => errorCount > 0) + const remainingForms = [] + const thumbnailIndexesToRemove = [] + + currentForms.forEach(({ errorCount }, i) => { + if (errorCount) { + remainingForms.push(currentForms[i]) + } else { + thumbnailIndexesToRemove.push(i) + } + }) + const successCount = Math.max(0, currentForms.length - remainingForms.length) const errorCount = currentForms.length - successCount @@ -377,6 +396,10 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { if (typeof onSuccess === 'function') { onSuccess(newDocs, errorCount) } + + if (remainingForms.length && thumbnailIndexesToRemove.length) { + removeThumbnails(thumbnailIndexesToRemove) + } } if (errorCount) { @@ -398,6 +421,7 @@ export function FormsManagerProvider({ children }: FormsManagerProps) { actionURL, activeIndex, forms, + removeThumbnails, onSuccess, collectionSlug, getUploadHandler, From 90d3c6500887dd911de42550e478ac475b013f6a Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Sat, 1 Mar 2025 02:37:19 +0200 Subject: [PATCH 060/127] perf: automatically add index on a relationship field when used as target for a join field (#11463) When the join field is used, Payload now automatically adds an index on the target relationship field. For example: ``` { name: 'relatedPosts', type: 'join', collection: "posts", on: 'category', }, { name: 'category', type: 'relationship', relationTo: "categories", }, ``` Here, `index: true` implicitly added to the `category` relationship field during sanitization to improve querying performance. --- packages/payload/src/fields/config/sanitizeJoinField.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/payload/src/fields/config/sanitizeJoinField.ts b/packages/payload/src/fields/config/sanitizeJoinField.ts index 84add39a5d..133b244922 100644 --- a/packages/payload/src/fields/config/sanitizeJoinField.ts +++ b/packages/payload/src/fields/config/sanitizeJoinField.ts @@ -139,6 +139,10 @@ export const sanitizeJoinField = ({ throw new InvalidFieldJoin(join.field) } + if (!joinRelationship.index && !joinRelationship.unique) { + joinRelationship.index = true + } + if (validateOnly) { return } From c828e336eec3539030c5ac439a35c961506426f7 Mon Sep 17 00:00:00 2001 From: Dmitrii Kuzmin Date: Sat, 1 Mar 2025 04:39:44 +0400 Subject: [PATCH 061/127] fix: excludes index files from migration files filtering (#10722) --- packages/payload/src/database/migrations/readMigrationFiles.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/payload/src/database/migrations/readMigrationFiles.ts b/packages/payload/src/database/migrations/readMigrationFiles.ts index 5bf413b7b9..ed8b788a5e 100644 --- a/packages/payload/src/database/migrations/readMigrationFiles.ts +++ b/packages/payload/src/database/migrations/readMigrationFiles.ts @@ -29,7 +29,7 @@ export const readMigrationFiles = async ({ .readdirSync(payload.db.migrationDir) .sort() .filter((f) => { - return (f.endsWith('.ts') || f.endsWith('.js')) && !f.includes('index.') + return (f.endsWith('.ts') || f.endsWith('.js')) && f !== 'index.js' && f !== 'index.ts' }) .map((file) => { return path.resolve(payload.db.migrationDir, file) From 6d8aca5ab3ef72f909169b8caeba901f74d66043 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 19:29:07 -0700 Subject: [PATCH 062/127] fix(richtext-lexical): ensure nested forms do not use form element (#11462) Previously, lexical blocks initialized a new `Form` component that rendered as `
` in the DOM. This may lead to React errors, as forms nested within forms is not valid HTML. This PR changes them to render as `
` in the DOM instead. --- .../src/features/blocks/client/component/index.tsx | 1 + .../src/features/blocks/client/componentInline/index.tsx | 1 + packages/ui/src/forms/Form/index.tsx | 7 +++++-- packages/ui/src/forms/Form/types.ts | 4 ++++ test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts | 4 ++-- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/richtext-lexical/src/features/blocks/client/component/index.tsx b/packages/richtext-lexical/src/features/blocks/client/component/index.tsx index a7348e12cc..5b17cda0ad 100644 --- a/packages/richtext-lexical/src/features/blocks/client/component/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/client/component/index.tsx @@ -541,6 +541,7 @@ export const BlockComponent: React.FC = (props) => { return await onChange({ formState, submit: true }) }, ]} + el="div" fields={clientBlockFields} initialState={initialState} onChange={[onChange]} diff --git a/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx b/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx index 10330ddb3c..8b38497e41 100644 --- a/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx +++ b/packages/richtext-lexical/src/features/blocks/client/componentInline/index.tsx @@ -391,6 +391,7 @@ export const InlineBlockComponent: React.FC = (props) => { }, ]} disableValidationOnSubmit + el="div" fields={clientBlock?.fields} initialState={initialState || {}} onChange={[onChange]} diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 8e8bc2c2b2..319ba9c090 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -66,6 +66,7 @@ export const Form: React.FC = (props) => { disableSuccessStatus, disableValidationOnSubmit, // fields: fieldsFromProps = collection?.fields || global?.fields, + el, handleResponse, initialState, // fully formed initial field state isDocumentForm, @@ -783,8 +784,10 @@ export const Form: React.FC = (props) => { } : {} + const El: 'form' = (el as unknown as 'form') || 'form' + return ( - = (props) => { - + ) } diff --git a/packages/ui/src/forms/Form/types.ts b/packages/ui/src/forms/Form/types.ts index f68a23eeb9..7c0266441b 100644 --- a/packages/ui/src/forms/Form/types.ts +++ b/packages/ui/src/forms/Form/types.ts @@ -25,6 +25,10 @@ export type FormProps = { * you can disable checks that the form makes before it submits */ disableValidationOnSubmit?: boolean + /** + * If you don't want the form to be a
element, you can pass a string here to use as the wrapper element. + */ + el?: string /** * By default, the form will get the field schema (not data) from the current document. If you pass this in, you can override that behavior. * This is very useful for sub-forms, where the form's field schema is not necessarily the field schema of the current document (e.g. for the Blocks diff --git a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts index 2fc74922ab..e384a5b9c6 100644 --- a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts @@ -1190,7 +1190,7 @@ describe('lexicalBlocks', () => { // Ensure radio button option1 of radioButtonBlock2 (the default option) is still selected await expect( radioButtonBlock2.locator('.radio-input:has-text("Option 1")').first(), - ).toBeChecked() + ).toHaveClass(/radio-input--is-selected/) // Click radio button option3 of radioButtonBlock2 await radioButtonBlock2 @@ -1201,7 +1201,7 @@ describe('lexicalBlocks', () => { // Ensure previously clicked option2 of radioButtonBlock1 is still selected await expect( radioButtonBlock1.locator('.radio-input:has-text("Option 2")').first(), - ).toBeChecked() + ).toHaveClass(/radio-input--is-selected/) /** * Now save and check the actual data. radio button block 1 should have option2 selected and radio button block 2 should have option3 selected From dda17f0c321fa81eac2da91820d45afc272d4942 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Fri, 28 Feb 2025 20:32:02 -0700 Subject: [PATCH 063/127] chore(richtext-lexical): export LexicalFieldAdminProps (#11464) --- packages/richtext-lexical/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index 61bff083d8..0789d0e0fd 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -1051,7 +1051,7 @@ export { $convertFromMarkdownString } from './packages/@lexical/markdown/index.j export { defaultRichTextValue } from './populateGraphQL/defaultValue.js' export { populate } from './populateGraphQL/populate.js' -export type { LexicalEditorProps, LexicalRichTextAdapter } from './types.js' +export type { LexicalEditorProps, LexicalFieldAdminProps, LexicalRichTextAdapter } from './types.js' export { createServerFeature } from './utilities/createServerFeature.js' From 927078c4dba6a2a3b0056416da8d1bbf43336f53 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Sat, 1 Mar 2025 16:20:00 -0500 Subject: [PATCH 064/127] fix(ui): uses query provider as single source of truth for where builder (#11476) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The "where" builder maintains its own duplicative state for conditions. This is problematic when an outside force needs to control the conditions in some way, but the "where" builder will not receive those updates. While it is a requirement of the "where" builder to transform the "where" query into "and" / "or" format for rendering, it does so in a way that causes it to become out of sync with the query provider. This is because we first initialize state from context, then for every change to conditions, report those updates to contexts—but not the other way around. To fix this, we need to completely remove state from the "where" builder and solely rely on the query context as a single source of truth. This will allow it to receive automatic updates from query provider without needing to sync both local state and context simultaneously. Now, we only ever need to send updates to the query provider and let the top-down rendering cycle propagate those changes everywhere. --- packages/ui/src/elements/WhereBuilder/index.tsx | 15 ++++++--------- packages/ui/src/providers/ListQuery/index.tsx | 7 ------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/packages/ui/src/elements/WhereBuilder/index.tsx b/packages/ui/src/elements/WhereBuilder/index.tsx index 4c2644175d..d9b4b21bda 100644 --- a/packages/ui/src/elements/WhereBuilder/index.tsx +++ b/packages/ui/src/elements/WhereBuilder/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { Operator, Where } from 'payload' +import type { Operator } from 'payload' import { getTranslation } from '@payloadcms/translations' import React, { useMemo } from 'react' @@ -32,7 +32,7 @@ export const WhereBuilder: React.FC = (props) => { const { handleWhereChange, query } = useListQuery() - const [conditions, setConditions] = React.useState(() => { + const conditions = useMemo(() => { const whereFromSearch = query.where if (whereFromSearch) { @@ -51,7 +51,7 @@ export const WhereBuilder: React.FC = (props) => { } return [] - }) + }, [query.where]) const addCondition: AddCondition = React.useCallback( async ({ andIndex, field, orIndex, relation }) => { @@ -77,8 +77,7 @@ export const WhereBuilder: React.FC = (props) => { }) } - setConditions(newConditions) - await handleWhereChange({ or: conditions }) + await handleWhereChange({ or: newConditions }) }, [conditions, handleWhereChange], ) @@ -100,8 +99,7 @@ export const WhereBuilder: React.FC = (props) => { const newConditions = [...conditions] newConditions[orIndex].and[andIndex] = newRowCondition - setConditions(newConditions) - await handleWhereChange({ or: conditions }) + await handleWhereChange({ or: newConditions }) } }, [conditions, handleWhereChange], @@ -116,8 +114,7 @@ export const WhereBuilder: React.FC = (props) => { newConditions.splice(orIndex, 1) } - setConditions(newConditions) - await handleWhereChange({ or: conditions }) + await handleWhereChange({ or: newConditions }) }, [conditions, handleWhereChange], ) diff --git a/packages/ui/src/providers/ListQuery/index.tsx b/packages/ui/src/providers/ListQuery/index.tsx index de7938f4ad..c0435a012d 100644 --- a/packages/ui/src/providers/ListQuery/index.tsx +++ b/packages/ui/src/providers/ListQuery/index.tsx @@ -45,13 +45,6 @@ export const ListQueryProvider: React.FC = ({ } }) - // If the search params change externally, update the current query - useEffect(() => { - if (modifySearchParams) { - setCurrentQuery(searchParams) - } - }, [searchParams, modifySearchParams]) - const refineListData = useCallback( // eslint-disable-next-line @typescript-eslint/require-await async (query: ListQuery) => { From e1b30842fb5402413cd14039b9a6f54a38d3cd7a Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sat, 1 Mar 2025 16:44:25 -0700 Subject: [PATCH 065/127] feat(richtext-lexical): add editorConfigFactory helper to streamline getting the editor config (#11467) This PR exports a new `editorConfigFactory` that provides multiple standardized ways to retrieve the editor configuration needed for the Lexical editor. ## Why this is needed Getting the editor config is required for converting the lexical editor state into/from different formats, as it's needed to create a headless editor. While we're moving away from requiring headless editor instantiation for common format conversions, some conversion types and other use cases still require it. Currently, retrieving the editor config is cumbersome - you either need an existing field to extract it from or the payload config to create it from scratch, with multiple approaches for each method. ## What this PR does The `editorConfigFactory` consolidates all possible ways to retrieve the editor config into a single factory with clear methods: ```ts editorConfigFactory.default() editorConfigFactory.fromField() editorConfigFactory.fromUnsanitizedField() editorConfigFactory.fromFeatures() editorConfigFactory.fromEditor() ``` This results in less code, simpler implementation, and improved developer experience. The PR also adds documentation for all retrieval methods. --- docs/rich-text/converters.mdx | 107 +++++++------ packages/richtext-lexical/src/index.ts | 59 ++------ packages/richtext-lexical/src/types.ts | 66 +++++---- .../src/utilities/editorConfigFactory.ts | 140 ++++++++++++++++++ 4 files changed, 254 insertions(+), 118 deletions(-) create mode 100644 packages/richtext-lexical/src/utilities/editorConfigFactory.ts diff --git a/docs/rich-text/converters.mdx b/docs/rich-text/converters.mdx index 9396f45121..3625edc6e2 100644 --- a/docs/rich-text/converters.mdx +++ b/docs/rich-text/converters.mdx @@ -346,48 +346,73 @@ A headless editor can perform such conversions outside of the main editor instan ```ts import { createHeadlessEditor } from '@payloadcms/richtext-lexical/lexical/headless' -import { getEnabledNodes, sanitizeServerEditorConfig } from '@payloadcms/richtext-lexical' +import { getEnabledNodes, editorConfigFactory } from '@payloadcms/richtext-lexical' -const yourEditorConfig // <= your editor config here const payloadConfig // <= your Payload Config here const headlessEditor = createHeadlessEditor({ nodes: getEnabledNodes({ - editorConfig: sanitizeServerEditorConfig(yourEditorConfig, payloadConfig), + editorConfig: await editorConfigFactory.default({config: payloadConfig}) }), }) ``` ### Getting the editor config -As you can see, you need to provide an editor config in order to create a headless editor. This is because the editor config is used to determine which nodes & features are enabled, and which converters are used. +You need to provide an editor config in order to create a headless editor. This is because the editor config is used to determine which nodes & features are enabled, and which converters are used. -To get the editor config, simply import the default editor config and adjust it - just like you did inside of the `editor: lexicalEditor({})` property: +To get the editor config, import the `editorConfigFactory` factory - this factory provides a variety of ways to get the editor config, depending on your use case. ```ts -import { defaultEditorConfig, defaultEditorFeatures } from '@payloadcms/richtext-lexical' // <= make sure this package is installed +import type { SanitizedConfig } from 'payload' -const yourEditorConfig = defaultEditorConfig +import { + editorConfigFactory, + FixedToolbarFeature, + lexicalEditor, +} from '@payloadcms/richtext-lexical' -// If you made changes to the features of the field's editor config, you should also make those changes here: -yourEditorConfig.features = [ - ...defaultEditorFeatures, - // Add your custom features here -] +// Your config needs to be available in order to retrieve the default editor config +const config: SanitizedConfig = {} as SanitizedConfig + +// Version 1 - use the default editor config +const yourEditorConfig = await editorConfigFactory.default({ config }) + +// Version 2 - if you have access to a lexical fields, you can extract the editor config from it +const yourEditorConfig2 = editorConfigFactory.fromField({ + field: collectionConfig.fields[1], +}) + +// Version 3 - create a new editor config - behaves just like instantiating a new `lexicalEditor` +const yourEditorConfig3 = await editorConfigFactory.fromFeatures({ + config, + features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], +}) + +// Version 4 - if you have instantiated a lexical editor and are accessing it outside a field (=> this is the unsanitized editor), +// you can extract the editor config from it. +// This is common if you define the editor in a re-usable module scope variable and pass it to the richText field. +// This is the least efficient way to get the editor config, and not recommended. It is recommended to extract the `features` arg +// into a separate variable and use `fromFeatures` instead. +const editor = lexicalEditor({ + features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], +}) + +const yourEditorConfig4 = await editorConfigFactory.fromEditor({ + config, + editor, +}) ``` -### Getting the editor config from an existing field +### Example - Getting the editor config from an existing field If you have access to the sanitized collection config, you can get access to the lexical sanitized editor config & features, as every lexical richText field returns it. Here is an example how you can get it from another field's afterRead hook: ```ts import type { CollectionConfig, RichTextField } from 'payload' + +import { editorConfigFactory, getEnabledNodes, lexicalEditor } from '@payloadcms/richtext-lexical' import { createHeadlessEditor } from '@payloadcms/richtext-lexical/lexical/headless' -import type { LexicalRichTextAdapter, SanitizedServerEditorConfig } from '@payloadcms/richtext-lexical' -import { - getEnabledNodes, - lexicalEditor -} from '@payloadcms/richtext-lexical' export const MyCollection: CollectionConfig = { slug: 'slug', @@ -397,20 +422,18 @@ export const MyCollection: CollectionConfig = { type: 'text', hooks: { afterRead: [ - ({ value, collection }) => { - const otherRichTextField: RichTextField = collection.fields.find( + ({ siblingFields, value }) => { + const field: RichTextField = siblingFields.find( (field) => 'name' in field && field.name === 'richText', ) as RichTextField - const lexicalAdapter: LexicalRichTextAdapter = - otherRichTextField.editor as LexicalRichTextAdapter - - const sanitizedServerEditorConfig: SanitizedServerEditorConfig = - lexicalAdapter.editorConfig + const editorConfig = editorConfigFactory.fromField({ + field, + }) const headlessEditor = createHeadlessEditor({ nodes: getEnabledNodes({ - editorConfig: sanitizedServerEditorConfig, + editorConfig, }), }) @@ -424,11 +447,9 @@ export const MyCollection: CollectionConfig = { { name: 'richText', type: 'richText', - editor: lexicalEditor({ - features, - }), - } - ] + editor: lexicalEditor(), + }, + ], } ``` @@ -479,14 +500,14 @@ This has been taken from the [lexical serialization & deserialization docs](http Convert markdown content to the Lexical editor format with the following: ```ts -import { sanitizeServerEditorConfig, $convertFromMarkdownString } from '@payloadcms/richtext-lexical' +import { $convertFromMarkdownString, editorConfigFactory } from '@payloadcms/richtext-lexical' -const yourSanitizedEditorConfig = sanitizeServerEditorConfig(yourEditorConfig, payloadConfig) // <= your editor config & Payload Config here +const yourEditorConfig = await editorConfigFactory.default({ config }) const markdown = `# Hello World` headlessEditor.update( () => { - $convertFromMarkdownString(markdown, yourSanitizedEditorConfig.features.markdownTransformers) + $convertFromMarkdownString(markdown, yourEditorConfig.features.markdownTransformers) }, { discrete: true }, ) @@ -505,11 +526,12 @@ Export content from the Lexical editor into Markdown format using these steps: Here's the code for it: ```ts -import { $convertToMarkdownString } from '@payloadcms/richtext-lexical/lexical/markdown' -import { sanitizeServerEditorConfig } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' -const yourSanitizedEditorConfig = sanitizeServerEditorConfig(yourEditorConfig, payloadConfig) // <= your editor config & Payload Config here +import { editorConfigFactory } from '@payloadcms/richtext-lexical' +import { $convertToMarkdownString } from '@payloadcms/richtext-lexical/lexical/markdown' + +const yourEditorConfig = await editorConfigFactory.default({ config }) const yourEditorState: SerializedEditorState // <= your current editor state here // Import editor state into your headless editor @@ -518,7 +540,7 @@ try { () => { headlessEditor.setEditorState(headlessEditor.parseEditorState(yourEditorState)) }, - { discrete: true }, // This should commit the editor state immediately + { discrete: true }, // This should commit the editor state immediately ) } catch (e) { logger.error({ err: e }, 'ERROR parsing editor state') @@ -527,7 +549,7 @@ try { // Export to markdown let markdown: string headlessEditor.getEditorState().read(() => { - markdown = $convertToMarkdownString(yourSanitizedEditorConfig?.features?.markdownTransformers) + markdown = $convertToMarkdownString(yourEditorConfig?.features?.markdownTransformers) }) ``` @@ -542,19 +564,20 @@ Here's the code for it: ```ts import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + import { $getRoot } from '@payloadcms/richtext-lexical/lexical' const yourEditorState: SerializedEditorState // <= your current editor state here // Import editor state into your headless editor try { - headlessEditor.update( + headlessEditor.update( () => { headlessEditor.setEditorState(headlessEditor.parseEditorState(yourEditorState)) }, - { discrete: true }, // This should commit the editor state immediately + { discrete: true }, // This should commit the editor state immediately ) - } catch (e) { +} catch (e) { logger.error({ err: e }, 'ERROR parsing editor state') } diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index 0789d0e0fd..48630bc21a 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -12,19 +12,13 @@ import { import type { FeatureProviderServer, ResolvedServerFeatureMap } from './features/typesServer.js' import type { SanitizedServerEditorConfig } from './lexical/config/types.js' -import type { - AdapterProps, - LexicalEditorProps, - LexicalRichTextAdapter, - LexicalRichTextAdapterProvider, -} from './types.js' +import type { AdapterProps, LexicalEditorProps, LexicalRichTextAdapterProvider } from './types.js' import { getDefaultSanitizedEditorConfig } from './getDefaultSanitizedEditorConfig.js' import { i18n } from './i18n.js' -import { defaultEditorConfig, defaultEditorFeatures } from './lexical/config/server/default.js' -import { loadFeatures } from './lexical/config/server/loader.js' -import { sanitizeServerFeatures } from './lexical/config/server/sanitize.js' +import { defaultEditorFeatures } from './lexical/config/server/default.js' import { populateLexicalPopulationPromises } from './populateGraphQL/populateLexicalPopulationPromises.js' +import { featuresInputToEditorConfig } from './utilities/editorConfigFactory.js' import { getGenerateImportMap } from './utilities/generateImportMap.js' import { getGenerateSchemaMap } from './utilities/generateSchemaMap.js' import { recurseNodeTree } from './utilities/recurseNodeTree.js' @@ -34,7 +28,7 @@ let checkedDependencies = false export const lexicalTargetVersion = '0.21.0' -export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapterProvider { +export function lexicalEditor(args?: LexicalEditorProps): LexicalRichTextAdapterProvider { if ( process.env.NODE_ENV !== 'production' && process.env.PAYLOAD_DISABLE_DEPENDENCY_CHECKER !== 'true' && @@ -66,7 +60,7 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte let resolvedFeatureMap: ResolvedServerFeatureMap let finalSanitizedEditorConfig: SanitizedServerEditorConfig // For server only - if (!props || (!props.features && !props.lexical)) { + if (!args || (!args.features && !args.lexical)) { finalSanitizedEditorConfig = await getDefaultSanitizedEditorConfig({ config, parentIsLocalized, @@ -76,41 +70,16 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte resolvedFeatureMap = finalSanitizedEditorConfig.resolvedFeatureMap } else { - if (props.features && typeof props.features === 'function') { - const rootEditor = config.editor - let rootEditorFeatures: FeatureProviderServer[] = [] - if (typeof rootEditor === 'object' && 'features' in rootEditor) { - rootEditorFeatures = (rootEditor as LexicalRichTextAdapter).features - } - features = props.features({ - defaultFeatures: defaultEditorFeatures, - rootFeatures: rootEditorFeatures, - }) - } else { - features = props.features as FeatureProviderServer[] - } - - if (!features) { - features = defaultEditorFeatures - } - - const lexical = props.lexical ?? defaultEditorConfig.lexical - - resolvedFeatureMap = await loadFeatures({ + const result = await featuresInputToEditorConfig({ config, + features: args?.features, isRoot, + lexical: args?.lexical, parentIsLocalized, - unSanitizedEditorConfig: { - features, - lexical, - }, }) - - finalSanitizedEditorConfig = { - features: sanitizeServerFeatures(resolvedFeatureMap), - lexical: props.lexical, - resolvedFeatureMap, - } + finalSanitizedEditorConfig = result.sanitizedConfig + features = result.features + resolvedFeatureMap = result.resolvedFeatureMap } const featureI18n = finalSanitizedEditorConfig.features.i18n @@ -128,7 +97,7 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte CellComponent: { path: '@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell', serverProps: { - admin: props?.admin, + admin: args?.admin, sanitizedEditorConfig: finalSanitizedEditorConfig, }, }, @@ -137,7 +106,7 @@ export function lexicalEditor(props?: LexicalEditorProps): LexicalRichTextAdapte FieldComponent: { path: '@payloadcms/richtext-lexical/rsc#RscEntryLexicalField', serverProps: { - admin: props?.admin, + admin: args?.admin, sanitizedEditorConfig: finalSanitizedEditorConfig, }, }, @@ -1055,6 +1024,7 @@ export type { LexicalEditorProps, LexicalFieldAdminProps, LexicalRichTextAdapter export { createServerFeature } from './utilities/createServerFeature.js' +export { editorConfigFactory } from './utilities/editorConfigFactory.js' export type { FieldsDrawerProps } from './utilities/fieldsDrawer/Drawer.js' export { extractPropsFromJSXPropsString } from './utilities/jsx/extractPropsFromJSXPropsString.js' export { @@ -1063,4 +1033,5 @@ export { objectToFrontmatter, propsToJSXString, } from './utilities/jsx/jsx.js' + export { upgradeLexicalData } from './utilities/upgradeLexicalData/index.js' diff --git a/packages/richtext-lexical/src/types.ts b/packages/richtext-lexical/src/types.ts index 540ebac327..fb36c429db 100644 --- a/packages/richtext-lexical/src/types.ts +++ b/packages/richtext-lexical/src/types.ts @@ -38,40 +38,42 @@ export type LexicalFieldAdminClientProps = { placeholder?: string } & Omit +export type FeaturesInput = + | (({ + defaultFeatures, + rootFeatures, + }: { + /** + * This opinionated array contains all "recommended" default features. + * + * @Example + * + * ```ts + * editor: lexicalEditor({ + * features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], + * }) + * ``` + */ + defaultFeatures: FeatureProviderServer[] + /** + * This array contains all features that are enabled in the root richText editor (the one defined in the payload.config.ts). + * If this field is the root richText editor, or if the root richText editor is not a lexical editor, this array will be empty. + * + * @Example + * + * ```ts + * editor: lexicalEditor({ + * features: ({ rootFeatures }) => [...rootFeatures, FixedToolbarFeature()], + * }) + * ``` + */ + rootFeatures: FeatureProviderServer[] + }) => FeatureProviderServer[]) + | FeatureProviderServer[] + export type LexicalEditorProps = { admin?: LexicalFieldAdminProps - features?: - | (({ - defaultFeatures, - rootFeatures, - }: { - /** - * This opinionated array contains all "recommended" default features. - * - * @Example - * - * ```ts - * editor: lexicalEditor({ - * features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature()], - * }) - * ``` - */ - defaultFeatures: FeatureProviderServer[] - /** - * This array contains all features that are enabled in the root richText editor (the one defined in the payload.config.ts). - * If this field is the root richText editor, or if the root richText editor is not a lexical editor, this array will be empty. - * - * @Example - * - * ```ts - * editor: lexicalEditor({ - * features: ({ rootFeatures }) => [...rootFeatures, FixedToolbarFeature()], - * }) - * ``` - */ - rootFeatures: FeatureProviderServer[] - }) => FeatureProviderServer[]) - | FeatureProviderServer[] + features?: FeaturesInput lexical?: LexicalEditorConfig } diff --git a/packages/richtext-lexical/src/utilities/editorConfigFactory.ts b/packages/richtext-lexical/src/utilities/editorConfigFactory.ts new file mode 100644 index 0000000000..fc6f04b076 --- /dev/null +++ b/packages/richtext-lexical/src/utilities/editorConfigFactory.ts @@ -0,0 +1,140 @@ +import type { EditorConfig as LexicalEditorConfig } from 'lexical' +import type { RichTextAdapterProvider, RichTextField, SanitizedConfig } from 'payload' + +import type { FeatureProviderServer, ResolvedServerFeatureMap } from '../features/typesServer.js' +import type { SanitizedServerEditorConfig } from '../lexical/config/types.js' +import type { + FeaturesInput, + LexicalRichTextAdapter, + LexicalRichTextAdapterProvider, +} from '../types.js' + +import { getDefaultSanitizedEditorConfig } from '../getDefaultSanitizedEditorConfig.js' +import { defaultEditorConfig, defaultEditorFeatures } from '../lexical/config/server/default.js' +import { loadFeatures } from '../lexical/config/server/loader.js' +import { sanitizeServerFeatures } from '../lexical/config/server/sanitize.js' + +export const editorConfigFactory = { + default: async (args: { + config: SanitizedConfig + parentIsLocalized?: boolean + }): Promise => { + return getDefaultSanitizedEditorConfig({ + config: args.config, + parentIsLocalized: args.parentIsLocalized ?? false, + }) + }, + /** + * If you have instantiated a lexical editor and are accessing it outside a field (=> this is the unsanitized editor), + * you can extract the editor config from it. + * This is common if you define the editor in a re-usable module scope variable and pass it to the richText field. + * + * This is the least efficient way to get the editor config, and not recommended. It is recommended to extract the `features` arg + * into a separate variable and use `fromFeatures` instead. + */ + fromEditor: async (args: { + config: SanitizedConfig + editor: LexicalRichTextAdapterProvider + isRoot?: boolean + lexical?: LexicalEditorConfig + parentIsLocalized?: boolean + }): Promise => { + const lexicalAdapter: LexicalRichTextAdapter = await args.editor({ + config: args.config, + isRoot: args.isRoot ?? false, + parentIsLocalized: args.parentIsLocalized ?? false, + }) + + const sanitizedServerEditorConfig: SanitizedServerEditorConfig = lexicalAdapter.editorConfig + return sanitizedServerEditorConfig + }, + /** + * Create a new editor config - behaves just like instantiating a new `lexicalEditor` + */ + fromFeatures: async (args: { + config: SanitizedConfig + features?: FeaturesInput + isRoot?: boolean + lexical?: LexicalEditorConfig + parentIsLocalized?: boolean + }): Promise => { + return (await featuresInputToEditorConfig(args)).sanitizedConfig + }, + fromField: (args: { field: RichTextField }): SanitizedServerEditorConfig => { + const lexicalAdapter: LexicalRichTextAdapter = args.field.editor as LexicalRichTextAdapter + + const sanitizedServerEditorConfig: SanitizedServerEditorConfig = lexicalAdapter.editorConfig + return sanitizedServerEditorConfig + }, + fromUnsanitizedField: async (args: { + config: SanitizedConfig + field: RichTextField + isRoot?: boolean + parentIsLocalized?: boolean + }): Promise => { + const lexicalAdapterProvider: RichTextAdapterProvider = args.field + .editor as RichTextAdapterProvider + + const lexicalAdapter: LexicalRichTextAdapter = (await lexicalAdapterProvider({ + config: args.config, + isRoot: args.isRoot ?? false, + parentIsLocalized: args.parentIsLocalized ?? false, + })) as LexicalRichTextAdapter + + const sanitizedServerEditorConfig: SanitizedServerEditorConfig = lexicalAdapter.editorConfig + return sanitizedServerEditorConfig + }, +} + +export const featuresInputToEditorConfig = async (args: { + config: SanitizedConfig + features?: FeaturesInput + isRoot?: boolean + lexical?: LexicalEditorConfig + parentIsLocalized?: boolean +}): Promise<{ + features: FeatureProviderServer[] + resolvedFeatureMap: ResolvedServerFeatureMap + sanitizedConfig: SanitizedServerEditorConfig +}> => { + let features: FeatureProviderServer[] = [] + if (args.features && typeof args.features === 'function') { + const rootEditor = args.config.editor + let rootEditorFeatures: FeatureProviderServer[] = [] + if (typeof rootEditor === 'object' && 'features' in rootEditor) { + rootEditorFeatures = (rootEditor as LexicalRichTextAdapter).features + } + features = args.features({ + defaultFeatures: defaultEditorFeatures, + rootFeatures: rootEditorFeatures, + }) + } else { + features = args.features as FeatureProviderServer[] + } + + if (!features) { + features = defaultEditorFeatures + } + + const lexical = args.lexical ?? defaultEditorConfig.lexical + + const resolvedFeatureMap = await loadFeatures({ + config: args.config, + isRoot: args.isRoot ?? false, + parentIsLocalized: args.parentIsLocalized ?? false, + unSanitizedEditorConfig: { + features, + lexical, + }, + }) + + return { + features, + resolvedFeatureMap, + sanitizedConfig: { + features: sanitizeServerFeatures(resolvedFeatureMap), + lexical: args.lexical, + resolvedFeatureMap, + }, + } +} From cd29978fafdfee7a85fb46380a3043d6c41ca8a6 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sat, 1 Mar 2025 20:42:10 -0700 Subject: [PATCH 066/127] feat(richtext-lexical): add htmlToLexical helper (#11479) This adds a new `convertHTMLToLexical` helper that makes converting HTML to Lexical easy --- docs/rich-text/converters.mdx | 60 +++++++------------ .../converters/htmlToLexical/index.ts | 50 ++++++++++++++++ packages/richtext-lexical/src/index.ts | 29 ++++----- 3 files changed, 88 insertions(+), 51 deletions(-) create mode 100644 packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts diff --git a/docs/rich-text/converters.mdx b/docs/rich-text/converters.mdx index 3625edc6e2..5c49aa7154 100644 --- a/docs/rich-text/converters.mdx +++ b/docs/rich-text/converters.mdx @@ -338,8 +338,8 @@ export const UploadFeature: FeatureProviderProviderServer< Lexical provides a seamless way to perform conversions between various other formats: -- HTML to Lexical (or, importing HTML into the lexical editor) -- Markdown to Lexical (or, importing Markdown into the lexical editor) +- HTML to Lexical +- Markdown to Lexical - Lexical to Markdown A headless editor can perform such conversions outside of the main editor instance. Follow this method to initiate a headless editor: @@ -455,46 +455,22 @@ export const MyCollection: CollectionConfig = { ## HTML => Lexical -Once you have your headless editor instance, you can use it to convert HTML to Lexical: +If you have access to the Payload Config and the lexical editor config, you can convert HTML to the lexical editor state with the following: ```ts -import { $generateNodesFromDOM } from '@payloadcms/richtext-lexical/lexical/html' -import { $getRoot, $getSelection } from '@payloadcms/richtext-lexical/lexical' +import { convertHTMLToLexical, editorConfigFactory } from '@payloadcms/richtext-lexical' +// Make sure you have jsdom and @types/jsdom installed import { JSDOM } from 'jsdom' -headlessEditor.update( - () => { - // In a headless environment you can use a package such as JSDom to parse the HTML string. - const dom = new JSDOM(htmlString) - - // Once you have the DOM instance it's easy to generate LexicalNodes. - const nodes = $generateNodesFromDOM(headlessEditor, dom.window.document) - - // Select the root - $getRoot().select() - - // Insert them at a selection. - const selection = $getSelection() - selection.insertNodes(nodes) - }, - { discrete: true }, -) - -// Do this if you then want to get the editor JSON -const editorJSON = headlessEditor.getEditorState().toJSON() +const html = convertHTMLToLexical({ + editorConfig: await editorConfigFactory.default({ + config, // <= make sure you have access to your Payload Config + }), + html: '

text

', + JSDOM, // pass the JSDOM import. As it's a relatively large package, richtext-lexical does not include it by default. +}) ``` -Functions prefixed with a `$` can only be run inside an `editor.update()` or `editorState.read()` callback. - -This has been taken from the [lexical serialization & deserialization docs](https://lexical.dev/docs/concepts/serialization#html---lexical). - - - **Note:** - - Using the `discrete: true` flag ensures instant updates to the editor state. If - immediate reading of the updated state isn't necessary, you can omit the flag. - - ## Markdown => Lexical Convert markdown content to the Lexical editor format with the following: @@ -516,6 +492,17 @@ headlessEditor.update( const editorJSON = headlessEditor.getEditorState().toJSON() ``` +Functions prefixed with a `$` can only be run inside an `editor.update()` or `editorState.read()` callback. + +This has been taken from the [lexical serialization & deserialization docs](https://lexical.dev/docs/concepts/serialization#html---lexical). + + + **Note:** + + Using the `discrete: true` flag ensures instant updates to the editor state. If + immediate reading of the updated state isn't necessary, you can omit the flag. + + ## Lexical => Markdown Export content from the Lexical editor into Markdown format using these steps: @@ -564,7 +551,6 @@ Here's the code for it: ```ts import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' - import { $getRoot } from '@payloadcms/richtext-lexical/lexical' const yourEditorState: SerializedEditorState // <= your current editor state here diff --git a/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts b/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts new file mode 100644 index 0000000000..1db2425df5 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/htmlToLexical/index.ts @@ -0,0 +1,50 @@ +import { createHeadlessEditor } from '@lexical/headless' +import { $getRoot, $getSelection, type SerializedLexicalNode } from 'lexical' + +import type { SanitizedServerEditorConfig } from '../../../lexical/config/types.js' +import type { DefaultNodeTypes, TypedEditorState } from '../../../nodeTypes.js' + +import {} from '../../../lexical/config/server/sanitize.js' +import { getEnabledNodes } from '../../../lexical/nodes/index.js' +import { $generateNodesFromDOM } from '../../../lexical-proxy/@lexical-html.js' + +export const convertHTMLToLexical = ({ + editorConfig, + html, + JSDOM, +}: { + editorConfig: SanitizedServerEditorConfig + html: string + JSDOM: new (html: string) => { + window: { + document: Document + } + } +}): TypedEditorState => { + const headlessEditor = createHeadlessEditor({ + nodes: getEnabledNodes({ + editorConfig, + }), + }) + + headlessEditor.update( + () => { + const dom = new JSDOM(html) + + const nodes = $generateNodesFromDOM(headlessEditor, dom.window.document) + + $getRoot().select() + + const selection = $getSelection() + if (selection === null) { + throw new Error('Selection is null') + } + selection.insertNodes(nodes) + }, + { discrete: true }, + ) + + const editorJSON = headlessEditor.getEditorState().toJSON() + + return editorJSON as TypedEditorState +} diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index 48630bc21a..e3d3acef7b 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -886,48 +886,49 @@ export { HTMLConverterFeature, type HTMLConverterFeatureProps, } from './features/converters/html/index.js' +export { convertHTMLToLexical } from './features/converters/htmlToLexical/index.js' export { TestRecorderFeature } from './features/debug/testRecorder/server/index.js' export { TreeViewFeature } from './features/debug/treeView/server/index.js' export { EXPERIMENTAL_TableFeature } from './features/experimental_table/server/index.js' export { BoldFeature } from './features/format/bold/feature.server.js' export { InlineCodeFeature } from './features/format/inlineCode/feature.server.js' -export { ItalicFeature } from './features/format/italic/feature.server.js' +export { ItalicFeature } from './features/format/italic/feature.server.js' export { StrikethroughFeature } from './features/format/strikethrough/feature.server.js' export { SubscriptFeature } from './features/format/subscript/feature.server.js' export { SuperscriptFeature } from './features/format/superscript/feature.server.js' export { UnderlineFeature } from './features/format/underline/feature.server.js' export { HeadingFeature, type HeadingFeatureProps } from './features/heading/server/index.js' export { HorizontalRuleFeature } from './features/horizontalRule/server/index.js' + export { IndentFeature } from './features/indent/server/index.js' export { AutoLinkNode } from './features/link/nodes/AutoLinkNode.js' - export { LinkNode } from './features/link/nodes/LinkNode.js' export type { LinkFields } from './features/link/nodes/types.js' export { LinkFeature, type LinkFeatureServerProps } from './features/link/server/index.js' export { ChecklistFeature } from './features/lists/checklist/server/index.js' export { OrderedListFeature } from './features/lists/orderedList/server/index.js' + export { UnorderedListFeature } from './features/lists/unorderedList/server/index.js' export type { SlateNode, SlateNodeConverter, } from './features/migrations/slateToLexical/converter/types.js' - export { ParagraphFeature } from './features/paragraph/server/index.js' export { RelationshipFeature, type RelationshipFeatureProps, } from './features/relationship/server/index.js' + export { type RelationshipData, RelationshipServerNode, } from './features/relationship/server/nodes/RelationshipNode.js' - export { FixedToolbarFeature } from './features/toolbars/fixed/server/index.js' -export { InlineToolbarFeature } from './features/toolbars/inline/server/index.js' +export { InlineToolbarFeature } from './features/toolbars/inline/server/index.js' export type { ToolbarGroup, ToolbarGroupItem } from './features/toolbars/types.js' export type { BaseClientFeatureProps, @@ -942,6 +943,7 @@ export type { SanitizedClientFeatures, SanitizedPlugin, } from './features/typesClient.js' + export type { AfterChangeNodeHook, AfterChangeNodeHookArgs, @@ -967,37 +969,36 @@ export type { export { createNode } from './features/typeUtilities.js' // Only useful in feature.server.ts export { UploadFeature } from './features/upload/server/feature.server.js' - export type { UploadFeatureProps } from './features/upload/server/feature.server.js' -export { type UploadData, UploadServerNode } from './features/upload/server/nodes/UploadNode.js' +export { type UploadData, UploadServerNode } from './features/upload/server/nodes/UploadNode.js' export type { EditorConfigContextType } from './lexical/config/client/EditorConfigProvider.js' + export { defaultEditorConfig, defaultEditorFeatures, defaultEditorLexicalConfig, } from './lexical/config/server/default.js' - export { loadFeatures, sortFeaturesForOptimalLoading } from './lexical/config/server/loader.js' + export { sanitizeServerEditorConfig, sanitizeServerFeatures, } from './lexical/config/server/sanitize.js' - export type { ClientEditorConfig, SanitizedClientEditorConfig, SanitizedServerEditorConfig, ServerEditorConfig, } from './lexical/config/types.js' -export { getEnabledNodes, getEnabledNodesFromServerNodes } from './lexical/nodes/index.js' export type { AdapterProps } +export { getEnabledNodes, getEnabledNodesFromServerNodes } from './lexical/nodes/index.js' + export type { SlashMenuGroup, SlashMenuItem, } from './lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js' - export { DETAIL_TYPE_TO_DETAIL, DOUBLE_LINE_BREAK, @@ -1012,26 +1013,26 @@ export { TEXT_TYPE_TO_FORMAT, TEXT_TYPE_TO_MODE, } from './lexical/utils/nodeFormat.js' + export { sanitizeUrl, validateUrl } from './lexical/utils/url.js' export type * from './nodeTypes.js' export { $convertFromMarkdownString } from './packages/@lexical/markdown/index.js' - export { defaultRichTextValue } from './populateGraphQL/defaultValue.js' export { populate } from './populateGraphQL/populate.js' + export type { LexicalEditorProps, LexicalFieldAdminProps, LexicalRichTextAdapter } from './types.js' export { createServerFeature } from './utilities/createServerFeature.js' - export { editorConfigFactory } from './utilities/editorConfigFactory.js' export type { FieldsDrawerProps } from './utilities/fieldsDrawer/Drawer.js' export { extractPropsFromJSXPropsString } from './utilities/jsx/extractPropsFromJSXPropsString.js' + export { extractFrontmatter, frontmatterToObject, objectToFrontmatter, propsToJSXString, } from './utilities/jsx/jsx.js' - export { upgradeLexicalData } from './utilities/upgradeLexicalData/index.js' From 377454416acaa3c03dd0fe02b577737b4325c1f9 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 2 Mar 2025 12:51:49 -0700 Subject: [PATCH 067/127] chore(eslint): speed up no-imports-from-self rule by ensuring cache is used (#11483) Our `no-imports-from-self` eslint rule was supposed to cache the package.json name to ensure it doesn't try to find and read the package.json for every single import statement. Turns out that cache was never used. Credits to @etrepum for [finding this issue](https://github.com/facebook/lexical/pull/7272#discussion_r1976666227) --- .../eslint-plugin/customRules/no-imports-from-self.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/customRules/no-imports-from-self.js b/packages/eslint-plugin/customRules/no-imports-from-self.js index da6a9b5117..77b92e2832 100644 --- a/packages/eslint-plugin/customRules/no-imports-from-self.js +++ b/packages/eslint-plugin/customRules/no-imports-from-self.js @@ -18,11 +18,11 @@ export const rule = { return { ImportDeclaration(node) { const importPath = node.source.value - const pkgName = getPackageName(context, packageName) - if (pkgName && importPath.startsWith(pkgName)) { + packageName = getPackageName(context, packageName) + if (packageName && importPath.startsWith(packageName)) { context.report({ node, - message: `Package "${pkgName}" should not import from itself. Use relative instead.`, + message: `Package "${packageName}" should not import from itself. Use relative instead.`, }) } }, @@ -41,8 +41,7 @@ function getPackageName(context, packageName) { return packageName } - const fileName = context.getFilename() - const pkg = findNearestPackageJson(path.dirname(fileName)) + const pkg = findNearestPackageJson(path.dirname(context.filename)) if (pkg) { return pkg.name } From 398d48ab169b950b58f17db38d6f7a63eb41bfca Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 2 Mar 2025 18:34:34 -0700 Subject: [PATCH 068/127] templates: improve naming of richtext component import, add 'payload-richtext' classname (#11485) Our previous `RichTextWithoutBlocks` import alias was confusing - this PR changes it to `ConvertRichText`. This should make it clear that that's the imported RichText component that performs the editor state => JSX conversion --- templates/website/src/components/RichText/index.tsx | 13 +++++++------ .../src/components/RichText/index.tsx | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/templates/website/src/components/RichText/index.tsx b/templates/website/src/components/RichText/index.tsx index 7d5688f25e..1994159be2 100644 --- a/templates/website/src/components/RichText/index.tsx +++ b/templates/website/src/components/RichText/index.tsx @@ -3,12 +3,12 @@ import { DefaultNodeTypes, SerializedBlockNode, SerializedLinkNode, + type DefaultTypedEditorState, } from '@payloadcms/richtext-lexical' -import { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' import { JSXConvertersFunction, LinkJSXConverter, - RichText as RichTextWithoutBlocks, + RichText as ConvertRichText, } from '@payloadcms/richtext-lexical/react' import { CodeBlock, CodeBlockProps } from '@/blocks/Code/Component' @@ -56,7 +56,7 @@ const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) }) type Props = { - data: SerializedEditorState + data: DefaultTypedEditorState enableGutter?: boolean enableProse?: boolean } & React.HTMLAttributes @@ -64,13 +64,14 @@ type Props = { export default function RichText(props: Props) { const { className, enableProse = true, enableGutter = true, ...rest } = props return ( - = ({ defaultConverters }) }) type Props = { - data: SerializedEditorState + data: DefaultTypedEditorState enableGutter?: boolean enableProse?: boolean } & React.HTMLAttributes @@ -64,13 +64,14 @@ type Props = { export default function RichText(props: Props) { const { className, enableProse = true, enableGutter = true, ...rest } = props return ( - Date: Sun, 2 Mar 2025 19:01:53 -0700 Subject: [PATCH 069/127] templates: bump payload versions, upgrade next.js to 15.2.0, fix eslint errors (#11486) - Ensures website templates build without eslint errors - Upgrades all templates from Next.js 15.1.5 to 15.2.0 - Bumps all payload versions, updates all lockfiles to reference latest payload versions. The blank template was still installing 3.17.1 and the website template was installing 3.18.0 - Simplifies defaultLexical.ts --- templates/_template/package.json | 8 +- templates/blank/package.json | 8 +- templates/blank/pnpm-lock.yaml | 7117 +++++------------ templates/website/package.json | 12 +- templates/website/pnpm-lock.yaml | 2273 +++--- .../website/src/blocks/Content/config.ts | 2 +- .../website/src/blocks/Form/Component.tsx | 2 +- templates/website/src/endpoints/seed/index.ts | 32 +- .../website/src/fields/defaultLexical.ts | 70 +- templates/website/src/payload-types.ts | 57 +- templates/with-payload-cloud/package.json | 18 +- templates/with-postgres/package.json | 16 +- ...tial.json => 20250303_013923_initial.json} | 2 +- ..._initial.ts => 20250303_013923_initial.ts} | 0 .../with-postgres/src/migrations/index.ts | 8 +- templates/with-vercel-mongodb/package.json | 12 +- templates/with-vercel-postgres/package.json | 18 +- ...tial.json => 20250303_013913_initial.json} | 2 +- ..._initial.ts => 20250303_013913_initial.ts} | 0 .../src/migrations/index.ts | 8 +- templates/with-vercel-website/package.json | 22 +- .../src/blocks/Content/config.ts | 4 +- .../src/blocks/Form/Component.tsx | 2 +- .../src/endpoints/seed/index.ts | 32 +- .../src/fields/defaultLexical.ts | 70 +- ...tial.json => 20250303_013917_initial.json} | 2 +- ..._initial.ts => 20250303_013917_initial.ts} | 0 .../src/migrations/index.ts | 8 +- 28 files changed, 3347 insertions(+), 6458 deletions(-) rename templates/with-postgres/src/migrations/{20250227_171503_initial.json => 20250303_013923_initial.json} (99%) rename templates/with-postgres/src/migrations/{20250227_171503_initial.ts => 20250303_013923_initial.ts} (100%) rename templates/with-vercel-postgres/src/migrations/{20250227_171438_initial.json => 20250303_013913_initial.json} (99%) rename templates/with-vercel-postgres/src/migrations/{20250227_171438_initial.ts => 20250303_013913_initial.ts} (100%) rename templates/with-vercel-website/src/migrations/{20250227_171453_initial.json => 20250303_013917_initial.json} (99%) rename templates/with-vercel-website/src/migrations/{20250227_171453_initial.ts => 20250303_013917_initial.ts} (100%) diff --git a/templates/_template/package.json b/templates/_template/package.json index 3b9d361843..ef485d0c6c 100644 --- a/templates/_template/package.json +++ b/templates/_template/package.json @@ -21,7 +21,7 @@ "@payloadcms/richtext-lexical": "latest", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", + "next": "15.2.0", "payload": "latest", "react": "19.0.0", "react-dom": "19.0.0", @@ -30,10 +30,10 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/blank/package.json b/templates/blank/package.json index 3b9d361843..ef485d0c6c 100644 --- a/templates/blank/package.json +++ b/templates/blank/package.json @@ -21,7 +21,7 @@ "@payloadcms/richtext-lexical": "latest", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", + "next": "15.2.0", "payload": "latest", "react": "19.0.0", "react-dom": "19.0.0", @@ -30,10 +30,10 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/blank/pnpm-lock.yaml b/templates/blank/pnpm-lock.yaml index 5ba754b606..d13b82ca1c 100644 --- a/templates/blank/pnpm-lock.yaml +++ b/templates/blank/pnpm-lock.yaml @@ -5,20 +5,21 @@ settings: excludeLinksFromLockfile: false importers: + .: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.17.1(@aws-sdk/credential-providers@3.731.1)(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/next': specifier: latest - version: 3.17.1(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/payload-cloud': specifier: latest - version: 3.17.1(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/richtext-lexical': specifier: latest - version: 3.17.1(e4k67q3rxbsd4cunypxvod7ddu) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -26,11 +27,11 @@ importers: specifier: ^16.8.1 version: 16.10.0 next: - specifier: 15.1.5 - version: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + specifier: 15.2.0 + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) payload: specifier: latest - version: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: specifier: 19.0.0 version: 19.0.0 @@ -43,331 +44,200 @@ importers: devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 - version: 3.2.0 + version: 3.3.0 '@types/node': specifier: ^22.5.4 - version: 22.10.7 + version: 22.13.8 '@types/react': - specifier: 19.0.7 - version: 19.0.7 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.3 - version: 19.0.3(@types/react@19.0.7) + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) eslint: specifier: ^9.16.0 - version: 9.18.0 + version: 9.21.0 eslint-config-next: - specifier: 15.1.5 - version: 15.1.5(eslint@9.18.0)(typescript@5.7.3) + specifier: 15.2.0 + version: 15.2.0(eslint@9.21.0)(typescript@5.7.3) prettier: specifier: ^3.4.2 - version: 3.4.2 + version: 3.5.3 typescript: specifier: 5.7.3 version: 5.7.3 packages: - '@apidevtools/json-schema-ref-parser@11.7.3': - resolution: - { - integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==, - } - engines: { node: '>= 16' } + + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} '@aws-crypto/crc32@5.2.0': - resolution: - { - integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} '@aws-crypto/crc32c@5.2.0': - resolution: - { - integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==, - } + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} '@aws-crypto/sha1-browser@5.2.0': - resolution: - { - integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==, - } + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} '@aws-crypto/sha256-browser@5.2.0': - resolution: - { - integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==, - } + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} '@aws-crypto/sha256-js@1.2.2': - resolution: - { - integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==, - } + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} '@aws-crypto/sha256-js@5.2.0': - resolution: - { - integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} '@aws-crypto/supports-web-crypto@5.2.0': - resolution: - { - integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==, - } + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} '@aws-crypto/util@1.2.2': - resolution: - { - integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==, - } + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} '@aws-crypto/util@5.2.0': - resolution: - { - integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==, - } + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.731.1': - resolution: - { - integrity: sha512-hlYxRERFNxa4Jplh8rjxbCvk6e4ybNKu2wQdiK46GS2N6io9Z62/CNqx3bMiqmjhk92LWXnYcpYwI2MG/WOEMQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-cognito-identity@3.758.0': + resolution: {integrity: sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.731.1': - resolution: - { - integrity: sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-s3@3.758.0': + resolution: {integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.731.0': - resolution: - { - integrity: sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-sso@3.758.0': + resolution: {integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.731.0': - resolution: - { - integrity: sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/core@3.758.0': + resolution: {integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.731.1': - resolution: - { - integrity: sha512-4MdhrZFkMxS/5ZUXaf6NIVa7N3NV259Q10jvfd6AzePd6sq10stJSyShvV7nC1dc/XneHammpYdXV2hlh6Almw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-cognito-identity@3.758.0': + resolution: {integrity: sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.731.0': - resolution: - { - integrity: sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-env@3.758.0': + resolution: {integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.731.0': - resolution: - { - integrity: sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-http@3.758.0': + resolution: {integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.731.1': - resolution: - { - integrity: sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-ini@3.758.0': + resolution: {integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.731.1': - resolution: - { - integrity: sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-node@3.758.0': + resolution: {integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.731.0': - resolution: - { - integrity: sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-process@3.758.0': + resolution: {integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.731.1': - resolution: - { - integrity: sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-sso@3.758.0': + resolution: {integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.731.1': - resolution: - { - integrity: sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-web-identity@3.758.0': + resolution: {integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-providers@3.731.1': - resolution: - { - integrity: sha512-Rjb14vXPa3flBJu9YDZkld0pYuR15DESMWGvCtQgGhcgpY8QH7vzxPU2C224SgYYkP0JM+7SRfadbcI5seTFuw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-providers@3.758.0': + resolution: {integrity: sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/lib-storage@3.731.1': - resolution: - { - integrity: sha512-+ajlL3FOCHu+HEB8M5BJ3Rvq+QmXfGdgzU5tmnVMJUl1V9ggbG9P01EmrVX7Q7INdWezQYr/VWqUcOmUW4zuBQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/lib-storage@3.758.0': + resolution: {integrity: sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.731.1 + '@aws-sdk/client-s3': ^3.758.0 - '@aws-sdk/middleware-bucket-endpoint@3.731.0': - resolution: - { - integrity: sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-bucket-endpoint@3.734.0': + resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.731.0': - resolution: - { - integrity: sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-expect-continue@3.734.0': + resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.731.0': - resolution: - { - integrity: sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-flexible-checksums@3.758.0': + resolution: {integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.731.0': - resolution: - { - integrity: sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-host-header@3.734.0': + resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.731.0': - resolution: - { - integrity: sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-location-constraint@3.734.0': + resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.731.0': - resolution: - { - integrity: sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-logger@3.734.0': + resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.731.0': - resolution: - { - integrity: sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-recursion-detection@3.734.0': + resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.731.0': - resolution: - { - integrity: sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-sdk-s3@3.758.0': + resolution: {integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.731.0': - resolution: - { - integrity: sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-ssec@3.734.0': + resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.731.0': - resolution: - { - integrity: sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-user-agent@3.758.0': + resolution: {integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.731.1': - resolution: - { - integrity: sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/nested-clients@3.758.0': + resolution: {integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.731.0': - resolution: - { - integrity: sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/region-config-resolver@3.734.0': + resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.731.0': - resolution: - { - integrity: sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/signature-v4-multi-region@3.758.0': + resolution: {integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.731.1': - resolution: - { - integrity: sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/token-providers@3.758.0': + resolution: {integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.731.0': - resolution: - { - integrity: sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/types@3.734.0': + resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.723.0': - resolution: - { - integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.731.0': - resolution: - { - integrity: sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/util-endpoints@3.743.0': + resolution: {integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.723.0': - resolution: - { - integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.731.0': - resolution: - { - integrity: sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ==, - } + '@aws-sdk/util-user-agent-browser@3.734.0': + resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==} - '@aws-sdk/util-user-agent-node@3.731.0': - resolution: - { - integrity: sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/util-user-agent-node@3.758.0': + resolution: {integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==} + engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -375,164 +245,98 @@ packages: optional: true '@aws-sdk/util-utf8-browser@3.259.0': - resolution: - { - integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, - } + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.723.0': - resolution: - { - integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/xml-builder@3.734.0': + resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==} + engines: {node: '>=18.0.0'} '@babel/code-frame@7.26.2': - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} - '@babel/generator@7.26.5': - resolution: - { - integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==, - } - engines: { node: '>=6.9.0' } + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': - resolution: - { - integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.9': - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} - '@babel/parser@7.26.5': - resolution: - { - integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==, - } - engines: { node: '>=6.0.0' } + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: - { - integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, - } - engines: { node: '>=6.9.0' } + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: - { - integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, - } - engines: { node: '>=6.9.0' } + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.5': - resolution: - { - integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==, - } - engines: { node: '>=6.9.0' } + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + engines: {node: '>=6.9.0'} - '@babel/types@7.26.5': - resolution: - { - integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==, - } - engines: { node: '>=6.9.0' } + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} '@dnd-kit/accessibility@3.1.1': - resolution: - { - integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==, - } + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: react: '>=16.8.0' '@dnd-kit/core@6.0.8': - resolution: - { - integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==, - } + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@dnd-kit/sortable@7.0.2': - resolution: - { - integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==, - } + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} peerDependencies: '@dnd-kit/core': ^6.0.7 react: '>=16.8.0' '@dnd-kit/utilities@3.2.2': - resolution: - { - integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==, - } + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} peerDependencies: react: '>=16.8.0' '@emnapi/runtime@1.3.1': - resolution: - { - integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==, - } + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} '@emotion/babel-plugin@11.13.5': - resolution: - { - integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==, - } + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} '@emotion/cache@11.14.0': - resolution: - { - integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==, - } + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/css@11.13.5': - resolution: - { - integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==, - } + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} '@emotion/hash@0.9.2': - resolution: - { - integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, - } + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} '@emotion/memoize@0.9.0': - resolution: - { - integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, - } + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} '@emotion/react@11.14.0': - resolution: - { - integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==, - } + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -541,1865 +345,1060 @@ packages: optional: true '@emotion/serialize@1.3.3': - resolution: - { - integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==, - } + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/sheet@1.4.0': - resolution: - { - integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==, - } + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} '@emotion/unitless@0.10.0': - resolution: - { - integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==, - } + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: - { - integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==, - } + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' '@emotion/utils@1.4.2': - resolution: - { - integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==, - } + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.4.0': - resolution: - { - integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==, - } + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} '@esbuild/aix-ppc64@0.23.1': - resolution: - { - integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.23.1': - resolution: - { - integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.23.1': - resolution: - { - integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.23.1': - resolution: - { - integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.23.1': - resolution: - { - integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.23.1': - resolution: - { - integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.23.1': - resolution: - { - integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.23.1': - resolution: - { - integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.23.1': - resolution: - { - integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.23.1': - resolution: - { - integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.23.1': - resolution: - { - integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.23.1': - resolution: - { - integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.23.1': - resolution: - { - integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.23.1': - resolution: - { - integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.23.1': - resolution: - { - integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.23.1': - resolution: - { - integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.23.1': - resolution: - { - integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.23.1': - resolution: - { - integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.23.1': - resolution: - { - integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.23.1': - resolution: - { - integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.23.1': - resolution: - { - integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.23.1': - resolution: - { - integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.23.1': - resolution: - { - integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.23.1': - resolution: - { - integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.1': - resolution: - { - integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: - { - integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: - { - integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: - { - integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.18.0': - resolution: - { - integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: - { - integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: - { - integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faceless-ui/modal@3.0.0-beta.2': - resolution: - { - integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==, - } + resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/scroll-info@2.0.0-beta.0': - resolution: - { - integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==, - } + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: - { - integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==, - } + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@floating-ui/core@1.6.9': - resolution: - { - integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==, - } + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} '@floating-ui/dom@1.6.13': - resolution: - { - integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==, - } + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': - resolution: - { - integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==, - } + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.27.3': - resolution: - { - integrity: sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==, - } + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: react: '>=17.0.0' react-dom: '>=17.0.0' '@floating-ui/utils@0.2.9': - resolution: - { - integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==, - } + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} '@humanfs/core@0.19.1': - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': - resolution: - { - integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': - resolution: - { - integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: - { - integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==, - } - engines: { node: '>=18.18' } + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': - resolution: - { - integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] '@img/sharp-darwin-x64@0.33.5': - resolution: - { - integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: - { - integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, - } + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: - { - integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, - } + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: - { - integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, - } + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] '@img/sharp-libvips-linux-arm@1.0.5': - resolution: - { - integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, - } + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: - { - integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, - } + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] '@img/sharp-libvips-linux-x64@1.0.4': - resolution: - { - integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, - } + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: - { - integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, - } + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: - { - integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, - } + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] '@img/sharp-linux-arm64@0.33.5': - resolution: - { - integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] '@img/sharp-linux-arm@0.33.5': - resolution: - { - integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] '@img/sharp-linux-s390x@0.33.5': - resolution: - { - integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] '@img/sharp-linux-x64@0.33.5': - resolution: - { - integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: - { - integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] '@img/sharp-linuxmusl-x64@0.33.5': - resolution: - { - integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] '@img/sharp-wasm32@0.33.5': - resolution: - { - integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] '@img/sharp-win32-ia32@0.33.5': - resolution: - { - integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] '@img/sharp-win32-x64@0.33.5': - resolution: - { - integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } - '@jridgewell/gen-mapping@0.3.8': - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.0': - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jsdevtools/ono@7.1.3': - resolution: - { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, - } + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} '@lexical/clipboard@0.21.0': - resolution: - { - integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==, - } + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} '@lexical/code@0.21.0': - resolution: - { - integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==, - } + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} '@lexical/devtools-core@0.21.0': - resolution: - { - integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==, - } + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' '@lexical/dragon@0.21.0': - resolution: - { - integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==, - } + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} '@lexical/hashtag@0.21.0': - resolution: - { - integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==, - } + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} '@lexical/headless@0.21.0': - resolution: - { - integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==, - } + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} '@lexical/history@0.21.0': - resolution: - { - integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==, - } + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} '@lexical/html@0.21.0': - resolution: - { - integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==, - } + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} '@lexical/link@0.21.0': - resolution: - { - integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==, - } + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} '@lexical/list@0.21.0': - resolution: - { - integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==, - } + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} '@lexical/mark@0.21.0': - resolution: - { - integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==, - } + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} '@lexical/markdown@0.21.0': - resolution: - { - integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==, - } + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} '@lexical/offset@0.21.0': - resolution: - { - integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==, - } + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} '@lexical/overflow@0.21.0': - resolution: - { - integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==, - } + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} '@lexical/plain-text@0.21.0': - resolution: - { - integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==, - } + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} '@lexical/react@0.21.0': - resolution: - { - integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==, - } + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' '@lexical/rich-text@0.21.0': - resolution: - { - integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==, - } + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} '@lexical/selection@0.21.0': - resolution: - { - integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==, - } + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} '@lexical/table@0.21.0': - resolution: - { - integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==, - } + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} '@lexical/text@0.21.0': - resolution: - { - integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==, - } + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} '@lexical/utils@0.21.0': - resolution: - { - integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==, - } + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} '@lexical/yjs@0.21.0': - resolution: - { - integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==, - } + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} peerDependencies: yjs: '>=13.5.22' - '@monaco-editor/loader@1.4.0': - resolution: - { - integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==, - } - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: - { - integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==, - } + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: - { - integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==, - } + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.1.5': - resolution: - { - integrity: sha512-jg8ygVq99W3/XXb9Y6UQsritwhjc+qeiO7QrGZRYOfviyr/HcdnhdBQu4gbp2rBIh2ZyBYTBMWbPw3JSCb0GHw==, - } + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} - '@next/eslint-plugin-next@15.1.5': - resolution: - { - integrity: sha512-3cCrXBybsqe94UxD6DBQCYCCiP9YohBMgZ5IzzPYHmPzj8oqNlhBii5b6o1HDDaRHdz2pVnSsAROCtrczy8O0g==, - } + '@next/eslint-plugin-next@15.2.0': + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} - '@next/swc-darwin-arm64@15.1.5': - resolution: - { - integrity: sha512-5ttHGE75Nw9/l5S8zR2xEwR8OHEqcpPym3idIMAZ2yo+Edk0W/Vf46jGqPOZDk+m/SJ+vYZDSuztzhVha8rcdA==, - } - engines: { node: '>= 10' } + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.5': - resolution: - { - integrity: sha512-8YnZn7vDURUUTInfOcU5l0UWplZGBqUlzvqKKUFceM11SzfNEz7E28E1Arn4/FsOf90b1Nopboy7i7ufc4jXag==, - } - engines: { node: '>= 10' } + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.5': - resolution: - { - integrity: sha512-rDJC4ctlYbK27tCyFUhgIv8o7miHNlpCjb2XXfTLQszwAUOSbcMN9q2y3urSrrRCyGVOd9ZR9a4S45dRh6JF3A==, - } - engines: { node: '>= 10' } + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.5': - resolution: - { - integrity: sha512-FG5RApf4Gu+J+pHUQxXPM81oORZrKBYKUaBTylEIQ6Lz17hKVDsLbSXInfXM0giclvXbyiLXjTv42sQMATmZ0A==, - } - engines: { node: '>= 10' } + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.5': - resolution: - { - integrity: sha512-NX2Ar3BCquAOYpnoYNcKz14eH03XuF7SmSlPzTSSU4PJe7+gelAjxo3Y7F2m8+hLT8ZkkqElawBp7SWBdzwqQw==, - } - engines: { node: '>= 10' } + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.5': - resolution: - { - integrity: sha512-EQgqMiNu3mrV5eQHOIgeuh6GB5UU57tu17iFnLfBEhYfiOfyK+vleYKh2dkRVkV6ayx3eSqbIYgE7J7na4hhcA==, - } - engines: { node: '>= 10' } + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.5': - resolution: - { - integrity: sha512-HPULzqR/VqryQZbZME8HJE3jNFmTGcp+uRMHabFbQl63TtDPm+oCXAz3q8XyGv2AoihwNApVlur9Up7rXWRcjg==, - } - engines: { node: '>= 10' } + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.5': - resolution: - { - integrity: sha512-n74fUb/Ka1dZSVYfjwQ+nSJ+ifUff7jGurFcTuJNKZmI62FFOxQXUYit/uZXPTj2cirm1rvGWHG2GhbSol5Ikw==, - } - engines: { node: '>= 10' } + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] '@nodelib/fs.scandir@2.1.5': - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@nolyfill/is-core-module@1.0.39': - resolution: - { - integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, - } - engines: { node: '>=12.4.0' } + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} - '@one-ini/wasm@0.1.1': - resolution: - { - integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, - } - - '@payloadcms/db-mongodb@3.17.1': - resolution: - { - integrity: sha512-z/yCM8WmC7/DX/KmHA0oyWyw3E6+pydraR2YmA42PNA8KE3MGFpfrDJHUKz5IlcMb9oFLTIpmKnQcWzi/xF5yw==, - } + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} peerDependencies: - payload: 3.17.1 + payload: 3.25.0 - '@payloadcms/email-nodemailer@3.17.1': - resolution: - { - integrity: sha512-Kk02dtw/0kT1deGxhhlibH//B4SV5uDXnCfGFCshgBF+3UV24rhBFAAsf/me0PGuuARR1g+C5MD+Dm9b4fOZ5Q==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/email-nodemailer@3.25.0': + resolution: {integrity: sha512-7sPx3Uyt+piUdqz0/lRUaU7sjU7XGGuu//9qbf9FVwoceGQ/k8OBuK9dxKko2aMlfpff8Mo9ujKYFxfT4R970g==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - payload: 3.17.1 + payload: 3.25.0 - '@payloadcms/graphql@3.17.1': - resolution: - { - integrity: sha512-J9mZ12OVbINAgPTuQoP9gg2/SlXaq4culPQg89bRQLjwK/g1DcJWKgFl/7ExrrOqZlaz4lOSuURBLoc6sbvAgQ==, - } + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.17.1 + payload: 3.25.0 - '@payloadcms/next@3.17.1': - resolution: - { - integrity: sha512-syOwdQOYTEAO18Jh7k/HAb5Jl3EbUTlYESyrQwzBbwAK6YiAcb5qfm36IpAZhzHb5DOrgQeAgjcCzype6d/Sxg==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.17.1 + payload: 3.25.0 - '@payloadcms/payload-cloud@3.17.1': - resolution: - { - integrity: sha512-NrpRcUhG2PG/uMl8ynrDL3xHfm2qRqApiHfWPgq6NPQayFgDrqzma59D9f9sEhDTxjxzEP7N1Ip+GlhIV+F9ww==, - } + '@payloadcms/payload-cloud@3.25.0': + resolution: {integrity: sha512-VVNIvxAxxfxCArKcKKgBs81q7WhndiaPhAVU5VPr5giRzMpvATIwwpirjnfeoJxndL5X79lGhRcKiznwSIEEkw==} peerDependencies: - payload: 3.17.1 + payload: 3.25.0 - '@payloadcms/richtext-lexical@3.17.1': - resolution: - { - integrity: sha512-ACDjv1aN1of9SkrSNPiR0DKaq597yJvODUNiybo1GLlMT5dq4QBOAf3EvojgIYQqrv2aS9AMBxtR2HcryoNiIQ==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/richtext-lexical@3.25.0': + resolution: {integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: '@faceless-ui/modal': 3.0.0-beta.2 - '@faceless-ui/scroll-info': 2.0.0-beta.0 - '@lexical/headless': 0.21.0 - '@lexical/html': 0.21.0 - '@lexical/link': 0.21.0 - '@lexical/list': 0.21.0 - '@lexical/mark': 0.21.0 - '@lexical/react': 0.21.0 - '@lexical/rich-text': 0.21.0 - '@lexical/selection': 0.21.0 - '@lexical/table': 0.21.0 - '@lexical/utils': 0.21.0 - '@payloadcms/next': 3.17.1 - lexical: 0.21.0 - payload: 3.17.1 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.17.1': - resolution: - { - integrity: sha512-Po95yVwOME5TZuKaBylTrHpmrCbLbcviWAAfAU2DBjOv5+s+aev/LmGl3bAFxTL+5ZVLlzy7m/JwBX43gdgaBg==, - } + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.17.1': - resolution: - { - integrity: sha512-XuqSBzBEkPV9T/ER+FtdMHk77g15cBWwT9lPsaPtCWzeRqEakRVLCsH+5I5q7VID3CoWFMLLqOBExYkBV627ug==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.17.1 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@pkgjs/parseargs@0.11.0': - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } - - '@react-email/render@0.0.7': - resolution: - { - integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==, - } - engines: { node: '>=16.0.0' } - '@rtsao/scc@1.1.0': - resolution: - { - integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, - } + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.5': - resolution: - { - integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==, - } - - '@selderee/plugin-htmlparser2@0.10.0': - resolution: - { - integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==, - } + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} '@smithy/abort-controller@4.0.1': - resolution: - { - integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.0.0': - resolution: - { - integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader@5.0.0': - resolution: - { - integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} '@smithy/config-resolver@4.0.1': - resolution: - { - integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} + engines: {node: '>=18.0.0'} - '@smithy/core@3.1.1': - resolution: - { - integrity: sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw==, - } - engines: { node: '>=18.0.0' } + '@smithy/core@3.1.5': + resolution: {integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==} + engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.1': - resolution: - { - integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@4.0.1': - resolution: - { - integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-browser@4.0.1': - resolution: - { - integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-config-resolver@4.0.1': - resolution: - { - integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@4.0.1': - resolution: - { - integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@4.0.1': - resolution: - { - integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} + engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.0.1': - resolution: - { - integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} + engines: {node: '>=18.0.0'} '@smithy/hash-blob-browser@4.0.1': - resolution: - { - integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} + engines: {node: '>=18.0.0'} '@smithy/hash-node@4.0.1': - resolution: - { - integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} + engines: {node: '>=18.0.0'} '@smithy/hash-stream-node@4.0.1': - resolution: - { - integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} + engines: {node: '>=18.0.0'} '@smithy/invalid-dependency@4.0.1': - resolution: - { - integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} + engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': - resolution: - { - integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} '@smithy/is-array-buffer@4.0.0': - resolution: - { - integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} '@smithy/md5-js@4.0.1': - resolution: - { - integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} + engines: {node: '>=18.0.0'} '@smithy/middleware-content-length@4.0.1': - resolution: - { - integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.0.2': - resolution: - { - integrity: sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-endpoint@4.0.6': + resolution: {integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.0.3': - resolution: - { - integrity: sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-retry@4.0.7': + resolution: {integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.1': - resolution: - { - integrity: sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-serde@4.0.2': + resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} + engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.0.1': - resolution: - { - integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} + engines: {node: '>=18.0.0'} '@smithy/node-config-provider@4.0.1': - resolution: - { - integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} + engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.2': - resolution: - { - integrity: sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==, - } - engines: { node: '>=18.0.0' } + '@smithy/node-http-handler@4.0.3': + resolution: {integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==} + engines: {node: '>=18.0.0'} '@smithy/property-provider@4.0.1': - resolution: - { - integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} + engines: {node: '>=18.0.0'} '@smithy/protocol-http@5.0.1': - resolution: - { - integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} + engines: {node: '>=18.0.0'} '@smithy/querystring-builder@4.0.1': - resolution: - { - integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} + engines: {node: '>=18.0.0'} '@smithy/querystring-parser@4.0.1': - resolution: - { - integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} + engines: {node: '>=18.0.0'} '@smithy/service-error-classification@4.0.1': - resolution: - { - integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} + engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@4.0.1': - resolution: - { - integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} + engines: {node: '>=18.0.0'} '@smithy/signature-v4@5.0.1': - resolution: - { - integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.1.2': - resolution: - { - integrity: sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==, - } - engines: { node: '>=18.0.0' } + '@smithy/smithy-client@4.1.6': + resolution: {integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==} + engines: {node: '>=18.0.0'} '@smithy/types@4.1.0': - resolution: - { - integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} + engines: {node: '>=18.0.0'} '@smithy/url-parser@4.0.1': - resolution: - { - integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} + engines: {node: '>=18.0.0'} '@smithy/util-base64@4.0.0': - resolution: - { - integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-browser@4.0.0': - resolution: - { - integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-node@4.0.0': - resolution: - { - integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': - resolution: - { - integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} '@smithy/util-buffer-from@4.0.0': - resolution: - { - integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} '@smithy/util-config-provider@4.0.0': - resolution: - { - integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.3': - resolution: - { - integrity: sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-defaults-mode-browser@4.0.7': + resolution: {integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.3': - resolution: - { - integrity: sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-defaults-mode-node@4.0.7': + resolution: {integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==} + engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.0.1': - resolution: - { - integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} + engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.0.0': - resolution: - { - integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} '@smithy/util-middleware@4.0.1': - resolution: - { - integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} + engines: {node: '>=18.0.0'} '@smithy/util-retry@4.0.1': - resolution: - { - integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.0.2': - resolution: - { - integrity: sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-stream@4.1.2': + resolution: {integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==} + engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.0.0': - resolution: - { - integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': - resolution: - { - integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} '@smithy/util-utf8@4.0.0': - resolution: - { - integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} '@smithy/util-waiter@4.0.2': - resolution: - { - integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} + engines: {node: '>=18.0.0'} '@swc/counter@0.1.3': - resolution: - { - integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, - } + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.15': - resolution: - { - integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, - } + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tokenizer/token@0.3.0': - resolution: - { - integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==, - } + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} '@types/acorn@4.0.6': - resolution: - { - integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==, - } + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} '@types/busboy@1.5.4': - resolution: - { - integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==, - } + resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} '@types/debug@4.1.12': - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/estree-jsx@1.0.5': - resolution: - { - integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, - } + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} '@types/estree@1.0.6': - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/hast@3.0.4': - resolution: - { - integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, - } + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/json-schema@7.0.15': - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': - resolution: - { - integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, - } + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.14': - resolution: - { - integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==, - } + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} '@types/mdast@4.0.4': - resolution: - { - integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, - } + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': - resolution: - { - integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, - } + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.10.7': - resolution: - { - integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==, - } + '@types/node@22.13.8': + resolution: {integrity: sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==} '@types/parse-json@4.0.2': - resolution: - { - integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, - } + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/react-dom@19.0.3': - resolution: - { - integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==, - } + '@types/react-dom@19.0.4': + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: '@types/react': ^19.0.0 '@types/react-transition-group@4.4.12': - resolution: - { - integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==, - } + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' - '@types/react@19.0.7': - resolution: - { - integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==, - } + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/unist@2.0.11': - resolution: - { - integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, - } + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} '@types/unist@3.0.3': - resolution: - { - integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, - } + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/uuid@10.0.0': - resolution: - { - integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==, - } + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/webidl-conversions@7.0.3': - resolution: - { - integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==, - } + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} '@types/whatwg-url@11.0.5': - resolution: - { - integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==, - } + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.20.0': - resolution: - { - integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.20.0': - resolution: - { - integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.20.0': - resolution: - { - integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.20.0': - resolution: - { - integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.20.0': - resolution: - { - integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.20.0': - resolution: - { - integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.20.0': - resolution: - { - integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.20.0': - resolution: - { - integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - - abbrev@2.0.0: - resolution: - { - integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.12.1: - resolution: - { - integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} hasBin: true acorn@8.14.0: - resolution: - { - integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} amazon-cognito-identity-js@6.3.12: - resolution: - { - integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==, - } - - ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } - - ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } - - ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.2: - resolution: - { - integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-includes@3.1.8: - resolution: - { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: - resolution: - { - integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} array.prototype.findlastindex@1.2.5: - resolution: - { - integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: - resolution: - { - integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.3: - resolution: - { - integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: - resolution: - { - integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.4: - resolution: - { - integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} ast-types-flow@0.0.8: - resolution: - { - integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, - } + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} atomic-sleep@1.0.0: - resolution: - { - integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} available-typed-arrays@1.0.7: - resolution: - { - integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} axe-core@4.10.2: - resolution: - { - integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==, - } - engines: { node: '>=4' } - - axios@1.4.0: - resolution: - { - integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==, - } + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} axobject-query@4.1.0: - resolution: - { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} b4a@1.6.7: - resolution: - { - integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==, - } + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} babel-plugin-macros@3.1.0: - resolution: - { - integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, - } - engines: { node: '>=10', npm: '>=6' } + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} bare-events@2.5.4: - resolution: - { - integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==, - } + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} bare-fs@4.0.1: - resolution: - { - integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==, - } - engines: { bare: '>=1.7.0' } + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@3.4.0: - resolution: - { - integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==, - } - engines: { bare: '>=1.6.0' } + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} bare-path@3.0.0: - resolution: - { - integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==, - } + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.4: - resolution: - { - integrity: sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==, - } + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -2410,395 +1409,197 @@ packages: optional: true base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} body-scroll-lock@4.0.0-beta.0: - resolution: - { - integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==, - } + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} bowser@2.11.0: - resolution: - { - integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, - } + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} bson-objectid@2.0.4: - resolution: - { - integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==, - } + resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.1: - resolution: - { - integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==, - } - engines: { node: '>=16.20.1' } + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} + engines: {node: '>=16.20.1'} buffer@4.9.2: - resolution: - { - integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, - } + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} buffer@5.6.0: - resolution: - { - integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==, - } + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: '>=10.16.0' } + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.1: - resolution: - { - integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==, - } - engines: { node: '>= 0.4' } + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { - integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.3: - resolution: - { - integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - caniuse-lite@1.0.30001692: - resolution: - { - integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==, - } + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: - resolution: - { - integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, - } + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} character-entities-html4@2.1.0: - resolution: - { - integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, - } + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} character-entities-legacy@3.0.0: - resolution: - { - integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, - } + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} character-entities@2.0.2: - resolution: - { - integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, - } + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} character-reference-invalid@2.0.1: - resolution: - { - integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, - } + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} charenc@0.0.2: - resolution: - { - integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, - } + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: '>= 8.10.0' } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} ci-info@4.1.0: - resolution: - { - integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} classnames@2.5.1: - resolution: - { - integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, - } + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} client-only@0.0.1: - resolution: - { - integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, - } + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} clsx@2.1.1: - resolution: - { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@4.2.3: - resolution: - { - integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, - } - engines: { node: '>=12.5.0' } + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - - combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } - - commander@10.0.1: - resolution: - { - integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - - condense-newlines@0.2.1: - resolution: - { - integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==, - } - engines: { node: '>=0.10.0' } - - config-chain@1.1.13: - resolution: - { - integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} console-table-printer@2.12.1: - resolution: - { - integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==, - } + resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} croner@9.0.0: - resolution: - { - integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==, - } - engines: { node: '>=18.0' } + resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + engines: {node: '>=18.0'} cross-env@7.0.3: - resolution: - { - integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, - } - engines: { node: '>=10.14', npm: '>=6', yarn: '>=1' } + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} crypt@0.0.2: - resolution: - { - integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, - } + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} cssfilter@0.0.10: - resolution: - { - integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==, - } + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} damerau-levenshtein@1.0.8: - resolution: - { - integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, - } + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} data-view-buffer@1.0.2: - resolution: - { - integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} data-view-byte-length@1.0.2: - resolution: - { - integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: - resolution: - { - integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} dataloader@2.2.3: - resolution: - { - integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==, - } + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} date-fns@3.6.0: - resolution: - { - integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==, - } + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} date-fns@4.1.0: - resolution: - { - integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==, - } + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} dateformat@4.6.3: - resolution: - { - integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, - } + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2806,11 +1607,8 @@ packages: optional: true debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -2818,264 +1616,116 @@ packages: optional: true decode-named-character-reference@1.0.2: - resolution: - { - integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, - } + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: '>= 0.4' } - - delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} detect-libc@2.0.3: - resolution: - { - integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} devlop@1.1.0: - resolution: - { - integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, - } + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} diff@5.2.0: - resolution: - { - integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, - } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} doctrine@2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dom-helpers@5.2.1: - resolution: - { - integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, - } - - dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } - - domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - - domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: '>= 4' } - - domutils@3.2.2: - resolution: - { - integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, - } + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } - - eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } - - editorconfig@1.0.4: - resolution: - { - integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, - } - engines: { node: '>=14' } - hasBin: true - - emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.0: - resolution: - { - integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==, - } - engines: { node: '>=10.13.0' } - - entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: '>=0.12' } + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} es-abstract@1.23.9: - resolution: - { - integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-iterator-helpers@1.2.1: - resolution: - { - integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: - { - integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, - } + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: - resolution: - { - integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} esbuild@0.23.1: - resolution: - { - integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - eslint-config-next@15.1.5: - resolution: - { - integrity: sha512-Awm7iUJY8toOR+fU8yTxZnA7/LyOGUGOd6cENCuDfJ3gucHOSmLdOSGJ4u+nlrs8p5qXemua42bZmq+uOzxl6Q==, - } + eslint-config-next@15.2.0: + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -3084,17 +1734,11 @@ packages: optional: true eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: - { - integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -3106,11 +1750,8 @@ packages: optional: true eslint-module-utils@2.12.0: - resolution: - { - integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -3130,11 +1771,8 @@ packages: optional: true eslint-plugin-import@2.31.0: - resolution: - { - integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -3143,59 +1781,38 @@ packages: optional: true eslint-plugin-jsx-a11y@6.10.2: - resolution: - { - integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: - resolution: - { - integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==, - } - engines: { node: '>=10' } + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.4: - resolution: - { - integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-scope@8.2.0: - resolution: - { - integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.0: - resolution: - { - integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.18.0: - resolution: - { - integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -3204,160 +1821,84 @@ packages: optional: true espree@10.3.0: - resolution: - { - integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-util-is-identifier-name@3.0.0: - resolution: - { - integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, - } + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} estree-util-visit@2.0.0: - resolution: - { - integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, - } + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: '>=6' } - - extend-shallow@2.0.1: - resolution: - { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} fast-base64-decode@1.0.0: - resolution: - { - integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==, - } + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} fast-copy@3.0.2: - resolution: - { - integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==, - } + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-fifo@1.3.2: - resolution: - { - integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, - } + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fast-redact@3.5.0: - resolution: - { - integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} fast-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.5: - resolution: - { - integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==, - } + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fast-xml-parser@4.4.1: - resolution: - { - integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==, - } + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastq@1.18.0: - resolution: - { - integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==, - } + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fdir@6.4.3: - resolution: - { - integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, - } + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3365,1194 +1906,580 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-type@19.3.0: - resolution: - { - integrity: sha512-mROwiKLZf/Kwa/2Rol+OOZQn1eyTkPB3ZTwC0ExY6OLFCbgxHYZvBm7xI77NvfZFMKBsmuXfmLJnD4eEftEhrA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-mROwiKLZf/Kwa/2Rol+OOZQn1eyTkPB3ZTwC0ExY6OLFCbgxHYZvBm7xI77NvfZFMKBsmuXfmLJnD4eEftEhrA==} + engines: {node: '>=18'} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-root@1.1.0: - resolution: - { - integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, - } + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - flatted@3.3.2: - resolution: - { - integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==, - } + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: - resolution: - { - integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==, - } + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - follow-redirects@1.15.9: - resolution: - { - integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, - } - engines: { node: '>=4.0' } - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.3: - resolution: - { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, - } - - foreground-child@3.3.0: - resolution: - { - integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, - } - engines: { node: '>=14' } - - form-data@4.0.1: - resolution: - { - integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==, - } - engines: { node: '>= 6' } + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.8: - resolution: - { - integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.7: - resolution: - { - integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, - } - engines: { node: '>= 0.4' } + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-symbol-description@1.1.0: - resolution: - { - integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} get-tsconfig@4.8.1: - resolution: - { - integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==, - } + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } - - glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } - hasBin: true + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globalthis@1.0.4: - resolution: - { - integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} graphql-http@1.22.4: - resolution: - { - integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} + engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' graphql-playground-html@1.6.30: - resolution: - { - integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==, - } + resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} graphql-scalars@1.22.2: - resolution: - { - integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==} + engines: {node: '>=10'} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 graphql@16.10.0: - resolution: - { - integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==, - } - engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: - resolution: - { - integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: - resolution: - { - integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} help-me@5.0.0: - resolution: - { - integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, - } + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} hoist-non-react-statics@3.3.2: - resolution: - { - integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, - } + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-to-text@9.0.3: - resolution: - { - integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==, - } - engines: { node: '>=14' } - - htmlparser2@8.0.2: - resolution: - { - integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, - } - - http-status@1.6.2: - resolution: - { - integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==, - } - engines: { node: '>= 0.4.0' } + http-status@2.1.0: + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} + engines: {node: '>= 0.4.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} image-size@1.2.0: - resolution: - { - integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==, - } - engines: { node: '>=16.x' } + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + engines: {node: '>=16.x'} hasBin: true immutable@4.3.7: - resolution: - { - integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, - } + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: - resolution: - { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, - } - engines: { node: '>=6' } + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} internal-slot@1.1.0: - resolution: - { - integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} is-alphabetical@2.0.1: - resolution: - { - integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, - } + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: - resolution: - { - integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, - } + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} is-array-buffer@3.0.5: - resolution: - { - integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.0: - resolution: - { - integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==, - } - engines: { node: '>= 0.4' } + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} is-bigint@1.1.0: - resolution: - { - integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - is-boolean-object@1.2.1: - resolution: - { - integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==, - } - engines: { node: '>= 0.4' } + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} is-bun-module@1.3.0: - resolution: - { - integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==, - } + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-data-view@1.0.2: - resolution: - { - integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} is-date-object@1.1.0: - resolution: - { - integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} is-decimal@2.0.1: - resolution: - { - integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, - } - - is-extendable@0.1.1: - resolution: - { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.1: - resolution: - { - integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, - } - engines: { node: '>= 0.4' } - - is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-generator-function@1.1.0: - resolution: - { - integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-hexadecimal@2.0.1: - resolution: - { - integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, - } + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} is-map@2.0.3: - resolution: - { - integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-number-object@1.1.1: - resolution: - { - integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-regex@1.2.1: - resolution: - { - integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} is-set@2.0.3: - resolution: - { - integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.4: - resolution: - { - integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-string@1.1.1: - resolution: - { - integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} is-symbol@1.1.1: - resolution: - { - integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} is-typed-array@1.1.15: - resolution: - { - integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} is-weakmap@2.0.2: - resolution: - { - integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: - { - integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==, - } - engines: { node: '>= 0.4' } + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} is-weakset@2.0.4: - resolution: - { - integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, - } - engines: { node: '>= 0.4' } - - is-whitespace@0.3.0: - resolution: - { - integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isomorphic-unfetch@3.1.0: - resolution: - { - integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==, - } + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} isomorphic.js@0.2.5: - resolution: - { - integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==, - } + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} iterator.prototype@1.1.5: - resolution: - { - integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, - } - engines: { node: '>= 0.4' } - - jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jose@5.9.6: - resolution: - { - integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==, - } + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: '>=10' } - - js-beautify@1.15.1: - resolution: - { - integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==, - } - engines: { node: '>=14' } - hasBin: true + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-cookie@2.2.1: - resolution: - { - integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==, - } - - js-cookie@3.0.5: - resolution: - { - integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-to-typescript@15.0.3: - resolution: - { - integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==} + engines: {node: '>=16.0.0'} hasBin: true json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@1.0.2: - resolution: - { - integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, - } + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true jsox@1.2.121: - resolution: - { - integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==, - } + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} hasBin: true jsx-ast-utils@3.3.5: - resolution: - { - integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} kareem@2.6.3: - resolution: - { - integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} + engines: {node: '>=12.0.0'} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } - - kind-of@3.2.2: - resolution: - { - integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} language-subtag-registry@0.3.23: - resolution: - { - integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, - } + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: - resolution: - { - integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, - } - engines: { node: '>=0.10' } - - leac@0.6.0: - resolution: - { - integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==, - } + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lexical@0.21.0: - resolution: - { - integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==, - } + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} lib0@0.2.99: - resolution: - { - integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} + engines: {node: '>=16'} hasBin: true lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} longest-streak@3.1.0: - resolution: - { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, - } + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } - math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} md5@2.3.0: - resolution: - { - integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, - } + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} mdast-util-from-markdown@2.0.2: - resolution: - { - integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, - } + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-mdx-jsx@3.1.3: - resolution: - { - integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==, - } + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} mdast-util-phrasing@4.1.0: - resolution: - { - integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, - } + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} mdast-util-to-markdown@2.1.2: - resolution: - { - integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, - } + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: - resolution: - { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, - } + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} memoize-one@6.0.0: - resolution: - { - integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==, - } + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} memory-pager@1.5.0: - resolution: - { - integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, - } + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - micromark-core-commonmark@2.0.2: - resolution: - { - integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==, - } + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-mdx-jsx@3.0.1: - resolution: - { - integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==, - } + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} micromark-factory-destination@2.0.1: - resolution: - { - integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, - } + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: - resolution: - { - integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, - } + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} micromark-factory-mdx-expression@2.0.2: - resolution: - { - integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==, - } + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} micromark-factory-space@2.0.1: - resolution: - { - integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, - } + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} micromark-factory-title@2.0.1: - resolution: - { - integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, - } + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} micromark-factory-whitespace@2.0.1: - resolution: - { - integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, - } + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} micromark-util-character@2.1.1: - resolution: - { - integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, - } + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} micromark-util-chunked@2.0.1: - resolution: - { - integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, - } + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} micromark-util-classify-character@2.0.1: - resolution: - { - integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, - } + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} micromark-util-combine-extensions@2.0.1: - resolution: - { - integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, - } + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} micromark-util-decode-numeric-character-reference@2.0.2: - resolution: - { - integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, - } + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} micromark-util-decode-string@2.0.1: - resolution: - { - integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, - } + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} micromark-util-encode@2.0.1: - resolution: - { - integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, - } + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} micromark-util-events-to-acorn@2.0.2: - resolution: - { - integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==, - } + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} micromark-util-html-tag-name@2.0.1: - resolution: - { - integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, - } + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} micromark-util-normalize-identifier@2.0.1: - resolution: - { - integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, - } + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} micromark-util-resolve-all@2.0.1: - resolution: - { - integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, - } + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} micromark-util-sanitize-uri@2.0.1: - resolution: - { - integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, - } + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.3: - resolution: - { - integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==, - } + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: - resolution: - { - integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, - } + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: - { - integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==, - } + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: - { - integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==, - } + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: '>=8.6' } - - mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } - - mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - - minimatch@9.0.1: - resolution: - { - integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } - - minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} monaco-editor@0.52.2: - resolution: - { - integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==, - } + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} mongodb-connection-string-url@3.0.2: - resolution: - { - integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==, - } + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.10.0: - resolution: - { - integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==, - } - engines: { node: '>=16.20.1' } + mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} + engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -4575,72 +2502,42 @@ packages: optional: true mongoose-aggregate-paginate-v2@1.1.2: - resolution: - { - integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==} + engines: {node: '>=4.0.0'} mongoose-paginate-v2@1.8.5: - resolution: - { - integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} + engines: {node: '>=4.0.0'} - mongoose@8.8.3: - resolution: - { - integrity: sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==, - } - engines: { node: '>=16.20.1' } + mongoose@8.9.5: + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} + engines: {node: '>=16.20.1'} mpath@0.9.0: - resolution: - { - integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} mquery@5.0.0: - resolution: - { - integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} + engines: {node: '>=14.0.0'} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.8: - resolution: - { - integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: - { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, - } + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - next@15.1.5: - resolution: - { - integrity: sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==, - } - engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -4659,1043 +2556,518 @@ packages: sass: optional: true - node-abi@3.73.0: - resolution: - { - integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==, - } - engines: { node: '>=10' } + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} node-addon-api@6.1.0: - resolution: - { - integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==, - } + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: encoding: optional: true - nodemailer@6.9.10: - resolution: - { - integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==, - } - engines: { node: '>=6.0.0' } - - nopt@7.2.1: - resolution: - { - integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - hasBin: true + nodemailer@6.9.16: + resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} + engines: {node: '>=6.0.0'} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} - object-inspect@1.13.3: - resolution: - { - integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==, - } - engines: { node: '>= 0.4' } + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object-to-formdata@4.5.1: - resolution: - { - integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==, - } + resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} object.assign@4.1.7: - resolution: - { - integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} object.entries@1.1.8: - resolution: - { - integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} object.fromentries@2.0.8: - resolution: - { - integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} object.groupby@1.0.3: - resolution: - { - integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} object.values@1.2.1: - resolution: - { - integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} on-exit-leak-free@2.1.2: - resolution: - { - integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} own-keys@1.0.1: - resolution: - { - integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } - - package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-entities@4.0.2: - resolution: - { - integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, - } + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } - - parseley@0.11.0: - resolution: - { - integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==, - } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - - path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: '>=16 || 14 >=14.18' } - - path-to-regexp@6.2.1: - resolution: - { - integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-to-regexp@6.3.0: - resolution: - { - integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, - } + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - payload@3.17.1: - resolution: - { - integrity: sha512-S7vnuACu/71tVG34Y4i4FU+wsBm4d20u08Aj1ssUsDHfJ4Yc7351hV7sp2jC46Hu1NJdwKB8xipn/rw4PZdGiQ==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} + engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: graphql: ^16.8.1 - peberminta@0.8.0: - resolution: - { - integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==, - } - - peek-readable@5.3.1: - resolution: - { - integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==, - } - engines: { node: '>=14.16' } + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} + engines: {node: '>=14.16'} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: - { - integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} pino-abstract-transport@2.0.0: - resolution: - { - integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==, - } + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} pino-pretty@13.0.0: - resolution: - { - integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==, - } + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} hasBin: true pino-std-serializers@7.0.0: - resolution: - { - integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==, - } + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} pino@9.5.0: - resolution: - { - integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==, - } + resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} hasBin: true pluralize@8.0.0: - resolution: - { - integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: - { - integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, - } - engines: { node: '>= 0.4' } + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} postcss@8.4.31: - resolution: - { - integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: - { - integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==, - } - engines: { node: '>=10' } + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} hasBin: true prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: - { - integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==, - } - engines: { node: '>=14' } + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} hasBin: true - pretty@2.0.0: - resolution: - { - integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==, - } - engines: { node: '>=0.10.0' } - prismjs@1.29.0: - resolution: - { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} process-warning@4.0.1: - resolution: - { - integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==, - } + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } - - proto-list@1.2.4: - resolution: - { - integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, - } - - proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} pump@3.0.2: - resolution: - { - integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, - } + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} qs-esm@7.0.2: - resolution: - { - integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} + engines: {node: '>=18'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } - - queue-tick@1.0.1: - resolution: - { - integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} queue@6.0.2: - resolution: - { - integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, - } + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} quick-format-unescaped@4.0.4: - resolution: - { - integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, - } + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true react-datepicker@7.6.0: - resolution: - { - integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==, - } + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-diff-viewer-continued@3.2.6: - resolution: - { - integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==, - } - engines: { node: '>= 8' } + react-diff-viewer-continued@4.0.4: + resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + engines: {node: '>= 16'} peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - - react-dom@18.2.0: - resolution: - { - integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==, - } - peerDependencies: - react: ^18.2.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: - resolution: - { - integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==, - } + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: react: ^19.0.0 react-error-boundary@3.1.4: - resolution: - { - integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==, - } - engines: { node: '>=10', npm: '>=6' } + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} peerDependencies: react: '>=16.13.1' react-error-boundary@4.1.2: - resolution: - { - integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==, - } + resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: react: '>=16.13.1' react-image-crop@10.1.8: - resolution: - { - integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==, - } + resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==} peerDependencies: react: '>=16.13.1' react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-select@5.9.0: - resolution: - { - integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==, - } + resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-transition-group@4.4.5: - resolution: - { - integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, - } + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' - react@18.2.0: - resolution: - { - integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==, - } - engines: { node: '>=0.10.0' } - react@19.0.0: - resolution: - { - integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} real-require@0.2.0: - resolution: - { - integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} reflect.getprototypeof@1.0.10: - resolution: - { - integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp.prototype.flags@1.5.4: - resolution: - { - integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: '>=0.10.0' } - - resend@0.17.2: - resolution: - { - integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==, - } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: - resolution: - { - integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, - } + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.0.4: - resolution: - { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-array-concat@1.1.3: - resolution: - { - integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safe-push-apply@1.0.0: - resolution: - { - integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: - resolution: - { - integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: - resolution: - { - integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} sanitize-filename@1.6.3: - resolution: - { - integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==, - } + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} sass@1.77.4: - resolution: - { - integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} + engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.23.2: - resolution: - { - integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, - } - scheduler@0.25.0: - resolution: - { - integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==, - } + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} scmp@2.1.0: - resolution: - { - integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==, - } + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} secure-json-parse@2.7.0: - resolution: - { - integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, - } - - selderee@0.10.0: - resolution: - { - integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==, - } + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: - { - integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, - } - engines: { node: '>=10' } + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} hasBin: true set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} set-function-name@2.0.2: - resolution: - { - integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} set-proto@1.0.0: - resolution: - { - integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} sharp@0.32.6: - resolution: - { - integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==, - } - engines: { node: '>=14.15.0' } + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} sharp@0.33.5: - resolution: - { - integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} sift@17.1.3: - resolution: - { - integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==, - } - - signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} simple-wcswidth@1.0.1: - resolution: - { - integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==, - } + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} sonic-boom@4.2.0: - resolution: - { - integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==, - } + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.2: - resolution: - { - integrity: sha512-zMbseqjrOzQD1a93lxahm+qMGxWovdMxBlkTbbnZdNqVLt4j+amF9PQxUCL32WfztOFt9t9ADYkejAL3jF9iNA==, - } + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map@0.5.7: - resolution: - { - integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} sparse-bitfield@3.0.3: - resolution: - { - integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, - } + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} stable-hash@0.0.4: - resolution: - { - integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==, - } + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} state-local@1.0.7: - resolution: - { - integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==, - } + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} stream-browserify@3.0.0: - resolution: - { - integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, - } + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} - streamx@2.21.1: - resolution: - { - integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==, - } - - string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } - - string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string.prototype.includes@2.0.1: - resolution: - { - integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} string.prototype.matchall@4.0.12: - resolution: - { - integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: - resolution: - { - integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, - } + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} string.prototype.trim@1.2.10: - resolution: - { - integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: - resolution: - { - integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: - resolution: - { - integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-entities@4.0.4: - resolution: - { - integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, - } - - strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } - - strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - strnum@1.0.5: - resolution: - { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, - } + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} strtok3@8.1.0: - resolution: - { - integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} + engines: {node: '>=16'} styled-jsx@5.1.6: - resolution: - { - integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' @@ -5707,129 +3079,72 @@ packages: optional: true stylis@4.2.0: - resolution: - { - integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, - } + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} tabbable@6.2.0: - resolution: - { - integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, - } + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} tar-fs@2.1.2: - resolution: - { - integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==, - } + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} tar-fs@3.0.8: - resolution: - { - integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==, - } + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} tar-stream@3.1.7: - resolution: - { - integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, - } + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} text-decoder@1.2.3: - resolution: - { - integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==, - } + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} thread-stream@3.1.0: - resolution: - { - integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==, - } + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - tinyglobby@0.2.10: - resolution: - { - integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==, - } - engines: { node: '>=12.0.0' } + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} token-types@6.0.0: - resolution: - { - integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@5.0.0: - resolution: - { - integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: - resolution: - { - integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==, - } + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@2.0.0: - resolution: - { - integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==, - } - engines: { node: '>=18.12' } + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' ts-essentials@10.0.3: - resolution: - { - integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==, - } + resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} peerDependencies: typescript: '>=4.5.0' peerDependenciesMeta: @@ -5837,163 +3152,87 @@ packages: optional: true tsconfig-paths@3.15.0: - resolution: - { - integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, - } + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.19.2: - resolution: - { - integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} hasBin: true tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } - - type-fest@3.13.0: - resolution: - { - integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} typed-array-buffer@1.0.3: - resolution: - { - integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} typed-array-byte-length@1.0.3: - resolution: - { - integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.4: - resolution: - { - integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} typed-array-length@1.0.7: - resolution: - { - integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typescript@5.7.3: - resolution: - { - integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} hasBin: true uint8array-extras@1.4.0: - resolution: - { - integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} unbox-primitive@1.1.0: - resolution: - { - integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} undici-types@6.20.0: - resolution: - { - integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, - } + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unfetch@4.2.0: - resolution: - { - integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==, - } + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, - } + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position-from-estree@2.0.0: - resolution: - { - integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, - } + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, - } + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, - } + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, - } + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} use-context-selector@2.0.0: - resolution: - { - integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==, - } + resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} peerDependencies: react: '>=18.0.0' scheduler: '>=0.19.0' use-isomorphic-layout-effect@1.2.0: - resolution: - { - integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==, - } + resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -6002,132 +3241,67 @@ packages: optional: true utf8-byte-length@1.0.5: - resolution: - { - integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==, - } + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@10.0.0: - resolution: - { - integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, - } + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true uuid@9.0.1: - resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, - } + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - whatwg-url@14.1.0: - resolution: - { - integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==, - } - engines: { node: '>=18' } + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-boxed-primitive@1.1.1: - resolution: - { - integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: - resolution: - { - integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} which-collection@1.0.2: - resolution: - { - integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.18: - resolution: - { - integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: '>=0.10.0' } - - wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } - - wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: - { - integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, - } - engines: { node: '>=10.0.0' } + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -6138,42 +3312,28 @@ packages: optional: true xss@1.0.15: - resolution: - { - integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==, - } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} hasBin: true yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} yjs@13.6.23: - resolution: - { - integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==, - } - engines: { node: '>=16.0.0', npm: '>=8.0.0' } + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, - } + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@apidevtools/json-schema-ref-parser@11.7.3': + + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -6182,20 +3342,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6205,7 +3365,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -6213,13 +3373,13 @@ snapshots: '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6228,52 +3388,52 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.731.1': + '@aws-sdk/client-cognito-identity@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -6282,32 +3442,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.731.1': + '@aws-sdk/client-s3@3.758.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/middleware-bucket-endpoint': 3.731.0 - '@aws-sdk/middleware-expect-continue': 3.731.0 - '@aws-sdk/middleware-flexible-checksums': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-location-constraint': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-sdk-s3': 3.731.0 - '@aws-sdk/middleware-ssec': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/signature-v4-multi-region': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 - '@aws-sdk/xml-builder': 3.723.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-bucket-endpoint': 3.734.0 + '@aws-sdk/middleware-expect-continue': 3.734.0 + '@aws-sdk/middleware-flexible-checksums': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-location-constraint': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/middleware-ssec': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/signature-v4-multi-region': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/xml-builder': 3.734.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/eventstream-serde-browser': 4.0.1 '@smithy/eventstream-serde-config-resolver': 4.0.1 '@smithy/eventstream-serde-node': 4.0.1 @@ -6318,66 +3478,66 @@ snapshots: '@smithy/invalid-dependency': 4.0.1 '@smithy/md5-js': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 '@smithy/util-waiter': 4.0.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.731.0': + '@aws-sdk/client-sso@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -6386,61 +3546,61 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.731.0': + '@aws-sdk/core@3.758.0': dependencies: - '@aws-sdk/types': 3.731.0 - '@smithy/core': 3.1.1 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.731.1': + '@aws-sdk/credential-provider-cognito-identity@3.758.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.731.0': + '@aws-sdk/credential-provider-env@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.731.0': + '@aws-sdk/credential-provider-http@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.731.1': + '@aws-sdk/credential-provider-ini@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -6449,15 +3609,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.731.1': + '@aws-sdk/credential-provider-node@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-ini': 3.731.1 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -6466,21 +3626,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.731.0': + '@aws-sdk/credential-provider-process@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.731.1': + '@aws-sdk/credential-provider-sso@3.758.0': dependencies: - '@aws-sdk/client-sso': 3.731.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/token-providers': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-sso': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/token-providers': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -6488,31 +3648,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.731.1': + '@aws-sdk/credential-provider-web-identity@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.731.1': + '@aws-sdk/credential-providers@3.758.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-cognito-identity': 3.731.1 - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-ini': 3.731.1 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-cognito-identity': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 @@ -6520,20 +3681,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/lib-storage@3.731.1(@aws-sdk/client-s3@3.731.1)': + '@aws-sdk/lib-storage@3.758.0(@aws-sdk/client-s3@3.758.0)': dependencies: - '@aws-sdk/client-s3': 3.731.1 + '@aws-sdk/client-s3': 3.758.0 '@smithy/abort-controller': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/smithy-client': 4.1.2 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/smithy-client': 4.1.6 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.731.0': + '@aws-sdk/middleware-bucket-endpoint@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-arn-parser': 3.723.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -6541,123 +3702,123 @@ snapshots: '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.731.0': + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.731.0': + '@aws-sdk/middleware-flexible-checksums@3.758.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/is-array-buffer': 4.0.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.731.0': + '@aws-sdk/middleware-host-header@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.731.0': + '@aws-sdk/middleware-location-constraint@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.731.0': + '@aws-sdk/middleware-logger@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.731.0': + '@aws-sdk/middleware-recursion-detection@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.731.0': + '@aws-sdk/middleware-sdk-s3@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-arn-parser': 3.723.0 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.731.0': + '@aws-sdk/middleware-ssec@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.731.0': + '@aws-sdk/middleware-user-agent@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@smithy/core': 3.1.1 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@smithy/core': 3.1.5 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.731.1': + '@aws-sdk/nested-clients@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -6666,28 +3827,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.731.0': + '@aws-sdk/region-config-resolver@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.731.0': + '@aws-sdk/signature-v4-multi-region@3.758.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.731.1': + '@aws-sdk/token-providers@3.758.0': dependencies: - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -6695,7 +3856,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.731.0': + '@aws-sdk/types@3.734.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -6704,9 +3865,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.731.0': + '@aws-sdk/util-endpoints@3.743.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 @@ -6715,17 +3876,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.731.0': + '@aws-sdk/util-user-agent-browser@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.731.0': + '@aws-sdk/util-user-agent-node@3.758.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -6734,7 +3895,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.723.0': + '@aws-sdk/xml-builder@3.734.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -6745,18 +3906,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.5': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -6764,37 +3925,39 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.5': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.26.5': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.5': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@date-fns/tz@1.2.0': {} + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -6828,7 +3991,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -6863,9 +4026,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.0.7)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -6875,7 +4038,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 transitivePeerDependencies: - supports-color @@ -6971,46 +4134,46 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0)': dependencies: - eslint: 9.18.0 + eslint: 9.21.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.21.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -7021,12 +4184,12 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -7046,7 +4209,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.9 @@ -7067,7 +4230,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -7144,15 +4307,6 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -7323,50 +4477,49 @@ snapshots: lexical: 0.21.0 yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.1.5': {} + '@next/env@15.2.0': {} - '@next/eslint-plugin-next@15.1.5': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.5': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.5': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.5': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.5': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.5': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.5': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.5': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.5': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -7379,19 +4532,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@one-ini/wasm@0.1.1': {} - - '@payloadcms/db-mongodb@3.17.1(@aws-sdk/credential-providers@3.731.1)(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/db-mongodb@3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - http-status: 1.6.2 - mongoose: 8.8.3(@aws-sdk/credential-providers@3.731.1) + mongoose: 8.9.5(@aws-sdk/credential-providers@3.758.0) mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -7404,41 +4554,41 @@ snapshots: - socks - supports-color - '@payloadcms/email-nodemailer@3.17.1(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/email-nodemailer@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - nodemailer: 6.9.10 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/graphql@3.17.1(graphql@16.10.0)(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/next@3.17.1(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.17.1(graphql@16.10.0)(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3) - '@payloadcms/translations': 3.17.1 - '@payloadcms/ui': 3.17.1(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 graphql: 16.10.0 graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 - http-status: 1.6.2 - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + http-status: 2.1.0 + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -7448,26 +4598,24 @@ snapshots: - supports-color - typescript - '@payloadcms/payload-cloud@3.17.1(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/payload-cloud@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/client-s3': 3.731.1 - '@aws-sdk/credential-providers': 3.731.1 - '@aws-sdk/lib-storage': 3.731.1(@aws-sdk/client-s3@3.731.1) - '@payloadcms/email-nodemailer': 3.17.1(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/client-s3': 3.758.0 + '@aws-sdk/credential-providers': 3.758.0 + '@aws-sdk/lib-storage': 3.758.0(@aws-sdk/client-s3@3.758.0) + '@payloadcms/email-nodemailer': 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) amazon-cognito-identity-js: 6.3.12 - nodemailer: 6.9.10 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - resend: 0.17.2 + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) transitivePeerDependencies: - aws-crt - - debug - encoding - '@payloadcms/richtext-lexical@3.17.1(e4k67q3rxbsd4cunypxvod7ddu)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@lexical/headless': 0.21.0 '@lexical/html': 0.21.0 '@lexical/link': 0.21.0 @@ -7478,9 +4626,9 @@ snapshots: '@lexical/selection': 0.21.0 '@lexical/table': 0.21.0 '@lexical/utils': 0.21.0 - '@payloadcms/next': 3.17.1(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/translations': 3.17.1 - '@payloadcms/ui': 3.17.1(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/next': 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 @@ -7491,7 +4639,7 @@ snapshots: mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 4.1.2(react@19.0.0) @@ -7503,36 +4651,37 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.17.1': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.17.1(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/ui@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.17.1 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 react: 19.0.0 react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) - react-select: 5.9.0(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-select: 5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 @@ -7542,25 +4691,10 @@ snapshots: - supports-color - typescript - '@pkgjs/parseargs@0.11.0': - optional: true - - '@react-email/render@0.0.7': - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.5': {} - '@selderee/plugin-htmlparser2@0.10.0': - dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - '@smithy/abort-controller@4.0.1': dependencies: '@smithy/types': 4.1.0 @@ -7583,14 +4717,14 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@3.1.1': + '@smithy/core@3.1.5': dependencies: - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-serde': 4.0.2 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 @@ -7685,10 +4819,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.0.2': + '@smithy/middleware-endpoint@4.0.6': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-serde': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/middleware-serde': 4.0.2 '@smithy/node-config-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -7696,19 +4830,19 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.0.3': + '@smithy/middleware-retry@4.0.7': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/service-error-classification': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.1': + '@smithy/middleware-serde@4.0.2': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7725,7 +4859,7 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.2': + '@smithy/node-http-handler@4.0.3': dependencies: '@smithy/abort-controller': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -7774,14 +4908,14 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.1.2': + '@smithy/smithy-client@4.1.6': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-endpoint': 4.0.2 + '@smithy/core': 3.1.5 + '@smithy/middleware-endpoint': 4.0.6 '@smithy/middleware-stack': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 '@smithy/types@4.1.0': @@ -7822,21 +4956,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.3': + '@smithy/util-defaults-mode-browser@4.0.7': dependencies: '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.3': + '@smithy/util-defaults-mode-node@4.0.7': dependencies: '@smithy/config-resolver': 4.0.1 '@smithy/credential-provider-imds': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7861,10 +4995,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-stream@4.0.2': + '@smithy/util-stream@4.1.2': dependencies: '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/types': 4.1.0 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 @@ -7906,7 +5040,7 @@ snapshots: '@types/busboy@1.5.4': dependencies: - '@types/node': 22.10.7 + '@types/node': 22.13.8 '@types/debug@4.1.12': dependencies: @@ -7926,7 +5060,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.14': {} + '@types/lodash@4.17.16': {} '@types/mdast@4.0.4': dependencies: @@ -7934,21 +5068,21 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.10.7': + '@types/node@22.13.8': dependencies: undici-types: 6.20.0 '@types/parse-json@4.0.2': {} - '@types/react-dom@19.0.3(@types/react@19.0.7)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@types/react-transition-group@4.4.12(@types/react@19.0.7)': + '@types/react-transition-group@4.4.12(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@types/react@19.0.7': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 @@ -7964,85 +5098,83 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 - eslint: 9.18.0 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.18.0 + eslint: 9.21.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.20.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0)(typescript@5.7.3) debug: 4.4.0 - eslint: 9.18.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + eslint: 9.21.0 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.20.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - eslint: 9.18.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0 typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.20.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - abbrev@2.0.0: {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -8061,7 +5193,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.5 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -8075,16 +5207,10 @@ snapshots: transitivePeerDependencies: - encoding - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -8105,7 +5231,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -8115,7 +5241,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: @@ -8124,21 +5250,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -8146,7 +5272,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -8155,36 +5281,28 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} - asynckit@0.4.0: {} + async-function@1.0.0: {} atomic-sleep@1.0.0: {} available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} - axios@1.4.0: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@4.1.0: {} b4a@1.6.7: {} babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -8197,22 +5315,22 @@ snapshots: dependencies: bare-events: 2.5.4 bare-path: 3.0.0 - bare-stream: 2.6.4(bare-events@2.5.4) + bare-stream: 2.6.5(bare-events@2.5.4) transitivePeerDependencies: - bare-buffer optional: true - bare-os@3.4.0: + bare-os@3.5.1: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.4.0 + bare-os: 3.5.1 optional: true - bare-stream@2.6.4(bare-events@2.5.4): + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.21.1 + streamx: 2.22.0 optionalDependencies: bare-events: 2.5.4 optional: true @@ -8246,7 +5364,7 @@ snapshots: bson-objectid@2.0.4: {} - bson@6.10.1: {} + bson@6.10.3: {} buffer@4.9.2: dependencies: @@ -8268,26 +5386,26 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} - caniuse-lite@1.0.30001692: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -8346,27 +5464,10 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@10.0.1: {} - commander@2.20.3: {} concat-map@0.0.1: {} - condense-newlines@0.2.1: - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - console-table-printer@2.12.1: dependencies: simple-wcswidth: 1.0.1 @@ -8376,7 +5477,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -8461,8 +5562,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} - dequal@2.0.3: {} detect-libc@2.0.3: {} @@ -8479,57 +5578,26 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 csstype: 3.1.3 - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - - editorconfig@1.0.4: - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.6.3 - - emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} end-of-stream@1.4.4: dependencies: once: 1.4.0 - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - entities@4.5.0: {} - error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -8550,7 +5618,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -8567,9 +5635,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -8601,7 +5669,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -8618,11 +5686,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -8663,19 +5731,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.5(eslint@9.18.0)(typescript@5.7.3): + eslint-config-next@15.2.0(eslint@9.21.0)(typescript@5.7.3): dependencies: - '@next/eslint-plugin-next': 15.1.5 + '@next/eslint-plugin-next': 15.2.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3) - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint@9.21.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0) - eslint-plugin-react: 7.37.4(eslint@9.18.0) - eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) + eslint-plugin-react: 7.37.4(eslint@9.21.0) + eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -8691,34 +5759,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.0 - eslint: 9.18.0 - fast-glob: 3.3.3 - get-tsconfig: 4.8.1 + enhanced-resolve: 5.18.1 + eslint: 9.21.0 + get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) - eslint: 9.18.0 + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) + eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -8727,9 +5794,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0 + eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -8741,13 +5808,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0)(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -8757,7 +5824,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.18.0 + eslint: 9.21.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -8766,11 +5833,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.18.0): + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0): dependencies: - eslint: 9.18.0 + eslint: 9.21.0 - eslint-plugin-react@7.37.4(eslint@9.18.0): + eslint-plugin-react@7.37.4(eslint@9.21.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -8778,7 +5845,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.18.0 + eslint: 9.21.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -8801,18 +5868,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0: + eslint@9.21.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -8869,10 +5936,6 @@ snapshots: expand-template@2.0.3: {} - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - fast-base64-decode@1.0.0: {} fast-copy@3.0.2: {} @@ -8905,15 +5968,15 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.5: {} + fast-uri@3.0.6: {} fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -8942,32 +6005,19 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - follow-redirects@1.15.9: {} - - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fs-constants@1.0.0: {} fsevents@2.3.3: @@ -8986,9 +6036,9 @@ snapshots: functions-have-names@1.2.3: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -9008,7 +6058,11 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -9024,15 +6078,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globals@11.12.0: {} globals@14.0.0: {} @@ -9091,22 +6136,7 @@ snapshots: dependencies: react-is: 16.13.1 - html-to-text@9.0.3: - dependencies: - '@selderee/plugin-htmlparser2': 0.10.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.10.0 - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 4.5.0 - - http-status@1.6.2: {} + http-status@2.1.0: {} ieee754@1.2.1: {} @@ -9118,7 +6148,7 @@ snapshots: immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -9146,14 +6176,15 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.1.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 @@ -9167,7 +6198,7 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -9176,7 +6207,7 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} @@ -9187,7 +6218,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -9197,16 +6228,12 @@ snapshots: is-decimal@2.0.1: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.3 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: dependencies: call-bound: 1.0.3 @@ -9259,16 +6286,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 - - is-whitespace@0.3.0: {} + get-intrinsic: 1.3.0 isarray@1.0.0: {} @@ -9289,33 +6314,17 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jose@5.9.6: {} joycon@3.1.1: {} - js-beautify@1.15.1: - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 10.4.5 - js-cookie: 3.0.5 - nopt: 7.2.1 - js-cookie@2.2.1: {} - js-cookie@3.0.5: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -9330,15 +6339,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.3 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.14 + '@types/lodash': 4.17.16 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 + prettier: 3.5.3 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -9365,10 +6374,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - kleur@3.0.3: {} language-subtag-registry@0.3.23: {} @@ -9377,8 +6382,6 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 - leac@0.6.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -9406,8 +6409,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - lru-cache@10.4.3: {} - math-intrinsics@1.1.0: {} md5@2.3.0: @@ -9423,12 +6424,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -9477,7 +6478,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -9492,9 +6493,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -9507,21 +6508,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -9531,33 +6532,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -9567,12 +6568,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -9595,7 +6596,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -9606,7 +6607,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -9614,24 +6615,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -9641,9 +6642,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -9652,30 +6653,18 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mimic-response@3.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} - minipass@7.1.2: {} - mkdirp-classic@0.5.3: {} monaco-editor@0.52.2: {} @@ -9683,25 +6672,25 @@ snapshots: mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 14.1.0 + whatwg-url: 14.1.1 - mongodb@6.10.0(@aws-sdk/credential-providers@3.731.1): + mongodb@6.12.0(@aws-sdk/credential-providers@3.758.0): dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.731.1 + '@aws-sdk/credential-providers': 3.758.0 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.8.3(@aws-sdk/credential-providers@3.731.1): + mongoose@8.9.5(@aws-sdk/credential-providers@3.758.0): dependencies: - bson: 6.10.1 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.10.0(@aws-sdk/credential-providers@3.731.1) + mongodb: 6.12.0(@aws-sdk/credential-providers@3.758.0) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -9728,39 +6717,39 @@ snapshots: nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.5 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001692 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.5 - '@next/swc-darwin-x64': 15.1.5 - '@next/swc-linux-arm64-gnu': 15.1.5 - '@next/swc-linux-arm64-musl': 15.1.5 - '@next/swc-linux-x64-gnu': 15.1.5 - '@next/swc-linux-x64-musl': 15.1.5 - '@next/swc-win32-arm64-msvc': 15.1.5 - '@next/swc-win32-x64-msvc': 15.1.5 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.73.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -9768,17 +6757,13 @@ snapshots: dependencies: whatwg-url: 5.0.0 - nodemailer@6.9.10: {} - - nopt@7.2.1: - dependencies: - abbrev: 2.0.0 + nodemailer@6.9.16: {} normalize-path@3.0.0: {} object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -9836,7 +6821,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -9848,8 +6833,6 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -9871,33 +6854,20 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parseley@0.11.0: - dependencies: - leac: 0.6.0 - peberminta: 0.8.0 - path-exists@4.0.0: {} path-key@3.1.1: {} path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@6.2.1: {} - path-to-regexp@6.3.0: {} path-type@4.0.0: {} - payload@3.17.1(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + payload@3.25.0(graphql@16.10.0)(typescript@5.7.3): dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.5 - '@payloadcms/translations': 3.17.1 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 @@ -9910,12 +6880,12 @@ snapshots: file-type: 19.3.0 get-tsconfig: 4.8.1 graphql: 16.10.0 - http-status: 1.6.2 + http-status: 2.1.0 image-size: 1.2.0 jose: 5.9.6 json-schema-to-typescript: 15.0.3 minimist: 1.2.8 - path-to-regexp: 6.2.1 + path-to-regexp: 6.3.0 pino: 9.5.0 pino-pretty: 13.0.0 pluralize: 8.0.0 @@ -9925,18 +6895,13 @@ snapshots: ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peberminta@0.8.0: {} - - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} picocolors@1.1.1: {} @@ -9982,7 +6947,7 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} postcss@8.4.31: dependencies: @@ -9990,15 +6955,15 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.73.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -10007,13 +6972,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.2: {} - - pretty@2.0.0: - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.15.1 + prettier@3.5.3: {} prismjs@1.29.0: {} @@ -10030,10 +6989,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proto-list@1.2.4: {} - - proxy-from-env@1.1.0: {} - pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -10045,8 +7000,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -10062,30 +7015,25 @@ snapshots: react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - supports-color - react-dom@18.2.0(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.2 - react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 @@ -10093,12 +7041,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-image-crop@10.1.8(react@19.0.0): @@ -10107,36 +7055,32 @@ snapshots: react-is@16.13.1: {} - react-select@5.9.0(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@19.0.7)(react@19.0.0) + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) '@floating-ui/dom': 1.6.13 - '@types/react-transition-group': 4.4.12(@types/react@19.0.7) + '@types/react-transition-group': 4.4.12(@types/react@19.0.10) memoize-one: 6.0.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.7)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.10)(react@19.0.0) transitivePeerDependencies: - '@types/react' - supports-color react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - react@19.0.0: {} readable-stream@3.6.2: @@ -10158,7 +7102,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -10175,14 +7119,6 @@ snapshots: require-from-string@2.0.2: {} - resend@0.17.2: - dependencies: - '@react-email/render': 0.0.7 - axios: 1.4.0 - type-fest: 3.13.0 - transitivePeerDependencies: - - debug - resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -10199,7 +7135,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: @@ -10209,7 +7145,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -10238,30 +7174,22 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0: {} scmp@2.1.0: {} secure-json-parse@2.7.0: {} - selderee@0.10.0: - dependencies: - parseley: 0.11.0 - semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -10283,8 +7211,8 @@ snapshots: color: 4.2.3 detect-libc: 2.0.3 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 tar-fs: 3.0.8 tunnel-agent: 0.6.0 @@ -10295,7 +7223,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -10327,35 +7255,33 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 sift@17.1.3: {} - signal-exit@4.1.0: {} - simple-concat@1.0.1: {} simple-get@4.0.1: @@ -10376,7 +7302,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -10402,26 +7328,13 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.21.1: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: bare-events: 2.5.4 - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 @@ -10436,7 +7349,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -10481,26 +7394,18 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-bom@3.0.0: {} strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -10548,7 +7453,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.22.0 text-decoder@1.2.3: dependencies: @@ -10558,7 +7463,7 @@ snapshots: dependencies: real-require: 0.2.0 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -10582,7 +7487,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -10616,8 +7521,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@3.13.0: {} - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.3 @@ -10627,7 +7530,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -10636,7 +7539,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -10645,10 +7548,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 typescript@5.7.3: {} @@ -10698,11 +7601,11 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.7)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 utf8-byte-length@1.0.5: {} @@ -10721,7 +7624,7 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@14.1.0: + whatwg-url@14.1.1: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 @@ -10734,7 +7637,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -10744,12 +7647,12 @@ snapshots: call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.1.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -10767,7 +7670,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -10777,21 +7680,9 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: diff --git a/templates/website/package.json b/templates/website/package.json index 7d093bcf73..2e274e678c 100644 --- a/templates/website/package.json +++ b/templates/website/package.json @@ -40,13 +40,13 @@ "geist": "^1.3.0", "graphql": "^16.8.2", "lucide-react": "^0.378.0", - "next": "^15.1.5", + "next": "15.2.0", "next-sitemap": "^4.2.3", "payload": "latest", "payload-admin-bar": "^1.0.6", "prism-react-renderer": "^2.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", "react-hook-form": "7.45.4", "sharp": "0.32.6", "tailwind-merge": "^2.3.0", @@ -57,12 +57,12 @@ "@tailwindcss/typography": "^0.5.13", "@types/escape-html": "^1.0.2", "@types/node": "22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "autoprefixer": "^10.4.19", "copyfiles": "^2.4.1", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "postcss": "^8.4.38", "prettier": "^3.4.2", "tailwindcss": "^3.4.3", diff --git a/templates/website/pnpm-lock.yaml b/templates/website/pnpm-lock.yaml index e00515f1e7..0dd77530b9 100644 --- a/templates/website/pnpm-lock.yaml +++ b/templates/website/pnpm-lock.yaml @@ -9,49 +9,49 @@ importers: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.18.0(@aws-sdk/credential-providers@3.731.1)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/live-preview-react': specifier: latest - version: 3.18.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@payloadcms/next': specifier: latest - version: 3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/payload-cloud': specifier: latest - version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-form-builder': specifier: latest - version: 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-nested-docs': specifier: latest - version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-redirects': specifier: latest - version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-search': specifier: latest - version: 3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-seo': specifier: latest - version: 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/richtext-lexical': specifier: latest - version: 3.18.0(fp4jklecwhxtrwiifv76pyxpuu) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23) '@payloadcms/ui': specifier: latest - version: 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.1.1(@types/react@19.0.7)(react@19.0.0) + version: 1.1.2(@types/react@19.0.10)(react@19.0.0) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -63,7 +63,7 @@ importers: version: 7.0.3 geist: specifier: ^1.3.0 - version: 1.3.1(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) graphql: specifier: ^16.8.2 version: 16.10.0 @@ -71,14 +71,14 @@ importers: specifier: ^0.378.0 version: 0.378.0(react@19.0.0) next: - specifier: ^15.1.5 - version: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + specifier: 15.2.0 + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 4.2.3(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) payload: specifier: latest - version: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.25.0(graphql@16.10.0)(typescript@5.7.3) payload-admin-bar: specifier: ^1.0.6 version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -86,10 +86,10 @@ importers: specifier: ^2.3.1 version: 2.4.1(react@19.0.0) react: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0 react-dom: - specifier: ^19.0.0 + specifier: 19.0.0 version: 19.0.0(react@19.0.0) react-hook-form: specifier: 7.45.4 @@ -106,7 +106,7 @@ importers: devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 - version: 3.2.0 + version: 3.3.0 '@tailwindcss/typography': specifier: ^0.5.13 version: 0.5.16(tailwindcss@3.4.17) @@ -117,29 +117,29 @@ importers: specifier: 22.5.4 version: 22.5.4 '@types/react': - specifier: 19.0.7 - version: 19.0.7 + specifier: 19.0.10 + version: 19.0.10 '@types/react-dom': - specifier: 19.0.3 - version: 19.0.3(@types/react@19.0.7) + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.16.0 - version: 9.18.0(jiti@1.21.7) + version: 9.21.0(jiti@1.21.7) eslint-config-next: - specifier: 15.1.5 - version: 15.1.5(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + specifier: 15.2.0 + version: 15.2.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) postcss: specifier: ^8.4.38 - version: 8.5.1 + version: 8.5.3 prettier: specifier: ^3.4.2 - version: 3.4.2 + version: 3.5.3 tailwindcss: specifier: ^3.4.3 version: 3.4.17 @@ -155,10 +155,10 @@ packages: } engines: { node: '>=10' } - '@apidevtools/json-schema-ref-parser@11.7.3': + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: { - integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==, + integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==, } engines: { node: '>= 16' } @@ -218,208 +218,208 @@ packages: integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==, } - '@aws-sdk/client-cognito-identity@3.731.1': + '@aws-sdk/client-cognito-identity@3.758.0': resolution: { - integrity: sha512-hlYxRERFNxa4Jplh8rjxbCvk6e4ybNKu2wQdiK46GS2N6io9Z62/CNqx3bMiqmjhk92LWXnYcpYwI2MG/WOEMQ==, + integrity: sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/client-s3@3.731.1': + '@aws-sdk/client-s3@3.758.0': resolution: { - integrity: sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ==, + integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/client-sso@3.731.0': + '@aws-sdk/client-sso@3.758.0': resolution: { - integrity: sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A==, + integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/core@3.731.0': + '@aws-sdk/core@3.758.0': resolution: { - integrity: sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA==, + integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-cognito-identity@3.731.1': + '@aws-sdk/credential-provider-cognito-identity@3.758.0': resolution: { - integrity: sha512-4MdhrZFkMxS/5ZUXaf6NIVa7N3NV259Q10jvfd6AzePd6sq10stJSyShvV7nC1dc/XneHammpYdXV2hlh6Almw==, + integrity: sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-env@3.731.0': + '@aws-sdk/credential-provider-env@3.758.0': resolution: { - integrity: sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw==, + integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-http@3.731.0': + '@aws-sdk/credential-provider-http@3.758.0': resolution: { - integrity: sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg==, + integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-ini@3.731.1': + '@aws-sdk/credential-provider-ini@3.758.0': resolution: { - integrity: sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw==, + integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-node@3.731.1': + '@aws-sdk/credential-provider-node@3.758.0': resolution: { - integrity: sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg==, + integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-process@3.731.0': + '@aws-sdk/credential-provider-process@3.758.0': resolution: { - integrity: sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg==, + integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-sso@3.731.1': + '@aws-sdk/credential-provider-sso@3.758.0': resolution: { - integrity: sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw==, + integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-provider-web-identity@3.731.1': + '@aws-sdk/credential-provider-web-identity@3.758.0': resolution: { - integrity: sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g==, + integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==, } engines: { node: '>=18.0.0' } - '@aws-sdk/credential-providers@3.731.1': + '@aws-sdk/credential-providers@3.758.0': resolution: { - integrity: sha512-Rjb14vXPa3flBJu9YDZkld0pYuR15DESMWGvCtQgGhcgpY8QH7vzxPU2C224SgYYkP0JM+7SRfadbcI5seTFuw==, + integrity: sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/lib-storage@3.731.1': + '@aws-sdk/lib-storage@3.758.0': resolution: { - integrity: sha512-+ajlL3FOCHu+HEB8M5BJ3Rvq+QmXfGdgzU5tmnVMJUl1V9ggbG9P01EmrVX7Q7INdWezQYr/VWqUcOmUW4zuBQ==, + integrity: sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==, } engines: { node: '>=18.0.0' } peerDependencies: - '@aws-sdk/client-s3': ^3.731.1 + '@aws-sdk/client-s3': ^3.758.0 - '@aws-sdk/middleware-bucket-endpoint@3.731.0': + '@aws-sdk/middleware-bucket-endpoint@3.734.0': resolution: { - integrity: sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ==, + integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-expect-continue@3.731.0': + '@aws-sdk/middleware-expect-continue@3.734.0': resolution: { - integrity: sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug==, + integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-flexible-checksums@3.731.0': + '@aws-sdk/middleware-flexible-checksums@3.758.0': resolution: { - integrity: sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA==, + integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-host-header@3.731.0': + '@aws-sdk/middleware-host-header@3.734.0': resolution: { - integrity: sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w==, + integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-location-constraint@3.731.0': + '@aws-sdk/middleware-location-constraint@3.734.0': resolution: { - integrity: sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA==, + integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-logger@3.731.0': + '@aws-sdk/middleware-logger@3.734.0': resolution: { - integrity: sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw==, + integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-recursion-detection@3.731.0': + '@aws-sdk/middleware-recursion-detection@3.734.0': resolution: { - integrity: sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw==, + integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-sdk-s3@3.731.0': + '@aws-sdk/middleware-sdk-s3@3.758.0': resolution: { - integrity: sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA==, + integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-ssec@3.731.0': + '@aws-sdk/middleware-ssec@3.734.0': resolution: { - integrity: sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww==, + integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/middleware-user-agent@3.731.0': + '@aws-sdk/middleware-user-agent@3.758.0': resolution: { - integrity: sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A==, + integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/nested-clients@3.731.1': + '@aws-sdk/nested-clients@3.758.0': resolution: { - integrity: sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA==, + integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==, } engines: { node: '>=18.0.0' } - '@aws-sdk/region-config-resolver@3.731.0': + '@aws-sdk/region-config-resolver@3.734.0': resolution: { - integrity: sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ==, + integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==, } engines: { node: '>=18.0.0' } - '@aws-sdk/signature-v4-multi-region@3.731.0': + '@aws-sdk/signature-v4-multi-region@3.758.0': resolution: { - integrity: sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA==, + integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==, } engines: { node: '>=18.0.0' } - '@aws-sdk/token-providers@3.731.1': + '@aws-sdk/token-providers@3.758.0': resolution: { - integrity: sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg==, + integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==, } engines: { node: '>=18.0.0' } - '@aws-sdk/types@3.731.0': + '@aws-sdk/types@3.734.0': resolution: { - integrity: sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==, + integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==, } engines: { node: '>=18.0.0' } @@ -430,10 +430,10 @@ packages: } engines: { node: '>=18.0.0' } - '@aws-sdk/util-endpoints@3.731.0': + '@aws-sdk/util-endpoints@3.743.0': resolution: { - integrity: sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ==, + integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==, } engines: { node: '>=18.0.0' } @@ -444,16 +444,16 @@ packages: } engines: { node: '>=18.0.0' } - '@aws-sdk/util-user-agent-browser@3.731.0': + '@aws-sdk/util-user-agent-browser@3.734.0': resolution: { - integrity: sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ==, + integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==, } - '@aws-sdk/util-user-agent-node@3.731.0': + '@aws-sdk/util-user-agent-node@3.758.0': resolution: { - integrity: sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ==, + integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==, } engines: { node: '>=18.0.0' } peerDependencies: @@ -468,10 +468,10 @@ packages: integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, } - '@aws-sdk/xml-builder@3.723.0': + '@aws-sdk/xml-builder@3.734.0': resolution: { - integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==, + integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==, } engines: { node: '>=18.0.0' } @@ -482,10 +482,10 @@ packages: } engines: { node: '>=6.9.0' } - '@babel/generator@7.26.5': + '@babel/generator@7.26.9': resolution: { - integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==, + integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==, } engines: { node: '>=6.9.0' } @@ -510,39 +510,39 @@ packages: } engines: { node: '>=6.9.0' } - '@babel/parser@7.26.5': + '@babel/parser@7.26.9': resolution: { - integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==, + integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==, } engines: { node: '>=6.0.0' } hasBin: true - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': resolution: { - integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, + integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==, } engines: { node: '>=6.9.0' } - '@babel/template@7.25.9': + '@babel/template@7.26.9': resolution: { - integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, + integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==, } engines: { node: '>=6.9.0' } - '@babel/traverse@7.26.5': + '@babel/traverse@7.26.9': resolution: { - integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==, + integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==, } engines: { node: '>=6.9.0' } - '@babel/types@7.26.5': + '@babel/types@7.26.9': resolution: { - integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==, + integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==, } engines: { node: '>=6.9.0' } @@ -552,6 +552,12 @@ packages: integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==, } + '@date-fns/tz@1.2.0': + resolution: + { + integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==, + } + '@dnd-kit/accessibility@3.1.1': resolution: { @@ -904,45 +910,45 @@ packages: } engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': resolution: { - integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==, + integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/core@0.10.0': + '@eslint/core@0.12.0': resolution: { - integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==, + integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': resolution: { - integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, + integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/js@9.18.0': + '@eslint/js@9.21.0': resolution: { - integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==, + integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/object-schema@2.1.5': + '@eslint/object-schema@2.1.6': resolution: { - integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==, + integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': resolution: { - integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==, + integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -955,23 +961,23 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/scroll-info@2.0.0-beta.0': + '@faceless-ui/scroll-info@2.0.0': resolution: { - integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==, + integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==, } peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': + '@faceless-ui/window-info@3.0.1': resolution: { - integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==, + integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==, } peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@floating-ui/core@1.6.9': resolution: @@ -994,10 +1000,10 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.27.3': + '@floating-ui/react@0.27.5': resolution: { - integrity: sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==, + integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==, } peerDependencies: react: '>=17.0.0' @@ -1037,10 +1043,10 @@ packages: } engines: { node: '>=18.18' } - '@humanwhocodes/retry@0.4.1': + '@humanwhocodes/retry@0.4.2': resolution: { - integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==, + integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, } engines: { node: '>=18.18' } @@ -1392,28 +1398,26 @@ packages: peerDependencies: yjs: '>=13.5.22' - '@monaco-editor/loader@1.4.0': + '@monaco-editor/loader@1.5.0': resolution: { - integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==, + integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==, } - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' - '@monaco-editor/react@4.6.0': + '@monaco-editor/react@4.7.0': resolution: { - integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==, + integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==, } peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': resolution: { - integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==, + integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==, } '@next/env@13.5.8': @@ -1422,85 +1426,85 @@ packages: integrity: sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==, } - '@next/env@15.1.5': + '@next/env@15.2.0': resolution: { - integrity: sha512-jg8ygVq99W3/XXb9Y6UQsritwhjc+qeiO7QrGZRYOfviyr/HcdnhdBQu4gbp2rBIh2ZyBYTBMWbPw3JSCb0GHw==, + integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==, } - '@next/eslint-plugin-next@15.1.5': + '@next/eslint-plugin-next@15.2.0': resolution: { - integrity: sha512-3cCrXBybsqe94UxD6DBQCYCCiP9YohBMgZ5IzzPYHmPzj8oqNlhBii5b6o1HDDaRHdz2pVnSsAROCtrczy8O0g==, + integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==, } - '@next/swc-darwin-arm64@15.1.5': + '@next/swc-darwin-arm64@15.2.0': resolution: { - integrity: sha512-5ttHGE75Nw9/l5S8zR2xEwR8OHEqcpPym3idIMAZ2yo+Edk0W/Vf46jGqPOZDk+m/SJ+vYZDSuztzhVha8rcdA==, + integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==, } engines: { node: '>= 10' } cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.5': + '@next/swc-darwin-x64@15.2.0': resolution: { - integrity: sha512-8YnZn7vDURUUTInfOcU5l0UWplZGBqUlzvqKKUFceM11SzfNEz7E28E1Arn4/FsOf90b1Nopboy7i7ufc4jXag==, + integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==, } engines: { node: '>= 10' } cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.5': + '@next/swc-linux-arm64-gnu@15.2.0': resolution: { - integrity: sha512-rDJC4ctlYbK27tCyFUhgIv8o7miHNlpCjb2XXfTLQszwAUOSbcMN9q2y3urSrrRCyGVOd9ZR9a4S45dRh6JF3A==, + integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==, } engines: { node: '>= 10' } cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.5': + '@next/swc-linux-arm64-musl@15.2.0': resolution: { - integrity: sha512-FG5RApf4Gu+J+pHUQxXPM81oORZrKBYKUaBTylEIQ6Lz17hKVDsLbSXInfXM0giclvXbyiLXjTv42sQMATmZ0A==, + integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==, } engines: { node: '>= 10' } cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.5': + '@next/swc-linux-x64-gnu@15.2.0': resolution: { - integrity: sha512-NX2Ar3BCquAOYpnoYNcKz14eH03XuF7SmSlPzTSSU4PJe7+gelAjxo3Y7F2m8+hLT8ZkkqElawBp7SWBdzwqQw==, + integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==, } engines: { node: '>= 10' } cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.5': + '@next/swc-linux-x64-musl@15.2.0': resolution: { - integrity: sha512-EQgqMiNu3mrV5eQHOIgeuh6GB5UU57tu17iFnLfBEhYfiOfyK+vleYKh2dkRVkV6ayx3eSqbIYgE7J7na4hhcA==, + integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==, } engines: { node: '>= 10' } cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.5': + '@next/swc-win32-arm64-msvc@15.2.0': resolution: { - integrity: sha512-HPULzqR/VqryQZbZME8HJE3jNFmTGcp+uRMHabFbQl63TtDPm+oCXAz3q8XyGv2AoihwNApVlur9Up7rXWRcjg==, + integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==, } engines: { node: '>= 10' } cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.5': + '@next/swc-win32-x64-msvc@15.2.0': resolution: { - integrity: sha512-n74fUb/Ka1dZSVYfjwQ+nSJ+ifUff7jGurFcTuJNKZmI62FFOxQXUYit/uZXPTj2cirm1rvGWHG2GhbSol5Ikw==, + integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==, } engines: { node: '>= 10' } cpu: [x64] @@ -1534,153 +1538,142 @@ packages: } engines: { node: '>=12.4.0' } - '@payloadcms/db-mongodb@3.18.0': + '@payloadcms/db-mongodb@3.25.0': resolution: { - integrity: sha512-bRoCt89soddE8oTxtV8tXo9WsgEVQ1rOYaSqSTQj5/rzqkNtB5Eab6dlHcpI4ruJW2CbPlyspbqeV3as9HLPBA==, + integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/email-nodemailer@3.18.0': + '@payloadcms/email-nodemailer@3.25.0': resolution: { - integrity: sha512-8xv0GxmBWHLGWWfDssCnoo8Jcjdk0H5UpRZOgJWYRWo760DAGQL/cwQZXPMCYtDk6QkyXy4NzoTv94RVK5Yp9g==, + integrity: sha512-7sPx3Uyt+piUdqz0/lRUaU7sjU7XGGuu//9qbf9FVwoceGQ/k8OBuK9dxKko2aMlfpff8Mo9ujKYFxfT4R970g==, } engines: { node: ^18.20.2 || >=20.9.0 } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/graphql@3.18.0': + '@payloadcms/graphql@3.25.0': resolution: { - integrity: sha512-ktWKKEU/B7PDHUNAIt1rn4MUrVOIEWkWbvjAZONFCA6FMnD319QxISXE2UIjEPyiaRls8+7E4w3u8e6mHaIq2w==, + integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==, } hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/live-preview-react@3.18.0': + '@payloadcms/live-preview-react@3.25.0': resolution: { - integrity: sha512-uzHSkm9n4BvZDZL5AL++4eqyp7x4ChG3apJEDdEd8Uzn9Nh+w5dUDJ9S/Bs0hQAguYeyZlS4p/XeZx3hMnv/jA==, + integrity: sha512-toqtcPKKYTr5qKN1o89+lLpt9XWthzMy8IrzyJTCoSWWgrZBAvuWE1iskQxRDZsjEGyzi91B8yyJy7lgts04aQ==, } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/live-preview@3.18.0': + '@payloadcms/live-preview@3.25.0': resolution: { - integrity: sha512-JeZkyhKkiuthPn95B/t+ER3VTQGyeWCzuRxLJh0Wyw80SlVYpqlGhdInnwbSMFA8d6lsW7Z9H31oGsNGPcR5/g==, + integrity: sha512-EzhHqyWCsqyt6MEB+4P0jVvALcNgsS9551QIfWgVHi31qWACxxDWFS6TRms2PF9ObiLTD4aWLukSrC5RAMF3KQ==, } - '@payloadcms/next@3.18.0': + '@payloadcms/next@3.25.0': resolution: { - integrity: sha512-WQMm9ebywWgdZ83S5jrcJB50Iae512jKGLZyBzPpqbpEkP0W2iwg0S7QXKixwhVc+Af9fndbOF9y+6d0xTYm9Q==, + integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==, } engines: { node: ^18.20.2 || >=20.9.0 } peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/payload-cloud@3.18.0': + '@payloadcms/payload-cloud@3.25.0': resolution: { - integrity: sha512-t31fkN6owm8X6C4YWj0Aq1QHFJsilpBqlhSH8YxQeLLt5aFSgw4/nqymRjbEK+BCr3U90ByBZwbCS48bsSoleA==, + integrity: sha512-VVNIvxAxxfxCArKcKKgBs81q7WhndiaPhAVU5VPr5giRzMpvATIwwpirjnfeoJxndL5X79lGhRcKiznwSIEEkw==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/plugin-form-builder@3.18.0': + '@payloadcms/plugin-form-builder@3.25.0': resolution: { - integrity: sha512-bj84DodUvPlMxOiZFZBvOTsQfXuJgIY4emLVNQCU2vhklH9lO4SLesebariY9fXxnKstGQc0VAOLLBa+EmsvzA==, + integrity: sha512-2/rEJjH8F99LF5BDAjEnY8T697dbc2ZFHk+FlCVXWf5FpwneNXz7teWj20tGmLwmN4bdz3KYgby0tHNuH/reyQ==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-nested-docs@3.18.0': + '@payloadcms/plugin-nested-docs@3.25.0': resolution: { - integrity: sha512-UuD6i34Z7nc+VH0fiTEXFqz9m+1TpG+8rNF79k2B454mtbbbAFpLrrywfrTDm0wY6G2dUXiOSc78tXzyy5xn2w==, + integrity: sha512-hIYKsaaTBy0l+hYTJgwVJeSfc+bGA7kzm+o6f8fR6kdWOlgE8M1/m1DB+54MedzY8vHZ31YKBWNny3ompWDQJQ==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/plugin-redirects@3.18.0': + '@payloadcms/plugin-redirects@3.25.0': resolution: { - integrity: sha512-9Fwin0IyJxElqIH69yaTJwPdmPxVFyvxZDaM5/94WFVCTYeHyo0hB7XCki6nreG6NOeQjpBfHPeXzKit/vAgEQ==, + integrity: sha512-B19VBVXGbloXmSrkOmpCGiI5d+iQdA/Y5ciyvIiXELp52SWk88D7U4GuDKgWeS5FFyduNhB64mltJ6vJq+3bxg==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 - '@payloadcms/plugin-search@3.18.0': + '@payloadcms/plugin-search@3.25.0': resolution: { - integrity: sha512-9WRwNxUuA7coLIX/j+lmloopDR7I3KGu5XvidwXJeSRjKkmIls9RuzqJoPVUSj2tX8YTlG5fmgVxKCFQXvBFUw==, + integrity: sha512-VLTIv6emUmdoPip/A1TaCpU4As+ng1OhYynesVMCPa8A7jUvr4KQX1yE3XF0z7os2CzuITb0EsfKC5Wb+OAHUQ==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-seo@3.18.0': + '@payloadcms/plugin-seo@3.25.0': resolution: { - integrity: sha512-l8RLBfnkpmKGRM1ktQ6WqL5zOcPxd5Cie47ThaHwuWee6j0+zC7tjgikU2wX5b6gamvDdRh35MvuWBWO5/4v6w==, + integrity: sha512-zdHemmXb5O3c9XF5zP7B1oLibqMILkOvgh5MnpZA16QSM84dWefj/UizjcJ+NeYx1ODJTPT1eIRVB3gW/JLgtg==, } peerDependencies: - payload: 3.18.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/richtext-lexical@3.18.0': + '@payloadcms/richtext-lexical@3.25.0': resolution: { - integrity: sha512-3BNPlTF4wTSfhZ7aGQyGMNc1bfpTwl1Zwt4ONl8AYrHk0Zs+hQvZkLLAhrrX076t0r7niYYVp7dihYalXmzcaQ==, + integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==, } engines: { node: ^18.20.2 || >=20.9.0 } peerDependencies: '@faceless-ui/modal': 3.0.0-beta.2 - '@faceless-ui/scroll-info': 2.0.0-beta.0 - '@lexical/headless': 0.21.0 - '@lexical/html': 0.21.0 - '@lexical/link': 0.21.0 - '@lexical/list': 0.21.0 - '@lexical/mark': 0.21.0 - '@lexical/react': 0.21.0 - '@lexical/rich-text': 0.21.0 - '@lexical/selection': 0.21.0 - '@lexical/table': 0.21.0 - '@lexical/utils': 0.21.0 - '@payloadcms/next': 3.18.0 - lexical: 0.21.0 - payload: 3.18.0 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.18.0': + '@payloadcms/translations@3.25.0': resolution: { - integrity: sha512-ZPX3Gf5TSK+nNCtFYTMkQgt8zATSU8fflqzjSc7v64BBpNZoEug0OUtQqwDw4MjDQZZFJ7YuKT3lalDlZFUNxQ==, + integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==, } - '@payloadcms/ui@3.18.0': + '@payloadcms/ui@3.25.0': resolution: { - integrity: sha512-EXX72Q15kzIeCp8itSOu4NgFbVL039l3fDaKO9whPovRPjbgQz197P6WAolTzWCykESiO4eIuJwJIsmkfnqw8w==, + integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==, } engines: { node: ^18.20.2 || >=20.9.0 } peerDependencies: next: ^15.0.0 - payload: 3.18.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 @@ -1703,10 +1696,10 @@ packages: integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==, } - '@radix-ui/react-arrow@1.1.1': + '@radix-ui/react-arrow@1.1.2': resolution: { - integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==, + integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==, } peerDependencies: '@types/react': '*' @@ -1719,10 +1712,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.3': + '@radix-ui/react-checkbox@1.1.4': resolution: { - integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==, + integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==, } peerDependencies: '@types/react': '*' @@ -1735,10 +1728,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.1': + '@radix-ui/react-collection@1.1.2': resolution: { - integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==, + integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==, } peerDependencies: '@types/react': '*' @@ -1787,10 +1780,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.3': + '@radix-ui/react-dismissable-layer@1.1.5': resolution: { - integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==, + integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==, } peerDependencies: '@types/react': '*' @@ -1815,10 +1808,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.1': + '@radix-ui/react-focus-scope@1.1.2': resolution: { - integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==, + integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==, } peerDependencies: '@types/react': '*' @@ -1843,10 +1836,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.1': + '@radix-ui/react-label@2.1.2': resolution: { - integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==, + integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==, } peerDependencies: '@types/react': '*' @@ -1859,10 +1852,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.1': + '@radix-ui/react-popper@1.2.2': resolution: { - integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==, + integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==, } peerDependencies: '@types/react': '*' @@ -1875,10 +1868,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.3': + '@radix-ui/react-portal@1.1.4': resolution: { - integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==, + integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==, } peerDependencies: '@types/react': '*' @@ -1907,10 +1900,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.1': + '@radix-ui/react-primitive@2.0.2': resolution: { - integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==, + integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==, } peerDependencies: '@types/react': '*' @@ -1923,10 +1916,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.4': + '@radix-ui/react-select@2.1.6': resolution: { - integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==, + integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==, } peerDependencies: '@types/react': '*' @@ -1939,10 +1932,10 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.1.1': + '@radix-ui/react-slot@1.1.2': resolution: { - integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==, + integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==, } peerDependencies: '@types/react': '*' @@ -2035,10 +2028,10 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.1.1': + '@radix-ui/react-visually-hidden@1.1.2': resolution: { - integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==, + integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==, } peerDependencies: '@types/react': '*' @@ -2097,10 +2090,10 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/core@3.1.1': + '@smithy/core@3.1.5': resolution: { - integrity: sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw==, + integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==, } engines: { node: '>=18.0.0' } @@ -2209,24 +2202,24 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/middleware-endpoint@4.0.2': + '@smithy/middleware-endpoint@4.0.6': resolution: { - integrity: sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g==, + integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==, } engines: { node: '>=18.0.0' } - '@smithy/middleware-retry@4.0.3': + '@smithy/middleware-retry@4.0.7': resolution: { - integrity: sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA==, + integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==, } engines: { node: '>=18.0.0' } - '@smithy/middleware-serde@4.0.1': + '@smithy/middleware-serde@4.0.2': resolution: { - integrity: sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA==, + integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==, } engines: { node: '>=18.0.0' } @@ -2244,10 +2237,10 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/node-http-handler@4.0.2': + '@smithy/node-http-handler@4.0.3': resolution: { - integrity: sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==, + integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==, } engines: { node: '>=18.0.0' } @@ -2300,10 +2293,10 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/smithy-client@4.1.2': + '@smithy/smithy-client@4.1.6': resolution: { - integrity: sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==, + integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==, } engines: { node: '>=18.0.0' } @@ -2363,17 +2356,17 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/util-defaults-mode-browser@4.0.3': + '@smithy/util-defaults-mode-browser@4.0.7': resolution: { - integrity: sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g==, + integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==, } engines: { node: '>=18.0.0' } - '@smithy/util-defaults-mode-node@4.0.3': + '@smithy/util-defaults-mode-node@4.0.7': resolution: { - integrity: sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ==, + integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==, } engines: { node: '>=18.0.0' } @@ -2405,10 +2398,10 @@ packages: } engines: { node: '>=18.0.0' } - '@smithy/util-stream@4.0.2': + '@smithy/util-stream@4.1.2': resolution: { - integrity: sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==, + integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==, } engines: { node: '>=18.0.0' } @@ -2520,10 +2513,10 @@ packages: integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, } - '@types/lodash@4.17.14': + '@types/lodash@4.17.16': resolution: { - integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==, + integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==, } '@types/mdast@4.0.4': @@ -2556,10 +2549,10 @@ packages: integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==, } - '@types/react-dom@19.0.3': + '@types/react-dom@19.0.4': resolution: { - integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==, + integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==, } peerDependencies: '@types/react': ^19.0.0 @@ -2572,10 +2565,10 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@19.0.7': + '@types/react@19.0.10': resolution: { - integrity: sha512-MoFsEJKkAtZCrC1r6CM8U22GzhG7u2Wir8ons/aCKH6MBdD1ibV24zOSSkdZVUKqN5i396zG5VKLYZ3yaUZdLA==, + integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==, } '@types/unist@2.0.11': @@ -2608,10 +2601,10 @@ packages: integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==, } - '@typescript-eslint/eslint-plugin@8.20.0': + '@typescript-eslint/eslint-plugin@8.25.0': resolution: { - integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==, + integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: @@ -2619,63 +2612,63 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.20.0': + '@typescript-eslint/parser@8.25.0': resolution: { - integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==, + integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.20.0': + '@typescript-eslint/scope-manager@8.25.0': resolution: { - integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==, + integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/type-utils@8.20.0': + '@typescript-eslint/type-utils@8.25.0': resolution: { - integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==, + integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.20.0': + '@typescript-eslint/types@8.25.0': resolution: { - integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==, + integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - '@typescript-eslint/typescript-estree@8.20.0': + '@typescript-eslint/typescript-estree@8.25.0': resolution: { - integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==, + integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.20.0': + '@typescript-eslint/utils@8.25.0': resolution: { - integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==, + integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.20.0': + '@typescript-eslint/visitor-keys@8.25.0': resolution: { - integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==, + integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } @@ -2850,6 +2843,13 @@ packages: integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, } + async-function@1.0.0: + resolution: + { + integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, + } + engines: { node: '>= 0.4' } + atomic-sleep@1.0.0: resolution: { @@ -2920,12 +2920,12 @@ packages: } engines: { bare: '>=1.7.0' } - bare-os@3.4.0: + bare-os@3.5.1: resolution: { - integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==, + integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==, } - engines: { bare: '>=1.6.0' } + engines: { bare: '>=1.14.0' } bare-path@3.0.0: resolution: @@ -2933,10 +2933,10 @@ packages: integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==, } - bare-stream@2.6.4: + bare-stream@2.6.5: resolution: { - integrity: sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==, + integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==, } peerDependencies: bare-buffer: '*' @@ -3011,10 +3011,10 @@ packages: integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==, } - bson@6.10.1: + bson@6.10.3: resolution: { - integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==, + integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==, } engines: { node: '>=16.20.1' } @@ -3043,10 +3043,10 @@ packages: } engines: { node: '>=10.16.0' } - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: resolution: { - integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==, + integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, } engines: { node: '>= 0.4' } @@ -3078,10 +3078,10 @@ packages: } engines: { node: '>= 6' } - caniuse-lite@1.0.30001692: + caniuse-lite@1.0.30001701: resolution: { - integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==, + integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==, } ccount@2.0.1: @@ -3501,10 +3501,10 @@ packages: integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, } - electron-to-chromium@1.5.83: + electron-to-chromium@1.5.109: resolution: { - integrity: sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==, + integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==, } emoji-regex@8.0.0: @@ -3525,10 +3525,10 @@ packages: integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, } - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: resolution: { - integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==, + integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, } engines: { node: '>=10.13.0' } @@ -3580,11 +3580,12 @@ packages: } engines: { node: '>= 0.4' } - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: resolution: { - integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, + integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, } + engines: { node: '>= 0.4' } es-to-primitive@1.3.0: resolution: @@ -3621,10 +3622,10 @@ packages: } engines: { node: '>=10' } - eslint-config-next@15.1.5: + eslint-config-next@15.2.0: resolution: { - integrity: sha512-Awm7iUJY8toOR+fU8yTxZnA7/LyOGUGOd6cENCuDfJ3gucHOSmLdOSGJ4u+nlrs8p5qXemua42bZmq+uOzxl6Q==, + integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==, } peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 @@ -3639,10 +3640,10 @@ packages: integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, } - eslint-import-resolver-typescript@3.7.0: + eslint-import-resolver-typescript@3.8.3: resolution: { - integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==, + integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==, } engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: @@ -3701,10 +3702,10 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: + eslint-plugin-react-hooks@5.2.0: resolution: { - integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==, + integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==, } engines: { node: '>=10' } peerDependencies: @@ -3740,10 +3741,10 @@ packages: } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } - eslint@9.18.0: + eslint@9.21.0: resolution: { - integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==, + integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==, } engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true @@ -3877,10 +3878,10 @@ packages: integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, } - fast-uri@3.0.5: + fast-uri@3.0.6: resolution: { - integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==, + integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, } fast-xml-parser@4.4.1: @@ -3890,10 +3891,10 @@ packages: } hasBin: true - fastq@1.18.0: + fastq@1.19.1: resolution: { - integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==, + integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, } fdir@6.4.3: @@ -3948,10 +3949,10 @@ packages: } engines: { node: '>=16' } - flatted@3.3.2: + flatted@3.3.3: resolution: { - integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==, + integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, } focus-trap@7.5.4: @@ -3960,16 +3961,17 @@ packages: integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==, } - for-each@0.3.3: + for-each@0.3.5: resolution: { - integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, } + engines: { node: '>= 0.4' } - foreground-child@3.3.0: + foreground-child@3.3.1: resolution: { - integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, } engines: { node: '>=14' } @@ -4033,10 +4035,10 @@ packages: } engines: { node: 6.* || 8.* || >= 10.* } - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: resolution: { - integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, + integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, } engines: { node: '>= 0.4' } @@ -4061,6 +4063,12 @@ packages: } engines: { node: '>= 0.4' } + get-tsconfig@4.10.0: + resolution: + { + integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, + } + get-tsconfig@4.8.1: resolution: { @@ -4266,10 +4274,10 @@ packages: integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, } - import-fresh@3.3.0: + import-fresh@3.3.1: resolution: { - integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, } engines: { node: '>=6' } @@ -4337,10 +4345,10 @@ packages: integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, } - is-async-function@2.1.0: + is-async-function@2.1.1: resolution: { - integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==, + integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, } engines: { node: '>= 0.4' } @@ -4358,10 +4366,10 @@ packages: } engines: { node: '>=8' } - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: resolution: { - integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==, + integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, } engines: { node: '>= 0.4' } @@ -4522,10 +4530,10 @@ packages: } engines: { node: '>= 0.4' } - is-weakref@1.1.0: + is-weakref@1.1.1: resolution: { - integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==, + integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, } engines: { node: '>= 0.4' } @@ -4878,10 +4886,10 @@ packages: } engines: { node: '>= 8' } - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: resolution: { - integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==, + integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, } micromark-extension-mdx-jsx@3.0.1: @@ -4998,10 +5006,10 @@ packages: integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, } - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: resolution: { - integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==, + integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, } micromark-util-symbol@2.0.1: @@ -5010,16 +5018,16 @@ packages: integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, } - micromark-util-types@2.0.1: + micromark-util-types@2.0.2: resolution: { - integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==, + integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, } - micromark@4.0.1: + micromark@4.0.2: resolution: { - integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==, + integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, } micromatch@4.0.8: @@ -5173,10 +5181,10 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - napi-build-utils@1.0.2: + napi-build-utils@2.0.0: resolution: { - integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, + integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, } natural-compare@1.4.0: @@ -5195,10 +5203,10 @@ packages: peerDependencies: next: '*' - next@15.1.5: + next@15.2.0: resolution: { - integrity: sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==, + integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==, } engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } hasBin: true @@ -5219,10 +5227,10 @@ packages: sass: optional: true - node-abi@3.73.0: + node-abi@3.74.0: resolution: { - integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==, + integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==, } engines: { node: '>=10' } @@ -5291,10 +5299,10 @@ packages: } engines: { node: '>= 6' } - object-inspect@1.13.3: + object-inspect@1.13.4: resolution: { - integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==, + integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, } engines: { node: '>= 0.4' } @@ -5469,20 +5477,20 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - payload@3.18.0: + payload@3.25.0: resolution: { - integrity: sha512-Wwa/DQ6IoQ7DGgQb6/IRkm85kGXX/DYKABaPLlDYRkY44UaHndt2pzUfiSBR9J9QSWsLOk5jBGdDSP4nPT3E5w==, + integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==, } engines: { node: ^18.20.2 || >=20.9.0 } hasBin: true peerDependencies: graphql: ^16.8.1 - peek-readable@5.3.1: + peek-readable@5.4.2: resolution: { - integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==, + integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==, } engines: { node: '>=14.16' } @@ -5553,10 +5561,10 @@ packages: } engines: { node: '>=4' } - possible-typed-array-names@1.0.0: + possible-typed-array-names@1.1.0: resolution: { - integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, } engines: { node: '>= 0.4' } @@ -5629,17 +5637,17 @@ packages: } engines: { node: ^10 || ^12 || >=14 } - postcss@8.5.1: + postcss@8.5.3: resolution: { - integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==, + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, } engines: { node: ^10 || ^12 || >=14 } - prebuild-install@7.1.2: + prebuild-install@7.1.3: resolution: { - integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==, + integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==, } engines: { node: '>=10' } hasBin: true @@ -5651,10 +5659,10 @@ packages: } engines: { node: '>= 0.8.0' } - prettier@3.4.2: + prettier@3.5.3: resolution: { - integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==, + integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, } engines: { node: '>=14' } hasBin: true @@ -5725,12 +5733,6 @@ packages: integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - queue-tick@1.0.1: - resolution: - { - integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, - } - queue@6.0.2: resolution: { @@ -5759,15 +5761,15 @@ packages: react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-diff-viewer-continued@3.2.6: + react-diff-viewer-continued@4.0.4: resolution: { - integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==, + integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==, } - engines: { node: '>= 8' } + engines: { node: '>= 16' } peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: @@ -5830,10 +5832,10 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.2: + react-remove-scroll@2.6.3: resolution: { - integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==, + integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==, } engines: { node: '>=10' } peerDependencies: @@ -5982,10 +5984,10 @@ packages: } hasBin: true - reusify@1.0.4: + reusify@1.1.0: resolution: { - integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, } engines: { iojs: '>=1.0.0', node: '>=0.10.0' } @@ -6074,10 +6076,10 @@ packages: } hasBin: true - semver@7.6.3: + semver@7.7.1: resolution: { - integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, } engines: { node: '>=10' } hasBin: true @@ -6208,10 +6210,10 @@ packages: integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==, } - sonner@1.7.2: + sonner@1.7.4: resolution: { - integrity: sha512-zMbseqjrOzQD1a93lxahm+qMGxWovdMxBlkTbbnZdNqVLt4j+amF9PQxUCL32WfztOFt9t9ADYkejAL3jF9iNA==, + integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==, } peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -6269,10 +6271,10 @@ packages: } engines: { node: '>=10.0.0' } - streamx@2.21.1: + streamx@2.22.0: resolution: { - integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==, + integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==, } string-width@4.2.3: @@ -6389,10 +6391,10 @@ packages: } engines: { node: '>=8' } - strnum@1.0.5: + strnum@1.1.2: resolution: { - integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, + integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==, } strtok3@8.1.0: @@ -6537,10 +6539,10 @@ packages: integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, } - tinyglobby@0.2.10: + tinyglobby@0.2.12: resolution: { - integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==, + integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, } engines: { node: '>=12.0.0' } @@ -6577,10 +6579,10 @@ packages: integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==, } - ts-api-utils@2.0.0: + ts-api-utils@2.0.1: resolution: { - integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==, + integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==, } engines: { node: '>=18.12' } peerDependencies: @@ -6741,10 +6743,10 @@ packages: } engines: { node: '>=8' } - update-browserslist-db@1.1.2: + update-browserslist-db@1.1.3: resolution: { - integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==, + integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, } hasBin: true peerDependencies: @@ -6848,10 +6850,10 @@ packages: } engines: { node: '>=12' } - whatwg-url@14.1.0: + whatwg-url@14.1.1: resolution: { - integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==, + integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==, } engines: { node: '>=18' } @@ -6924,10 +6926,10 @@ packages: integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } - ws@8.18.0: + ws@8.18.1: resolution: { - integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==, + integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==, } engines: { node: '>=10.0.0' } peerDependencies: @@ -7013,7 +7015,7 @@ packages: snapshots: '@alloc/quick-lru@5.2.0': {} - '@apidevtools/json-schema-ref-parser@11.7.3': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -7022,20 +7024,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7045,7 +7047,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7053,13 +7055,13 @@ snapshots: '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -7068,52 +7070,52 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.731.1': + '@aws-sdk/client-cognito-identity@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7122,32 +7124,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.731.1': + '@aws-sdk/client-s3@3.758.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/middleware-bucket-endpoint': 3.731.0 - '@aws-sdk/middleware-expect-continue': 3.731.0 - '@aws-sdk/middleware-flexible-checksums': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-location-constraint': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-sdk-s3': 3.731.0 - '@aws-sdk/middleware-ssec': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/signature-v4-multi-region': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 - '@aws-sdk/xml-builder': 3.723.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-bucket-endpoint': 3.734.0 + '@aws-sdk/middleware-expect-continue': 3.734.0 + '@aws-sdk/middleware-flexible-checksums': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-location-constraint': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/middleware-ssec': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/signature-v4-multi-region': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/xml-builder': 3.734.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/eventstream-serde-browser': 4.0.1 '@smithy/eventstream-serde-config-resolver': 4.0.1 '@smithy/eventstream-serde-node': 4.0.1 @@ -7158,66 +7160,66 @@ snapshots: '@smithy/invalid-dependency': 4.0.1 '@smithy/md5-js': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 '@smithy/util-waiter': 4.0.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.731.0': + '@aws-sdk/client-sso@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7226,61 +7228,61 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.731.0': + '@aws-sdk/core@3.758.0': dependencies: - '@aws-sdk/types': 3.731.0 - '@smithy/core': 3.1.1 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.731.1': + '@aws-sdk/credential-provider-cognito-identity@3.758.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.731.0': + '@aws-sdk/credential-provider-env@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.731.0': + '@aws-sdk/credential-provider-http@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.731.1': + '@aws-sdk/credential-provider-ini@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -7289,15 +7291,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.731.1': + '@aws-sdk/credential-provider-node@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-ini': 3.731.1 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -7306,21 +7308,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.731.0': + '@aws-sdk/credential-provider-process@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.731.1': + '@aws-sdk/credential-provider-sso@3.758.0': dependencies: - '@aws-sdk/client-sso': 3.731.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/token-providers': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-sso': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/token-providers': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -7328,31 +7330,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.731.1': + '@aws-sdk/credential-provider-web-identity@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.731.1': + '@aws-sdk/credential-providers@3.758.0': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/credential-provider-cognito-identity': 3.731.1 - '@aws-sdk/credential-provider-env': 3.731.0 - '@aws-sdk/credential-provider-http': 3.731.0 - '@aws-sdk/credential-provider-ini': 3.731.1 - '@aws-sdk/credential-provider-node': 3.731.1 - '@aws-sdk/credential-provider-process': 3.731.0 - '@aws-sdk/credential-provider-sso': 3.731.1 - '@aws-sdk/credential-provider-web-identity': 3.731.1 - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-cognito-identity': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 @@ -7360,20 +7363,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/lib-storage@3.731.1(@aws-sdk/client-s3@3.731.1)': + '@aws-sdk/lib-storage@3.758.0(@aws-sdk/client-s3@3.758.0)': dependencies: - '@aws-sdk/client-s3': 3.731.1 + '@aws-sdk/client-s3': 3.758.0 '@smithy/abort-controller': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/smithy-client': 4.1.2 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/smithy-client': 4.1.6 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.731.0': + '@aws-sdk/middleware-bucket-endpoint@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-arn-parser': 3.723.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -7381,123 +7384,123 @@ snapshots: '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.731.0': + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.731.0': + '@aws-sdk/middleware-flexible-checksums@3.758.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/is-array-buffer': 4.0.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.731.0': + '@aws-sdk/middleware-host-header@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.731.0': + '@aws-sdk/middleware-location-constraint@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.731.0': + '@aws-sdk/middleware-logger@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.731.0': + '@aws-sdk/middleware-recursion-detection@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.731.0': + '@aws-sdk/middleware-sdk-s3@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-arn-parser': 3.723.0 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.731.0': + '@aws-sdk/middleware-ssec@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.731.0': + '@aws-sdk/middleware-user-agent@3.758.0': dependencies: - '@aws-sdk/core': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@smithy/core': 3.1.1 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@smithy/core': 3.1.5 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.731.1': + '@aws-sdk/nested-clients@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.731.0 - '@aws-sdk/middleware-host-header': 3.731.0 - '@aws-sdk/middleware-logger': 3.731.0 - '@aws-sdk/middleware-recursion-detection': 3.731.0 - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/region-config-resolver': 3.731.0 - '@aws-sdk/types': 3.731.0 - '@aws-sdk/util-endpoints': 3.731.0 - '@aws-sdk/util-user-agent-browser': 3.731.0 - '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.1 + '@smithy/core': 3.1.5 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.2 - '@smithy/middleware-retry': 4.0.3 - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.3 - '@smithy/util-defaults-mode-node': 4.0.3 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7506,28 +7509,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.731.0': + '@aws-sdk/region-config-resolver@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.731.0': + '@aws-sdk/signature-v4-multi-region@3.758.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.731.1': + '@aws-sdk/token-providers@3.758.0': dependencies: - '@aws-sdk/nested-clients': 3.731.1 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -7535,7 +7538,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.731.0': + '@aws-sdk/types@3.734.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7544,9 +7547,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.731.0': + '@aws-sdk/util-endpoints@3.743.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 @@ -7555,17 +7558,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.731.0': + '@aws-sdk/util-user-agent-browser@3.734.0': dependencies: - '@aws-sdk/types': 3.731.0 + '@aws-sdk/types': 3.734.0 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.731.0': + '@aws-sdk/util-user-agent-node@3.758.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.731.0 - '@aws-sdk/types': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/types': 3.734.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7574,7 +7577,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.723.0': + '@aws-sdk/xml-builder@3.734.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7585,18 +7588,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.5': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -7604,39 +7607,41 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.5': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.5 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.26.5': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.5': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@corex/deepmerge@4.0.43': {} + '@date-fns/tz@1.2.0': {} + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -7670,7 +7675,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -7705,9 +7710,9 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.14.0(@types/react@19.0.7)(react@19.0.0)': + '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -7717,7 +7722,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 transitivePeerDependencies: - supports-color @@ -7813,46 +7818,46 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.18.0': {} + '@eslint/js@9.21.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -7863,12 +7868,12 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -7888,7 +7893,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.9 @@ -7909,7 +7914,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -8165,52 +8170,51 @@ snapshots: lexical: 0.21.0 yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 '@next/env@13.5.8': {} - '@next/env@15.1.5': {} + '@next/env@15.2.0': {} - '@next/eslint-plugin-next@15.1.5': + '@next/eslint-plugin-next@15.2.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.5': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.5': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.5': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.5': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.5': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.5': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.5': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.5': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -8223,16 +8227,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@payloadcms/db-mongodb@3.18.0(@aws-sdk/credential-providers@3.731.1)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/db-mongodb@3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - mongoose: 8.9.5(@aws-sdk/credential-providers@3.731.1) + mongoose: 8.9.5(@aws-sdk/credential-providers@3.758.0) mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -8245,49 +8249,49 @@ snapshots: - socks - supports-color - '@payloadcms/email-nodemailer@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/email-nodemailer@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: nodemailer: 6.9.16 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/graphql@3.18.0(graphql@16.10.0)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/live-preview-react@3.18.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@payloadcms/live-preview-react@3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@payloadcms/live-preview': 3.18.0 + '@payloadcms/live-preview': 3.25.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@payloadcms/live-preview@3.18.0': {} + '@payloadcms/live-preview@3.25.0': {} - '@payloadcms/next@3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.18.0(graphql@16.10.0)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3) - '@payloadcms/translations': 3.18.0 - '@payloadcms/ui': 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 graphql: 16.10.0 graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 http-status: 2.1.0 - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -8297,25 +8301,25 @@ snapshots: - supports-color - typescript - '@payloadcms/payload-cloud@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/payload-cloud@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - '@aws-sdk/client-cognito-identity': 3.731.1 - '@aws-sdk/client-s3': 3.731.1 - '@aws-sdk/credential-providers': 3.731.1 - '@aws-sdk/lib-storage': 3.731.1(@aws-sdk/client-s3@3.731.1) - '@payloadcms/email-nodemailer': 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/client-s3': 3.758.0 + '@aws-sdk/credential-providers': 3.758.0 + '@aws-sdk/lib-storage': 3.758.0(@aws-sdk/client-s3@3.758.0) + '@payloadcms/email-nodemailer': 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) amazon-cognito-identity-js: 6.3.12 nodemailer: 6.9.16 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) transitivePeerDependencies: - aws-crt - encoding - '@payloadcms/plugin-form-builder@3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-form-builder@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/ui': 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) escape-html: 1.0.3 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8325,19 +8329,19 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-nested-docs@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/plugin-nested-docs@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-redirects@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': + '@payloadcms/plugin-redirects@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-search@3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-search@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/next': 3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/ui': 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/next': 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8348,11 +8352,11 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-seo@3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-seo@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/translations': 3.18.0 - '@payloadcms/ui': 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8362,10 +8366,10 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.18.0(fp4jklecwhxtrwiifv76pyxpuu)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@lexical/headless': 0.21.0 '@lexical/html': 0.21.0 '@lexical/link': 0.21.0 @@ -8376,9 +8380,9 @@ snapshots: '@lexical/selection': 0.21.0 '@lexical/table': 0.21.0 '@lexical/utils': 0.21.0 - '@payloadcms/next': 3.18.0(@types/react@19.0.7)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/translations': 3.18.0 - '@payloadcms/ui': 3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/next': 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 @@ -8389,7 +8393,7 @@ snapshots: mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 4.1.2(react@19.0.0) @@ -8401,36 +8405,37 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.18.0': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.18.0(@types/react@19.0.7)(monaco-editor@0.52.2)(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/ui@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.18.0 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 react: 19.0.0 react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) - react-select: 5.9.0(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-select: 5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 @@ -8447,244 +8452,244 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-context@1.1.1(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-context@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-direction@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-direction@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-id@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-id@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/rect': 1.1.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-context': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-direction': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-id': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.7)(react@19.0.0) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.2(@types/react@19.0.7)(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-slot@1.1.1(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.0 react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-use-size@1.1.0(@types/react@19.0.7)(react@19.0.0)': + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.7)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 - '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@types/react': 19.0.10 + '@types/react-dom': 19.0.4(@types/react@19.0.10) '@radix-ui/rect@1.1.0': {} @@ -8714,14 +8719,14 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@3.1.1': + '@smithy/core@3.1.5': dependencies: - '@smithy/middleware-serde': 4.0.1 + '@smithy/middleware-serde': 4.0.2 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 @@ -8816,10 +8821,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.0.2': + '@smithy/middleware-endpoint@4.0.6': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-serde': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/middleware-serde': 4.0.2 '@smithy/node-config-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -8827,19 +8832,19 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.0.3': + '@smithy/middleware-retry@4.0.7': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/service-error-classification': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.1': + '@smithy/middleware-serde@4.0.2': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -8856,7 +8861,7 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.2': + '@smithy/node-http-handler@4.0.3': dependencies: '@smithy/abort-controller': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -8905,14 +8910,14 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.1.2': + '@smithy/smithy-client@4.1.6': dependencies: - '@smithy/core': 3.1.1 - '@smithy/middleware-endpoint': 4.0.2 + '@smithy/core': 3.1.5 + '@smithy/middleware-endpoint': 4.0.6 '@smithy/middleware-stack': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.0.2 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 '@smithy/types@4.1.0': @@ -8953,21 +8958,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.3': + '@smithy/util-defaults-mode-browser@4.0.7': dependencies: '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.3': + '@smithy/util-defaults-mode-node@4.0.7': dependencies: '@smithy/config-resolver': 4.0.1 '@smithy/credential-provider-imds': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.2 + '@smithy/smithy-client': 4.1.6 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -8992,10 +8997,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-stream@4.0.2': + '@smithy/util-stream@4.1.2': dependencies: '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.2 + '@smithy/node-http-handler': 4.0.3 '@smithy/types': 4.1.0 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 @@ -9067,7 +9072,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.14': {} + '@types/lodash@4.17.16': {} '@types/mdast@4.0.4': dependencies: @@ -9083,15 +9088,15 @@ snapshots: '@types/prismjs@1.26.5': {} - '@types/react-dom@19.0.3(@types/react@19.0.7)': + '@types/react-dom@19.0.4(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@types/react-transition-group@4.4.12(@types/react@19.0.7)': + '@types/react-transition-group@4.4.12(@types/react@19.0.10)': dependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - '@types/react@19.0.7': + '@types/react@19.0.10': dependencies: csstype: 3.1.3 @@ -9107,81 +9112,81 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.20.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.18.0(jiti@1.21.7) - ts-api-utils: 2.0.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.20.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.20.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 acorn-jsx@5.3.2(acorn@8.14.0): @@ -9202,7 +9207,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.5 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9254,7 +9259,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -9264,7 +9269,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: @@ -9273,21 +9278,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: @@ -9295,7 +9300,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -9304,26 +9309,28 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} + async-function@1.0.0: {} + atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.5.1): + autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001692 + caniuse-lite: 1.0.30001701 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} @@ -9333,7 +9340,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -9346,22 +9353,22 @@ snapshots: dependencies: bare-events: 2.5.4 bare-path: 3.0.0 - bare-stream: 2.6.4(bare-events@2.5.4) + bare-stream: 2.6.5(bare-events@2.5.4) transitivePeerDependencies: - bare-buffer optional: true - bare-os@3.4.0: + bare-os@3.5.1: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.4.0 + bare-os: 3.5.1 optional: true - bare-stream@2.6.4(bare-events@2.5.4): + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.21.1 + streamx: 2.22.0 optionalDependencies: bare-events: 2.5.4 optional: true @@ -9395,14 +9402,14 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001692 - electron-to-chromium: 1.5.83 + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.109 node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.24.4) bson-objectid@2.0.4: {} - bson@6.10.1: {} + bson@6.10.3: {} buffer@4.9.2: dependencies: @@ -9424,28 +9431,28 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001692: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -9541,7 +9548,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -9650,18 +9657,18 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 csstype: 3.1.3 dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.83: {} + electron-to-chromium@1.5.109: {} emoji-regex@8.0.0: {} @@ -9671,7 +9678,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -9696,7 +9703,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -9713,9 +9720,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.0 + is-weakref: 1.1.1 math-intrinsics: 1.1.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -9747,7 +9754,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9764,11 +9771,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -9811,19 +9818,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.5(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): + eslint-config-next@15.2.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): dependencies: - '@next/eslint-plugin-next': 15.1.5 + '@next/eslint-plugin-next': 15.2.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-react: 7.37.4(eslint@9.18.0(jiti@1.21.7)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0(jiti@1.21.7)) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -9839,34 +9846,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.0 - eslint: 9.18.0(jiti@1.21.7) - fast-glob: 3.3.3 - get-tsconfig: 4.8.1 + enhanced-resolve: 5.18.1 + eslint: 9.21.0(jiti@1.21.7) + get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.18.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9875,9 +9881,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -9889,13 +9895,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -9905,7 +9911,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9914,11 +9920,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react@7.37.4(eslint@9.18.0(jiti@1.21.7)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -9926,7 +9932,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.18.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -9949,18 +9955,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.18.0(jiti@1.21.7): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.18.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -10051,15 +10057,15 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.5: {} + fast-uri@3.0.6: {} fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -10088,20 +10094,20 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -10128,15 +10134,15 @@ snapshots: functions-have-names@1.2.3: {} - geist@1.3.1(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + geist@1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) get-caller-file@2.0.5: {} - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -10158,7 +10164,11 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -10176,7 +10186,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -10262,7 +10272,7 @@ snapshots: immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -10295,14 +10305,15 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.1.0: + is-async-function@2.1.1: dependencies: + async-function: 1.0.0 call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 @@ -10316,7 +10327,7 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -10325,7 +10336,7 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} @@ -10336,7 +10347,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -10406,14 +10417,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 isarray@0.0.1: {} @@ -10436,7 +10447,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -10469,15 +10480,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.3 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.14 + '@types/lodash': 4.17.16 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 + prettier: 3.5.3 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -10566,12 +10577,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -10620,7 +10631,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -10635,9 +10646,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -10650,21 +10661,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -10674,33 +10685,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -10710,12 +10721,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -10738,7 +10749,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -10749,7 +10760,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -10757,24 +10768,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -10784,9 +10795,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -10818,25 +10829,25 @@ snapshots: mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 14.1.0 + whatwg-url: 14.1.1 - mongodb@6.12.0(@aws-sdk/credential-providers@3.731.1): + mongodb@6.12.0(@aws-sdk/credential-providers@3.758.0): dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.731.1 + '@aws-sdk/credential-providers': 3.758.0 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.9.5(@aws-sdk/credential-providers@3.731.1): + mongoose@8.9.5(@aws-sdk/credential-providers@3.758.0): dependencies: - bson: 6.10.1 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.12.0(@aws-sdk/credential-providers@3.731.1) + mongodb: 6.12.0(@aws-sdk/credential-providers@3.758.0) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -10869,47 +10880,47 @@ snapshots: nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} - next-sitemap@4.2.3(next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + next-sitemap@4.2.3(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: '@corex/deepmerge': 4.0.43 '@next/env': 13.5.8 fast-glob: 3.3.3 minimist: 1.2.8 - next: 15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) - next@15.1.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.5 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001692 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.5 - '@next/swc-darwin-x64': 15.1.5 - '@next/swc-linux-arm64-gnu': 15.1.5 - '@next/swc-linux-arm64-musl': 15.1.5 - '@next/swc-linux-x64-gnu': 15.1.5 - '@next/swc-linux-x64-musl': 15.1.5 - '@next/swc-win32-arm64-msvc': 15.1.5 - '@next/swc-win32-x64-msvc': 15.1.5 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.73.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -10934,7 +10945,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -10992,7 +11003,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -11049,11 +11060,10 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): + payload@3.25.0(graphql@16.10.0)(typescript@5.7.3): dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.5 - '@payloadcms/translations': 3.18.0 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 @@ -11081,16 +11091,13 @@ snapshots: ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} picocolors@1.1.1: {} @@ -11140,30 +11147,30 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.1): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.1): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.1 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.1): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.3 - postcss-nested@6.2.0(postcss@8.5.1): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -11184,21 +11191,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.1: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.73.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -11207,7 +11214,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.4.2: {} + prettier@3.5.3: {} prism-react-renderer@2.4.1(react@19.0.0): dependencies: @@ -11243,8 +11250,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -11260,22 +11265,23 @@ snapshots: react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - supports-color react-dom@19.0.0(react@19.0.0): @@ -11285,12 +11291,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-hook-form@7.45.4(react@19.0.0): @@ -11303,53 +11309,53 @@ snapshots: react-is@16.13.1: {} - react-remove-scroll-bar@2.3.8(@types/react@19.0.7)(react@19.0.0): + react-remove-scroll-bar@2.3.8(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 - react-style-singleton: 2.2.3(@types/react@19.0.7)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - react-remove-scroll@2.6.2(@types/react@19.0.7)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.0.7)(react@19.0.0) - react-style-singleton: 2.2.3(@types/react@19.0.7)(react@19.0.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) + react-style-singleton: 2.2.3(@types/react@19.0.10)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.0.7)(react@19.0.0) - use-sidecar: 1.1.3(@types/react@19.0.7)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.0.10)(react@19.0.0) + use-sidecar: 1.1.3(@types/react@19.0.10)(react@19.0.0) optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - react-select@5.9.0(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-select@5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@19.0.7)(react@19.0.0) + '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) '@floating-ui/dom': 1.6.13 - '@types/react-transition-group': 4.4.12(@types/react@19.0.7) + '@types/react-transition-group': 4.4.12(@types/react@19.0.10) memoize-one: 6.0.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.7)(react@19.0.0) + use-isomorphic-layout-effect: 1.2.0(@types/react@19.0.10)(react@19.0.0) transitivePeerDependencies: - '@types/react' - supports-color - react-style-singleton@2.2.3(@types/react@19.0.7)(react@19.0.0): + react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0): dependencies: get-nonce: 1.0.1 react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -11398,7 +11404,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -11433,7 +11439,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: @@ -11443,7 +11449,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -11482,14 +11488,14 @@ snapshots: semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -11511,8 +11517,8 @@ snapshots: color: 4.2.3 detect-libc: 2.0.3 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 tar-fs: 3.0.8 tunnel-agent: 0.6.0 @@ -11523,7 +11529,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -11555,27 +11561,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.7 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -11604,7 +11610,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -11630,10 +11636,9 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.21.1: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: bare-events: 2.5.4 @@ -11664,7 +11669,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -11729,12 +11734,12 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -11783,11 +11788,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.1 - postcss-import: 15.1.0(postcss@8.5.1) - postcss-js: 4.0.1(postcss@8.5.1) - postcss-load-config: 4.0.2(postcss@8.5.1) - postcss-nested: 6.2.0(postcss@8.5.1) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -11825,7 +11830,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.22.0 text-decoder@1.2.3: dependencies: @@ -11848,7 +11853,7 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -11872,7 +11877,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -11917,7 +11922,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -11926,7 +11931,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -11935,10 +11940,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 typescript@5.7.3: {} @@ -11981,7 +11986,7 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.2(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: browserslist: 4.24.4 escalade: 3.2.0 @@ -11991,31 +11996,31 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.0.7)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0): dependencies: react: 19.0.0 scheduler: 0.25.0 - use-isomorphic-layout-effect@1.2.0(@types/react@19.0.7)(react@19.0.0): + use-isomorphic-layout-effect@1.2.0(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 - use-sidecar@1.1.3(@types/react@19.0.7)(react@19.0.0): + use-sidecar@1.1.3(@types/react@19.0.10)(react@19.0.0): dependencies: detect-node-es: 1.1.0 react: 19.0.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.0.7 + '@types/react': 19.0.10 utf8-byte-length@1.0.5: {} @@ -12034,7 +12039,7 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@14.1.0: + whatwg-url@14.1.1: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 @@ -12047,7 +12052,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -12057,12 +12062,12 @@ snapshots: call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.1.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -12080,7 +12085,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -12104,7 +12109,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: diff --git a/templates/website/src/blocks/Content/config.ts b/templates/website/src/blocks/Content/config.ts index db9bcdf554..5c2fb0771d 100644 --- a/templates/website/src/blocks/Content/config.ts +++ b/templates/website/src/blocks/Content/config.ts @@ -56,7 +56,7 @@ const columnFields: Field[] = [ overrides: { admin: { condition: (_data, siblingData) => { - return Boolean(siblingData?.enableLink); + return Boolean(siblingData?.enableLink) }, }, }, diff --git a/templates/website/src/blocks/Form/Component.tsx b/templates/website/src/blocks/Form/Component.tsx index e0a06eba16..b0b5d38cbc 100644 --- a/templates/website/src/blocks/Form/Component.tsx +++ b/templates/website/src/blocks/Form/Component.tsx @@ -32,7 +32,7 @@ export const FormBlock: React.FC< } = props const formMethods = useForm({ - defaultValues: formFromProps.fields as any, + defaultValues: formFromProps.fields, }) const { control, diff --git a/templates/website/src/endpoints/seed/index.ts b/templates/website/src/endpoints/seed/index.ts index d91c270d84..323dbd9589 100644 --- a/templates/website/src/endpoints/seed/index.ts +++ b/templates/website/src/endpoints/seed/index.ts @@ -95,16 +95,7 @@ export const seed = async ({ ), ]) - const [ - demoAuthor, - image1Doc, - image2Doc, - image3Doc, - imageHomeDoc, - technologyCategory, - newsCategory, - financeCategory, - ] = await Promise.all([ + const [demoAuthor, image1Doc, image2Doc, image3Doc, imageHomeDoc] = await Promise.all([ payload.create({ collection: 'users', data: { @@ -212,21 +203,6 @@ export const seed = async ({ }), ]) - let demoAuthorID: number | string = demoAuthor.id - - let image1ID: number | string = image1Doc.id - let image2ID: number | string = image2Doc.id - let image3ID: number | string = image3Doc.id - let imageHomeID: number | string = imageHomeDoc.id - - if (payload.db.defaultIDType === 'text') { - image1ID = `"${image1Doc.id}"` - image2ID = `"${image2Doc.id}"` - image3ID = `"${image3Doc.id}"` - imageHomeID = `"${imageHomeDoc.id}"` - demoAuthorID = `"${demoAuthorID}"` - } - payload.logger.info(`— Seeding posts...`) // Do not create posts with `Promise.all` because we want the posts to be created in order @@ -289,12 +265,6 @@ export const seed = async ({ data: contactFormData, }) - let contactFormID: number | string = contactForm.id - - if (payload.db.defaultIDType === 'text') { - contactFormID = `"${contactFormID}"` - } - payload.logger.info(`— Seeding pages...`) const [_, contactPage] = await Promise.all([ diff --git a/templates/website/src/fields/defaultLexical.ts b/templates/website/src/fields/defaultLexical.ts index c9215317fb..2468d6e976 100644 --- a/templates/website/src/fields/defaultLexical.ts +++ b/templates/website/src/fields/defaultLexical.ts @@ -1,4 +1,4 @@ -import { Config, type TextFieldSingleValidation } from 'payload' +import type { TextFieldSingleValidation } from 'payload' import { BoldFeature, ItalicFeature, @@ -9,41 +9,39 @@ import { type LinkFields, } from '@payloadcms/richtext-lexical' -export const defaultLexical: Config['editor'] = lexicalEditor({ - features: () => { - return [ - ParagraphFeature(), - UnderlineFeature(), - BoldFeature(), - ItalicFeature(), - LinkFeature({ - enabledCollections: ['pages', 'posts'], - fields: ({ defaultFields }) => { - const defaultFieldsWithoutUrl = defaultFields.filter((field) => { - if ('name' in field && field.name === 'url') return false - return true - }) +export const defaultLexical = lexicalEditor({ + features: [ + ParagraphFeature(), + UnderlineFeature(), + BoldFeature(), + ItalicFeature(), + LinkFeature({ + enabledCollections: ['pages', 'posts'], + fields: ({ defaultFields }) => { + const defaultFieldsWithoutUrl = defaultFields.filter((field) => { + if ('name' in field && field.name === 'url') return false + return true + }) - return [ - ...defaultFieldsWithoutUrl, - { - name: 'url', - type: 'text', - admin: { - condition: (_data, siblingData) => siblingData?.linkType !== 'internal', - }, - label: ({ t }) => t('fields:enterURL'), - required: true, - validate: ((value, options) => { - if ((options?.siblingData as LinkFields)?.linkType === 'internal') { - return true // no validation needed, as no url should exist for internal links - } - return value ? true : 'URL is required' - }) as TextFieldSingleValidation, + return [ + ...defaultFieldsWithoutUrl, + { + name: 'url', + type: 'text', + admin: { + condition: (_data, siblingData) => siblingData?.linkType !== 'internal', }, - ] - }, - }), - ] - }, + label: ({ t }) => t('fields:enterURL'), + required: true, + validate: ((value, options) => { + if ((options?.siblingData as LinkFields)?.linkType === 'internal') { + return true // no validation needed, as no url should exist for internal links + } + return value ? true : 'URL is required' + }) as TextFieldSingleValidation, + }, + ] + }, + }), + ], }) diff --git a/templates/website/src/payload-types.ts b/templates/website/src/payload-types.ts index 7051d8f204..4814fe7713 100644 --- a/templates/website/src/payload-types.ts +++ b/templates/website/src/payload-types.ts @@ -6,10 +6,65 @@ * and re-run `payload generate:types` to regenerate this file. */ +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { pages: Page; posts: Post; @@ -1645,4 +1700,4 @@ export interface Auth { declare module 'payload' { export interface GeneratedTypes extends Config {} -} \ No newline at end of file +} diff --git a/templates/with-payload-cloud/package.json b/templates/with-payload-cloud/package.json index b593c468a0..e78ce84833 100644 --- a/templates/with-payload-cloud/package.json +++ b/templates/with-payload-cloud/package.json @@ -15,14 +15,14 @@ "start": "cross-env NODE_OPTIONS=--no-deprecation next start" }, "dependencies": { - "@payloadcms/db-mongodb": "3.9.0", - "@payloadcms/next": "3.9.0", - "@payloadcms/payload-cloud": "3.9.0", - "@payloadcms/richtext-lexical": "3.9.0", + "@payloadcms/db-mongodb": "3.25.0", + "@payloadcms/next": "3.25.0", + "@payloadcms/payload-cloud": "3.25.0", + "@payloadcms/richtext-lexical": "3.25.0", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", - "payload": "3.9.0", + "next": "15.2.0", + "payload": "3.25.0", "react": "19.0.0", "react-dom": "19.0.0", "sharp": "0.32.6" @@ -30,10 +30,10 @@ "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/with-postgres/package.json b/templates/with-postgres/package.json index 7ab08b9dd2..8743b602f7 100644 --- a/templates/with-postgres/package.json +++ b/templates/with-postgres/package.json @@ -6,35 +6,35 @@ "type": "module", "scripts": { "build": "cross-env NODE_OPTIONS=--no-deprecation next build", - "ci": "payload migrate && pnpm build", "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", "devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev", "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", "generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types", "lint": "cross-env NODE_OPTIONS=--no-deprecation next lint", "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", - "start": "cross-env NODE_OPTIONS=--no-deprecation next start" + "start": "cross-env NODE_OPTIONS=--no-deprecation next start", + "ci": "payload migrate && pnpm build" }, "dependencies": { - "@payloadcms/db-postgres": "latest", "@payloadcms/next": "latest", "@payloadcms/payload-cloud": "latest", "@payloadcms/richtext-lexical": "latest", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", + "next": "15.2.0", "payload": "latest", "react": "19.0.0", "react-dom": "19.0.0", - "sharp": "0.32.6" + "sharp": "0.32.6", + "@payloadcms/db-postgres": "latest" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/with-postgres/src/migrations/20250227_171503_initial.json b/templates/with-postgres/src/migrations/20250303_013923_initial.json similarity index 99% rename from templates/with-postgres/src/migrations/20250227_171503_initial.json rename to templates/with-postgres/src/migrations/20250303_013923_initial.json index 1961f415ec..eb06e9bca3 100644 --- a/templates/with-postgres/src/migrations/20250227_171503_initial.json +++ b/templates/with-postgres/src/migrations/20250303_013923_initial.json @@ -1,5 +1,5 @@ { - "id": "68ffc268-6144-4470-8258-65a7d4d4bac6", + "id": "4d0dd218-d96c-4cf1-9ccf-0fbc54bb2798", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-postgres/src/migrations/20250227_171503_initial.ts b/templates/with-postgres/src/migrations/20250303_013923_initial.ts similarity index 100% rename from templates/with-postgres/src/migrations/20250227_171503_initial.ts rename to templates/with-postgres/src/migrations/20250303_013923_initial.ts diff --git a/templates/with-postgres/src/migrations/index.ts b/templates/with-postgres/src/migrations/index.ts index 0812d53505..e4aaa18818 100644 --- a/templates/with-postgres/src/migrations/index.ts +++ b/templates/with-postgres/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250227_171503_initial from './20250227_171503_initial' +import * as migration_20250303_013923_initial from './20250303_013923_initial' export const migrations = [ { - up: migration_20250227_171503_initial.up, - down: migration_20250227_171503_initial.down, - name: '20250227_171503_initial', + up: migration_20250303_013923_initial.up, + down: migration_20250303_013923_initial.down, + name: '20250303_013923_initial', }, ] diff --git a/templates/with-vercel-mongodb/package.json b/templates/with-vercel-mongodb/package.json index 3d20eecd97..47d8d9cfa8 100644 --- a/templates/with-vercel-mongodb/package.json +++ b/templates/with-vercel-mongodb/package.json @@ -19,21 +19,21 @@ "@payloadcms/next": "latest", "@payloadcms/payload-cloud": "latest", "@payloadcms/richtext-lexical": "latest", - "@payloadcms/storage-vercel-blob": "latest", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", + "next": "15.2.0", "payload": "latest", "react": "19.0.0", - "react-dom": "19.0.0" + "react-dom": "19.0.0", + "@payloadcms/storage-vercel-blob": "latest" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/with-vercel-postgres/package.json b/templates/with-vercel-postgres/package.json index 96c4ad9935..8ede228754 100644 --- a/templates/with-vercel-postgres/package.json +++ b/templates/with-vercel-postgres/package.json @@ -6,35 +6,35 @@ "type": "module", "scripts": { "build": "cross-env NODE_OPTIONS=--no-deprecation next build", - "ci": "payload migrate && pnpm build", "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", "devsafe": "rm -rf .next && cross-env NODE_OPTIONS=--no-deprecation next dev", "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", "generate:types": "cross-env NODE_OPTIONS=--no-deprecation payload generate:types", "lint": "cross-env NODE_OPTIONS=--no-deprecation next lint", "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", - "start": "cross-env NODE_OPTIONS=--no-deprecation next start" + "start": "cross-env NODE_OPTIONS=--no-deprecation next start", + "ci": "payload migrate && pnpm build" }, "dependencies": { - "@payloadcms/db-vercel-postgres": "latest", "@payloadcms/next": "latest", "@payloadcms/payload-cloud": "latest", "@payloadcms/richtext-lexical": "latest", - "@payloadcms/storage-vercel-blob": "latest", "cross-env": "^7.0.3", "graphql": "^16.8.1", - "next": "15.1.5", + "next": "15.2.0", "payload": "latest", "react": "19.0.0", - "react-dom": "19.0.0" + "react-dom": "19.0.0", + "@payloadcms/db-vercel-postgres": "latest", + "@payloadcms/storage-vercel-blob": "latest" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@types/node": "^22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "prettier": "^3.4.2", "typescript": "5.7.3" }, diff --git a/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json b/templates/with-vercel-postgres/src/migrations/20250303_013913_initial.json similarity index 99% rename from templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json rename to templates/with-vercel-postgres/src/migrations/20250303_013913_initial.json index 1862003750..0f597adeb5 100644 --- a/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.json +++ b/templates/with-vercel-postgres/src/migrations/20250303_013913_initial.json @@ -1,5 +1,5 @@ { - "id": "9507702f-2302-45e9-ac4d-bd33b5d64a5a", + "id": "60ec4acc-9dd1-42f7-be06-3f5dd7ba95cc", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-vercel-postgres/src/migrations/20250227_171438_initial.ts b/templates/with-vercel-postgres/src/migrations/20250303_013913_initial.ts similarity index 100% rename from templates/with-vercel-postgres/src/migrations/20250227_171438_initial.ts rename to templates/with-vercel-postgres/src/migrations/20250303_013913_initial.ts diff --git a/templates/with-vercel-postgres/src/migrations/index.ts b/templates/with-vercel-postgres/src/migrations/index.ts index 67a93f7528..7bc1ad9c0f 100644 --- a/templates/with-vercel-postgres/src/migrations/index.ts +++ b/templates/with-vercel-postgres/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250227_171438_initial from './20250227_171438_initial' +import * as migration_20250303_013913_initial from './20250303_013913_initial' export const migrations = [ { - up: migration_20250227_171438_initial.up, - down: migration_20250227_171438_initial.down, - name: '20250227_171438_initial', + up: migration_20250303_013913_initial.up, + down: migration_20250303_013913_initial.down, + name: '20250303_013913_initial', }, ] diff --git a/templates/with-vercel-website/package.json b/templates/with-vercel-website/package.json index bfc9a6405f..cfcf8a683b 100644 --- a/templates/with-vercel-website/package.json +++ b/templates/with-vercel-website/package.json @@ -7,7 +7,6 @@ "scripts": { "build": "cross-env NODE_OPTIONS=--no-deprecation next build", "postbuild": "next-sitemap --config next-sitemap.config.cjs", - "ci": "payload migrate && pnpm build", "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", "dev:prod": "cross-env NODE_OPTIONS=--no-deprecation rm -rf .next && pnpm build && pnpm start", "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", @@ -17,10 +16,10 @@ "lint:fix": "cross-env NODE_OPTIONS=--no-deprecation next lint --fix", "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", "reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install", - "start": "cross-env NODE_OPTIONS=--no-deprecation next start" + "start": "cross-env NODE_OPTIONS=--no-deprecation next start", + "ci": "payload migrate && pnpm build" }, "dependencies": { - "@payloadcms/db-vercel-postgres": "latest", "@payloadcms/live-preview-react": "latest", "@payloadcms/next": "latest", "@payloadcms/payload-cloud": "latest", @@ -30,7 +29,6 @@ "@payloadcms/plugin-search": "latest", "@payloadcms/plugin-seo": "latest", "@payloadcms/richtext-lexical": "latest", - "@payloadcms/storage-vercel-blob": "latest", "@payloadcms/ui": "latest", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-label": "^2.0.2", @@ -42,29 +40,31 @@ "geist": "^1.3.0", "graphql": "^16.8.2", "lucide-react": "^0.378.0", - "next": "^15.1.5", + "next": "15.2.0", "next-sitemap": "^4.2.3", "payload": "latest", "payload-admin-bar": "^1.0.6", "prism-react-renderer": "^2.3.1", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "react": "19.0.0", + "react-dom": "19.0.0", "react-hook-form": "7.45.4", "sharp": "0.32.6", "tailwind-merge": "^2.3.0", - "tailwindcss-animate": "^1.0.7" + "tailwindcss-animate": "^1.0.7", + "@payloadcms/db-vercel-postgres": "latest", + "@payloadcms/storage-vercel-blob": "latest" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@tailwindcss/typography": "^0.5.13", "@types/escape-html": "^1.0.2", "@types/node": "22.5.4", - "@types/react": "19.0.7", - "@types/react-dom": "19.0.3", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", "autoprefixer": "^10.4.19", "copyfiles": "^2.4.1", "eslint": "^9.16.0", - "eslint-config-next": "15.1.5", + "eslint-config-next": "15.2.0", "postcss": "^8.4.38", "prettier": "^3.4.2", "tailwindcss": "^3.4.3", diff --git a/templates/with-vercel-website/src/blocks/Content/config.ts b/templates/with-vercel-website/src/blocks/Content/config.ts index 16a01e218c..5c2fb0771d 100644 --- a/templates/with-vercel-website/src/blocks/Content/config.ts +++ b/templates/with-vercel-website/src/blocks/Content/config.ts @@ -55,7 +55,9 @@ const columnFields: Field[] = [ link({ overrides: { admin: { - condition: (_, { enableLink }) => Boolean(enableLink), + condition: (_data, siblingData) => { + return Boolean(siblingData?.enableLink) + }, }, }, }), diff --git a/templates/with-vercel-website/src/blocks/Form/Component.tsx b/templates/with-vercel-website/src/blocks/Form/Component.tsx index e0a06eba16..b0b5d38cbc 100644 --- a/templates/with-vercel-website/src/blocks/Form/Component.tsx +++ b/templates/with-vercel-website/src/blocks/Form/Component.tsx @@ -32,7 +32,7 @@ export const FormBlock: React.FC< } = props const formMethods = useForm({ - defaultValues: formFromProps.fields as any, + defaultValues: formFromProps.fields, }) const { control, diff --git a/templates/with-vercel-website/src/endpoints/seed/index.ts b/templates/with-vercel-website/src/endpoints/seed/index.ts index d91c270d84..323dbd9589 100644 --- a/templates/with-vercel-website/src/endpoints/seed/index.ts +++ b/templates/with-vercel-website/src/endpoints/seed/index.ts @@ -95,16 +95,7 @@ export const seed = async ({ ), ]) - const [ - demoAuthor, - image1Doc, - image2Doc, - image3Doc, - imageHomeDoc, - technologyCategory, - newsCategory, - financeCategory, - ] = await Promise.all([ + const [demoAuthor, image1Doc, image2Doc, image3Doc, imageHomeDoc] = await Promise.all([ payload.create({ collection: 'users', data: { @@ -212,21 +203,6 @@ export const seed = async ({ }), ]) - let demoAuthorID: number | string = demoAuthor.id - - let image1ID: number | string = image1Doc.id - let image2ID: number | string = image2Doc.id - let image3ID: number | string = image3Doc.id - let imageHomeID: number | string = imageHomeDoc.id - - if (payload.db.defaultIDType === 'text') { - image1ID = `"${image1Doc.id}"` - image2ID = `"${image2Doc.id}"` - image3ID = `"${image3Doc.id}"` - imageHomeID = `"${imageHomeDoc.id}"` - demoAuthorID = `"${demoAuthorID}"` - } - payload.logger.info(`— Seeding posts...`) // Do not create posts with `Promise.all` because we want the posts to be created in order @@ -289,12 +265,6 @@ export const seed = async ({ data: contactFormData, }) - let contactFormID: number | string = contactForm.id - - if (payload.db.defaultIDType === 'text') { - contactFormID = `"${contactFormID}"` - } - payload.logger.info(`— Seeding pages...`) const [_, contactPage] = await Promise.all([ diff --git a/templates/with-vercel-website/src/fields/defaultLexical.ts b/templates/with-vercel-website/src/fields/defaultLexical.ts index c9215317fb..2468d6e976 100644 --- a/templates/with-vercel-website/src/fields/defaultLexical.ts +++ b/templates/with-vercel-website/src/fields/defaultLexical.ts @@ -1,4 +1,4 @@ -import { Config, type TextFieldSingleValidation } from 'payload' +import type { TextFieldSingleValidation } from 'payload' import { BoldFeature, ItalicFeature, @@ -9,41 +9,39 @@ import { type LinkFields, } from '@payloadcms/richtext-lexical' -export const defaultLexical: Config['editor'] = lexicalEditor({ - features: () => { - return [ - ParagraphFeature(), - UnderlineFeature(), - BoldFeature(), - ItalicFeature(), - LinkFeature({ - enabledCollections: ['pages', 'posts'], - fields: ({ defaultFields }) => { - const defaultFieldsWithoutUrl = defaultFields.filter((field) => { - if ('name' in field && field.name === 'url') return false - return true - }) +export const defaultLexical = lexicalEditor({ + features: [ + ParagraphFeature(), + UnderlineFeature(), + BoldFeature(), + ItalicFeature(), + LinkFeature({ + enabledCollections: ['pages', 'posts'], + fields: ({ defaultFields }) => { + const defaultFieldsWithoutUrl = defaultFields.filter((field) => { + if ('name' in field && field.name === 'url') return false + return true + }) - return [ - ...defaultFieldsWithoutUrl, - { - name: 'url', - type: 'text', - admin: { - condition: (_data, siblingData) => siblingData?.linkType !== 'internal', - }, - label: ({ t }) => t('fields:enterURL'), - required: true, - validate: ((value, options) => { - if ((options?.siblingData as LinkFields)?.linkType === 'internal') { - return true // no validation needed, as no url should exist for internal links - } - return value ? true : 'URL is required' - }) as TextFieldSingleValidation, + return [ + ...defaultFieldsWithoutUrl, + { + name: 'url', + type: 'text', + admin: { + condition: (_data, siblingData) => siblingData?.linkType !== 'internal', }, - ] - }, - }), - ] - }, + label: ({ t }) => t('fields:enterURL'), + required: true, + validate: ((value, options) => { + if ((options?.siblingData as LinkFields)?.linkType === 'internal') { + return true // no validation needed, as no url should exist for internal links + } + return value ? true : 'URL is required' + }) as TextFieldSingleValidation, + }, + ] + }, + }), + ], }) diff --git a/templates/with-vercel-website/src/migrations/20250227_171453_initial.json b/templates/with-vercel-website/src/migrations/20250303_013917_initial.json similarity index 99% rename from templates/with-vercel-website/src/migrations/20250227_171453_initial.json rename to templates/with-vercel-website/src/migrations/20250303_013917_initial.json index b06e70afc9..3330fef102 100644 --- a/templates/with-vercel-website/src/migrations/20250227_171453_initial.json +++ b/templates/with-vercel-website/src/migrations/20250303_013917_initial.json @@ -1,5 +1,5 @@ { - "id": "090f3356-1c23-4749-bf86-2191f58b85b4", + "id": "4013ab14-2e86-4a03-a7a7-5cc3f55915ac", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", diff --git a/templates/with-vercel-website/src/migrations/20250227_171453_initial.ts b/templates/with-vercel-website/src/migrations/20250303_013917_initial.ts similarity index 100% rename from templates/with-vercel-website/src/migrations/20250227_171453_initial.ts rename to templates/with-vercel-website/src/migrations/20250303_013917_initial.ts diff --git a/templates/with-vercel-website/src/migrations/index.ts b/templates/with-vercel-website/src/migrations/index.ts index dc6f1f047b..cf5b73d099 100644 --- a/templates/with-vercel-website/src/migrations/index.ts +++ b/templates/with-vercel-website/src/migrations/index.ts @@ -1,9 +1,9 @@ -import * as migration_20250227_171453_initial from './20250227_171453_initial' +import * as migration_20250303_013917_initial from './20250303_013917_initial' export const migrations = [ { - up: migration_20250227_171453_initial.up, - down: migration_20250227_171453_initial.down, - name: '20250227_171453_initial', + up: migration_20250303_013917_initial.up, + down: migration_20250303_013917_initial.down, + name: '20250303_013917_initial', }, ] From 192964417dbc774232f742b9c45ba0b6342a6c41 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 2 Mar 2025 21:05:25 -0700 Subject: [PATCH 070/127] chore: temporarily disables flaky "should execute a custom script" test (#11487) The newly added "should execute a custom script" int test is very flaky on mongodb - it was failing most of the time. This PR skips this test until it's fixed Example failures: - https://github.com/payloadcms/payload/actions/runs/13618762213/job/38065304540 - https://github.com/payloadcms/payload/actions/runs/13611742446/job/38049886588 - https://github.com/payloadcms/payload/actions/runs/13608918590/job/38043761182 - https://github.com/payloadcms/payload/actions/runs/13599001510/job/38021936623 --- test/config/int.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/config/int.spec.ts b/test/config/int.spec.ts index c3a843cc00..0b6b568878 100644 --- a/test/config/int.spec.ts +++ b/test/config/int.spec.ts @@ -129,7 +129,7 @@ describe('Config', () => { } } - it('should execute a custom script', () => { + it.skip('should execute a custom script', () => { deleteTestFile() executeCLI('start-server') expect(JSON.parse(readFileSync(testFilePath, 'utf-8')).docs).toHaveLength(1) From 6a3d58bb32a23f7092039d44d24c1460f1c6d2ff Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sun, 2 Mar 2025 22:32:57 -0700 Subject: [PATCH 071/127] feat(db-*): support limit in db.updateMany (#11488) This PR adds a new `limit` property to `payload.db.updateMany`. This functionality is required for [migrating our job system to use faster, direct db adapter calls](https://github.com/payloadcms/payload/pull/11489) --- packages/db-mongodb/src/updateMany.ts | 16 ++- packages/drizzle/src/updateMany.ts | 22 ++- packages/payload/src/database/types.ts | 1 + test/database/int.spec.ts | 177 +++++++++++++++++++++++++ 4 files changed, 209 insertions(+), 7 deletions(-) diff --git a/packages/db-mongodb/src/updateMany.ts b/packages/db-mongodb/src/updateMany.ts index a4ba3f7ac4..ceac20fa54 100644 --- a/packages/db-mongodb/src/updateMany.ts +++ b/packages/db-mongodb/src/updateMany.ts @@ -15,6 +15,7 @@ export const updateMany: UpdateMany = async function updateMany( { collection: collectionSlug, data, + limit, locale, options: optionsArgs = {}, req, @@ -37,7 +38,7 @@ export const updateMany: UpdateMany = async function updateMany( session: await getSession(this, req), } - const query = await buildQuery({ + let query = await buildQuery({ adapter: this, collectionSlug, fields: collectionConfig.flattenedFields, @@ -48,6 +49,19 @@ export const updateMany: UpdateMany = async function updateMany( transform({ adapter: this, data, fields: collectionConfig.fields, operation: 'write' }) try { + if (typeof limit === 'number' && limit > 0) { + const documentsToUpdate = await Model.find( + query, + {}, + { ...options, limit, projection: { _id: 1 } }, + ) + if (documentsToUpdate.length === 0) { + return null + } + + query = { _id: { $in: documentsToUpdate.map((doc) => doc._id) } } + } + await Model.updateMany(query, data, options) } catch (error) { handleError({ collection: collectionSlug, error, req }) diff --git a/packages/drizzle/src/updateMany.ts b/packages/drizzle/src/updateMany.ts index 9195d3fb32..40cea50911 100644 --- a/packages/drizzle/src/updateMany.ts +++ b/packages/drizzle/src/updateMany.ts @@ -16,6 +16,7 @@ export const updateMany: UpdateMany = async function updateMany( collection: collectionSlug, data, joins: joinQuery, + limit, locale, req, returning, @@ -55,12 +56,21 @@ export const updateMany: UpdateMany = async function updateMany( const table = this.tables[tableName] - const docsToUpdate = await _db - .select({ - id: table.id, - }) - .from(table) - .where(where) + const docsToUpdate = + typeof limit === 'number' && limit > 0 + ? await _db + .select({ + id: table.id, + }) + .from(table) + .where(where) + .limit(limit) + : await _db + .select({ + id: table.id, + }) + .from(table) + .where(where) idsToUpdate = docsToUpdate?.map((doc) => doc.id) } diff --git a/packages/payload/src/database/types.ts b/packages/payload/src/database/types.ts index 78dbf248b2..d9abba968a 100644 --- a/packages/payload/src/database/types.ts +++ b/packages/payload/src/database/types.ts @@ -517,6 +517,7 @@ export type UpdateManyArgs = { data: Record draft?: boolean joins?: JoinQuery + limit?: number locale?: string /** * Additional database adapter specific options to pass to the query diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index 02143b0967..9b76303088 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -960,6 +960,183 @@ describe('database', () => { expect(notUpdatedDocs).toHaveLength(1) expect(notUpdatedDocs?.[0]?.title).toBe('notupdated') }) + + it('ensure updateMany respects limit', async () => { + await payload.db.deleteMany({ + collection: postsSlug, + where: { + id: { + exists: true, + }, + }, + }) + + // Create 11 posts + for (let i = 0; i < 11; i++) { + await payload.create({ + collection: postsSlug, + data: { + title: 'not updated', + }, + }) + } + + const result = await payload.db.updateMany({ + collection: postsSlug, + data: { + title: 'updated', + }, + limit: 5, + where: { + id: { + exists: true, + }, + }, + }) + + expect(result?.length).toBe(5) + expect(result?.[0]?.title).toBe('updated') + expect(result?.[4]?.title).toBe('updated') + + // Ensure all posts minus the one we don't want updated are updated + const { docs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + equals: 'updated', + }, + }, + }) + + expect(docs).toHaveLength(5) + expect(docs?.[0]?.title).toBe('updated') + expect(docs?.[4]?.title).toBe('updated') + + const { docs: notUpdatedDocs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + equals: 'not updated', + }, + }, + }) + + expect(notUpdatedDocs).toHaveLength(6) + expect(notUpdatedDocs?.[0]?.title).toBe('not updated') + expect(notUpdatedDocs?.[5]?.title).toBe('not updated') + }) + + it('ensure updateMany correctly handles 0 limit', async () => { + await payload.db.deleteMany({ + collection: postsSlug, + where: { + id: { + exists: true, + }, + }, + }) + + // Create 5 posts + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: postsSlug, + data: { + title: 'not updated', + }, + }) + } + + const result = await payload.db.updateMany({ + collection: postsSlug, + data: { + title: 'updated', + }, + limit: 0, + where: { + id: { + exists: true, + }, + }, + }) + + expect(result?.length).toBe(5) + expect(result?.[0]?.title).toBe('updated') + expect(result?.[4]?.title).toBe('updated') + + // Ensure all posts are updated. limit: 0 should mean unlimited + const { docs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + equals: 'updated', + }, + }, + }) + + expect(docs).toHaveLength(5) + expect(docs?.[0]?.title).toBe('updated') + expect(docs?.[4]?.title).toBe('updated') + }) + + it('ensure updateMany correctly handles -1 limit', async () => { + await payload.db.deleteMany({ + collection: postsSlug, + where: { + id: { + exists: true, + }, + }, + }) + + // Create 5 posts + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: postsSlug, + data: { + title: 'not updated', + }, + }) + } + + const result = await payload.db.updateMany({ + collection: postsSlug, + data: { + title: 'updated', + }, + limit: -1, + where: { + id: { + exists: true, + }, + }, + }) + + expect(result?.length).toBe(5) + expect(result?.[0]?.title).toBe('updated') + expect(result?.[4]?.title).toBe('updated') + + // Ensure all posts are updated. limit: -1 should mean unlimited + const { docs } = await payload.find({ + collection: postsSlug, + depth: 0, + pagination: false, + where: { + title: { + equals: 'updated', + }, + }, + }) + + expect(docs).toHaveLength(5) + expect(docs?.[0]?.title).toBe('updated') + expect(docs?.[4]?.title).toBe('updated') + }) }) describe('Error Handler', () => { From b9108b4306148a672990a11e72938d843440bf43 Mon Sep 17 00:00:00 2001 From: Vincent Vu Date: Mon, 3 Mar 2025 21:47:23 +1100 Subject: [PATCH 072/127] docs: fix documentation "CheckListFeature" (#11480) ### What? CheckListFeature is noted in the documentation. However, the package uses ChecklistFeature Rather than changing the package, this would be better. --- docs/rich-text/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rich-text/overview.mdx b/docs/rich-text/overview.mdx index 5374950e46..878579fba5 100644 --- a/docs/rich-text/overview.mdx +++ b/docs/rich-text/overview.mdx @@ -158,7 +158,7 @@ Here's an overview of all the included features: | **`IndentFeature`** | Yes | Allows you to indent text with the tab key | | **`UnorderedListFeature`** | Yes | Adds unordered lists (ul) | | **`OrderedListFeature`** | Yes | Adds ordered lists (ol) | -| **`CheckListFeature`** | Yes | Adds checklists | +| **`ChecklistFeature`** | Yes | Adds checklists | | **`LinkFeature`** | Yes | Allows you to create internal and external links | | **`RelationshipFeature`** | Yes | Allows you to create block-level (not inline) relationships to other documents | | **`BlockquoteFeature`** | Yes | Allows you to create block-level quotes | From fa8a2f8d8dc301a54d172e73bc2618926410c239 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 3 Mar 2025 11:32:40 +0000 Subject: [PATCH 073/127] chore: add docker volume directories to gitignore (#10902) Added these directories to gitignore so they don't conflict with stashing, which throws an error due to host user not having write permissions --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 77ef9ccae8..45f9b34187 100644 --- a/.gitignore +++ b/.gitignore @@ -318,3 +318,6 @@ test/databaseAdapter.js /media-with-relation-preview /media-without-relation-preview /media-without-cache-tags +test/.localstack +test/google-cloud-storage +test/azurestoragedata/ From a15c38f665fe8c2b06f0c9b07377a42d67eb03d8 Mon Sep 17 00:00:00 2001 From: Patrik Date: Mon, 3 Mar 2025 09:46:15 -0500 Subject: [PATCH 074/127] ci: clarify version reporting in issue templates (#11498) This update improves the `Environment Info` section in the issue template by asking users to provide exact version numbers instead of "latest." This ensures that bug reports remain accurate and useful over time. --- .github/ISSUE_TEMPLATE/1.bug_report_v3.yml | 2 +- .github/ISSUE_TEMPLATE/2.design_issue.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml b/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml index 0c1139294f..7d8f364ff8 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report_v3.yml @@ -57,7 +57,7 @@ body: - type: textarea attributes: label: Environment Info - description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. + description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. Please avoid using "latest"—specific version numbers help us accurately diagnose and resolve issues. render: text placeholder: | Payload: diff --git a/.github/ISSUE_TEMPLATE/2.design_issue.yml b/.github/ISSUE_TEMPLATE/2.design_issue.yml index 4b3fb17bb5..cf336ed8e4 100644 --- a/.github/ISSUE_TEMPLATE/2.design_issue.yml +++ b/.github/ISSUE_TEMPLATE/2.design_issue.yml @@ -20,7 +20,7 @@ body: - type: textarea attributes: label: Environment Info - description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. + description: Paste output from `pnpm payload info` _or_ Payload, Node.js, and Next.js versions. Please avoid using "latest"—specific version numbers help us accurately diagnose and resolve issues. render: text placeholder: | Payload: From fd1a4f689eaee8642535ed111b557a90eab86acc Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Mon, 3 Mar 2025 10:08:13 -0500 Subject: [PATCH 075/127] ci: change custom github actions target back to es5 --- .github/actions/release-commenter/tsconfig.json | 2 +- .github/actions/triage/tsconfig.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/release-commenter/tsconfig.json b/.github/actions/release-commenter/tsconfig.json index a99f5e1ce8..4cf9fec443 100644 --- a/.github/actions/release-commenter/tsconfig.json +++ b/.github/actions/release-commenter/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "es5", "lib": ["es2020.string"], "noEmit": true, "strict": true, diff --git a/.github/actions/triage/tsconfig.json b/.github/actions/triage/tsconfig.json index 766e72770e..5577737a90 100644 --- a/.github/actions/triage/tsconfig.json +++ b/.github/actions/triage/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2022", + "target": "es5", "lib": ["es2020.string"], "noEmit": true, "strict": true, From bf4fa5902604a15f1cb4a656d9c2c1f6d83fd2bf Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 3 Mar 2025 10:13:24 -0500 Subject: [PATCH 076/127] chore(deps): bumps payload-admin-bar to v1.0.7 to suppress react 19 warnings (#11499) The `payload-admin-bar` now supports React 19 as a result of https://github.com/payloadcms/payload-admin-bar/pull/13. This will suppress the React 19 warnings on install within the website templates and various examples that rely on this package. --- examples/draft-preview/package.json | 2 +- examples/localization/package.json | 2 +- examples/localization/pnpm-lock.yaml | 5057 ++++++-------- templates/website/package.json | 2 +- templates/website/pnpm-lock.yaml | 7338 ++++++-------------- templates/with-vercel-website/package.json | 12 +- 6 files changed, 4405 insertions(+), 8008 deletions(-) diff --git a/examples/draft-preview/package.json b/examples/draft-preview/package.json index 933ae688cc..208042048f 100644 --- a/examples/draft-preview/package.json +++ b/examples/draft-preview/package.json @@ -25,7 +25,7 @@ "graphql": "^16.9.0", "next": "^15.0.0", "payload": "latest", - "payload-admin-bar": "^1.0.6", + "payload-admin-bar": "^1.0.7", "react": "19.0.0", "react-dom": "19.0.0" }, diff --git a/examples/localization/package.json b/examples/localization/package.json index 17e657fdad..32777b3610 100644 --- a/examples/localization/package.json +++ b/examples/localization/package.json @@ -42,7 +42,7 @@ "next": "^15.1.0", "next-intl": "^3.23.2", "payload": "latest", - "payload-admin-bar": "^1.0.6", + "payload-admin-bar": "^1.0.7", "prism-react-renderer": "^2.3.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/localization/pnpm-lock.yaml b/examples/localization/pnpm-lock.yaml index 814eb30850..38e62b9e73 100644 --- a/examples/localization/pnpm-lock.yaml +++ b/examples/localization/pnpm-lock.yaml @@ -10,49 +10,49 @@ importers: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.11.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/live-preview-react': specifier: latest - version: 3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@payloadcms/next': specifier: latest - version: 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/payload-cloud': specifier: latest - version: 3.11.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-form-builder': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-nested-docs': specifier: latest - version: 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-redirects': specifier: latest - version: 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) '@payloadcms/plugin-search': specifier: latest - version: 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-seo': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/richtext-lexical': specifier: latest - version: 3.11.0(7ul3c6beuv3aho36y23w6b4pou) + version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23) '@payloadcms/ui': specifier: latest - version: 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.1.1(@types/react@19.0.1)(react@19.0.0) + version: 1.1.2(@types/react@19.0.1)(react@19.0.0) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -64,7 +64,7 @@ importers: version: 7.0.3 geist: specifier: ^1.3.0 - version: 1.3.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) graphql: specifier: ^16.8.2 version: 16.10.0 @@ -76,16 +76,16 @@ importers: version: 0.378.0(react@19.0.0) next: specifier: ^15.1.0 - version: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) next-intl: specifier: ^3.23.2 - version: 3.26.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0) + version: 3.26.5(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0) payload: specifier: latest - version: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + version: 3.25.0(graphql@16.10.0)(typescript@5.7.3) payload-admin-bar: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.0.7 + version: 1.0.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) prism-react-renderer: specifier: ^2.3.1 version: 2.4.1(react@19.0.0) @@ -103,23 +103,23 @@ importers: version: 0.32.6 tailwind-merge: specifier: ^2.3.0 - version: 2.5.5 + version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.16) + version: 1.0.7(tailwindcss@3.4.17) devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 - version: 3.2.0 + version: 3.3.0 '@tailwindcss/typography': specifier: ^0.5.13 - version: 0.5.15(tailwindcss@3.4.16) + version: 0.5.16(tailwindcss@3.4.17) '@types/escape-html': specifier: ^1.0.2 version: 1.0.4 '@types/jsonwebtoken': specifier: ^9.0.6 - version: 9.0.7 + version: 9.0.9 '@types/node': specifier: 22.5.4 version: 22.5.4 @@ -131,28 +131,28 @@ importers: version: 19.0.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.4.49) + version: 10.4.20(postcss@8.5.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.16.0 - version: 9.17.0(jiti@1.21.6) + version: 9.21.0(jiti@1.21.7) eslint-config-next: specifier: 15.1.0 - version: 15.1.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + version: 15.1.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) postcss: specifier: ^8.4.38 - version: 8.4.49 + version: 8.5.3 prettier: specifier: ^3.4.2 - version: 3.4.2 + version: 3.5.3 tailwindcss: specifier: ^3.4.3 - version: 3.4.16 + version: 3.4.17 typescript: - specifier: 5.7.2 - version: 5.7.2 + specifier: 5.7.3 + version: 5.7.3 packages: @@ -160,8 +160,8 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@apidevtools/json-schema-ref-parser@11.7.3': - resolution: {integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==} + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} '@aws-crypto/crc32@5.2.0': @@ -193,250 +193,142 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.713.0': - resolution: {integrity: sha512-MKOEuD/QFdbz65kHUKHn0aEJQ6oe2w9Ho62QTR9JDrBf78jPV5gWI7w8w5A0jX0KEcdqM3o59bawTV5E4nMAFA==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-cognito-identity@3.758.0': + resolution: {integrity: sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.717.0': - resolution: {integrity: sha512-jzaH8IskAXVnqlZ3/H/ROwrB2HCnq/atlN7Hi7FIfjWvMPf5nfcJKfzJ1MXFX0EQR5qO6X4TbK7rgi7Bjw9NjQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-s3@3.758.0': + resolution: {integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso-oidc@3.713.0': - resolution: {integrity: sha512-B7N1Nte4Kqn8oaqLR2qnegLZjAgylYDAYNmXDY2+f1QNLF2D3emmWu8kLvBPIxT3wj23Mt177CPcBvMMGF2+aQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/client-sso@3.758.0': + resolution: {integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.758.0': + resolution: {integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-cognito-identity@3.758.0': + resolution: {integrity: sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.758.0': + resolution: {integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.758.0': + resolution: {integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.758.0': + resolution: {integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.758.0': + resolution: {integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.758.0': + resolution: {integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.758.0': + resolution: {integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.758.0': + resolution: {integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-providers@3.758.0': + resolution: {integrity: sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/lib-storage@3.758.0': + resolution: {integrity: sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 + '@aws-sdk/client-s3': ^3.758.0 - '@aws-sdk/client-sso-oidc@3.716.0': - resolution: {integrity: sha512-lA4IB9FzR2KjH7EVCo+mHGFKqdViVyeBQEIX9oVratL/l7P0bMS1fMwgfHOc3ACazqNxBxDES7x08ZCp32y6Lw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 + '@aws-sdk/middleware-bucket-endpoint@3.734.0': + resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.713.0': - resolution: {integrity: sha512-qrgL/BILiRdv3npkJ88XxTeVPE/HPZ2gW9peyhYWP4fXCdPjpWYnAebbWBN6TqofiSlpP7xuoX8Xc1czwr90sg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-expect-continue@3.734.0': + resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.716.0': - resolution: {integrity: sha512-5Nb0jJXce2TclbjG7WVPufwhgV1TRydz1QnsuBtKU0AdViEpr787YrZhPpGnNIM1Dx+R1H/tmAHZnOoohS6D8g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.758.0': + resolution: {integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.713.0': - resolution: {integrity: sha512-sjXy6z5bS1uspOdA0B4xQVri0XxdM24MkK0XhLoFoWAWoMlrORAMy+zW3YyU/vlsLckNYs7B4+j0P0MK35d+AQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-host-header@3.734.0': + resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sts@3.716.0': - resolution: {integrity: sha512-i4SVNsrdXudp8T4bkm7Fi3YWlRnvXCSwvNDqf6nLqSJxqr4CN3VlBELueDyjBK7TAt453/qSif+eNx+bHmwo4Q==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-location-constraint@3.734.0': + resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.713.0': - resolution: {integrity: sha512-7Xq7LY6Q3eITvlqR1bP3cJu3RvTt4eb+WilK85eezPemi9589o6MNL0lu4nL0i+OdgPWw4x9z9WArRwXhHTreg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-logger@3.734.0': + resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.716.0': - resolution: {integrity: sha512-5DkUiTrbyzO8/W4g7UFEqRFpuhgizayHI/Zbh0wtFMcot8801nJV+MP/YMhdjimlvAr/OqYB08FbGsPyWppMTw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-recursion-detection@3.734.0': + resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.713.0': - resolution: {integrity: sha512-9+b6wT89FV1sOSPoGKhIf2+g1hyc1/+yVDfVc1yBwU5foQPugy0x4Fi2YLL5bPFr1H2FhdmRLD4wi/HdXmaJ6g==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-sdk-s3@3.758.0': + resolution: {integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.713.0': - resolution: {integrity: sha512-B5+AbvN8qr5jmaiFdErtHlhdZtfMCP7JB1nwdi9LTsZLVP8BhFXnOYlIE7z6jq8GRkDBHybTxovKWzSfI0gg+w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-ssec@3.734.0': + resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.716.0': - resolution: {integrity: sha512-JI2KQUnn2arICwP9F3CnqP1W3nAbm4+meQg/yOhp9X0DMzQiHrHRd4HIrK2vyVgi2/6hGhONY5uLF26yRTA7nQ==} - engines: {node: '>=16.0.0'} + '@aws-sdk/middleware-user-agent@3.758.0': + resolution: {integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.713.0': - resolution: {integrity: sha512-VarD43CV9Bn+yNCZZb17xMiSjX/FRdU3wN2Aw/jP6ZE3/d87J9L7fxRRFmt4FAgLg35MJbooDGT9heycwg/WWw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/nested-clients@3.758.0': + resolution: {integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.716.0': - resolution: {integrity: sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/region-config-resolver@3.734.0': + resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.713.0': - resolution: {integrity: sha512-6oQuPjYONMCWTWhq5yV61OziX2KeU+nhTsdk+Zh4RiuaTkRRNTLnMAVA/VoG1FG8cnQbZJDFezh58nzlBTWHdw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 + '@aws-sdk/signature-v4-multi-region@3.758.0': + resolution: {integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.716.0': - resolution: {integrity: sha512-P37We2GtZvdROxiwP0zrpEL81/HuYK1qlYxp5VCj3uV+G4mG8UQN2gMIU/baYrpOQqa0h81RfyQGRFUjVaDVqw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 + '@aws-sdk/token-providers@3.758.0': + resolution: {integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.713.0': - resolution: {integrity: sha512-uIRHrhqcjcc+fUcid7Dey7mXRYfntPcA2xzebOnIK5hGBNwfQHpRG3RAlEB8K864psqW+j+XxvjoRHx9trL5Zg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/types@3.734.0': + resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.716.0': - resolution: {integrity: sha512-FGQPK2uKfS53dVvoskN/s/t6m0Po24BGd1PzJdzHBFCOjxbZLM6+8mDMXeyi2hCLVVQOUcuW41kOgmJ0+zMbww==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-arn-parser@3.723.0': + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.713.0': - resolution: {integrity: sha512-adVC8iz8uHmhVmZaYGj4Ab8rLz+hmnR6rOeMQ6wVbCAnWDb2qoahb+vLZ9sW9yMCVRqiDWeVK7lsa0MDRCM1sw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-endpoints@3.743.0': + resolution: {integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.716.0': - resolution: {integrity: sha512-0spcu2MWVVHSTHH3WE2E//ttUJPwXRM3BCp+WyI41xLzpNu1Fd8zjOrDpEo0SnGUzsSiRTIJWgkuu/tqv9NJ2A==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-locate-window@3.723.0': + resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.713.0': - resolution: {integrity: sha512-67QzqZJ6i04ZJVRB4WTUfU3QWJgr9fmv9JdqiLl63GTfz2KGOMwmojbi4INJ9isq4rDVUycdHsgl1Mhe6eDXJg==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-browser@3.734.0': + resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==} - '@aws-sdk/credential-provider-sso@3.716.0': - resolution: {integrity: sha512-J2IA3WuCpRGGoZm6VHZVFCnrxXP+41iUWb9Ct/1spljegTa1XjiaZ5Jf3+Ubj7WKiyvP9/dgz1L0bu2bYEjliw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.713.0': - resolution: {integrity: sha512-hz2Ru+xKYQupxyYb8KCCmH6qhzn4MSkocFbnBxevlQMYbugi80oaQtpmkj2ovrKCY2ktD4ufhC/8UZJMFGjAqw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.713.0 - - '@aws-sdk/credential-provider-web-identity@3.716.0': - resolution: {integrity: sha512-vzgpWKs2gGXZGdbMKRFrMW4PqEFWkGvwWH2T7ZwQv9m+8lQ7P4Dk2uimqu0f37HZAbpn8HFMqRh4CaySjU354A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sts': ^3.716.0 - - '@aws-sdk/credential-providers@3.713.0': - resolution: {integrity: sha512-eHNSkc/JQioGCrh1u2NwlXD1mwBiSp7p+nTK+6IKR4A6oWR5Le3t6xslZurmwqEKC1DuF7eiTIyDKRura4/aRw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/lib-storage@3.717.0': - resolution: {integrity: sha512-3Wpsi5soTH2XCEEu9qctj6zVH4ViZ3Qe3crFL7fJQrE9Uw3X60/+IfYfJMgZdQY3pIqmUsjydR93PZG0x6cXLw==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-s3': ^3.717.0 - - '@aws-sdk/middleware-bucket-endpoint@3.714.0': - resolution: {integrity: sha512-I/xSOskiseJJ8i183Z522BgqbgYzLKP7jGcg2Qeib/IWoG2IP+9DH8pwqagKaPAycyswtnoKBJiiFXY43n0CkA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-expect-continue@3.714.0': - resolution: {integrity: sha512-rlzsXdG8Lzo4Qpl35ZnpOBAWlzvDHpP9++0AXoUwAJA0QmMm7auIRmgxJuNj91VwT9h15ZU6xjU4S7fJl4W0+w==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.717.0': - resolution: {integrity: sha512-a5kY5r7/7bDZZlOQQGWOR1ulQewdtNexdW1Ex5DD0FLKlFY7RD0va24hxQ6BP7mWHol+Dx4pj6UQ8ahk0ap1tw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-host-header@3.713.0': - resolution: {integrity: sha512-T1cRV9hs9WKwb2porR4QmW76ScCHqbdsrAAH+/2fR8IVRpFRU0BMnwrpSrRr7ujj6gqWQRQ97JLL+GpqpY3/ag==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-host-header@3.714.0': - resolution: {integrity: sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-location-constraint@3.714.0': - resolution: {integrity: sha512-MX7M+V+FblujKck3fyuzePVIAy9530gY719IiSxV6uN1qLHl7VDJxNblpF/KpXakD6rOg8OpvtmqsXj9aBMftw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-logger@3.713.0': - resolution: {integrity: sha512-mpTK7ost3lQt08YhTsf+C4uEAwg3Xu1LKxexlIZGXucCB6AqBKpP7e86XzpFFAtuRgEfTJVbW+Gqna8LM+yXoA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-logger@3.714.0': - resolution: {integrity: sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.713.0': - resolution: {integrity: sha512-6vgQw92yvKR8MNsSXJE4seZhMSPVuyuBLuX81DWPr1pak/RpuUzn96CSYCTAYoCtf5vJgNseIcPfKQLkRYmBzg==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.714.0': - resolution: {integrity: sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.716.0': - resolution: {integrity: sha512-Qzz5OfRA/5brqfvq+JHTInwS1EuJ1+tC6qMtwKWJN3czMnVJVdnnsPTf+G5IM/1yYaGEIjY8rC1ExQLcc8ApFQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-ssec@3.714.0': - resolution: {integrity: sha512-RkK8REAVwNUQmYbIDRw8eYbMJ8F1Rw4C9mlME4BBMhFlelGcD3ErU2ce24moQbDxBjNwHNESmIqgmdQk93CDCQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.713.0': - resolution: {integrity: sha512-MYg2N9EUXQ4Kf0+rk7qCHPLbxRPAeWrxJXp8xDxSBiDPf0hcbCtT+cXXB6qWVrnp+OuacoUDrur3h604sp47Aw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/middleware-user-agent@3.716.0': - resolution: {integrity: sha512-FpAtT6nNKrYdkDZndutEraiRMf+TgDzAGvniqRtZ/YTPA+gIsWrsn+TwMKINR81lFC3nQfb9deS5CFtxd021Ew==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.713.0': - resolution: {integrity: sha512-SsIxxUFgYSHXchkyal+Vg+tZUFyBR0NPy/3GEYZ8geJqVfgb/4SHCIfkLMcU0qPUKlRfkJF7FPdgO24sfLiopA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/region-config-resolver@3.714.0': - resolution: {integrity: sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.716.0': - resolution: {integrity: sha512-k0goWotZKKz+kV6Ln0qeAMSeSVi4NipuIIz5R8A0uCF2zBK4CXWdZR7KeaIoLBhJwQnHj1UU7E+2MK74KIUBzA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/token-providers@3.713.0': - resolution: {integrity: sha512-KNL+XaU0yR6qFDtceHe/ycEz0kHyDWNd2pbL3clFWzeVQXYs8+dYDEXA17MJPVyg7oh4wRdu0ymwQsBMl2wYAA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.713.0 - - '@aws-sdk/token-providers@3.714.0': - resolution: {integrity: sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@aws-sdk/client-sso-oidc': ^3.714.0 - - '@aws-sdk/types@3.713.0': - resolution: {integrity: sha512-AMSYVKi1MxrJqGGbjcFC7/4g8E+ZHGfg/eW0+GXQJmsVjMjccHtU+s1dYloX4KEDgrY42QPep+dpSVRR4W7U1Q==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/types@3.714.0': - resolution: {integrity: sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-arn-parser@3.693.0': - resolution: {integrity: sha512-WC8x6ca+NRrtpAH64rWu+ryDZI3HuLwlEr8EU6/dbC/pt+r/zC0PBoC15VEygUaBA+isppCikQpGyEDu0Yj7gQ==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.713.0': - resolution: {integrity: sha512-fbHDhiPTqfmkWzxZgWy+GFpdfiWJa1kNLWJCF4+yaF7iOZz0eyHoBX3iaTf20V2SUU8D2td/qkwTF+cpSZTZVw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-endpoints@3.714.0': - resolution: {integrity: sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-locate-window@3.693.0': - resolution: {integrity: sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-user-agent-browser@3.713.0': - resolution: {integrity: sha512-ioLAF8aIlcVhdizFVNuogMK5u3Js04rpGFvsbZANa1SJ9pK2UsKznnzinJT4e4ongy55g6LSZkWlF79VjG/Yfw==} - - '@aws-sdk/util-user-agent-browser@3.714.0': - resolution: {integrity: sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw==} - - '@aws-sdk/util-user-agent-node@3.713.0': - resolution: {integrity: sha512-dIunWBB7zRLvLVzNoBjap8YWrOhkwdFEjDWx9NleD+8ufpCFq5gEm8PJ0JP6stUgG5acTmafdzH7NgMyaeEexA==} - engines: {node: '>=16.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/util-user-agent-node@3.716.0': - resolution: {integrity: sha512-3PqaXmQbxrtHKAsPCdp7kn5FrQktj8j3YyuNsqFZ8rWZeEQ88GWlsvE61PTsr2peYCKzpFqYVddef2x1axHU0w==} - engines: {node: '>=16.0.0'} + '@aws-sdk/util-user-agent-node@3.758.0': + resolution: {integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==} + engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -446,16 +338,16 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.709.0': - resolution: {integrity: sha512-2GPCwlNxeHspoK/Mc8nbk9cBOkSpp3j2SJUQmFnyQK6V/pR6II2oPRyZkMomug1Rc10hqlBHByMecq4zhV2uUw==} - engines: {node: '>=16.0.0'} + '@aws-sdk/xml-builder@3.734.0': + resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==} + engines: {node: '>=18.0.0'} '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.3': - resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + '@babel/generator@7.26.9': + resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': @@ -470,27 +362,30 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/template@7.26.9': + resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': - resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + '@babel/traverse@7.26.9': + resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} engines: {node: '>=6.9.0'} + '@date-fns/tz@1.2.0': + resolution: {integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==} + '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -714,28 +609,28 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.1': - resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.5': - resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.4': - resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faceless-ui/modal@3.0.0-beta.2': @@ -744,23 +639,23 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/scroll-info@2.0.0-beta.0': - resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} + '@faceless-ui/scroll-info@2.0.0': + resolution: {integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@faceless-ui/window-info@3.0.0-beta.0': - resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} + '@faceless-ui/window-info@3.0.1': + resolution: {integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} @@ -768,29 +663,32 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + '@floating-ui/react@0.27.5': + resolution: {integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==} peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: '>=17.0.0' + react-dom: '>=17.0.0' - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@formatjs/ecma402-abstract@2.3.1': - resolution: {integrity: sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==} + '@formatjs/ecma402-abstract@2.3.3': + resolution: {integrity: sha512-pJT1OkhplSmvvr6i3CWTPvC/FGC06MbN5TNBfRO6Ox62AEz90eMq+dVvtX9Bl3jxCEkS0tATzDarRZuOLw7oFg==} - '@formatjs/fast-memoize@2.2.5': - resolution: {integrity: sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==} + '@formatjs/fast-memoize@2.2.6': + resolution: {integrity: sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==} - '@formatjs/icu-messageformat-parser@2.9.7': - resolution: {integrity: sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==} + '@formatjs/icu-messageformat-parser@2.11.1': + resolution: {integrity: sha512-o0AhSNaOfKoic0Sn1GkFCK4MxdRsw7mPJ5/rBpIqdvcC7MIuyUSW8WChUEvrK78HhNpYOgqCQbINxCTumJLzZA==} - '@formatjs/icu-skeleton-parser@1.8.11': - resolution: {integrity: sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==} + '@formatjs/icu-skeleton-parser@1.8.13': + resolution: {integrity: sha512-N/LIdTvVc1TpJmMt2jVg0Fr1F7Q1qJPdZSCs19unMskCmVQ/sa0H9L8PWt13vq+gLdLg1+pPsvBLydL1Apahjg==} - '@formatjs/intl-localematcher@0.5.9': - resolution: {integrity: sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==} + '@formatjs/intl-localematcher@0.5.10': + resolution: {integrity: sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==} + + '@formatjs/intl-localematcher@0.6.0': + resolution: {integrity: sha512-4rB4g+3hESy1bHSBG3tDFaMY2CH67iT7yne1e+0CLTsGLDcmoEWWpJjjpWVaYgYfYuohIRuo0E+N536gd2ZHZA==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -808,8 +706,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': @@ -942,148 +840,143 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@lexical/clipboard@0.20.0': - resolution: {integrity: sha512-oHmb9kSVHjeFCd2q8VrEXW22doUHMJ6cGXqo7Ican7Ljl4/9OgRWr+cq55yntoSaJfCrRYkTiZCLDejF2ciSiA==} + '@lexical/clipboard@0.21.0': + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} - '@lexical/code@0.20.0': - resolution: {integrity: sha512-zFsVGuzIn4CQxEnlW4AG/Hq6cyATVZ4fZTxozE/f5oK4vDPvnY/goRxrzSuAMX73A/HRX3kTEzMDcm4taRM3Mg==} + '@lexical/code@0.21.0': + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} - '@lexical/devtools-core@0.20.0': - resolution: {integrity: sha512-/CnL+Dfpzw4koy2BTdUICkvrCkMIYG8Y73KB/S1Bt5UzJpD+PV300puWJ0NvUvAj24H78r73jxvK2QUG67Tdaw==} + '@lexical/devtools-core@0.21.0': + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/dragon@0.20.0': - resolution: {integrity: sha512-3DAHF8mSKiPZtXCqu2P8ynSwS3fGXzg4G/V0lXNjBxhmozjzUzWZRWIWtmTlWdEu9GXsoyeM3agcaxyDPJJwkA==} + '@lexical/dragon@0.21.0': + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} - '@lexical/hashtag@0.20.0': - resolution: {integrity: sha512-ldOP/d9tA6V9qvLyr3mRYkcYY5ySOHJ2BFOW/jZPxQcj6lWafS8Lk7XdMUpHHDjRpY2Hizsi5MHJkIqFglYXbw==} + '@lexical/hashtag@0.21.0': + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} - '@lexical/headless@0.20.0': - resolution: {integrity: sha512-PZ9Yxud7UOpVoq3oJ1wb3wb7NHyFt8XLc1IhdNAzTzbZ+L6c9lyomgBFvDs11u/3t9vjtLxGbzkzYKryQE80Ig==} + '@lexical/headless@0.21.0': + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} - '@lexical/history@0.20.0': - resolution: {integrity: sha512-dXtIS31BU6RmLX2KwLAi1EgGl+USeyi+rshh19azACXHPFqONZgPd2t21LOLSFn7C1/W+cSp/kqVDlQVbZUZRA==} + '@lexical/history@0.21.0': + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} - '@lexical/html@0.20.0': - resolution: {integrity: sha512-ob7QHkEv+mhaZjlurDj90UmEyN9G4rzBPR5QV42PLnu1qMSviMEdI5V3a5/A5aFf/FDDQ+0GAgWBFnA/MEDczQ==} + '@lexical/html@0.21.0': + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} - '@lexical/link@0.20.0': - resolution: {integrity: sha512-zicDcfgRZPRFZ8WOZv5er0Aqkde+i7QoFVkLQD4dNLLORjoMSJOISJH6VEdjBl3k7QJTxbfrt+xT5d/ZsAN5GA==} + '@lexical/link@0.21.0': + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} - '@lexical/list@0.20.0': - resolution: {integrity: sha512-ufSse8ui3ooUe0HA/yF/9STrG8wYhIDLMRhELOw80GFCkPJaxs6yRvjfmJooH5IC88rpUJ5XXFFiZKfGxEZLEw==} + '@lexical/list@0.21.0': + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} - '@lexical/mark@0.20.0': - resolution: {integrity: sha512-1P2izmkgZ4VDp+49rWO1KfWivL5aA30y5kkYbFZ/CS05fgbO7ogMjLSajpz+RN/zzW79v3q4YfikrMgaD23InA==} + '@lexical/mark@0.21.0': + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} - '@lexical/markdown@0.20.0': - resolution: {integrity: sha512-ZoGsECejp9z6MEvc8l81b1h1aWbB3sTq6xOFeUTbDL5vKpA67z5CmQQLi0uZWrygrbO9dSE3Q/JGcodUrczxbw==} + '@lexical/markdown@0.21.0': + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} - '@lexical/offset@0.20.0': - resolution: {integrity: sha512-VMhxsxxDGnpVw0jgC8UlDf0Q2RHIHbS49uZgs3l9nP+O+G8s3b76Ta4Tb+iJOK2FY6874/TcQMbSuXGhfpQk8A==} + '@lexical/offset@0.21.0': + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} - '@lexical/overflow@0.20.0': - resolution: {integrity: sha512-z4lElzLm1FVifc7bzBZN4VNKeTuwygpyHQvCJVWXzF2Kbvex43PEYMi8u4A83idVqbmzbyBLASwUJS0voLoPLw==} + '@lexical/overflow@0.21.0': + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} - '@lexical/plain-text@0.20.0': - resolution: {integrity: sha512-LvoC+9mm2Im1iO8GgtgaqSfW0T3mIE5GQl1xGxbVNdANmtHmBgRAJn2KfQm1XHZP6zydLRMhZkzC+jfInh2yfQ==} + '@lexical/plain-text@0.21.0': + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} - '@lexical/react@0.20.0': - resolution: {integrity: sha512-5QbN5AFtZ9efXxU/M01ADhUZgthR0e8WKi5K/w5EPpWtYFDPQnUte3rKUjYJ7uwG1iwcvaCpuMbxJjHQ+i6pDQ==} + '@lexical/react@0.21.0': + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' - '@lexical/rich-text@0.20.0': - resolution: {integrity: sha512-BR1pACdMA+Ymef0f5EN1y+9yP8w7S+9MgmBP1yjr3w4KdqRnfSaGWyxwcHU8eA+zu16QfivpB6501VJ90YeuXw==} + '@lexical/rich-text@0.21.0': + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} - '@lexical/selection@0.20.0': - resolution: {integrity: sha512-YnkH5UCMNN/em95or/6uwAV31vcENh1Roj+JOg5KD+gJuA7VGdDCy0vZl/o0+1badXozeZ2VRxXNC6JSK7T4+A==} + '@lexical/selection@0.21.0': + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} - '@lexical/table@0.20.0': - resolution: {integrity: sha512-qHuK2rvQUoQDx62YpvJE3Ev4yK9kjRFo79IDBapxrhoXg/wCGQOjMBzVD3G5PWkhyl/GDnww80GwYjLloQLQzg==} + '@lexical/table@0.21.0': + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} - '@lexical/text@0.20.0': - resolution: {integrity: sha512-Fu64i5CIlEOlgucSdp9XFqB2XqoRsw4at76n93+6RF4+LgGDnu4nLXQVCVxNmLcGyh2WgczuTpnk5P2mHNAIUA==} + '@lexical/text@0.21.0': + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} - '@lexical/utils@0.20.0': - resolution: {integrity: sha512-sXIa2nowrNxY8VcjjuxZbJ/HovIql8bmInNaxBR03JAYfqMiL5I5/dYgjOQJV49NJnuR1uTY2GwVxVTXCTFUCw==} + '@lexical/utils@0.21.0': + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} - '@lexical/yjs@0.20.0': - resolution: {integrity: sha512-TiHNhu2VkhXN69V+fXVS3xjOQ6aLnheQUGwOAhuFkDPL3VLCb0yl2Mgydpayn+3Grwii4ZBHcF7oCC84GiU5bw==} + '@lexical/yjs@0.21.0': + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} peerDependencies: yjs: '>=13.5.22' - '@monaco-editor/loader@1.4.0': - resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} - peerDependencies: - monaco-editor: '>= 0.21.0 < 1' + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - '@monaco-editor/react@4.6.0': - resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@mongodb-js/saslprep@1.1.9': - resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} + '@mongodb-js/saslprep@1.2.0': + resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} - '@next/env@15.1.0': - resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} - - '@next/env@15.1.2': - resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} + '@next/env@15.2.0': + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} '@next/eslint-plugin-next@15.1.0': resolution: {integrity: sha512-+jPT0h+nelBT6HC9ZCHGc7DgGVy04cv4shYdAe6tKlEbjQUtwU3LzQhzbDHQyY2m6g39m6B0kOFVuLGBrxxbGg==} - '@next/swc-darwin-arm64@15.1.0': - resolution: {integrity: sha512-ZU8d7xxpX14uIaFC3nsr4L++5ZS/AkWDm1PzPO6gD9xWhFkOj2hzSbSIxoncsnlJXB1CbLOfGVN4Zk9tg83PUw==} + '@next/swc-darwin-arm64@15.2.0': + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.0': - resolution: {integrity: sha512-DQ3RiUoW2XC9FcSM4ffpfndq1EsLV0fj0/UY33i7eklW5akPUCo6OX2qkcLXZ3jyPdo4sf2flwAED3AAq3Om2Q==} + '@next/swc-darwin-x64@15.2.0': + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.0': - resolution: {integrity: sha512-M+vhTovRS2F//LMx9KtxbkWk627l5Q7AqXWWWrfIzNIaUFiz2/NkOFkxCFyNyGACi5YbA8aekzCLtbDyfF/v5Q==} + '@next/swc-linux-arm64-gnu@15.2.0': + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.0': - resolution: {integrity: sha512-Qn6vOuwaTCx3pNwygpSGtdIu0TfS1KiaYLYXLH5zq1scoTXdwYfdZtwvJTpB1WrLgiQE2Ne2kt8MZok3HlFqmg==} + '@next/swc-linux-arm64-musl@15.2.0': + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.1.0': - resolution: {integrity: sha512-yeNh9ofMqzOZ5yTOk+2rwncBzucc6a1lyqtg8xZv0rH5znyjxHOWsoUtSq4cUTeeBIiXXX51QOOe+VoCjdXJRw==} + '@next/swc-linux-x64-gnu@15.2.0': + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.0': - resolution: {integrity: sha512-t9IfNkHQs/uKgPoyEtU912MG6a1j7Had37cSUyLTKx9MnUpjj+ZDKw9OyqTI9OwIIv0wmkr1pkZy+3T5pxhJPg==} + '@next/swc-linux-x64-musl@15.2.0': + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.1.0': - resolution: {integrity: sha512-WEAoHyG14t5sTavZa1c6BnOIEukll9iqFRTavqRVPfYmfegOAd5MaZfXgOGG6kGo1RduyGdTHD4+YZQSdsNZXg==} + '@next/swc-win32-arm64-msvc@15.2.0': + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.0': - resolution: {integrity: sha512-J1YdKuJv9xcixzXR24Dv+4SaDKc2jj31IVUEMdO5xJivMTXuE6MAdIi4qPjSymHuFG8O5wbfWKnhJUcHHpj5CA==} + '@next/swc-win32-x64-msvc@15.2.0': + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1104,111 +997,97 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} - '@one-ini/wasm@0.1.1': - resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} - - '@payloadcms/db-mongodb@3.11.0': - resolution: {integrity: sha512-mPtbgo/e1HJe2kHtIe+xKUne0jswg5t/OxlLZ1h22S4FII7m/dK3ezpC+EHI4Z4lHSbKt0yIPGrKANxmmkkOsQ==} + '@payloadcms/db-mongodb@3.25.0': + resolution: {integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/email-nodemailer@3.11.0': - resolution: {integrity: sha512-g62Dcu/zlcKjH3Y9SrOsV0e7OTCUt7OJt2wq8iukSmAmEqVmkbZFHvzmh9BntGcTAjaBKguJosW8ep7lQW7zcA==} + '@payloadcms/email-nodemailer@3.25.0': + resolution: {integrity: sha512-7sPx3Uyt+piUdqz0/lRUaU7sjU7XGGuu//9qbf9FVwoceGQ/k8OBuK9dxKko2aMlfpff8Mo9ujKYFxfT4R970g==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/graphql@3.11.0': - resolution: {integrity: sha512-IYiivNdm++wiUvHa40S9rM/rjwrh7D/7rofZjR7aDEvWiYj2lF/ZfmG7PY22S7ZCYcmq4+bgOqSk4JYz5lXynw==} + '@payloadcms/graphql@3.25.0': + resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/live-preview-react@3.11.0': - resolution: {integrity: sha512-Ng+OonmNEB5njTfAntE8WF7OBKDhbvlciPAe3cBRTL5eS2QwfX4PK/T/fxIwV9GhKwmmcDSFWtccdIQ0TRfocg==} + '@payloadcms/live-preview-react@3.25.0': + resolution: {integrity: sha512-toqtcPKKYTr5qKN1o89+lLpt9XWthzMy8IrzyJTCoSWWgrZBAvuWE1iskQxRDZsjEGyzi91B8yyJy7lgts04aQ==} peerDependencies: - react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/live-preview@3.11.0': - resolution: {integrity: sha512-CBsvUSV2fI8NrSML9Afnd/yy2D89cxtVz9LnMquoiZLqDbpR0U31BJ2Pxq7HFAsPaNxnRpzZD5NZsYRsak9hnA==} + '@payloadcms/live-preview@3.25.0': + resolution: {integrity: sha512-EzhHqyWCsqyt6MEB+4P0jVvALcNgsS9551QIfWgVHi31qWACxxDWFS6TRms2PF9ObiLTD4aWLukSrC5RAMF3KQ==} - '@payloadcms/next@3.11.0': - resolution: {integrity: sha512-Ut1Mrfv5pXKza1kipv5C80KZ/fyziaNsAV73gCOykritPsownRyeXugaEobcL8GcifvAoduk75mAXAw+rwizgw==} + '@payloadcms/next@3.25.0': + resolution: {integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/payload-cloud@3.11.0': - resolution: {integrity: sha512-FvUlesO/4hpWtry8I0Veifs4KJxrMEubPoonCMEYS1cgQnlzxP6uGzDOe5i8eMLOg3fgEnWQFyZkug1xr/7gCQ==} + '@payloadcms/payload-cloud@3.25.0': + resolution: {integrity: sha512-VVNIvxAxxfxCArKcKKgBs81q7WhndiaPhAVU5VPr5giRzMpvATIwwpirjnfeoJxndL5X79lGhRcKiznwSIEEkw==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-form-builder@3.11.0': - resolution: {integrity: sha512-pawZ86gvqqwAky9krxgSXgCR1Jr/Ui851omWEuXtkkhF2qlpw3HUy0Dc9N37PHBHFJ04Vm1/M4/GyhQalMWAHA==} + '@payloadcms/plugin-form-builder@3.25.0': + resolution: {integrity: sha512-2/rEJjH8F99LF5BDAjEnY8T697dbc2ZFHk+FlCVXWf5FpwneNXz7teWj20tGmLwmN4bdz3KYgby0tHNuH/reyQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-nested-docs@3.11.0': - resolution: {integrity: sha512-pOmwkTbrZBfr8PQQNvBEbJz9P2jtU2mO9UuLqjp8x2/NFFyLsJ0NE0BbGAdLHBguzY+jIzybl6RblP2PalXjww==} + '@payloadcms/plugin-nested-docs@3.25.0': + resolution: {integrity: sha512-hIYKsaaTBy0l+hYTJgwVJeSfc+bGA7kzm+o6f8fR6kdWOlgE8M1/m1DB+54MedzY8vHZ31YKBWNny3ompWDQJQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-redirects@3.11.0': - resolution: {integrity: sha512-BTVqsz/amR7DH5aU6BF8anuCznZIaCnsVZjHi6oB/P1KktrPVFzHcxdADVYpbCEykKqNujS8CXbDNCzvLjxoNQ==} + '@payloadcms/plugin-redirects@3.25.0': + resolution: {integrity: sha512-B19VBVXGbloXmSrkOmpCGiI5d+iQdA/Y5ciyvIiXELp52SWk88D7U4GuDKgWeS5FFyduNhB64mltJ6vJq+3bxg==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 - '@payloadcms/plugin-search@3.11.0': - resolution: {integrity: sha512-Y6uMMaT1NCo77xP0GYTdnbY+0pYpwkgdYz5VpR54PUifKkPJcTWYGvwTVPUzTrBq7fV0vP8V8EqgOrNuwWWf4Q==} + '@payloadcms/plugin-search@3.25.0': + resolution: {integrity: sha512-VLTIv6emUmdoPip/A1TaCpU4As+ng1OhYynesVMCPa8A7jUvr4KQX1yE3XF0z7os2CzuITb0EsfKC5Wb+OAHUQ==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-seo@3.11.0': - resolution: {integrity: sha512-NBJW0/vQl4UnzEZhJki4jssEaGJspJXM98uJ6FD+JOj2UDwuqN5HWG0fw3bSqvqlrJlSFThiyLVLbkfGUMf3nA==} + '@payloadcms/plugin-seo@3.25.0': + resolution: {integrity: sha512-zdHemmXb5O3c9XF5zP7B1oLibqMILkOvgh5MnpZA16QSM84dWefj/UizjcJ+NeYx1ODJTPT1eIRVB3gW/JLgtg==} peerDependencies: - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/richtext-lexical@3.11.0': - resolution: {integrity: sha512-ONR+sSRayllhTEk1N9b1jXzmKUzUKU73/KmtQNu90+mmvs6rdqNbDcjerlE/uVprkvDO/gRpI+jVFNlFD/cuBw==} + '@payloadcms/richtext-lexical@3.25.0': + resolution: {integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: '@faceless-ui/modal': 3.0.0-beta.2 - '@faceless-ui/scroll-info': 2.0.0-beta.0 - '@lexical/headless': 0.20.0 - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.11.0 - lexical: 0.20.0 - payload: 3.11.0 + '@faceless-ui/scroll-info': 2.0.0 + '@payloadcms/next': 3.25.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.11.0': - resolution: {integrity: sha512-6iGYqe3lE5ARBcMDbXOcPB0mMK2oxyn46fI2c06u2VEGS6z4b8B4cDoNfHv6ZhInzTS94ZtZUnbK1heR8KcEcg==} + '@payloadcms/translations@3.25.0': + resolution: {integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==} - '@payloadcms/ui@3.11.0': - resolution: {integrity: sha512-iB8BThtP+gFnt/DA1NHTdTTv5TZx3aYWQca/VGhrYU5SCR1SUVGcBpO7qW2eQiHWjnaMKA8tvqeY8T5mkEdfRA==} + '@payloadcms/ui@3.25.0': + resolution: {integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==} engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.11.0 + payload: 3.25.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 @@ -1222,8 +1101,8 @@ packages: '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} - '@radix-ui/react-arrow@1.1.1': - resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} + '@radix-ui/react-arrow@1.1.2': + resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1235,8 +1114,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.3': - resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} + '@radix-ui/react-checkbox@1.1.4': + resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1248,8 +1127,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.1': - resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} + '@radix-ui/react-collection@1.1.2': + resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1288,8 +1167,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.3': - resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} + '@radix-ui/react-dismissable-layer@1.1.5': + resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1310,8 +1189,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.1': - resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + '@radix-ui/react-focus-scope@1.1.2': + resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1332,8 +1211,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.1': - resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + '@radix-ui/react-label@2.1.2': + resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1345,8 +1224,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.1': - resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} + '@radix-ui/react-popper@1.2.2': + resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1358,8 +1237,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.3': - resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + '@radix-ui/react-portal@1.1.4': + resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1384,8 +1263,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.1': - resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + '@radix-ui/react-primitive@2.0.2': + resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1397,8 +1276,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.4': - resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} + '@radix-ui/react-select@2.1.6': + resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1410,8 +1289,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.1.1': - resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} + '@radix-ui/react-slot@1.1.2': + resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1482,8 +1361,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.1.1': - resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} + '@radix-ui/react-visually-hidden@1.1.2': + resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1498,221 +1377,223 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - '@react-email/render@0.0.7': - resolution: {integrity: sha512-hMMhxk6TpOcDC5qnKzXPVJoVGEwfm+U5bGOPH+MyTTlx0F02RLQygcATBKsbP7aI/mvkmBAZoFbgPIHop7ovug==} - engines: {node: '>=16.0.0'} - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} + '@rushstack/eslint-patch@1.10.5': + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - '@selderee/plugin-htmlparser2@0.10.0': - resolution: {integrity: sha512-gW69MEamZ4wk1OsOq1nG1jcyhXIQcnrsX5JwixVw/9xaiav8TCyjESAruu1Rz9yyInhgBXxkNwMeygKnN2uxNA==} + '@smithy/abort-controller@4.0.1': + resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} + engines: {node: '>=18.0.0'} - '@smithy/abort-controller@3.1.9': - resolution: {integrity: sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw==} - engines: {node: '>=16.0.0'} + '@smithy/chunked-blob-reader-native@4.0.0': + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@3.0.1': - resolution: {integrity: sha512-VEYtPvh5rs/xlyqpm5NRnfYLZn+q0SRPELbvBV+C/G7IQ+ouTuo+NKKa3ShG5OaFR8NYVMXls9hPYLTvIKKDrQ==} + '@smithy/chunked-blob-reader@5.0.0': + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@4.0.0': - resolution: {integrity: sha512-jSqRnZvkT4egkq/7b6/QRCNXmmYVcHwnJldqJ3IhVpQE2atObVJ137xmGeuGFhjFUr8gCEVAOKwSY79OvpbDaQ==} + '@smithy/config-resolver@4.0.1': + resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} + engines: {node: '>=18.0.0'} - '@smithy/config-resolver@3.0.13': - resolution: {integrity: sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg==} - engines: {node: '>=16.0.0'} + '@smithy/core@3.1.5': + resolution: {integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==} + engines: {node: '>=18.0.0'} - '@smithy/core@2.5.5': - resolution: {integrity: sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw==} - engines: {node: '>=16.0.0'} + '@smithy/credential-provider-imds@4.0.1': + resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} + engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@3.2.8': - resolution: {integrity: sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-codec@4.0.1': + resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@3.1.10': - resolution: {integrity: sha512-323B8YckSbUH0nMIpXn7HZsAVKHYHFUODa8gG9cHo0ySvA1fr5iWaNT+iIL0UCqUzG6QPHA3BSsBtRQou4mMqQ==} + '@smithy/eventstream-serde-browser@4.0.1': + resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@3.0.14': - resolution: {integrity: sha512-kbrt0vjOIihW3V7Cqj1SXQvAI5BR8SnyQYsandva0AOR307cXAc+IhPngxIPslxTLfxwDpNu0HzCAq6g42kCPg==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-config-resolver@4.0.1': + resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@3.0.11': - resolution: {integrity: sha512-P2pnEp4n75O+QHjyO7cbw/vsw5l93K/8EWyjNCAAybYwUmj3M+hjSQZ9P5TVdUgEG08ueMAP5R4FkuSkElZ5tQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-node@4.0.1': + resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@3.0.13': - resolution: {integrity: sha512-zqy/9iwbj8Wysmvi7Lq7XFLeDgjRpTbCfwBhJa8WbrylTAHiAu6oQTwdY7iu2lxigbc9YYr9vPv5SzYny5tCXQ==} - engines: {node: '>=16.0.0'} + '@smithy/eventstream-serde-universal@4.0.1': + resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} + engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@3.0.13': - resolution: {integrity: sha512-L1Ib66+gg9uTnqp/18Gz4MDpJPKRE44geOjOQ2SVc0eiaO5l255ADziATZgjQjqumC7yPtp1XnjHlF1srcwjKw==} - engines: {node: '>=16.0.0'} + '@smithy/fetch-http-handler@5.0.1': + resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} + engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@4.1.2': - resolution: {integrity: sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA==} + '@smithy/hash-blob-browser@4.0.1': + resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} + engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@3.1.10': - resolution: {integrity: sha512-elwslXOoNunmfS0fh55jHggyhccobFkexLYC1ZeZ1xP2BTSrcIBaHV2b4xUQOdctrSNOpMqOZH1r2XzWTEhyfA==} + '@smithy/hash-node@4.0.1': + resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} + engines: {node: '>=18.0.0'} - '@smithy/hash-node@3.0.11': - resolution: {integrity: sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA==} - engines: {node: '>=16.0.0'} + '@smithy/hash-stream-node@4.0.1': + resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} + engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@3.1.10': - resolution: {integrity: sha512-olomK/jZQ93OMayW1zfTHwcbwBdhcZOHsyWyiZ9h9IXvc1mCD/VuvzbLb3Gy/qNJwI4MANPLctTp2BucV2oU/Q==} - engines: {node: '>=16.0.0'} - - '@smithy/invalid-dependency@3.0.11': - resolution: {integrity: sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==} + '@smithy/invalid-dependency@4.0.1': + resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} + engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@3.0.0': - resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==} - engines: {node: '>=16.0.0'} + '@smithy/is-array-buffer@4.0.0': + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} - '@smithy/md5-js@3.0.11': - resolution: {integrity: sha512-3NM0L3i2Zm4bbgG6Ymi9NBcxXhryi3uE8fIfHJZIOfZVxOkGdjdgjR9A06SFIZCfnEIWKXZdm6Yq5/aPXFFhsQ==} + '@smithy/md5-js@4.0.1': + resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@3.0.13': - resolution: {integrity: sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-content-length@4.0.1': + resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@3.2.6': - resolution: {integrity: sha512-WAqzyulvvSKrT5c6VrQelgNVNNO7BlTQW9Z+s9tcG6G5CaBS1YBpPtT3VuhXLQbewSiGi7oXQROwpw26EG9PLQ==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-endpoint@4.0.6': + resolution: {integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@3.0.31': - resolution: {integrity: sha512-yq9wawrJLYHAYFpChLujxRN4My+SiKXvZk9Ml/CvTdRSA8ew+hvuR5LT+mjSlSBv3c4XJrkN8CWegkBaeD0Vrg==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-retry@4.0.7': + resolution: {integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@3.0.11': - resolution: {integrity: sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-serde@4.0.2': + resolution: {integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@3.0.11': - resolution: {integrity: sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA==} - engines: {node: '>=16.0.0'} + '@smithy/middleware-stack@4.0.1': + resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} + engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@3.1.12': - resolution: {integrity: sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ==} - engines: {node: '>=16.0.0'} + '@smithy/node-config-provider@4.0.1': + resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} + engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@3.3.2': - resolution: {integrity: sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA==} - engines: {node: '>=16.0.0'} + '@smithy/node-http-handler@4.0.3': + resolution: {integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==} + engines: {node: '>=18.0.0'} - '@smithy/property-provider@3.1.11': - resolution: {integrity: sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A==} - engines: {node: '>=16.0.0'} + '@smithy/property-provider@4.0.1': + resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} + engines: {node: '>=18.0.0'} - '@smithy/protocol-http@4.1.8': - resolution: {integrity: sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==} - engines: {node: '>=16.0.0'} + '@smithy/protocol-http@5.0.1': + resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@3.0.11': - resolution: {integrity: sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-builder@4.0.1': + resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} + engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@3.0.11': - resolution: {integrity: sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw==} - engines: {node: '>=16.0.0'} + '@smithy/querystring-parser@4.0.1': + resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} + engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@3.0.11': - resolution: {integrity: sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==} - engines: {node: '>=16.0.0'} + '@smithy/service-error-classification@4.0.1': + resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} + engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@3.1.12': - resolution: {integrity: sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q==} - engines: {node: '>=16.0.0'} + '@smithy/shared-ini-file-loader@4.0.1': + resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} + engines: {node: '>=18.0.0'} - '@smithy/signature-v4@4.2.4': - resolution: {integrity: sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA==} - engines: {node: '>=16.0.0'} + '@smithy/signature-v4@5.0.1': + resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@3.5.1': - resolution: {integrity: sha512-PmjskH4Os1Eh3rd5vSsa5uVelZ4DRu+N5CBEgb9AT96hQSJGWSEb6pGxKV/PtKQSIp9ft3+KvnT8ViMKaguzgA==} - engines: {node: '>=16.0.0'} + '@smithy/smithy-client@4.1.6': + resolution: {integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==} + engines: {node: '>=18.0.0'} - '@smithy/types@3.7.2': - resolution: {integrity: sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==} - engines: {node: '>=16.0.0'} + '@smithy/types@4.1.0': + resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} + engines: {node: '>=18.0.0'} - '@smithy/url-parser@3.0.11': - resolution: {integrity: sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw==} + '@smithy/url-parser@4.0.1': + resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} + engines: {node: '>=18.0.0'} - '@smithy/util-base64@3.0.0': - resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-base64@4.0.0': + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@3.0.0': - resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} + '@smithy/util-body-length-browser@4.0.0': + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@3.0.0': - resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} - engines: {node: '>=16.0.0'} + '@smithy/util-body-length-node@4.0.0': + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@3.0.0': - resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==} - engines: {node: '>=16.0.0'} + '@smithy/util-buffer-from@4.0.0': + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@3.0.0': - resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-config-provider@4.0.0': + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@3.0.31': - resolution: {integrity: sha512-eO+zkbqrPnmsagqzrmF7IJrCoU2wTQXWVYxMPqA9Oue55kw9WEvhyuw2XQzTVTCRcYsg6KgmV3YYhLlWQJfK1A==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-browser@4.0.7': + resolution: {integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@3.0.31': - resolution: {integrity: sha512-0/nJfpSpbGZOs6qs42wCe2TdjobbnnD4a3YUUlvTXSQqLy4qa63luDaV04hGvqSHP7wQ7/WGehbvHkDhMZd1MQ==} - engines: {node: '>= 10.0.0'} + '@smithy/util-defaults-mode-node@4.0.7': + resolution: {integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==} + engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@2.1.7': - resolution: {integrity: sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw==} - engines: {node: '>=16.0.0'} + '@smithy/util-endpoints@3.0.1': + resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} + engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@3.0.0': - resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-hex-encoding@4.0.0': + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} - '@smithy/util-middleware@3.0.11': - resolution: {integrity: sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow==} - engines: {node: '>=16.0.0'} + '@smithy/util-middleware@4.0.1': + resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} + engines: {node: '>=18.0.0'} - '@smithy/util-retry@3.0.11': - resolution: {integrity: sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==} - engines: {node: '>=16.0.0'} + '@smithy/util-retry@4.0.1': + resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@3.3.2': - resolution: {integrity: sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg==} - engines: {node: '>=16.0.0'} + '@smithy/util-stream@4.1.2': + resolution: {integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==} + engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@3.0.0': - resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==} - engines: {node: '>=16.0.0'} + '@smithy/util-uri-escape@4.0.0': + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@3.0.0': - resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==} - engines: {node: '>=16.0.0'} + '@smithy/util-utf8@4.0.0': + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} - '@smithy/util-waiter@3.2.0': - resolution: {integrity: sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg==} - engines: {node: '>=16.0.0'} + '@smithy/util-waiter@4.0.2': + resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} + engines: {node: '>=18.0.0'} '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} @@ -1720,10 +1601,10 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/typography@0.5.15': - resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} + '@tailwindcss/typography@0.5.16': + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' + tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1755,17 +1636,17 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/jsonwebtoken@9.0.7': - resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + '@types/jsonwebtoken@9.0.9': + resolution: {integrity: sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@22.5.4': resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} @@ -1802,57 +1683,53 @@ packages: '@types/whatwg-url@11.0.5': resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.18.1': - resolution: {integrity: sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.18.1': - resolution: {integrity: sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.18.1': - resolution: {integrity: sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.18.1': - resolution: {integrity: sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.18.1': - resolution: {integrity: sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.18.1': - resolution: {integrity: sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.18.1': - resolution: {integrity: sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.18.1': - resolution: {integrity: sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1914,8 +1791,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -1949,8 +1826,9 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} @@ -1971,9 +1849,6 @@ packages: resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} - axios@1.4.0: - resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} - axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -1988,20 +1863,30 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + bare-fs@4.0.1: + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + bare-os@3.5.1: + resolution: {integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==} + engines: {bare: '>=1.14.0'} - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.1: - resolution: {integrity: sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==} + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2029,16 +1914,16 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.3: - resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bson-objectid@2.0.4: resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.1: - resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} + bson@6.10.3: + resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} buffer-equal-constant-time@1.0.1: @@ -2057,8 +1942,8 @@ packages: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.8: @@ -2077,8 +1962,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001689: - resolution: {integrity: sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==} + caniuse-lite@1.0.30001701: + resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2146,14 +2031,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2164,13 +2041,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - condense-newlines@0.2.1: - resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} - engines: {node: '>=0.10.0'} - - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - console-table-printer@2.12.1: resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} @@ -2218,16 +2088,16 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dataloader@2.2.3: @@ -2259,8 +2129,8 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -2288,10 +2158,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2323,19 +2189,6 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2346,13 +2199,8 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - editorconfig@1.0.4: - resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} - engines: {node: '>=14'} - hasBin: true - - electron-to-chromium@1.5.74: - resolution: {integrity: sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==} + electron-to-chromium@1.5.109: + resolution: {integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2363,19 +2211,15 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -2386,20 +2230,21 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.0: - resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -2433,8 +2278,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + eslint-import-resolver-typescript@3.8.3: + resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2483,14 +2328,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.2: - resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -2507,8 +2352,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2551,10 +2396,6 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - fast-base64-decode@1.0.0: resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} @@ -2571,8 +2412,8 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2588,18 +2429,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2629,32 +2470,20 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.1: - resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} - engines: {node: '>= 6'} - fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -2672,8 +2501,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -2688,18 +2517,25 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -2744,8 +2580,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-http@1.22.3: - resolution: {integrity: sha512-sgUz/2DZt+QvY6WrpAsAXUvhnIkp2eX9jN78V8DAtFcpZi/nfDrzDt2byYjyoJzRcWuqhE0K63g1QMewt73U6A==} + graphql-http@1.22.4: + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' @@ -2763,8 +2599,9 @@ packages: resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -2795,15 +2632,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - html-to-text@9.0.3: - resolution: {integrity: sha512-hxDF1kVCF2uw4VUJ3vr2doc91pXf2D5ngKcNviSitNkhP9OMOaJkDrFIFL6RMvko7NisWTEiqGpQ9LAxcVok1w==} - engines: {node: '>=14'} - - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - - http-status@1.6.2: - resolution: {integrity: sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ==} + http-status@2.1.0: + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} engines: {node: '>= 0.4.0'} ieee754@1.2.1: @@ -2813,16 +2643,16 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} + image-size@1.2.0: + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} engines: {node: '>=16.x'} hasBin: true immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -2843,8 +2673,8 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - intl-messageformat@10.7.10: - resolution: {integrity: sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==} + intl-messageformat@10.7.15: + resolution: {integrity: sha512-LRyExsEsefQSBjU2p47oAheoKz+EOJxSLDdjOaEjdriajfHsMXOmV/EhMvYSg9bAgCUHasuAC+mcUBe/95PfIg==} is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -2862,8 +2692,8 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: @@ -2874,8 +2704,8 @@ packages: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.2.1: - resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} is-buffer@1.1.6: @@ -2888,8 +2718,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2903,24 +2733,20 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -2934,10 +2760,6 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -2954,8 +2776,8 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-string@1.1.1: @@ -2966,26 +2788,22 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.1.0: - resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-whitespace@0.3.0: - resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} - engines: {node: '>=0.10.0'} - isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -3004,15 +2822,15 @@ packages: isomorphic.js@0.2.5: resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} - iterator.prototype@1.1.4: - resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jose@5.9.6: @@ -3022,18 +2840,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} - engines: {node: '>=14'} - hasBin: true - js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3074,6 +2883,10 @@ packages: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} + jsox@1.2.121: + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} + hasBin: true + jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3091,10 +2904,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -3106,15 +2915,12 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} - leac@0.6.0: - resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lexical@0.20.0: - resolution: {integrity: sha512-lJEHLFACXqRf3u/VlIOu9T7MJ51O4la92uOBwiS9Sx+juDK3Nrru5Vgl1aUirV1qK8XEM3h6Org2HcrsrzZ3ZA==} + lexical@0.21.0: + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} lib0@0.2.99: resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} @@ -3177,8 +2983,8 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} md5@2.3.0: @@ -3209,8 +3015,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-core-commonmark@2.0.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-mdx-jsx@3.0.1: resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} @@ -3269,30 +3075,22 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.3: - resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -3300,10 +3098,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@9.0.1: - resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3326,15 +3120,15 @@ packages: monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - mongodb-connection-string-url@3.0.1: - resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} + mongodb-connection-string-url@3.0.2: + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} - mongodb@6.10.0: - resolution: {integrity: sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==} + mongodb@6.12.0: + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.1.0 + '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 gcp-metadata: ^5.2.0 kerberos: ^2.0.1 mongodb-client-encryption: '>=6.0.0 <7' @@ -3364,8 +3158,8 @@ packages: resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} engines: {node: '>=4.0.0'} - mongoose@8.8.3: - resolution: {integrity: sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==} + mongoose@8.9.5: + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} engines: {node: '>=16.20.1'} mpath@0.9.0: @@ -3387,8 +3181,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3397,14 +3191,14 @@ packages: resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} - next-intl@3.26.1: - resolution: {integrity: sha512-TE4cQgXNw4jzEtVPdiYQOCmhAu+Z2qoUppCMxPkJoz8XXe8TdqiNEPhD/GtXEsI80nV6NnVAq3hyTHH5+ex6Hw==} + next-intl@3.26.5: + resolution: {integrity: sha512-EQlCIfY0jOhRldiFxwSXG+ImwkQtDEfQeSOEQp6ieAGSLWGlgjdb/Ck/O7wMfC430ZHGeUKVKax8KGusTPKCgg==} peerDependencies: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - next@15.1.0: - resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} + next@15.2.0: + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -3424,8 +3218,8 @@ packages: sass: optional: true - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} engines: {node: '>=10'} node-addon-api@6.1.0: @@ -3443,18 +3237,13 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nodemailer@6.9.10: - resolution: {integrity: sha512-qtoKfGFhvIFW5kLfrkw2R6Nm6Ur4LNUMykyqu6n9BRKJuyQrqEGwdXXUAbwWEKt33dlWUGXb7rzmJP/p4+O+CA==} + nodemailer@6.9.16: + resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} engines: {node: '>=6.0.0'} noms@0.0.0: resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3471,8 +3260,8 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} object-keys@1.1.1: @@ -3482,8 +3271,8 @@ packages: object-to-formdata@4.5.1: resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -3498,8 +3287,8 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} on-exit-leak-free@2.1.2: @@ -3513,6 +3302,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3535,9 +3328,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parseley@0.11.0: - resolution: {integrity: sha512-VfcwXlBWgTF+unPcr7yu3HSSA6QUdDaDnrHcytVfj5Z8azAyKBDrYnSIfeSxlrEayndNcLmrXzg+Vxbo6DWRXQ==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3564,24 +3354,21 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - payload-admin-bar@1.0.6: - resolution: {integrity: sha512-hpQdOiPq4LpWTkbuAnvxDf5wQ2ysMp9kQt+X2U+FfvBwD1U6qoxJfmUymG1OjLlaZzCZ93FlOdTl4u4Z0/m/SA==} + payload-admin-bar@1.0.7: + resolution: {integrity: sha512-eY/FjfCGkyXOxRupv4IPZ+HFh8CQnJBQS++VItgTXe/g9H0B4RqxfdpU3g3tART3e8MzmZYGOBxV5EGGO2+jbg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - payload@3.11.0: - resolution: {integrity: sha512-OdPS95bn5JxurxBZK5HzQiED4T1nR6MZbX8zQSppTHBPL7chsujLl7U9BGMgY1njA26rOoy/mjZc2v4phhWAtw==} + payload@3.25.0: + resolution: {integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==} engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: graphql: ^16.8.1 - peberminta@0.8.0: - resolution: {integrity: sha512-YYEs+eauIjDH5nUEGi18EohWE0nV2QbGTqmxQcqgZ/0g+laPCQmuIqq7EBLVi9uim9zMgfJv0QBZEnQ3uHw/Tw==} - - peek-readable@5.3.1: - resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + peek-readable@5.4.2: + resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} picocolors@1.1.1: @@ -3621,8 +3408,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} postcss-import@15.1.0: @@ -3670,12 +3457,12 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.2: - resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} hasBin: true @@ -3683,15 +3470,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true - pretty@2.0.0: - resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} - engines: {node: '>=0.10.0'} - prism-react-renderer@2.4.1: resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: @@ -3704,8 +3487,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} @@ -3714,12 +3497,6 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -3734,9 +3511,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - queue@6.0.2: resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} @@ -3747,23 +3521,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-datepicker@7.5.0: - resolution: {integrity: sha512-6MzeamV8cWSOcduwePHfGqY40acuGlS1cG//ePHT6bVbLxWyqngaStenfH03n1wbzOibFggF66kWaBTb1SbTtQ==} + react-datepicker@7.6.0: + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: - react: ^16.9.0 || ^17 || ^18 - react-dom: ^16.9.0 || ^17 || ^18 + react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-diff-viewer-continued@3.2.6: - resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} - engines: {node: '>= 8'} + react-diff-viewer-continued@4.0.4: + resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + engines: {node: '>= 16'} peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom@19.0.0: resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} @@ -3805,8 +3574,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.1: - resolution: {integrity: sha512-jWEvWQidZ/C/FnFlUIB1mDLpY3r7uEb22WZ3uVeKj520caKDiaBsNDEB9J1gHJgpiLo+eTdPl2MVi0JitFTiFg==} + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' @@ -3837,10 +3606,6 @@ packages: react: '>=16.6.0' react-dom: '>=16.6.0' - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -3866,15 +3631,15 @@ packages: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} - reflect.getprototypeof@1.0.8: - resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} require-directory@2.1.1: @@ -3885,9 +3650,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - resend@0.17.2: - resolution: {integrity: sha512-lakm76u4MiIDeMF1s2tCmjtksOhwZOs4WcAXkA7aUTvl+63/h+0h6Q6WnkB8RGtj6GakUhQuUkiZshfXgtIrGw==} - resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3895,16 +3657,17 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.9: - resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: @@ -3920,6 +3683,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -3936,9 +3703,6 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.25.0: resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} @@ -3948,15 +3712,12 @@ packages: secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - selderee@0.10.0: - resolution: {integrity: sha512-DEL/RW/f4qLw/NrVg97xKaEBC8IpzIG2fvxnzCp3Z4yk4jQ3MXom+Imav9wApjxX2dfS3eW7x0DXafJr85i39A==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -3968,6 +3729,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + sharp@0.32.6: resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} engines: {node: '>=14.15.0'} @@ -4025,8 +3790,8 @@ packages: sonic-boom@4.2.0: resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.1: - resolution: {integrity: sha512-b6LHBfH32SoVasRFECrdY8p8s7hXPDn3OHUFbZZbiB1ctLS9Gdh6rpX2dVrpQA0kiL5jcRzDDldwwLkSKk3+QQ==} + sonner@1.7.4: + resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -4059,8 +3824,8 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - streamx@2.21.1: - resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -4074,8 +3839,8 @@ packages: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: @@ -4125,8 +3890,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} strtok3@8.1.0: resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} @@ -4164,16 +3929,16 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.5.5: - resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==} + tailwind-merge@2.6.0: + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.16: - resolution: {integrity: sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==} + tailwindcss@3.4.17: + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} hasBin: true @@ -4181,11 +3946,11 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -4210,8 +3975,8 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -4225,18 +3990,18 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-essentials@10.0.3: resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} @@ -4270,28 +4035,24 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@3.13.0: - resolution: {integrity: sha512-Gur3yQGM9qiLNs0KPP7LPgeRbio2QTt4xXouobMCarR0/wyW3F+F/+OWwshg3NG0Adon7uQfSZBpB46NfhoF1A==} - engines: {node: '>=14.16'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -4328,8 +4089,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4337,12 +4098,12 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-callback-ref@1.3.2: - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: '@types/react': optional: true @@ -4353,8 +4114,8 @@ packages: react: '>=18.0.0' scheduler: '>=0.19.0' - use-intl@3.26.1: - resolution: {integrity: sha512-MZhtSBcMrDna3xs1T6O7CAXx4wRfm1eGyUYrDCCnW9qTOGZurCH5k/X6ChDl6EI4f+qYEtXQCRMkQUVOIhJWTQ==} + use-intl@3.26.5: + resolution: {integrity: sha512-OdsJnC/znPvHCHLQH/duvQNXnP1w0hPfS+tkSi3mAbfjYBGh4JnyfdwkQBfIVf7t8gs9eSX/CntxUMvtKdG2MQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -4401,9 +4162,9 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - whatwg-url@13.0.0: - resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} - engines: {node: '>=16'} + whatwg-url@14.1.1: + resolution: {integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==} + engines: {node: '>=18'} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -4420,8 +4181,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4444,8 +4205,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.1: + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4473,8 +4234,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -4486,8 +4247,8 @@ packages: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} - yjs@13.6.20: - resolution: {integrity: sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==} + yjs@13.6.23: + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: @@ -4501,7 +4262,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@apidevtools/json-schema-ref-parser@11.7.3': + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -4510,21 +4271,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-locate-window': 3.693.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -4533,21 +4294,21 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-locate-window': 3.693.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -4556,942 +4317,516 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.714.0 + '@aws-sdk/types': 3.734.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.713.0': + '@aws-sdk/client-cognito-identity@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.717.0': + '@aws-sdk/client-s3@3.758.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-bucket-endpoint': 3.714.0 - '@aws-sdk/middleware-expect-continue': 3.714.0 - '@aws-sdk/middleware-flexible-checksums': 3.717.0 - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-location-constraint': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-sdk-s3': 3.716.0 - '@aws-sdk/middleware-ssec': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/signature-v4-multi-region': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@aws-sdk/xml-builder': 3.709.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/eventstream-serde-browser': 3.0.14 - '@smithy/eventstream-serde-config-resolver': 3.0.11 - '@smithy/eventstream-serde-node': 3.0.13 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-blob-browser': 3.1.10 - '@smithy/hash-node': 3.0.11 - '@smithy/hash-stream-node': 3.1.10 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/md5-js': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 - '@smithy/util-waiter': 3.2.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/middleware-bucket-endpoint': 3.734.0 + '@aws-sdk/middleware-expect-continue': 3.734.0 + '@aws-sdk/middleware-flexible-checksums': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-location-constraint': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/middleware-ssec': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/signature-v4-multi-region': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/xml-builder': 3.734.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/eventstream-serde-browser': 4.0.1 + '@smithy/eventstream-serde-config-resolver': 4.0.1 + '@smithy/eventstream-serde-node': 4.0.1 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-blob-browser': 4.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/hash-stream-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/md5-js': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 + '@smithy/util-waiter': 4.0.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/client-sso@3.758.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/core@3.758.0': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.713.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.716.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.713.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/middleware-host-header': 3.713.0 - '@aws-sdk/middleware-logger': 3.713.0 - '@aws-sdk/middleware-recursion-detection': 3.713.0 - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/region-config-resolver': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@aws-sdk/util-user-agent-browser': 3.713.0 - '@aws-sdk/util-user-agent-node': 3.713.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.716.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-node': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/middleware-host-header': 3.714.0 - '@aws-sdk/middleware-logger': 3.714.0 - '@aws-sdk/middleware-recursion-detection': 3.714.0 - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/region-config-resolver': 3.714.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@aws-sdk/util-user-agent-browser': 3.714.0 - '@aws-sdk/util-user-agent-node': 3.716.0 - '@smithy/config-resolver': 3.0.13 - '@smithy/core': 2.5.5 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/hash-node': 3.0.11 - '@smithy/invalid-dependency': 3.0.11 - '@smithy/middleware-content-length': 3.0.13 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-retry': 3.0.31 - '@smithy/middleware-serde': 3.0.11 - '@smithy/middleware-stack': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/node-http-handler': 3.3.2 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-base64': 3.0.0 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-body-length-node': 3.0.0 - '@smithy/util-defaults-mode-browser': 3.0.31 - '@smithy/util-defaults-mode-node': 3.0.31 - '@smithy/util-endpoints': 2.1.7 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 - '@smithy/util-utf8': 3.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.713.0': - dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/core@3.716.0': + '@aws-sdk/credential-provider-cognito-identity@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - fast-xml-parser: 4.4.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-cognito-identity@3.713.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.713.0': + '@aws-sdk/credential-provider-env@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.716.0': + '@aws-sdk/credential-provider-http@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/property-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.713.0': + '@aws-sdk/credential-provider-ini@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.716.0': - dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/property-provider': 3.1.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0)': - dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-provider-node@3.758.0': dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-ini@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/credential-provider-process@3.758.0': dependencies: - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/credential-provider-env': 3.716.0 - '@aws-sdk/credential-provider-http': 3.716.0 - '@aws-sdk/credential-provider-process': 3.716.0 - '@aws-sdk/credential-provider-sso': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.758.0': + dependencies: + '@aws-sdk/client-sso': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/token-providers': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - '@aws-sdk/credential-provider-node@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-provider-web-identity@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0)': + '@aws-sdk/credential-providers@3.758.0': dependencies: - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/credential-provider-cognito-identity': 3.758.0 + '@aws-sdk/credential-provider-env': 3.758.0 + '@aws-sdk/credential-provider-http': 3.758.0 + '@aws-sdk/credential-provider-ini': 3.758.0 + '@aws-sdk/credential-provider-node': 3.758.0 + '@aws-sdk/credential-provider-process': 3.758.0 + '@aws-sdk/credential-provider-sso': 3.758.0 + '@aws-sdk/credential-provider-web-identity': 3.758.0 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/core': 3.1.5 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - aws-crt - '@aws-sdk/credential-provider-node@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0)': + '@aws-sdk/lib-storage@3.758.0(@aws-sdk/client-s3@3.758.0)': dependencies: - '@aws-sdk/credential-provider-env': 3.716.0 - '@aws-sdk/credential-provider-http': 3.716.0 - '@aws-sdk/credential-provider-ini': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/credential-provider-process': 3.716.0 - '@aws-sdk/credential-provider-sso': 3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - '@aws-sdk/client-sts' - - aws-crt - - '@aws-sdk/credential-provider-process@3.713.0': - dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.716.0': - dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))': - dependencies: - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/token-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0)) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/token-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-sso@3.716.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/token-providers': 3.714.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.713.0(@aws-sdk/client-sts@3.713.0)': - dependencies: - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-web-identity@3.716.0(@aws-sdk/client-sts@3.716.0)': - dependencies: - '@aws-sdk/client-sts': 3.716.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/client-sso': 3.713.0 - '@aws-sdk/client-sts': 3.713.0 - '@aws-sdk/core': 3.713.0 - '@aws-sdk/credential-provider-cognito-identity': 3.713.0 - '@aws-sdk/credential-provider-env': 3.713.0 - '@aws-sdk/credential-provider-http': 3.713.0 - '@aws-sdk/credential-provider-ini': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-node': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/credential-provider-process': 3.713.0 - '@aws-sdk/credential-provider-sso': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/credential-provider-web-identity': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - - aws-crt - - '@aws-sdk/lib-storage@3.717.0(@aws-sdk/client-s3@3.717.0)': - dependencies: - '@aws-sdk/client-s3': 3.717.0 - '@smithy/abort-controller': 3.1.9 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/smithy-client': 3.5.1 + '@aws-sdk/client-s3': 3.758.0 + '@smithy/abort-controller': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/smithy-client': 4.1.6 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.714.0': + '@aws-sdk/middleware-bucket-endpoint@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-arn-parser': 3.693.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.714.0': + '@aws-sdk/middleware-expect-continue@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.717.0': + '@aws-sdk/middleware-flexible-checksums@3.758.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/is-array-buffer': 3.0.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.713.0': + '@aws-sdk/middleware-host-header@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.714.0': + '@aws-sdk/middleware-location-constraint@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.714.0': + '@aws-sdk/middleware-logger@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.713.0': + '@aws-sdk/middleware-recursion-detection@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.714.0': + '@aws-sdk/middleware-sdk-s3@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-arn-parser': 3.723.0 + '@smithy/core': 3.1.5 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.713.0': + '@aws-sdk/middleware-ssec@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.714.0': + '@aws-sdk/middleware-user-agent@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@smithy/core': 3.1.5 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.716.0': + '@aws-sdk/nested-clients@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-arn-parser': 3.693.0 - '@smithy/core': 2.5.5 - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.758.0 + '@aws-sdk/middleware-host-header': 3.734.0 + '@aws-sdk/middleware-logger': 3.734.0 + '@aws-sdk/middleware-recursion-detection': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/region-config-resolver': 3.734.0 + '@aws-sdk/types': 3.734.0 + '@aws-sdk/util-endpoints': 3.743.0 + '@aws-sdk/util-user-agent-browser': 3.734.0 + '@aws-sdk/util-user-agent-node': 3.758.0 + '@smithy/config-resolver': 4.0.1 + '@smithy/core': 3.1.5 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/hash-node': 4.0.1 + '@smithy/invalid-dependency': 4.0.1 + '@smithy/middleware-content-length': 4.0.1 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-retry': 4.0.7 + '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-stack': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/protocol-http': 5.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-base64': 4.0.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-body-length-node': 4.0.0 + '@smithy/util-defaults-mode-browser': 4.0.7 + '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-endpoints': 3.0.1 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/middleware-ssec@3.714.0': + '@aws-sdk/region-config-resolver@3.734.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.713.0': + '@aws-sdk/signature-v4-multi-region@3.758.0': dependencies: - '@aws-sdk/core': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@aws-sdk/util-endpoints': 3.713.0 - '@smithy/core': 2.5.5 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/middleware-sdk-s3': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/signature-v4': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.716.0': + '@aws-sdk/token-providers@3.758.0': dependencies: - '@aws-sdk/core': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@aws-sdk/util-endpoints': 3.714.0 - '@smithy/core': 2.5.5 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@aws-sdk/nested-clients': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - '@aws-sdk/region-config-resolver@3.713.0': + '@aws-sdk/types@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.714.0': - dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.716.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/signature-v4': 4.2.4 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.713.0(@aws-sdk/client-sso-oidc@3.713.0(@aws-sdk/client-sts@3.713.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.713.0(@aws-sdk/client-sts@3.713.0) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.713.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.714.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))': - dependencies: - '@aws-sdk/client-sso-oidc': 3.716.0(@aws-sdk/client-sts@3.716.0) - '@aws-sdk/types': 3.714.0 - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/types@3.713.0': - dependencies: - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/types@3.714.0': - dependencies: - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.693.0': + '@aws-sdk/util-arn-parser@3.723.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.713.0': + '@aws-sdk/util-endpoints@3.743.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 - '@smithy/util-endpoints': 2.1.7 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 + '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.714.0': - dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 - '@smithy/util-endpoints': 2.1.7 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.693.0': + '@aws-sdk/util-locate-window@3.723.0': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.713.0': + '@aws-sdk/util-user-agent-browser@3.734.0': dependencies: - '@aws-sdk/types': 3.713.0 - '@smithy/types': 3.7.2 + '@aws-sdk/types': 3.734.0 + '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.714.0': + '@aws-sdk/util-user-agent-node@3.758.0': dependencies: - '@aws-sdk/types': 3.714.0 - '@smithy/types': 3.7.2 - bowser: 2.11.0 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.713.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.713.0 - '@aws-sdk/types': 3.713.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.716.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.716.0 - '@aws-sdk/types': 3.714.0 - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 + '@aws-sdk/middleware-user-agent': 3.758.0 + '@aws-sdk/types': 3.734.0 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.709.0': + '@aws-sdk/xml-builder@3.734.0': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@babel/code-frame@7.26.2': @@ -5500,18 +4835,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.3': + '@babel/generator@7.26.9': dependencies: - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/traverse': 7.26.9 + '@babel/types': 7.26.9 transitivePeerDependencies: - supports-color @@ -5519,37 +4854,39 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.9': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.9 - '@babel/runtime@7.26.0': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.9': + '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.3 - '@babel/types': 7.26.3 + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 - '@babel/traverse@7.26.4': + '@babel/traverse@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.3 + '@babel/generator': 7.26.9 + '@babel/parser': 7.26.9 + '@babel/template': 7.26.9 + '@babel/types': 7.26.9 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.3': + '@babel/types@7.26.9': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@date-fns/tz@1.2.0': {} + '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -5583,7 +4920,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -5620,7 +4957,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@19.0.1)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -5726,45 +5063,46 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.1': + '@eslint/config-array@0.19.2': dependencies: - '@eslint/object-schema': 2.1.5 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.9.1': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.21.0': {} - '@eslint/object-schema@2.1.5': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.4': + '@eslint/plugin-kit@0.2.7': dependencies: + '@eslint/core': 0.12.0 levn: 0.4.1 '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -5775,64 +5113,68 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/core@1.6.8': + '@floating-ui/core@1.6.9': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': + '@floating-ui/dom@1.6.13': dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.8': {} + '@floating-ui/utils@0.2.9': {} - '@formatjs/ecma402-abstract@2.3.1': + '@formatjs/ecma402-abstract@2.3.3': dependencies: - '@formatjs/fast-memoize': 2.2.5 - '@formatjs/intl-localematcher': 0.5.9 - decimal.js: 10.4.3 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/intl-localematcher': 0.6.0 + decimal.js: 10.5.0 tslib: 2.8.1 - '@formatjs/fast-memoize@2.2.5': + '@formatjs/fast-memoize@2.2.6': dependencies: tslib: 2.8.1 - '@formatjs/icu-messageformat-parser@2.9.7': + '@formatjs/icu-messageformat-parser@2.11.1': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 - '@formatjs/icu-skeleton-parser': 1.8.11 + '@formatjs/ecma402-abstract': 2.3.3 + '@formatjs/icu-skeleton-parser': 1.8.13 tslib: 2.8.1 - '@formatjs/icu-skeleton-parser@1.8.11': + '@formatjs/icu-skeleton-parser@1.8.13': dependencies: - '@formatjs/ecma402-abstract': 2.3.1 + '@formatjs/ecma402-abstract': 2.3.3 tslib: 2.8.1 - '@formatjs/intl-localematcher@0.5.9': + '@formatjs/intl-localematcher@0.5.10': + dependencies: + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.6.0': dependencies: tslib: 2.8.1 @@ -5847,7 +5189,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -5952,203 +5294,200 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@lexical/clipboard@0.20.0': + '@lexical/clipboard@0.21.0': dependencies: - '@lexical/html': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/code@0.20.0': + '@lexical/code@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 prismjs: 1.29.0 - '@lexical/devtools-core@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@lexical/devtools-core@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@lexical/dragon@0.20.0': + '@lexical/dragon@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/hashtag@0.20.0': + '@lexical/hashtag@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/headless@0.20.0': + '@lexical/headless@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/history@0.20.0': + '@lexical/history@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/html@0.20.0': + '@lexical/html@0.21.0': dependencies: - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/link@0.20.0': + '@lexical/link@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/list@0.20.0': + '@lexical/list@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/mark@0.20.0': + '@lexical/mark@0.21.0': dependencies: - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/markdown@0.20.0': + '@lexical/markdown@0.21.0': dependencies: - '@lexical/code': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/code': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/offset@0.20.0': + '@lexical/offset@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/overflow@0.20.0': + '@lexical/overflow@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/plain-text@0.20.0': + '@lexical/plain-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/react@0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20)': + '@lexical/react@0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23)': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/code': 0.20.0 - '@lexical/devtools-core': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/dragon': 0.20.0 - '@lexical/hashtag': 0.20.0 - '@lexical/history': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/markdown': 0.20.0 - '@lexical/overflow': 0.20.0 - '@lexical/plain-text': 0.20.0 - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/text': 0.20.0 - '@lexical/utils': 0.20.0 - '@lexical/yjs': 0.20.0(yjs@13.6.20) - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/code': 0.21.0 + '@lexical/devtools-core': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/dragon': 0.21.0 + '@lexical/hashtag': 0.21.0 + '@lexical/history': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/markdown': 0.21.0 + '@lexical/overflow': 0.21.0 + '@lexical/plain-text': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/text': 0.21.0 + '@lexical/utils': 0.21.0 + '@lexical/yjs': 0.21.0(yjs@13.6.23) + lexical: 0.21.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 3.1.4(react@19.0.0) transitivePeerDependencies: - yjs - '@lexical/rich-text@0.20.0': + '@lexical/rich-text@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/selection@0.20.0': + '@lexical/selection@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/table@0.20.0': + '@lexical/table@0.21.0': dependencies: - '@lexical/clipboard': 0.20.0 - '@lexical/utils': 0.20.0 - lexical: 0.20.0 + '@lexical/clipboard': 0.21.0 + '@lexical/utils': 0.21.0 + lexical: 0.21.0 - '@lexical/text@0.20.0': + '@lexical/text@0.21.0': dependencies: - lexical: 0.20.0 + lexical: 0.21.0 - '@lexical/utils@0.20.0': + '@lexical/utils@0.21.0': dependencies: - '@lexical/list': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - lexical: 0.20.0 + '@lexical/list': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + lexical: 0.21.0 - '@lexical/yjs@0.20.0(yjs@13.6.20)': + '@lexical/yjs@0.21.0(yjs@13.6.23)': dependencies: - '@lexical/offset': 0.20.0 - '@lexical/selection': 0.20.0 - lexical: 0.20.0 - yjs: 13.6.20 + '@lexical/offset': 0.21.0 + '@lexical/selection': 0.21.0 + lexical: 0.21.0 + yjs: 13.6.23 - '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': + '@monaco-editor/loader@1.5.0': dependencies: - monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) + '@monaco-editor/loader': 1.5.0 monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.1.9': + '@mongodb-js/saslprep@1.2.0': dependencies: sparse-bitfield: 3.0.3 - '@next/env@15.1.0': {} - - '@next/env@15.1.2': {} + '@next/env@15.2.0': {} '@next/eslint-plugin-next@15.1.0': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.0': + '@next/swc-darwin-arm64@15.2.0': optional: true - '@next/swc-darwin-x64@15.1.0': + '@next/swc-darwin-x64@15.2.0': optional: true - '@next/swc-linux-arm64-gnu@15.1.0': + '@next/swc-linux-arm64-gnu@15.2.0': optional: true - '@next/swc-linux-arm64-musl@15.1.0': + '@next/swc-linux-arm64-musl@15.2.0': optional: true - '@next/swc-linux-x64-gnu@15.1.0': + '@next/swc-linux-x64-gnu@15.2.0': optional: true - '@next/swc-linux-x64-musl@15.1.0': + '@next/swc-linux-x64-musl@15.2.0': optional: true - '@next/swc-win32-arm64-msvc@15.1.0': + '@next/swc-win32-arm64-msvc@15.2.0': optional: true - '@next/swc-win32-x64-msvc@15.1.0': + '@next/swc-win32-x64-msvc@15.2.0': optional: true '@nodelib/fs.scandir@2.1.5': @@ -6161,19 +5500,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@nolyfill/is-core-module@1.0.39': {} - '@one-ini/wasm@0.1.1': {} - - '@payloadcms/db-mongodb@3.11.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/db-mongodb@3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - http-status: 1.6.2 - mongoose: 8.8.3(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))) + mongoose: 8.9.5(@aws-sdk/credential-providers@3.758.0) mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -6186,49 +5522,49 @@ snapshots: - socks - supports-color - '@payloadcms/email-nodemailer@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/email-nodemailer@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - nodemailer: 6.9.10 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/graphql@3.11.0(graphql@16.10.0)(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(typescript@5.7.2)': + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) pluralize: 8.0.0 - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/live-preview-react@3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@payloadcms/live-preview-react@3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@payloadcms/live-preview': 3.11.0 + '@payloadcms/live-preview': 3.25.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@payloadcms/live-preview@3.11.0': {} + '@payloadcms/live-preview@3.25.0': {} - '@payloadcms/next@3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.11.0(graphql@16.10.0)(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(typescript@5.7.2) - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) busboy: 1.6.0 + dequal: 2.0.3 file-type: 19.3.0 graphql: 16.10.0 - graphql-http: 1.22.3(graphql@16.10.0) + graphql-http: 1.22.4(graphql@16.10.0) graphql-playground-html: 1.6.30 - http-status: 1.6.2 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + http-status: 2.1.0 + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 - react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 - sonner: 1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -6238,28 +5574,25 @@ snapshots: - supports-color - typescript - '@payloadcms/payload-cloud@3.11.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/payload-cloud@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - '@aws-sdk/client-cognito-identity': 3.713.0 - '@aws-sdk/client-s3': 3.717.0 - '@aws-sdk/credential-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) - '@aws-sdk/lib-storage': 3.717.0(@aws-sdk/client-s3@3.717.0) - '@payloadcms/email-nodemailer': 3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)) + '@aws-sdk/client-cognito-identity': 3.758.0 + '@aws-sdk/client-s3': 3.758.0 + '@aws-sdk/credential-providers': 3.758.0 + '@aws-sdk/lib-storage': 3.758.0(@aws-sdk/client-s3@3.758.0) + '@payloadcms/email-nodemailer': 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) amazon-cognito-identity-js: 6.3.12 - nodemailer: 6.9.10 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - resend: 0.17.2 + nodemailer: 6.9.16 + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) transitivePeerDependencies: - - '@aws-sdk/client-sso-oidc' - aws-crt - - debug - encoding - '@payloadcms/plugin-form-builder@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-form-builder@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) escape-html: 1.0.3 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6269,19 +5602,19 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-nested-docs@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/plugin-nested-docs@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-redirects@3.11.0(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))': + '@payloadcms/plugin-redirects@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': dependencies: - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) - '@payloadcms/plugin-search@3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-search@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/next': 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6292,11 +5625,11 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-seo@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/plugin-seo@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -6306,37 +5639,38 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.11.0(7ul3c6beuv3aho36y23w6b4pou)': + '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@lexical/headless': 0.20.0 - '@lexical/html': 0.20.0 - '@lexical/link': 0.20.0 - '@lexical/list': 0.20.0 - '@lexical/mark': 0.20.0 - '@lexical/react': 0.20.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.20) - '@lexical/rich-text': 0.20.0 - '@lexical/selection': 0.20.0 - '@lexical/table': 0.20.0 - '@lexical/utils': 0.20.0 - '@payloadcms/next': 3.11.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) - '@payloadcms/translations': 3.11.0 - '@payloadcms/ui': 3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@lexical/headless': 0.21.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/react': 0.21.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yjs@13.6.23) + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + '@payloadcms/next': 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.25.0 + '@payloadcms/ui': 3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 dequal: 2.0.3 escape-html: 1.0.3 - lexical: 0.20.0 + jsox: 1.2.121 + lexical: 0.21.0 mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 4.1.2(react@19.0.0) - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -6344,37 +5678,38 @@ snapshots: - next - supports-color - typescript + - yjs - '@payloadcms/translations@3.11.0': + '@payloadcms/translations@3.25.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.11.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2)': + '@payloadcms/ui@3.25.0(@types/react@19.0.1)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: + '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.11.0 - body-scroll-lock: 4.0.0-beta.0 + '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.25.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2) + payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) qs-esm: 7.0.2 react: 19.0.0 - react-datepicker: 7.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react-dom: 19.0.0(react@19.0.0) react-image-crop: 10.1.8(react@19.0.0) react-select: 5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - ts-essentials: 10.0.3(typescript@5.7.2) + sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 transitivePeerDependencies: @@ -6390,22 +5725,22 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.1)(react@19.0.0) @@ -6415,12 +5750,12 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -6445,11 +5780,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 @@ -6464,10 +5799,10 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -6482,22 +5817,22 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.1)(react@19.0.0) @@ -6509,9 +5844,9 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -6529,45 +5864,45 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-direction': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-id': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.2(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.1)(react@19.0.0) - '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.1(@types/react@19.0.1)(react@19.0.0) + react-remove-scroll: 2.6.3(@types/react@19.0.1)(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 - '@radix-ui/react-slot@1.1.1(@types/react@19.0.1)(react@19.0.0)': + '@radix-ui/react-slot@1.1.2(@types/react@19.0.1)(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) react: 19.0.0 @@ -6620,9 +5955,9 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -6631,266 +5966,254 @@ snapshots: '@radix-ui/rect@1.1.0': {} - '@react-email/render@0.0.7': - dependencies: - html-to-text: 9.0.3 - pretty: 2.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.10.4': {} + '@rushstack/eslint-patch@1.10.5': {} - '@selderee/plugin-htmlparser2@0.10.0': + '@smithy/abort-controller@4.0.1': dependencies: - domhandler: 5.0.3 - selderee: 0.10.0 - - '@smithy/abort-controller@3.1.9': - dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@3.0.1': + '@smithy/chunked-blob-reader-native@4.0.0': dependencies: - '@smithy/util-base64': 3.0.0 + '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@4.0.0': + '@smithy/chunked-blob-reader@5.0.0': dependencies: tslib: 2.8.1 - '@smithy/config-resolver@3.0.13': + '@smithy/config-resolver@4.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/util-config-provider': 3.0.0 - '@smithy/util-middleware': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-config-provider': 4.0.0 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@2.5.5': + '@smithy/core@3.1.5': dependencies: - '@smithy/middleware-serde': 3.0.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-body-length-browser': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-stream': 3.3.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/middleware-serde': 4.0.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-body-length-browser': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-stream': 4.1.2 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@3.2.8': + '@smithy/credential-provider-imds@4.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 tslib: 2.8.1 - '@smithy/eventstream-codec@3.1.10': + '@smithy/eventstream-codec@4.0.1': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 3.7.2 - '@smithy/util-hex-encoding': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-hex-encoding': 4.0.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@3.0.14': + '@smithy/eventstream-serde-browser@4.0.1': dependencies: - '@smithy/eventstream-serde-universal': 3.0.13 - '@smithy/types': 3.7.2 + '@smithy/eventstream-serde-universal': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@3.0.11': + '@smithy/eventstream-serde-config-resolver@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@3.0.13': + '@smithy/eventstream-serde-node@4.0.1': dependencies: - '@smithy/eventstream-serde-universal': 3.0.13 - '@smithy/types': 3.7.2 + '@smithy/eventstream-serde-universal': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@3.0.13': + '@smithy/eventstream-serde-universal@4.0.1': dependencies: - '@smithy/eventstream-codec': 3.1.10 - '@smithy/types': 3.7.2 + '@smithy/eventstream-codec': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@4.1.2': + '@smithy/fetch-http-handler@5.0.1': dependencies: - '@smithy/protocol-http': 4.1.8 - '@smithy/querystring-builder': 3.0.11 - '@smithy/types': 3.7.2 - '@smithy/util-base64': 3.0.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@3.1.10': + '@smithy/hash-blob-browser@4.0.1': dependencies: - '@smithy/chunked-blob-reader': 4.0.0 - '@smithy/chunked-blob-reader-native': 3.0.1 - '@smithy/types': 3.7.2 + '@smithy/chunked-blob-reader': 5.0.0 + '@smithy/chunked-blob-reader-native': 4.0.0 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/hash-node@3.0.11': + '@smithy/hash-node@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/hash-stream-node@3.1.10': + '@smithy/hash-stream-node@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/invalid-dependency@3.0.11': + '@smithy/invalid-dependency@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@3.0.0': + '@smithy/is-array-buffer@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/md5-js@3.0.11': + '@smithy/md5-js@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-utf8': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/middleware-content-length@3.0.13': + '@smithy/middleware-content-length@4.0.1': dependencies: - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@3.2.6': + '@smithy/middleware-endpoint@4.0.6': dependencies: - '@smithy/core': 2.5.5 - '@smithy/middleware-serde': 3.0.11 - '@smithy/node-config-provider': 3.1.12 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 - '@smithy/url-parser': 3.0.11 - '@smithy/util-middleware': 3.0.11 + '@smithy/core': 3.1.5 + '@smithy/middleware-serde': 4.0.2 + '@smithy/node-config-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 + '@smithy/url-parser': 4.0.1 + '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@3.0.31': + '@smithy/middleware-retry@4.0.7': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/protocol-http': 4.1.8 - '@smithy/service-error-classification': 3.0.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-retry': 3.0.11 + '@smithy/node-config-provider': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/service-error-classification': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@3.0.11': + '@smithy/middleware-serde@4.0.2': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-stack@3.0.11': + '@smithy/middleware-stack@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-config-provider@3.1.12': + '@smithy/node-config-provider@4.0.1': dependencies: - '@smithy/property-provider': 3.1.11 - '@smithy/shared-ini-file-loader': 3.1.12 - '@smithy/types': 3.7.2 + '@smithy/property-provider': 4.0.1 + '@smithy/shared-ini-file-loader': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-http-handler@3.3.2': + '@smithy/node-http-handler@4.0.3': dependencies: - '@smithy/abort-controller': 3.1.9 - '@smithy/protocol-http': 4.1.8 - '@smithy/querystring-builder': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/abort-controller': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/querystring-builder': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/property-provider@3.1.11': + '@smithy/property-provider@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/protocol-http@4.1.8': + '@smithy/protocol-http@5.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/querystring-builder@3.0.11': + '@smithy/querystring-builder@4.0.1': dependencies: - '@smithy/types': 3.7.2 - '@smithy/util-uri-escape': 3.0.0 + '@smithy/types': 4.1.0 + '@smithy/util-uri-escape': 4.0.0 tslib: 2.8.1 - '@smithy/querystring-parser@3.0.11': + '@smithy/querystring-parser@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/service-error-classification@3.0.11': + '@smithy/service-error-classification@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 - '@smithy/shared-ini-file-loader@3.1.12': + '@smithy/shared-ini-file-loader@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/signature-v4@4.2.4': + '@smithy/signature-v4@5.0.1': dependencies: - '@smithy/is-array-buffer': 3.0.0 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-middleware': 3.0.11 - '@smithy/util-uri-escape': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/is-array-buffer': 4.0.0 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-middleware': 4.0.1 + '@smithy/util-uri-escape': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@3.5.1': + '@smithy/smithy-client@4.1.6': dependencies: - '@smithy/core': 2.5.5 - '@smithy/middleware-endpoint': 3.2.6 - '@smithy/middleware-stack': 3.0.11 - '@smithy/protocol-http': 4.1.8 - '@smithy/types': 3.7.2 - '@smithy/util-stream': 3.3.2 + '@smithy/core': 3.1.5 + '@smithy/middleware-endpoint': 4.0.6 + '@smithy/middleware-stack': 4.0.1 + '@smithy/protocol-http': 5.0.1 + '@smithy/types': 4.1.0 + '@smithy/util-stream': 4.1.2 tslib: 2.8.1 - '@smithy/types@3.7.2': + '@smithy/types@4.1.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@3.0.11': + '@smithy/url-parser@4.0.1': dependencies: - '@smithy/querystring-parser': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/querystring-parser': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-base64@3.0.0': + '@smithy/util-base64@4.0.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@3.0.0': + '@smithy/util-body-length-browser@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@3.0.0': + '@smithy/util-body-length-node@4.0.0': dependencies: tslib: 2.8.1 @@ -6899,66 +6222,66 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@3.0.0': + '@smithy/util-buffer-from@4.0.0': dependencies: - '@smithy/is-array-buffer': 3.0.0 + '@smithy/is-array-buffer': 4.0.0 tslib: 2.8.1 - '@smithy/util-config-provider@3.0.0': + '@smithy/util-config-provider@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@3.0.31': + '@smithy/util-defaults-mode-browser@4.0.7': dependencies: - '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 + '@smithy/property-provider': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@3.0.31': + '@smithy/util-defaults-mode-node@4.0.7': dependencies: - '@smithy/config-resolver': 3.0.13 - '@smithy/credential-provider-imds': 3.2.8 - '@smithy/node-config-provider': 3.1.12 - '@smithy/property-provider': 3.1.11 - '@smithy/smithy-client': 3.5.1 - '@smithy/types': 3.7.2 + '@smithy/config-resolver': 4.0.1 + '@smithy/credential-provider-imds': 4.0.1 + '@smithy/node-config-provider': 4.0.1 + '@smithy/property-provider': 4.0.1 + '@smithy/smithy-client': 4.1.6 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-endpoints@2.1.7': + '@smithy/util-endpoints@3.0.1': dependencies: - '@smithy/node-config-provider': 3.1.12 - '@smithy/types': 3.7.2 + '@smithy/node-config-provider': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@3.0.0': + '@smithy/util-hex-encoding@4.0.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@3.0.11': + '@smithy/util-middleware@4.0.1': dependencies: - '@smithy/types': 3.7.2 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-retry@3.0.11': + '@smithy/util-retry@4.0.1': dependencies: - '@smithy/service-error-classification': 3.0.11 - '@smithy/types': 3.7.2 + '@smithy/service-error-classification': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-stream@3.3.2': + '@smithy/util-stream@4.1.2': dependencies: - '@smithy/fetch-http-handler': 4.1.2 - '@smithy/node-http-handler': 3.3.2 - '@smithy/types': 3.7.2 - '@smithy/util-base64': 3.0.0 - '@smithy/util-buffer-from': 3.0.0 - '@smithy/util-hex-encoding': 3.0.0 - '@smithy/util-utf8': 3.0.0 + '@smithy/fetch-http-handler': 5.0.1 + '@smithy/node-http-handler': 4.0.3 + '@smithy/types': 4.1.0 + '@smithy/util-base64': 4.0.0 + '@smithy/util-buffer-from': 4.0.0 + '@smithy/util-hex-encoding': 4.0.0 + '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/util-uri-escape@3.0.0': + '@smithy/util-uri-escape@4.0.0': dependencies: tslib: 2.8.1 @@ -6967,15 +6290,15 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@3.0.0': + '@smithy/util-utf8@4.0.0': dependencies: - '@smithy/util-buffer-from': 3.0.0 + '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 - '@smithy/util-waiter@3.2.0': + '@smithy/util-waiter@4.0.2': dependencies: - '@smithy/abort-controller': 3.1.9 - '@smithy/types': 3.7.2 + '@smithy/abort-controller': 4.0.1 + '@smithy/types': 4.1.0 tslib: 2.8.1 '@swc/counter@0.1.3': {} @@ -6984,13 +6307,13 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/typography@0.5.15(tailwindcss@3.4.16)': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.16 + tailwindcss: 3.4.17 '@tokenizer/token@0.3.0': {} @@ -7004,7 +6327,7 @@ snapshots: '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.34 + '@types/ms': 2.1.0 '@types/escape-html@1.0.4': {} @@ -7022,17 +6345,18 @@ snapshots: '@types/json5@0.0.29': {} - '@types/jsonwebtoken@9.0.7': + '@types/jsonwebtoken@9.0.9': dependencies: + '@types/ms': 2.1.0 '@types/node': 22.5.4 - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.16': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/ms@0.7.34': {} + '@types/ms@2.1.0': {} '@types/node@22.5.4': dependencies: @@ -7066,85 +6390,83 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/type-utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 - eslint: 9.17.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.6) - typescript: 5.7.2 + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.18.1': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - '@typescript-eslint/utils': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.17.0(jiti@1.21.6) - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + eslint: 9.21.0(jiti@1.21.7) + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.18.1': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.18.1(typescript@5.7.2)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/visitor-keys': 8.18.1 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - typescript: 5.7.2 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.18.1 - '@typescript-eslint/types': 8.18.1 - '@typescript-eslint/typescript-estree': 8.18.1(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) - typescript: 5.7.2 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.18.1': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.18.1 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 - abbrev@2.0.0: {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -7163,7 +6485,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -7204,133 +6526,129 @@ snapshots: aria-query@5.3.2: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 is-string: 1.1.1 array.prototype.findlast@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-shim-unscopables: 1.0.2 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 array.prototype.tosorted@1.1.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} - asynckit@0.4.0: {} + async-function@1.0.0: {} atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.4.49): + autoprefixer@10.4.20(postcss@8.5.3): dependencies: - browserslist: 4.24.3 - caniuse-lite: 1.0.30001689 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001701 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.4.49 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axe-core@4.10.2: {} - axios@1.4.0: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@4.1.0: {} b4a@1.6.7: {} babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 cosmiconfig: 7.1.0 - resolve: 1.22.9 + resolve: 1.22.10 balanced-match@1.0.2: {} - bare-events@2.5.0: + bare-events@2.5.4: optional: true - bare-fs@2.3.5: + bare-fs@4.0.1: dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.6.1 + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + transitivePeerDependencies: + - bare-buffer optional: true - bare-os@2.4.4: + bare-os@3.5.1: optional: true - bare-path@2.1.3: + bare-path@3.0.0: dependencies: - bare-os: 2.4.4 + bare-os: 3.5.1 optional: true - bare-stream@2.6.1: + bare-stream@2.6.5(bare-events@2.5.4): dependencies: - streamx: 2.21.1 + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 optional: true base64-js@1.5.1: {} @@ -7360,16 +6678,16 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001689 - electron-to-chromium: 1.5.74 + caniuse-lite: 1.0.30001701 + electron-to-chromium: 1.5.109 node-releases: 2.0.19 - update-browserslist-db: 1.1.1(browserslist@4.24.3) + update-browserslist-db: 1.1.3(browserslist@4.24.4) bson-objectid@2.0.4: {} - bson@6.10.1: {} + bson@6.10.3: {} buffer-equal-constant-time@1.0.1: {} @@ -7393,28 +6711,28 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001689: {} + caniuse-lite@1.0.30001701: {} ccount@2.0.1: {} @@ -7483,29 +6801,12 @@ snapshots: colorette@2.0.20: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@10.0.1: {} - commander@2.20.3: {} commander@4.1.1: {} concat-map@0.0.1: {} - condense-newlines@0.2.1: - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - console-table-printer@2.12.1: dependencies: simple-wcswidth: 1.0.1 @@ -7527,7 +6828,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -7554,21 +6855,21 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -7588,7 +6889,7 @@ snapshots: dependencies: ms: 2.1.3 - decimal.js@10.4.3: {} + decimal.js@10.5.0: {} decode-named-character-reference@1.0.2: dependencies: @@ -7616,8 +6917,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} - dequal@2.0.3: {} detect-libc@2.0.3: {} @@ -7640,30 +6939,12 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 csstype: 3.1.3 - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.1.0: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -7673,14 +6954,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - editorconfig@1.0.4: - dependencies: - '@one-ini/wasm': 0.1.1 - commander: 10.0.1 - minimatch: 9.0.1 - semver: 7.6.3 - - electron-to-chromium@1.5.74: {} + electron-to-chromium@1.5.109: {} emoji-regex@8.0.0: {} @@ -7690,35 +6964,34 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - entities@4.5.0: {} - error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.6: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 - get-intrinsic: 1.2.6 - get-symbol-description: 1.0.2 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -7729,62 +7002,66 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 - is-negative-zero: 2.0.3 is-regex: 1.2.1 - is-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.4 is-string: 1.1.1 - is-typed-array: 1.1.13 - is-weakref: 1.1.0 - math-intrinsics: 1.0.0 - object-inspect: 1.13.3 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 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 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.3 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.0: + es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 - iterator.prototype: 1.1.4 + iterator.prototype: 1.1.5 safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.6 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.2: + es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 @@ -7827,21 +7104,21 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.1.0(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2): + eslint-config-next@15.1.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.1.0 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.18.1(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) + '@rushstack/eslint-patch': 1.10.5 + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-react: 7.37.2(eslint@9.17.0(jiti@1.21.6)) - eslint-plugin-react-hooks: 5.1.0(eslint@9.17.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0(jiti@1.21.7)) optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -7850,39 +7127,38 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.16.0 - resolve: 1.22.9 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.17.1 - eslint: 9.17.0(jiti@1.21.6) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 + enhanced-resolve: 5.18.1 + eslint: 9.21.0(jiti@1.21.7) + get-tsconfig: 4.10.0 is-bun-module: 1.3.0 - is-glob: 4.0.3 stable-hash: 0.0.4 + tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.17.0(jiti@1.21.6) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -7891,27 +7167,27 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.6)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) hasown: 2.0.2 - is-core-module: 2.16.0 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 - object.values: 1.2.0 + object.values: 1.2.1 semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.18.1(eslint@9.17.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -7921,7 +7197,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -7930,30 +7206,30 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.17.0(jiti@1.21.6) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-react@7.37.2(eslint@9.17.0(jiti@1.21.6)): + eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): 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.0 - eslint: 9.17.0(jiti@1.21.6) + es-iterator-helpers: 1.2.1 + eslint: 9.21.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + 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.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 eslint-scope@8.2.0: @@ -7965,18 +7241,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.17.0(jiti@1.21.6): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.1 - '@eslint/core': 0.9.1 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.4 + '@eslint/config-array': 0.19.2 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -8002,7 +7278,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.6 + jiti: 1.21.7 transitivePeerDependencies: - supports-color @@ -8035,10 +7311,6 @@ snapshots: expand-template@2.0.3: {} - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - fast-base64-decode@1.0.0: {} fast-copy@3.0.2: {} @@ -8055,7 +7327,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -8071,17 +7343,17 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} fast-xml-parser@4.4.1: dependencies: - strnum: 1.0.5 + strnum: 1.1.2 - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8108,32 +7380,24 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - follow-redirects@1.15.9: {} - - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - fraction.js@4.3.7: {} fs-constants@1.0.0: {} @@ -8145,9 +7409,10 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.7: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -8155,32 +7420,41 @@ snapshots: functions-have-names@1.2.3: {} - geist@1.3.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + geist@1.3.1(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) get-caller-file@2.0.5: {} - get-intrinsic@1.2.6: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 + get-proto: 1.0.1 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.1: {} - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.8 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 get-tsconfig@4.8.1: dependencies: @@ -8198,7 +7472,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -8229,7 +7503,7 @@ snapshots: graphemer@1.4.0: {} - graphql-http@1.22.3(graphql@16.10.0): + graphql-http@1.22.4(graphql@16.10.0): dependencies: graphql: 16.10.0 @@ -8244,7 +7518,7 @@ snapshots: graphql@16.10.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -8272,34 +7546,19 @@ snapshots: dependencies: react-is: 16.13.1 - html-to-text@9.0.3: - dependencies: - '@selderee/plugin-htmlparser2': 0.10.0 - deepmerge: 4.3.1 - dom-serializer: 2.0.0 - htmlparser2: 8.0.2 - selderee: 0.10.0 - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - - http-status@1.6.2: {} + http-status@2.1.0: {} ieee754@1.2.1: {} ignore@5.3.2: {} - image-size@1.1.1: + image-size@1.2.0: dependencies: queue: 6.0.2 immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -8321,11 +7580,11 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - intl-messageformat@10.7.10: + intl-messageformat@10.7.15: 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.3 + '@formatjs/fast-memoize': 2.2.6 + '@formatjs/icu-messageformat-parser': 2.11.1 tslib: 2.8.1 is-alphabetical@2.0.1: {} @@ -8339,25 +7598,29 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.0.0: + is-async-function@2.1.1: dependencies: + 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: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.1: + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -8366,19 +7629,19 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 - is-typed-array: 1.1.13 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: @@ -8387,19 +7650,20 @@ snapshots: is-decimal@2.0.1: {} - is-extendable@0.1.1: {} - is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -8409,8 +7673,6 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -8427,9 +7689,9 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-string@1.1.1: dependencies: @@ -8442,22 +7704,20 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.1.0: + is-weakref@1.1.1: dependencies: call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.6 - - is-whitespace@0.3.0: {} + call-bound: 1.0.3 + get-intrinsic: 1.3.0 isarray@0.0.1: {} @@ -8476,13 +7736,13 @@ snapshots: isomorphic.js@0.2.5: {} - iterator.prototype@1.1.4: + iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 has-symbols: 1.1.0 - reflect.getprototypeof: 1.0.8 set-function-name: 2.0.2 jackspeak@3.4.3: @@ -8491,24 +7751,14 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@1.21.6: {} + jiti@1.21.7: {} jose@5.9.6: {} joycon@3.1.1: {} - js-beautify@1.15.1: - dependencies: - config-chain: 1.1.13 - editorconfig: 1.0.4 - glob: 10.4.5 - js-cookie: 3.0.5 - nopt: 7.2.1 - js-cookie@2.2.1: {} - js-cookie@3.0.5: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -8523,15 +7773,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.7.3 + '@apidevtools/json-schema-ref-parser': 11.9.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.16 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.4.2 - tinyglobby: 0.2.10 + prettier: 3.5.3 + tinyglobby: 0.2.12 json-schema-traverse@0.4.1: {} @@ -8554,14 +7804,16 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.3 + semver: 7.7.1 + + jsox@1.2.121: {} jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 array.prototype.flat: 1.3.3 - object.assign: 4.1.5 - object.values: 1.2.0 + object.assign: 4.1.7 + object.values: 1.2.1 jwa@1.4.1: dependencies: @@ -8580,10 +7832,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - kleur@3.0.3: {} language-subtag-registry@0.3.23: {} @@ -8592,14 +7840,12 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 - leac@0.6.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lexical@0.20.0: {} + lexical@0.21.0: {} lib0@0.2.99: dependencies: @@ -8645,7 +7891,7 @@ snapshots: dependencies: react: 19.0.0 - math-intrinsics@1.0.0: {} + math-intrinsics@1.1.0: {} md5@2.3.0: dependencies: @@ -8660,12 +7906,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -8714,7 +7960,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -8729,9 +7975,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -8744,21 +7990,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -8768,33 +8014,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -8804,12 +8050,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -8832,7 +8078,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -8843,7 +8089,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -8851,24 +8097,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.3: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -8878,9 +8124,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.3 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -8889,22 +8135,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - mimic-response@3.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - minimatch@9.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -8919,28 +8155,28 @@ snapshots: monaco-editor@0.52.2: {} - mongodb-connection-string-url@3.0.1: + mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 13.0.0 + whatwg-url: 14.1.1 - mongodb@6.10.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))): + mongodb@6.12.0(@aws-sdk/credential-providers@3.758.0): dependencies: - '@mongodb-js/saslprep': 1.1.9 - bson: 6.10.1 - mongodb-connection-string-url: 3.0.1 + '@mongodb-js/saslprep': 1.2.0 + bson: 6.10.3 + mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0)) + '@aws-sdk/credential-providers': 3.758.0 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.8.3(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))): + mongoose@8.9.5(@aws-sdk/credential-providers@3.758.0): dependencies: - bson: 6.10.1 + bson: 6.10.3 kareem: 2.6.3 - mongodb: 6.10.0(@aws-sdk/credential-providers@3.713.0(@aws-sdk/client-sso-oidc@3.716.0(@aws-sdk/client-sts@3.716.0))) + mongodb: 6.12.0(@aws-sdk/credential-providers@3.758.0) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -8973,49 +8209,49 @@ snapshots: nanoid@3.3.8: {} - napi-build-utils@1.0.2: {} + napi-build-utils@2.0.0: {} natural-compare@1.4.0: {} negotiator@1.0.0: {} - next-intl@3.26.1(next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0): + next-intl@3.26.5(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0): dependencies: - '@formatjs/intl-localematcher': 0.5.9 + '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) react: 19.0.0 - use-intl: 3.26.1(react@19.0.0) + use-intl: 3.26.5(react@19.0.0) - next@15.1.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: - '@next/env': 15.1.0 + '@next/env': 15.2.0 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001689 + caniuse-lite: 1.0.30001701 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.0 - '@next/swc-darwin-x64': 15.1.0 - '@next/swc-linux-arm64-gnu': 15.1.0 - '@next/swc-linux-arm64-musl': 15.1.0 - '@next/swc-linux-x64-gnu': 15.1.0 - '@next/swc-linux-x64-musl': 15.1.0 - '@next/swc-win32-arm64-msvc': 15.1.0 - '@next/swc-win32-x64-msvc': 15.1.0 + '@next/swc-darwin-arm64': 15.2.0 + '@next/swc-darwin-x64': 15.2.0 + '@next/swc-linux-arm64-gnu': 15.2.0 + '@next/swc-linux-arm64-musl': 15.2.0 + '@next/swc-linux-x64-gnu': 15.2.0 + '@next/swc-linux-x64-musl': 15.2.0 + '@next/swc-win32-arm64-msvc': 15.2.0 + '@next/swc-win32-x64-msvc': 15.2.0 sass: 1.77.4 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - node-abi@3.71.0: + node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 node-addon-api@6.1.0: {} @@ -9025,17 +8261,13 @@ snapshots: node-releases@2.0.19: {} - nodemailer@6.9.10: {} + nodemailer@6.9.16: {} noms@0.0.0: dependencies: inherits: 2.0.4 readable-stream: 1.0.34 - nopt@7.2.1: - dependencies: - abbrev: 2.0.0 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -9044,16 +8276,18 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.3: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} object-to-formdata@4.5.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -9061,26 +8295,27 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 - object.values@1.2.0: + object.values@1.2.1: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 on-exit-leak-free@2.1.2: {} @@ -9097,6 +8332,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9128,11 +8369,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parseley@0.11.0: - dependencies: - leac: 0.6.0 - peberminta: 0.8.0 - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -9150,19 +8386,19 @@ snapshots: path-type@4.0.0: {} - payload-admin-bar@1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + payload-admin-bar@1.0.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - payload@3.11.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.2): + payload@3.25.0(graphql@16.10.0)(typescript@5.7.3): dependencies: - '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@next/env': 15.1.2 - '@payloadcms/translations': 3.11.0 + '@next/env': 15.2.0 + '@payloadcms/translations': 3.25.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 + busboy: 1.6.0 ci-info: 4.1.0 console-table-printer: 2.12.1 croner: 9.0.0 @@ -9171,31 +8407,28 @@ snapshots: file-type: 19.3.0 get-tsconfig: 4.8.1 graphql: 16.10.0 - http-status: 1.6.2 - image-size: 1.1.1 + http-status: 2.1.0 + image-size: 1.2.0 jose: 5.9.6 json-schema-to-typescript: 15.0.3 minimist: 1.2.8 + path-to-regexp: 6.3.0 pino: 9.5.0 pino-pretty: 13.0.0 pluralize: 8.0.0 + qs-esm: 7.0.2 sanitize-filename: 1.6.3 scmp: 2.1.0 - ts-essentials: 10.0.3(typescript@5.7.2) + ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.0 + ws: 8.18.1 transitivePeerDependencies: - bufferutil - - monaco-editor - - react - - react-dom - typescript - utf-8-validate - peberminta@0.8.0: {} - - peek-readable@5.3.1: {} + peek-readable@5.4.2: {} picocolors@1.1.1: {} @@ -9234,7 +8467,7 @@ snapshots: on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.0 + process-warning: 4.0.1 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 @@ -9245,30 +8478,30 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.4.49): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.4.49 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.9 + resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.4.49): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.49 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 - yaml: 2.6.1 + yaml: 2.7.0 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.3 - postcss-nested@6.2.0(postcss@8.4.49): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.4.49 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -9289,36 +8522,30 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.4.49: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.2: + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.71.0 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tunnel-agent: 0.6.0 prelude-ls@1.2.1: {} - prettier@3.4.2: {} - - pretty@2.0.0: - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.15.1 + prettier@3.5.3: {} prism-react-renderer@2.4.1(react@19.0.0): dependencies: @@ -9330,7 +8557,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@4.0.0: {} + process-warning@4.0.1: {} prompts@2.4.2: dependencies: @@ -9343,10 +8570,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - proto-list@1.2.4: {} - - proxy-from-env@1.1.0: {} - pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -9358,8 +8581,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - queue@6.0.2: dependencies: inherits: 2.0.4 @@ -9373,33 +8594,27 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-datepicker@7.5.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.4(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 + '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 - prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: + - '@types/react' - supports-color - react-dom@18.2.0(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.2 - react-dom@19.0.0(react@19.0.0): dependencies: react: 19.0.0 @@ -9407,12 +8622,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 react: 19.0.0 react-hook-form@7.45.4(react@19.0.0): @@ -9433,23 +8648,23 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 - react-remove-scroll@2.6.1(@types/react@19.0.1)(react@19.0.0): + react-remove-scroll@2.6.3(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 react-remove-scroll-bar: 2.3.8(@types/react@19.0.1)(react@19.0.0) react-style-singleton: 2.2.3(@types/react@19.0.1)(react@19.0.0) tslib: 2.8.1 - use-callback-ref: 1.3.2(@types/react@19.0.1)(react@19.0.0) + use-callback-ref: 1.3.3(@types/react@19.0.1)(react@19.0.0) use-sidecar: 1.1.3(@types/react@19.0.1)(react@19.0.0) optionalDependencies: '@types/react': 19.0.1 react-select@5.9.0(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@19.0.1)(react@19.0.0) - '@floating-ui/dom': 1.6.12 + '@floating-ui/dom': 1.6.13 '@types/react-transition-group': 4.4.12(@types/react@19.0.1) memoize-one: 6.0.0 prop-types: 15.8.1 @@ -9471,17 +8686,13 @@ snapshots: react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.26.9 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - react@19.0.0: {} read-cache@1.0.0: @@ -9517,55 +8728,49 @@ snapshots: real-require@0.2.0: {} - reflect.getprototypeof@1.0.8: + reflect.getprototypeof@1.0.10: 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.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: dependencies: 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 require-directory@2.1.1: {} require-from-string@2.0.2: {} - resend@0.17.2: - dependencies: - '@react-email/render': 0.0.7 - axios: 1.4.0 - type-fest: 3.13.0 - transitivePeerDependencies: - - debug - resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve@1.22.9: + resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: @@ -9575,7 +8780,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -9583,6 +8788,11 @@ snapshots: safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.3 @@ -9601,30 +8811,22 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.25.0: {} scmp@2.1.0: {} secure-json-parse@2.7.0: {} - selderee@0.10.0: - dependencies: - parseley: 0.11.0 - semver@6.3.1: {} - semver@7.6.3: {} + semver@7.7.1: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9635,22 +8837,30 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + sharp@0.32.6: dependencies: color: 4.2.3 detect-libc: 2.0.3 node-addon-api: 6.1.0 - prebuild-install: 7.1.2 - semver: 7.6.3 + prebuild-install: 7.1.3 + semver: 7.7.1 simple-get: 4.0.1 - tar-fs: 3.0.6 + tar-fs: 3.0.8 tunnel-agent: 0.6.0 + transitivePeerDependencies: + - bare-buffer sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.6.3 + semver: 7.7.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -9682,27 +8892,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - object-inspect: 1.13.3 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.3 + object-inspect: 1.13.4 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -9731,7 +8941,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -9757,13 +8967,12 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.21.1: + streamx@2.22.0: dependencies: fast-fifo: 1.3.2 - queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: - bare-events: 2.5.0 + bare-events: 2.5.4 string-width@4.2.3: dependencies: @@ -9781,27 +8990,28 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.6 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.3 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 string.prototype.trim@1.2.10: dependencies: @@ -9809,8 +9019,8 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: @@ -9818,13 +9028,13 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string_decoder@0.10.31: {} @@ -9855,12 +9065,12 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.0.5: {} + strnum@1.1.2: {} strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.3.1 + peek-readable: 5.4.2 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -9887,55 +9097,57 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.5.5: {} + tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.16): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): dependencies: - tailwindcss: 3.4.16 + tailwindcss: 3.4.17 - tailwindcss@3.4.16: + tailwindcss@3.4.17: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.6.0 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.3 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.6 + jiti: 1.21.7 lilconfig: 3.1.3 micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.49 - postcss-import: 15.1.0(postcss@8.4.49) - postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-nested: 6.2.0(postcss@8.4.49) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 - resolve: 1.22.9 + resolve: 1.22.10 sucrase: 3.35.0 transitivePeerDependencies: - ts-node tapable@2.2.1: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.2 tar-stream: 2.2.0 - tar-fs@3.0.6: + tar-fs@3.0.8: dependencies: pump: 3.0.2 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 + bare-fs: 4.0.1 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer tar-stream@2.2.0: dependencies: @@ -9949,7 +9161,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.21.1 + streamx: 2.22.0 text-decoder@1.2.3: dependencies: @@ -9972,9 +9184,9 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinyglobby@0.2.10: + tinyglobby@0.2.12: dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: @@ -9988,7 +9200,7 @@ snapshots: tr46@0.0.3: {} - tr46@4.1.1: + tr46@5.0.0: dependencies: punycode: 2.3.1 @@ -9996,13 +9208,13 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-api-utils@2.0.1(typescript@5.7.3): dependencies: - typescript: 5.7.2 + typescript: 5.7.3 - ts-essentials@10.0.3(typescript@5.7.2): + ts-essentials@10.0.3(typescript@5.7.3): optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 ts-interface-checker@0.1.13: {} @@ -10032,49 +9244,47 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@3.13.0: {} - - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.3: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 - typescript@5.7.2: {} + typescript@5.7.3: {} uint8array-extras@1.4.0: {} unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 - has-bigints: 1.0.2 + has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -10107,9 +9317,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.1(browserslist@4.24.3): + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: - browserslist: 4.24.3 + browserslist: 4.24.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -10117,7 +9327,7 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.2(@types/react@19.0.1)(react@19.0.0): + use-callback-ref@1.3.3(@types/react@19.0.1)(react@19.0.0): dependencies: react: 19.0.0 tslib: 2.8.1 @@ -10129,10 +9339,10 @@ snapshots: react: 19.0.0 scheduler: 0.25.0 - use-intl@3.26.1(react@19.0.0): + use-intl@3.26.5(react@19.0.0): dependencies: - '@formatjs/fast-memoize': 2.2.5 - intl-messageformat: 10.7.10 + '@formatjs/fast-memoize': 2.2.6 + intl-messageformat: 10.7.15 react: 19.0.0 use-isomorphic-layout-effect@1.2.0(@types/react@19.0.1)(react@19.0.0): @@ -10166,9 +9376,9 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@13.0.0: + whatwg-url@14.1.1: dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 whatwg-url@5.0.0: @@ -10179,7 +9389,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.1 + is-boolean-object: 1.2.2 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -10187,31 +9397,32 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 + is-async-function: 2.1.1 is-date-object: 1.1.0 - is-finalizationregistry: 1.1.0 - is-generator-function: 1.0.10 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.0 + is-weakref: 1.1.1 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 - which-typed-array@1.1.16: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + call-bound: 1.0.3 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -10235,7 +9446,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.0: {} + ws@8.18.1: {} xss@1.0.15: dependencies: @@ -10248,7 +9459,7 @@ snapshots: yaml@1.10.2: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yargs-parser@20.2.9: {} @@ -10262,7 +9473,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yjs@13.6.20: + yjs@13.6.23: dependencies: lib0: 0.2.99 diff --git a/templates/website/package.json b/templates/website/package.json index 2e274e678c..f9d7a19adb 100644 --- a/templates/website/package.json +++ b/templates/website/package.json @@ -43,7 +43,7 @@ "next": "15.2.0", "next-sitemap": "^4.2.3", "payload": "latest", - "payload-admin-bar": "^1.0.6", + "payload-admin-bar": "^1.0.7", "prism-react-renderer": "^2.3.1", "react": "19.0.0", "react-dom": "19.0.0", diff --git a/templates/website/pnpm-lock.yaml b/templates/website/pnpm-lock.yaml index 0dd77530b9..cbb04ea281 100644 --- a/templates/website/pnpm-lock.yaml +++ b/templates/website/pnpm-lock.yaml @@ -5,53 +5,54 @@ settings: excludeLinksFromLockfile: false importers: + .: dependencies: '@payloadcms/db-mongodb': specifier: latest - version: 3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) + version: 3.18.0(@aws-sdk/credential-providers@3.731.1)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) '@payloadcms/live-preview-react': specifier: latest - version: 3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 3.18.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@payloadcms/next': specifier: latest - version: 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/payload-cloud': specifier: latest - version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) + version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) '@payloadcms/plugin-form-builder': specifier: latest - version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-nested-docs': specifier: latest - version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) + version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) '@payloadcms/plugin-redirects': specifier: latest - version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) + version: 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) '@payloadcms/plugin-search': specifier: latest - version: 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/plugin-seo': specifier: latest - version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@payloadcms/richtext-lexical': specifier: latest - version: 3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23) + version: 3.18.0(mlgbdnqourdrhm64whzjvljgzi) '@payloadcms/ui': specifier: latest - version: 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + version: 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 2.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.1.2(@types/react@19.0.10)(react@19.0.0) + version: 1.1.1(@types/react@19.0.10)(react@19.0.0) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -78,10 +79,10 @@ importers: version: 4.2.3(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) payload: specifier: latest - version: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + version: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) payload-admin-bar: - specifier: ^1.0.6 - version: 1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: ^1.0.7 + version: 1.0.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0) prism-react-renderer: specifier: ^2.3.1 version: 2.4.1(react@19.0.0) @@ -106,7 +107,7 @@ importers: devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 - version: 3.3.0 + version: 3.2.0 '@tailwindcss/typography': specifier: ^0.5.13 version: 0.5.16(tailwindcss@3.4.17) @@ -124,22 +125,22 @@ importers: version: 19.0.4(@types/react@19.0.10) autoprefixer: specifier: ^10.4.19 - version: 10.4.20(postcss@8.5.3) + version: 10.4.20(postcss@8.5.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.16.0 - version: 9.21.0(jiti@1.21.7) + version: 9.18.0(jiti@1.21.7) eslint-config-next: specifier: 15.2.0 - version: 15.2.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + version: 15.2.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) postcss: specifier: ^8.4.38 - version: 8.5.3 + version: 8.5.1 prettier: specifier: ^3.4.2 - version: 3.5.3 + version: 3.4.2 tailwindcss: specifier: ^3.4.3 version: 3.4.17 @@ -148,314 +149,180 @@ importers: version: 5.7.3 packages: - '@alloc/quick-lru@5.2.0': - resolution: - { - integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, - } - engines: { node: '>=10' } - '@apidevtools/json-schema-ref-parser@11.9.3': - resolution: - { - integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==, - } - engines: { node: '>= 16' } + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@apidevtools/json-schema-ref-parser@11.7.3': + resolution: {integrity: sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==} + engines: {node: '>= 16'} '@aws-crypto/crc32@5.2.0': - resolution: - { - integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} '@aws-crypto/crc32c@5.2.0': - resolution: - { - integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==, - } + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} '@aws-crypto/sha1-browser@5.2.0': - resolution: - { - integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==, - } + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} '@aws-crypto/sha256-browser@5.2.0': - resolution: - { - integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==, - } + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} '@aws-crypto/sha256-js@1.2.2': - resolution: - { - integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==, - } + resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} '@aws-crypto/sha256-js@5.2.0': - resolution: - { - integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} '@aws-crypto/supports-web-crypto@5.2.0': - resolution: - { - integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==, - } + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} '@aws-crypto/util@1.2.2': - resolution: - { - integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==, - } + resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} '@aws-crypto/util@5.2.0': - resolution: - { - integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==, - } + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-cognito-identity@3.758.0': - resolution: - { - integrity: sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-cognito-identity@3.731.1': + resolution: {integrity: sha512-hlYxRERFNxa4Jplh8rjxbCvk6e4ybNKu2wQdiK46GS2N6io9Z62/CNqx3bMiqmjhk92LWXnYcpYwI2MG/WOEMQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-s3@3.758.0': - resolution: - { - integrity: sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-s3@3.731.1': + resolution: {integrity: sha512-Ab2PA/8Th6JkurCkxnQJZHPE/JnnSsX/XHQzirkQb+JpKOyWMRC/YZUBfAaiwhxqX65RHgklrwil+UbFl4TtAQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.758.0': - resolution: - { - integrity: sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/client-sso@3.731.0': + resolution: {integrity: sha512-O4C/UYGgqMsBg21MMApFdgyh8BX568hQhbdoNFmRVTBoSnCZ3w+H4a1wBPX4Gyl0NX+ab6Xxo9rId8HiyPXJ0A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.758.0': - resolution: - { - integrity: sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/core@3.731.0': + resolution: {integrity: sha512-ithBN1VWASkvAIlozJmenqDvNnFddr/SZXAs58+jCnBHgy3tXLHABZGVNCjetZkHRqNdXEO1kirnoxaFeXMeDA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-cognito-identity@3.758.0': - resolution: - { - integrity: sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-cognito-identity@3.731.1': + resolution: {integrity: sha512-4MdhrZFkMxS/5ZUXaf6NIVa7N3NV259Q10jvfd6AzePd6sq10stJSyShvV7nC1dc/XneHammpYdXV2hlh6Almw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.758.0': - resolution: - { - integrity: sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-env@3.731.0': + resolution: {integrity: sha512-h0WWZg4QMLgFVyIvQrC43zpVqsUWg1mPM1clpogP43B8+wEhDEQ4qWRzvFs3dQ4cqx/FLyDUZZF4cqgd94z7kw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.758.0': - resolution: - { - integrity: sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-http@3.731.0': + resolution: {integrity: sha512-iRtrjtcYaWgbvtu2cvDhIsPWXZGvhy1Hgks4682MEBNTc9AUwlfvDrYz2EEnTtJJyrbOdEHVrYrzqD8qPyVLCg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.758.0': - resolution: - { - integrity: sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-ini@3.731.1': + resolution: {integrity: sha512-0M0ejuqW8iHNcTH2ZXSY9m+I7Y06qVkj6k3vfQU9XaB//mTUCxxfGfqWAtgfr7Yi73egABTcPc0jyPdcvSW4Kw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.758.0': - resolution: - { - integrity: sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-node@3.731.1': + resolution: {integrity: sha512-5c0ZiagMTPmWilXNffeXJCLoCEz97jilHr3QJWwf2GaTay4tzN+Ld71rpdfEenzUR7fuxEWFfVlwQbFOzFNYHg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.758.0': - resolution: - { - integrity: sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-process@3.731.0': + resolution: {integrity: sha512-6yNMY6q3xHLbs2f2+C6GhvMrjTgtFBiPJJqKaPLsTIhlTRvh4sK8pGm3ITcma0jOxtPDIuoPfBAV8N8XVMBlZg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.758.0': - resolution: - { - integrity: sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-sso@3.731.1': + resolution: {integrity: sha512-p1tp+rMUf5YNQLr8rVRmDgNtKGYLL0KCdq3K2hwwvFnx9MjReF1sA4lfm3xWsxBQM+j3QN9AvMQqBzDJ+NOSdw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.758.0': - resolution: - { - integrity: sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-provider-web-identity@3.731.1': + resolution: {integrity: sha512-+ynAvEGWDR5ZJFxgpwwzhvlQ3WQ7BleWXU6JwpIw3yFrD4eZEn85b8DZC1aEz7C9kb1HSV6B3gpqHqlyS6wj8g==} + engines: {node: '>=18.0.0'} - '@aws-sdk/credential-providers@3.758.0': - resolution: - { - integrity: sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/credential-providers@3.731.1': + resolution: {integrity: sha512-Rjb14vXPa3flBJu9YDZkld0pYuR15DESMWGvCtQgGhcgpY8QH7vzxPU2C224SgYYkP0JM+7SRfadbcI5seTFuw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/lib-storage@3.758.0': - resolution: - { - integrity: sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/lib-storage@3.731.1': + resolution: {integrity: sha512-+ajlL3FOCHu+HEB8M5BJ3Rvq+QmXfGdgzU5tmnVMJUl1V9ggbG9P01EmrVX7Q7INdWezQYr/VWqUcOmUW4zuBQ==} + engines: {node: '>=18.0.0'} peerDependencies: - '@aws-sdk/client-s3': ^3.758.0 + '@aws-sdk/client-s3': ^3.731.1 - '@aws-sdk/middleware-bucket-endpoint@3.734.0': - resolution: - { - integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-bucket-endpoint@3.731.0': + resolution: {integrity: sha512-G9vuGW5GWCbzGOwlGFJcOkfxhw1cB6vzcv75QTT0CmciLXK+Cio8O2pqMSTTF2kg9Y6iHVC2BlOtLRkJAVOxVQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-expect-continue@3.734.0': - resolution: - { - integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-expect-continue@3.731.0': + resolution: {integrity: sha512-oY4nsY/mb5O5eZCzIuWpyvzO45Bi6UBtE48IaJsoyVctagA1l8hB66aczH9M1NHNjvbS4Beu1agwh3Nyb1eJug==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.758.0': - resolution: - { - integrity: sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-flexible-checksums@3.731.0': + resolution: {integrity: sha512-LMs/rndovYjYSntSYyPE/PIl4iHNiquaU0lpDqpQc9iTgQcNbjdriSUWpibgu1jXlGBpBYCqttNkxmEThbbWxA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-host-header@3.734.0': - resolution: - { - integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-host-header@3.731.0': + resolution: {integrity: sha512-ndAJsm5uWPPJRZowLKpB1zuL17qWlWVtCJP4I/ynBkq1PU1DijDXBul2UZaG6Mpvsgms1NXo/h9noHuK7T3v8w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-location-constraint@3.734.0': - resolution: - { - integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-location-constraint@3.731.0': + resolution: {integrity: sha512-1I2EjAFxrQksrzqdN7YYuY/q2YsjqeX4l7f9VOkdBjiZeDvVIEdM99IT5sISJB/r6CjNrYX5MhqGhE8i1VFchA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-logger@3.734.0': - resolution: - { - integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-logger@3.731.0': + resolution: {integrity: sha512-IIZrOdjbY2vKzPJPrwE7FoFQCIPEL6UqURi8LEaiVyCag4p2fvaTN5pgKuQtGC2+iYd/HHcGT4qn2bAqF5Jmmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-recursion-detection@3.734.0': - resolution: - { - integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-recursion-detection@3.731.0': + resolution: {integrity: sha512-y6FLASB1iKWuR5tUipMyo77bt0lEl3OnCrrd2xw/H24avq1HhJjjPR0HHhJE6QKJzF/FYXeV88tcyPSMe32VDw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.758.0': - resolution: - { - integrity: sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-sdk-s3@3.731.0': + resolution: {integrity: sha512-J9aKyQaVoec5eWTSDfO4h2sKHNP0wTzN15LFcHnkD+e/d0rdmOi7BTkkbJrIaynma9WShIasmrtM3HNi9GiiTA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-ssec@3.734.0': - resolution: - { - integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-ssec@3.731.0': + resolution: {integrity: sha512-1HP4lxGcQx4awXgxfL8t9faBK7TqEL7zkAZrm/YBbLrT9oQomxZOHKIOHvo5VVh4qmsNBdqnH2XUlSMY71gsww==} + engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.758.0': - resolution: - { - integrity: sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/middleware-user-agent@3.731.0': + resolution: {integrity: sha512-Ngr2Gz0aec/uduoKaO3srN52SYkEHndYtFzkK/gDUyQwQzi4ha2eIisxPiuHEX6RvXT31V9ouqn/YtVkt0R76A==} + engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.758.0': - resolution: - { - integrity: sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/nested-clients@3.731.1': + resolution: {integrity: sha512-/L8iVrulnXZl+kgmTn+oxRxNnhcSIbf+r12C06vGUq60w0YMidLvxJZN7vt8H9SnCAGCHqud2MS7ExCEvhc0gA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/region-config-resolver@3.734.0': - resolution: - { - integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/region-config-resolver@3.731.0': + resolution: {integrity: sha512-XlDpRNkDVHF59f07JmkuAidEv//m3hT6/JL85h0l3+zrpaRWhf8n8lVUyAPNq35ZujK8AcorYM+93u7hdWsliQ==} + engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.758.0': - resolution: - { - integrity: sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/signature-v4-multi-region@3.731.0': + resolution: {integrity: sha512-1r/b4Os15dR+BCVRRLVQJMF7Krq6xX6IKHxN43kuvODYWz8Nv3XDlaSpeRpAzyJuzW/fTp4JgE+z0+gmJfdEeA==} + engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.758.0': - resolution: - { - integrity: sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/token-providers@3.731.1': + resolution: {integrity: sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg==} + engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.734.0': - resolution: - { - integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/types@3.731.0': + resolution: {integrity: sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.723.0': - resolution: - { - integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==} + engines: {node: '>=18.0.0'} - '@aws-sdk/util-endpoints@3.743.0': - resolution: - { - integrity: sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/util-endpoints@3.731.0': + resolution: {integrity: sha512-riztxTAfncFS9yQWcBJffGgOgLoKSa63ph+rxWJxKl6BHAmWEvHICj1qDcVmnWfIcvJ5cClclY75l9qKaUH7rQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.723.0': - resolution: - { - integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==} + engines: {node: '>=18.0.0'} - '@aws-sdk/util-user-agent-browser@3.734.0': - resolution: - { - integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==, - } + '@aws-sdk/util-user-agent-browser@3.731.0': + resolution: {integrity: sha512-EnYXxTkCNCjTTBjW/pelRPv4Thsi9jepoB6qQjPMA9/ixrZ71BhhQecz9kgqzZLR9BPCwb6hgJ/Yd702jqJ4aQ==} - '@aws-sdk/util-user-agent-node@3.758.0': - resolution: - { - integrity: sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/util-user-agent-node@3.731.0': + resolution: {integrity: sha512-Rze78Ym5Bx7aWMvmZE2iL3JPo2INNCC5N9rLVx98Gg1G0ZaxclVRUvJrh1AojNlOFxU+otkxAe7FA3Foy2iLLQ==} + engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -463,176 +330,98 @@ packages: optional: true '@aws-sdk/util-utf8-browser@3.259.0': - resolution: - { - integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==, - } + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@aws-sdk/xml-builder@3.734.0': - resolution: - { - integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==, - } - engines: { node: '>=18.0.0' } + '@aws-sdk/xml-builder@3.723.0': + resolution: {integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==} + engines: {node: '>=18.0.0'} '@babel/code-frame@7.26.2': - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': - resolution: - { - integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==, - } - engines: { node: '>=6.9.0' } + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': - resolution: - { - integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.9': - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} - '@babel/parser@7.26.9': - resolution: - { - integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==, - } - engines: { node: '>=6.0.0' } + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.26.9': - resolution: - { - integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==, - } - engines: { node: '>=6.9.0' } + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} - '@babel/template@7.26.9': - resolution: - { - integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==, - } - engines: { node: '>=6.9.0' } + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.9': - resolution: - { - integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==, - } - engines: { node: '>=6.9.0' } + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} - '@babel/types@7.26.9': - resolution: - { - integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==, - } - engines: { node: '>=6.9.0' } + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} '@corex/deepmerge@4.0.43': - resolution: - { - integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==, - } - - '@date-fns/tz@1.2.0': - resolution: - { - integrity: sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg==, - } + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} '@dnd-kit/accessibility@3.1.1': - resolution: - { - integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==, - } + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: react: '>=16.8.0' '@dnd-kit/core@6.0.8': - resolution: - { - integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==, - } + resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@dnd-kit/sortable@7.0.2': - resolution: - { - integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==, - } + resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} peerDependencies: '@dnd-kit/core': ^6.0.7 react: '>=16.8.0' '@dnd-kit/utilities@3.2.2': - resolution: - { - integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==, - } + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} peerDependencies: react: '>=16.8.0' '@emnapi/runtime@1.3.1': - resolution: - { - integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==, - } + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} '@emotion/babel-plugin@11.13.5': - resolution: - { - integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==, - } + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} '@emotion/cache@11.14.0': - resolution: - { - integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==, - } + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/css@11.13.5': - resolution: - { - integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==, - } + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} '@emotion/hash@0.9.2': - resolution: - { - integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, - } + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} '@emotion/memoize@0.9.0': - resolution: - { - integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, - } + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} '@emotion/react@11.14.0': - resolution: - { - integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==, - } + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -641,1066 +430,674 @@ packages: optional: true '@emotion/serialize@1.3.3': - resolution: - { - integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==, - } + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/sheet@1.4.0': - resolution: - { - integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==, - } + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} '@emotion/unitless@0.10.0': - resolution: - { - integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==, - } + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: - { - integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==, - } + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' '@emotion/utils@1.4.2': - resolution: - { - integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==, - } + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.4.0': - resolution: - { - integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==, - } + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} '@esbuild/aix-ppc64@0.23.1': - resolution: - { - integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.23.1': - resolution: - { - integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.23.1': - resolution: - { - integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.23.1': - resolution: - { - integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.23.1': - resolution: - { - integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.23.1': - resolution: - { - integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.23.1': - resolution: - { - integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.23.1': - resolution: - { - integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.23.1': - resolution: - { - integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.23.1': - resolution: - { - integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.23.1': - resolution: - { - integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.23.1': - resolution: - { - integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.23.1': - resolution: - { - integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.23.1': - resolution: - { - integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.23.1': - resolution: - { - integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.23.1': - resolution: - { - integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.23.1': - resolution: - { - integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.23.1': - resolution: - { - integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.23.1': - resolution: - { - integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.23.1': - resolution: - { - integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.23.1': - resolution: - { - integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.23.1': - resolution: - { - integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.23.1': - resolution: - { - integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.23.1': - resolution: - { - integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.1': - resolution: - { - integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: - { - integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: - { - integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/core@0.10.0': + resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: - { - integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.21.0': - resolution: - { - integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: - { - integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: - { - integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@eslint/plugin-kit@0.2.5': + resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@faceless-ui/modal@3.0.0-beta.2': - resolution: - { - integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==, - } + resolution: {integrity: sha512-UmXvz7Iw3KMO4Pm3llZczU4uc5pPQDb6rdqwoBvYDFgWvkraOAHKx0HxSZgwqQvqOhn8joEFBfFp6/Do2562ow==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/scroll-info@2.0.0': - resolution: - { - integrity: sha512-BkyJ9OQ4bzpKjE3UhI8BhcG36ZgfB4run8TmlaR4oMFUbl59dfyarNfjveyimrxIso9RhFEja/AJ5nQmbcR9hw==, - } + '@faceless-ui/scroll-info@2.0.0-beta.0': + resolution: {integrity: sha512-pUBhQP8vduA7rVndNsjhaCcds1BykA/Q4iV23JWijU6ZFL/M3Fm9P3ypDS+0VVxolqemNhw8S3FXPwZGgjH4Rw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 - '@faceless-ui/window-info@3.0.1': - resolution: - { - integrity: sha512-uPjdJYE/j7hqVNelE9CRUNOeXuXDdPxR4DMe+oz3xwyZi2Y4CxsfpfdPTqqwmNAZa1P33O+ZiCyIkBEeNed0kw==, - } + '@faceless-ui/window-info@3.0.0-beta.0': + resolution: {integrity: sha512-Qs8xRA+fl4sU2aFVe9xawxfi5TVZ9VTPuhdQpx9aSv7U5a2F0AXwT61lJfnaJ9Flm8tOcxzq67p8cVZsXNCVeQ==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc.0 '@floating-ui/core@1.6.9': - resolution: - { - integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==, - } + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} '@floating-ui/dom@1.6.13': - resolution: - { - integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==, - } + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} '@floating-ui/react-dom@2.1.2': - resolution: - { - integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==, - } + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.27.5': - resolution: - { - integrity: sha512-BX3jKxo39Ba05pflcQmqPPwc0qdNsdNi/eweAFtoIdrJWNen2sVEWMEac3i6jU55Qfx+lOcdMNKYn2CtWmlnOQ==, - } + '@floating-ui/react@0.27.3': + resolution: {integrity: sha512-CLHnes3ixIFFKVQDdICjel8muhFLOBdQH7fgtHNPY8UbCNqbeKZ262G7K66lGQOUQWWnYocf7ZbUsLJgGfsLHg==} peerDependencies: react: '>=17.0.0' react-dom: '>=17.0.0' '@floating-ui/utils@0.2.9': - resolution: - { - integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==, - } + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} '@humanfs/core@0.19.1': - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': - resolution: - { - integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': - resolution: - { - integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: - { - integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, - } - engines: { node: '>=18.18' } + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} '@img/sharp-darwin-arm64@0.33.5': - resolution: - { - integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] '@img/sharp-darwin-x64@0.33.5': - resolution: - { - integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: - { - integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, - } + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: - { - integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, - } + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: - { - integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, - } + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] '@img/sharp-libvips-linux-arm@1.0.5': - resolution: - { - integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, - } + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: - { - integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, - } + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] '@img/sharp-libvips-linux-x64@1.0.4': - resolution: - { - integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, - } + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: - { - integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, - } + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: - { - integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, - } + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] '@img/sharp-linux-arm64@0.33.5': - resolution: - { - integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] '@img/sharp-linux-arm@0.33.5': - resolution: - { - integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] '@img/sharp-linux-s390x@0.33.5': - resolution: - { - integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] '@img/sharp-linux-x64@0.33.5': - resolution: - { - integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: - { - integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] '@img/sharp-linuxmusl-x64@0.33.5': - resolution: - { - integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] '@img/sharp-wasm32@0.33.5': - resolution: - { - integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] '@img/sharp-win32-ia32@0.33.5': - resolution: - { - integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] '@img/sharp-win32-x64@0.33.5': - resolution: - { - integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] '@isaacs/cliui@8.0.2': - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@jridgewell/gen-mapping@0.3.8': - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.0': - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jsdevtools/ono@7.1.3': - resolution: - { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, - } + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} '@lexical/clipboard@0.21.0': - resolution: - { - integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==, - } + resolution: {integrity: sha512-3lNMlMeUob9fcnRXGVieV/lmPbmet/SVWckNTOwzfKrZ/YW5HiiyJrWviLRVf50dGXTbmBGt7K/2pfPYvWCHFA==} '@lexical/code@0.21.0': - resolution: - { - integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==, - } + resolution: {integrity: sha512-E0DNSFu4I+LMn3ft+UT0Dbntc8ZKjIA0BJj6BDewm0qh3bir40YUf5DkI2lpiFNRF2OpcmmcIxakREeU6avqTA==} '@lexical/devtools-core@0.21.0': - resolution: - { - integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==, - } + resolution: {integrity: sha512-csK41CmRLZbKNV5pT4fUn5RzdPjU5PoWR8EqaS9kiyayhDg2zEnuPtvUYWanLfCLH9A2oOfbEsGxjMctAySlJw==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' '@lexical/dragon@0.21.0': - resolution: - { - integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==, - } + resolution: {integrity: sha512-ahTCaOtRFNauEzplN1qVuPjyGAlDd+XcVM5FQCdxVh/1DvqmBxEJRVuCBqatzUUVb89jRBekYUcEdnY9iNjvEQ==} '@lexical/hashtag@0.21.0': - resolution: - { - integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==, - } + resolution: {integrity: sha512-O4dxcZNq1Xm45HLoRifbGAYvQkg3qLoBc6ibmHnDqZL5mQDsufnH6QEKWfgDtrvp9++3iqsSC+TE7VzWIvA7ww==} '@lexical/headless@0.21.0': - resolution: - { - integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==, - } + resolution: {integrity: sha512-7/eEz6ed39MAg34c+rU7xUn46UV4Wdt5dEZwsdBzuflWhpNeUscQmkw8wIoFhEhJdCc+ZbB17CnjJlUZ1RxHvg==} '@lexical/history@0.21.0': - resolution: - { - integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==, - } + resolution: {integrity: sha512-Sv2sici2NnAfHYHYRSjjS139MDT8fHP6PlYM2hVr+17dOg7/fJl22VBLRgQ7/+jLtAPxQjID69jvaMlOvt4Oog==} '@lexical/html@0.21.0': - resolution: - { - integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==, - } + resolution: {integrity: sha512-UGahVsGz8OD7Ya39qwquE+JPStTxCw/uaQrnUNorCM7owtPidO2H+tsilAB3A1GK3ksFGdHeEjBjG0Gf7gOg+Q==} '@lexical/link@0.21.0': - resolution: - { - integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==, - } + resolution: {integrity: sha512-/coktIyRXg8rXz/7uxXsSEfSQYxPIx8CmignAXWYhcyYtCWA0fD2mhEhWwVvHH9ofNzvidclRPYKUnrmUm3z3Q==} '@lexical/list@0.21.0': - resolution: - { - integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==, - } + resolution: {integrity: sha512-WItGlwwNJCS8b6SO1QPKzArShmD+OXQkLbhBcAh+EfpnkvmCW5T5LqY+OfIRmEN1dhDOnwqCY7mXkivWO8o5tw==} '@lexical/mark@0.21.0': - resolution: - { - integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==, - } + resolution: {integrity: sha512-2x/LoHDYPOkZbKHz4qLFWsPywjRv9KggTOtmRazmaNRUG0FpkImJwUbbaKjWQXeESVGpzfL3qNFSAmCWthsc4g==} '@lexical/markdown@0.21.0': - resolution: - { - integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==, - } + resolution: {integrity: sha512-XCQCyW5ujK0xR6evV8sF0hv/MRUA//kIrB2JiyF12tLQyjLRNEXO+0IKastWnMKSaDdJMKjzgd+4PiummYs7uA==} '@lexical/offset@0.21.0': - resolution: - { - integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==, - } + resolution: {integrity: sha512-UR0wHg+XXbq++6aeUPdU0K41xhUDBYzX+AeiqU9bZ7yoOq4grvKD8KBr5tARCSYTy0yvQnL1ddSO12TrP/98Lg==} '@lexical/overflow@0.21.0': - resolution: - { - integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==, - } + resolution: {integrity: sha512-93P+d1mbvaJvZF8KK2pG22GuS2pHLtyC7N3GBfkbyAIb7TL/rYs47iR+eADJ4iNY680lylJ4Sl/AEnWvlY7hAg==} '@lexical/plain-text@0.21.0': - resolution: - { - integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==, - } + resolution: {integrity: sha512-r4CsAknBD7qGYSE5fPdjpJ6EjfvzHbDtuCeKciL9muiswQhw4HeJrT1qb/QUIY+072uvXTgCgmjUmkbYnxKyPA==} '@lexical/react@0.21.0': - resolution: - { - integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==, - } + resolution: {integrity: sha512-tKwx8EoNkBBKOZf8c10QfyDImH87+XUI1QDL8KXt+Lb8E4ho7g1jAjoEirNEn9gMBj33K4l2qVdbe3XmPAdpMQ==} peerDependencies: react: '>=17.x' react-dom: '>=17.x' '@lexical/rich-text@0.21.0': - resolution: - { - integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==, - } + resolution: {integrity: sha512-+pvEKUneEkGfWOSTl9jU58N9knePilMLxxOtppCAcgnaCdilOh3n5YyRppXhvmprUe0JaTseCMoik2LP51G/JA==} '@lexical/selection@0.21.0': - resolution: - { - integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==, - } + resolution: {integrity: sha512-4u53bc8zlPPF0rnHjsGQExQ1St8NafsDd70/t1FMw7yvoMtUsKdH7+ap00esLkJOMv45unJD7UOzKRqU1X0sEA==} '@lexical/table@0.21.0': - resolution: - { - integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==, - } + resolution: {integrity: sha512-JhylAWcf4qKD4FmxMUt3YzH5zg2+baBr4+/haLZL7178hMvUzJwGIiWk+3hD3phzmW3WrP49uFXzM7DMSCkE8w==} '@lexical/text@0.21.0': - resolution: - { - integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==, - } + resolution: {integrity: sha512-ceB4fhYejCoR8ID4uIs0sO/VyQoayRjrRWTIEMvOcQtwUkcyciKRhY0A7f2wVeq/MFStd+ajLLjy4WKYK5zUnA==} '@lexical/utils@0.21.0': - resolution: - { - integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==, - } + resolution: {integrity: sha512-YzsNOAiLkCy6R3DuP18gtseDrzgx+30lFyqRvp5M7mckeYgQElwdfG5biNFDLv7BM9GjSzgU5Cunjycsx6Sjqg==} '@lexical/yjs@0.21.0': - resolution: - { - integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==, - } + resolution: {integrity: sha512-AtPhC3pJ92CHz3dWoniSky7+MSK2WSd0xijc76I2qbTeXyeuFfYyhR6gWMg4knuY9Wz3vo9/+dXGdbQIPD8efw==} peerDependencies: yjs: '>=13.5.22' - '@monaco-editor/loader@1.5.0': - resolution: - { - integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==, - } + '@monaco-editor/loader@1.4.0': + resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==} + peerDependencies: + monaco-editor: '>= 0.21.0 < 1' - '@monaco-editor/react@4.7.0': - resolution: - { - integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==, - } + '@monaco-editor/react@4.6.0': + resolution: {integrity: sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@mongodb-js/saslprep@1.2.0': - resolution: - { - integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==, - } + '@mongodb-js/saslprep@1.1.9': + resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} '@next/env@13.5.8': - resolution: - { - integrity: sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==, - } + resolution: {integrity: sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==} + + '@next/env@15.1.5': + resolution: {integrity: sha512-jg8ygVq99W3/XXb9Y6UQsritwhjc+qeiO7QrGZRYOfviyr/HcdnhdBQu4gbp2rBIh2ZyBYTBMWbPw3JSCb0GHw==} '@next/env@15.2.0': - resolution: - { - integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==, - } + resolution: {integrity: sha512-eMgJu1RBXxxqqnuRJQh5RozhskoNUDHBFybvi+Z+yK9qzKeG7dadhv/Vp1YooSZmCnegf7JxWuapV77necLZNA==} '@next/eslint-plugin-next@15.2.0': - resolution: - { - integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==, - } + resolution: {integrity: sha512-jHFUG2OwmAuOASqq253RAEG/5BYcPHn27p1NoWZDCf4OdvdK0yRYWX92YKkL+Mk2s+GyJrmd/GATlL5b2IySpw==} '@next/swc-darwin-arm64@15.2.0': - resolution: - { - integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-rlp22GZwNJjFCyL7h5wz9vtpBVuCt3ZYjFWpEPBGzG712/uL1bbSkS675rVAUCRZ4hjoTJ26Q7IKhr5DfJrHDA==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@next/swc-darwin-x64@15.2.0': - resolution: - { - integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-DiU85EqSHogCz80+sgsx90/ecygfCSGl5P3b4XDRVZpgujBm5lp4ts7YaHru7eVTyZMjHInzKr+w0/7+qDrvMA==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@next/swc-linux-arm64-gnu@15.2.0': - resolution: - { - integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-VnpoMaGukiNWVxeqKHwi8MN47yKGyki5q+7ql/7p/3ifuU2341i/gDwGK1rivk0pVYbdv5D8z63uu9yMw0QhpQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@next/swc-linux-arm64-musl@15.2.0': - resolution: - { - integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-ka97/ssYE5nPH4Qs+8bd8RlYeNeUVBhcnsNUmFM6VWEob4jfN9FTr0NBhXVi1XEJpj3cMfgSRW+LdE3SUZbPrw==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@next/swc-linux-x64-gnu@15.2.0': - resolution: - { - integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-zY1JduE4B3q0k2ZCE+DAF/1efjTXUsKP+VXRtrt/rJCTgDlUyyryx7aOgYXNc1d8gobys/Lof9P9ze8IyRDn7Q==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@next/swc-linux-x64-musl@15.2.0': - resolution: - { - integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-QqvLZpurBD46RhaVaVBepkVQzh8xtlUN00RlG4Iq1sBheNugamUNPuZEH1r9X1YGQo1KqAe1iiShF0acva3jHQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@next/swc-win32-arm64-msvc@15.2.0': - resolution: - { - integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-ODZ0r9WMyylTHAN6pLtvUtQlGXBL9voljv6ujSlcsjOxhtXPI1Ag6AhZK0SE8hEpR1374WZZ5w33ChpJd5fsjw==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@next/swc-win32-x64-msvc@15.2.0': - resolution: - { - integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-8+4Z3Z7xa13NdUuUAcpVNA6o76lNPniBd9Xbo02bwXQXnZgFvEopwY2at5+z7yHl47X9qbZpvwatZ2BRo3EdZw==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] '@nodelib/fs.scandir@2.1.5': - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@nolyfill/is-core-module@1.0.39': - resolution: - { - integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, - } - engines: { node: '>=12.4.0' } + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} - '@payloadcms/db-mongodb@3.25.0': - resolution: - { - integrity: sha512-M5aD+s698wlmagTJPqgKySrwtuIjtwEJHQ8Ft5qLZWM/ngizrePbW/N/jGicSkuKJjwlP0fwJSrDQ4bkAN515g==, - } + '@payloadcms/db-mongodb@3.18.0': + resolution: {integrity: sha512-bRoCt89soddE8oTxtV8tXo9WsgEVQ1rOYaSqSTQj5/rzqkNtB5Eab6dlHcpI4ruJW2CbPlyspbqeV3as9HLPBA==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/email-nodemailer@3.25.0': - resolution: - { - integrity: sha512-7sPx3Uyt+piUdqz0/lRUaU7sjU7XGGuu//9qbf9FVwoceGQ/k8OBuK9dxKko2aMlfpff8Mo9ujKYFxfT4R970g==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/email-nodemailer@3.18.0': + resolution: {integrity: sha512-8xv0GxmBWHLGWWfDssCnoo8Jcjdk0H5UpRZOgJWYRWo760DAGQL/cwQZXPMCYtDk6QkyXy4NzoTv94RVK5Yp9g==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/graphql@3.25.0': - resolution: - { - integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==, - } + '@payloadcms/graphql@3.18.0': + resolution: {integrity: sha512-ktWKKEU/B7PDHUNAIt1rn4MUrVOIEWkWbvjAZONFCA6FMnD319QxISXE2UIjEPyiaRls8+7E4w3u8e6mHaIq2w==} hasBin: true peerDependencies: graphql: ^16.8.1 - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/live-preview-react@3.25.0': - resolution: - { - integrity: sha512-toqtcPKKYTr5qKN1o89+lLpt9XWthzMy8IrzyJTCoSWWgrZBAvuWE1iskQxRDZsjEGyzi91B8yyJy7lgts04aQ==, - } + '@payloadcms/live-preview-react@3.18.0': + resolution: {integrity: sha512-uzHSkm9n4BvZDZL5AL++4eqyp7x4ChG3apJEDdEd8Uzn9Nh+w5dUDJ9S/Bs0hQAguYeyZlS4p/XeZx3hMnv/jA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/live-preview@3.25.0': - resolution: - { - integrity: sha512-EzhHqyWCsqyt6MEB+4P0jVvALcNgsS9551QIfWgVHi31qWACxxDWFS6TRms2PF9ObiLTD4aWLukSrC5RAMF3KQ==, - } + '@payloadcms/live-preview@3.18.0': + resolution: {integrity: sha512-JeZkyhKkiuthPn95B/t+ER3VTQGyeWCzuRxLJh0Wyw80SlVYpqlGhdInnwbSMFA8d6lsW7Z9H31oGsNGPcR5/g==} - '@payloadcms/next@3.25.0': - resolution: - { - integrity: sha512-Xx703RpURJ34yRMTgjcbyg555p0yXCH5C6ZxLCinEs1Lv3nE6FymVjlMGs2y+5IqPZfjaH4qnkgcwtxBE+fHQw==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/next@3.18.0': + resolution: {integrity: sha512-WQMm9ebywWgdZ83S5jrcJB50Iae512jKGLZyBzPpqbpEkP0W2iwg0S7QXKixwhVc+Af9fndbOF9y+6d0xTYm9Q==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: graphql: ^16.8.1 next: ^15.0.0 - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/payload-cloud@3.25.0': - resolution: - { - integrity: sha512-VVNIvxAxxfxCArKcKKgBs81q7WhndiaPhAVU5VPr5giRzMpvATIwwpirjnfeoJxndL5X79lGhRcKiznwSIEEkw==, - } + '@payloadcms/payload-cloud@3.18.0': + resolution: {integrity: sha512-t31fkN6owm8X6C4YWj0Aq1QHFJsilpBqlhSH8YxQeLLt5aFSgw4/nqymRjbEK+BCr3U90ByBZwbCS48bsSoleA==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/plugin-form-builder@3.25.0': - resolution: - { - integrity: sha512-2/rEJjH8F99LF5BDAjEnY8T697dbc2ZFHk+FlCVXWf5FpwneNXz7teWj20tGmLwmN4bdz3KYgby0tHNuH/reyQ==, - } + '@payloadcms/plugin-form-builder@3.18.0': + resolution: {integrity: sha512-bj84DodUvPlMxOiZFZBvOTsQfXuJgIY4emLVNQCU2vhklH9lO4SLesebariY9fXxnKstGQc0VAOLLBa+EmsvzA==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-nested-docs@3.25.0': - resolution: - { - integrity: sha512-hIYKsaaTBy0l+hYTJgwVJeSfc+bGA7kzm+o6f8fR6kdWOlgE8M1/m1DB+54MedzY8vHZ31YKBWNny3ompWDQJQ==, - } + '@payloadcms/plugin-nested-docs@3.18.0': + resolution: {integrity: sha512-UuD6i34Z7nc+VH0fiTEXFqz9m+1TpG+8rNF79k2B454mtbbbAFpLrrywfrTDm0wY6G2dUXiOSc78tXzyy5xn2w==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/plugin-redirects@3.25.0': - resolution: - { - integrity: sha512-B19VBVXGbloXmSrkOmpCGiI5d+iQdA/Y5ciyvIiXELp52SWk88D7U4GuDKgWeS5FFyduNhB64mltJ6vJq+3bxg==, - } + '@payloadcms/plugin-redirects@3.18.0': + resolution: {integrity: sha512-9Fwin0IyJxElqIH69yaTJwPdmPxVFyvxZDaM5/94WFVCTYeHyo0hB7XCki6nreG6NOeQjpBfHPeXzKit/vAgEQ==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 - '@payloadcms/plugin-search@3.25.0': - resolution: - { - integrity: sha512-VLTIv6emUmdoPip/A1TaCpU4As+ng1OhYynesVMCPa8A7jUvr4KQX1yE3XF0z7os2CzuITb0EsfKC5Wb+OAHUQ==, - } + '@payloadcms/plugin-search@3.18.0': + resolution: {integrity: sha512-9WRwNxUuA7coLIX/j+lmloopDR7I3KGu5XvidwXJeSRjKkmIls9RuzqJoPVUSj2tX8YTlG5fmgVxKCFQXvBFUw==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/plugin-seo@3.25.0': - resolution: - { - integrity: sha512-zdHemmXb5O3c9XF5zP7B1oLibqMILkOvgh5MnpZA16QSM84dWefj/UizjcJ+NeYx1ODJTPT1eIRVB3gW/JLgtg==, - } + '@payloadcms/plugin-seo@3.18.0': + resolution: {integrity: sha512-l8RLBfnkpmKGRM1ktQ6WqL5zOcPxd5Cie47ThaHwuWee6j0+zC7tjgikU2wX5b6gamvDdRh35MvuWBWO5/4v6w==} peerDependencies: - payload: 3.25.0 + payload: 3.18.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/richtext-lexical@3.25.0': - resolution: - { - integrity: sha512-VHRqbhRu137bRYopYnPJef+5G2XyQO2a7LFUKPcnscwKDJKxkNQ5+jbUMKUjpm5zdxfbirnDVjWgJcsixau0Og==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/richtext-lexical@3.18.0': + resolution: {integrity: sha512-3BNPlTF4wTSfhZ7aGQyGMNc1bfpTwl1Zwt4ONl8AYrHk0Zs+hQvZkLLAhrrX076t0r7niYYVp7dihYalXmzcaQ==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: '@faceless-ui/modal': 3.0.0-beta.2 - '@faceless-ui/scroll-info': 2.0.0 - '@payloadcms/next': 3.25.0 - payload: 3.25.0 + '@faceless-ui/scroll-info': 2.0.0-beta.0 + '@lexical/headless': 0.21.0 + '@lexical/html': 0.21.0 + '@lexical/link': 0.21.0 + '@lexical/list': 0.21.0 + '@lexical/mark': 0.21.0 + '@lexical/react': 0.21.0 + '@lexical/rich-text': 0.21.0 + '@lexical/selection': 0.21.0 + '@lexical/table': 0.21.0 + '@lexical/utils': 0.21.0 + '@payloadcms/next': 3.18.0 + lexical: 0.21.0 + payload: 3.18.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 - '@payloadcms/translations@3.25.0': - resolution: - { - integrity: sha512-af+fDh+fzfExx9oeM8AJqwdEfc6X291smMUUe3mOCRlwIylcxXKzgj8ITdwPonGzaV/GJjAsc4U0mZIkaA6MMg==, - } + '@payloadcms/translations@3.18.0': + resolution: {integrity: sha512-ZPX3Gf5TSK+nNCtFYTMkQgt8zATSU8fflqzjSc7v64BBpNZoEug0OUtQqwDw4MjDQZZFJ7YuKT3lalDlZFUNxQ==} - '@payloadcms/ui@3.25.0': - resolution: - { - integrity: sha512-9zOv8zeenZlNua+WlFtldVAUn6NatMY5BPXzWRMWSfIVnrRqimY87HQyS6uvncSPdsPwqf9UH6mBkbIqbeusgw==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + '@payloadcms/ui@3.18.0': + resolution: {integrity: sha512-EXX72Q15kzIeCp8itSOu4NgFbVL039l3fDaKO9whPovRPjbgQz197P6WAolTzWCykESiO4eIuJwJIsmkfnqw8w==} + engines: {node: ^18.20.2 || >=20.9.0} peerDependencies: next: ^15.0.0 - payload: 3.25.0 + payload: 3.18.0 react: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 react-dom: ^19.0.0 || ^19.0.0-rc-65a56d0e-20241020 '@pkgjs/parseargs@0.11.0': - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} '@radix-ui/number@1.1.0': - resolution: - { - integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==, - } + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} '@radix-ui/primitive@1.1.1': - resolution: - { - integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==, - } + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} - '@radix-ui/react-arrow@1.1.2': - resolution: - { - integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==, - } + '@radix-ui/react-arrow@1.1.1': + resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1712,11 +1109,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.4': - resolution: - { - integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==, - } + '@radix-ui/react-checkbox@1.1.3': + resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1728,11 +1122,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.2': - resolution: - { - integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==, - } + '@radix-ui/react-collection@1.1.1': + resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1745,10 +1136,7 @@ packages: optional: true '@radix-ui/react-compose-refs@1.1.1': - resolution: - { - integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==, - } + resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1757,10 +1145,7 @@ packages: optional: true '@radix-ui/react-context@1.1.1': - resolution: - { - integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==, - } + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1769,10 +1154,7 @@ packages: optional: true '@radix-ui/react-direction@1.1.0': - resolution: - { - integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==, - } + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1780,11 +1162,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.5': - resolution: - { - integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==, - } + '@radix-ui/react-dismissable-layer@1.1.3': + resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1797,10 +1176,7 @@ packages: optional: true '@radix-ui/react-focus-guards@1.1.1': - resolution: - { - integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==, - } + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1808,11 +1184,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.2': - resolution: - { - integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==, - } + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1825,10 +1198,7 @@ packages: optional: true '@radix-ui/react-id@1.1.0': - resolution: - { - integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==, - } + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1836,11 +1206,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.2': - resolution: - { - integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==, - } + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1852,11 +1219,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.2': - resolution: - { - integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==, - } + '@radix-ui/react-popper@1.2.1': + resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1868,11 +1232,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.4': - resolution: - { - integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==, - } + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1885,10 +1246,7 @@ packages: optional: true '@radix-ui/react-presence@1.1.2': - resolution: - { - integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==, - } + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1900,11 +1258,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.0.2': - resolution: - { - integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==, - } + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1916,11 +1271,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.6': - resolution: - { - integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==, - } + '@radix-ui/react-select@2.1.4': + resolution: {integrity: sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -1932,11 +1284,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.1.2': - resolution: - { - integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==, - } + '@radix-ui/react-slot@1.1.1': + resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1945,10 +1294,7 @@ packages: optional: true '@radix-ui/react-use-callback-ref@1.1.0': - resolution: - { - integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==, - } + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1957,10 +1303,7 @@ packages: optional: true '@radix-ui/react-use-controllable-state@1.1.0': - resolution: - { - integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==, - } + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1969,10 +1312,7 @@ packages: optional: true '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: - { - integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==, - } + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1981,10 +1321,7 @@ packages: optional: true '@radix-ui/react-use-layout-effect@1.1.0': - resolution: - { - integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==, - } + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -1993,10 +1330,7 @@ packages: optional: true '@radix-ui/react-use-previous@1.1.0': - resolution: - { - integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==, - } + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2005,10 +1339,7 @@ packages: optional: true '@radix-ui/react-use-rect@1.1.0': - resolution: - { - integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==, - } + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2017,10 +1348,7 @@ packages: optional: true '@radix-ui/react-use-size@1.1.0': - resolution: - { - integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==, - } + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2028,11 +1356,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.1.2': - resolution: - { - integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==, - } + '@radix-ui/react-visually-hidden@1.1.1': + resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2045,899 +1370,505 @@ packages: optional: true '@radix-ui/rect@1.1.0': - resolution: - { - integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==, - } + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} '@rtsao/scc@1.1.0': - resolution: - { - integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, - } + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@rushstack/eslint-patch@1.10.5': - resolution: - { - integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==, - } + resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} '@smithy/abort-controller@4.0.1': - resolution: - { - integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.0.0': - resolution: - { - integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader@5.0.0': - resolution: - { - integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} + engines: {node: '>=18.0.0'} '@smithy/config-resolver@4.0.1': - resolution: - { - integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==} + engines: {node: '>=18.0.0'} - '@smithy/core@3.1.5': - resolution: - { - integrity: sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==, - } - engines: { node: '>=18.0.0' } + '@smithy/core@3.1.1': + resolution: {integrity: sha512-hhUZlBWYuh9t6ycAcN90XOyG76C1AzwxZZgaCVPMYpWqqk9uMFo7HGG5Zu2cEhCJn7DdOi5krBmlibWWWPgdsw==} + engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.1': - resolution: - { - integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@4.0.1': - resolution: - { - integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-browser@4.0.1': - resolution: - { - integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-config-resolver@4.0.1': - resolution: - { - integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@4.0.1': - resolution: - { - integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@4.0.1': - resolution: - { - integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==} + engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.0.1': - resolution: - { - integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==} + engines: {node: '>=18.0.0'} '@smithy/hash-blob-browser@4.0.1': - resolution: - { - integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==} + engines: {node: '>=18.0.0'} '@smithy/hash-node@4.0.1': - resolution: - { - integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==} + engines: {node: '>=18.0.0'} '@smithy/hash-stream-node@4.0.1': - resolution: - { - integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==} + engines: {node: '>=18.0.0'} '@smithy/invalid-dependency@4.0.1': - resolution: - { - integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==} + engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': - resolution: - { - integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} '@smithy/is-array-buffer@4.0.0': - resolution: - { - integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + engines: {node: '>=18.0.0'} '@smithy/md5-js@4.0.1': - resolution: - { - integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==} + engines: {node: '>=18.0.0'} '@smithy/middleware-content-length@4.0.1': - resolution: - { - integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.0.6': - resolution: - { - integrity: sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-endpoint@4.0.2': + resolution: {integrity: sha512-Z9m67CXizGpj8CF/AW/7uHqYNh1VXXOn9Ap54fenWsCa0HnT4cJuE61zqG3cBkTZJDCy0wHJphilI41co/PE5g==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.0.7': - resolution: - { - integrity: sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-retry@4.0.3': + resolution: {integrity: sha512-TiKwwQTwUDeDtwWW8UWURTqu7s6F3wN2pmziLU215u7bqpVT9Mk2oEvURjpRLA+5XeQhM68R5BpAGzVtomsqgA==} + engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.2': - resolution: - { - integrity: sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==, - } - engines: { node: '>=18.0.0' } + '@smithy/middleware-serde@4.0.1': + resolution: {integrity: sha512-Fh0E2SOF+S+P1+CsgKyiBInAt3o2b6Qk7YOp2W0Qx2XnfTdfMuSDKUEcnrtpxCzgKJnqXeLUZYqtThaP0VGqtA==} + engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.0.1': - resolution: - { - integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==} + engines: {node: '>=18.0.0'} '@smithy/node-config-provider@4.0.1': - resolution: - { - integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==} + engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.0.3': - resolution: - { - integrity: sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==, - } - engines: { node: '>=18.0.0' } + '@smithy/node-http-handler@4.0.2': + resolution: {integrity: sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==} + engines: {node: '>=18.0.0'} '@smithy/property-provider@4.0.1': - resolution: - { - integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==} + engines: {node: '>=18.0.0'} '@smithy/protocol-http@5.0.1': - resolution: - { - integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==} + engines: {node: '>=18.0.0'} '@smithy/querystring-builder@4.0.1': - resolution: - { - integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==} + engines: {node: '>=18.0.0'} '@smithy/querystring-parser@4.0.1': - resolution: - { - integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==} + engines: {node: '>=18.0.0'} '@smithy/service-error-classification@4.0.1': - resolution: - { - integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==} + engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@4.0.1': - resolution: - { - integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==} + engines: {node: '>=18.0.0'} '@smithy/signature-v4@5.0.1': - resolution: - { - integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==} + engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.1.6': - resolution: - { - integrity: sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==, - } - engines: { node: '>=18.0.0' } + '@smithy/smithy-client@4.1.2': + resolution: {integrity: sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==} + engines: {node: '>=18.0.0'} '@smithy/types@4.1.0': - resolution: - { - integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} + engines: {node: '>=18.0.0'} '@smithy/url-parser@4.0.1': - resolution: - { - integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==} + engines: {node: '>=18.0.0'} '@smithy/util-base64@4.0.0': - resolution: - { - integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-browser@4.0.0': - resolution: - { - integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-node@4.0.0': - resolution: - { - integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} + engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': - resolution: - { - integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} '@smithy/util-buffer-from@4.0.0': - resolution: - { - integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + engines: {node: '>=18.0.0'} '@smithy/util-config-provider@4.0.0': - resolution: - { - integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.7': - resolution: - { - integrity: sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-defaults-mode-browser@4.0.3': + resolution: {integrity: sha512-7c5SF1fVK0EOs+2EOf72/qF199zwJflU1d02AevwKbAUPUZyE9RUZiyJxeUmhVxfKDWdUKaaVojNiaDQgnHL9g==} + engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.7': - resolution: - { - integrity: sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-defaults-mode-node@4.0.3': + resolution: {integrity: sha512-CVnD42qYD3JKgDlImZ9+On+MqJHzq9uJgPbMdeBE8c2x8VJ2kf2R3XO/yVFx+30ts5lD/GlL0eFIShY3x9ROgQ==} + engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.0.1': - resolution: - { - integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==} + engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.0.0': - resolution: - { - integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + engines: {node: '>=18.0.0'} '@smithy/util-middleware@4.0.1': - resolution: - { - integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==} + engines: {node: '>=18.0.0'} '@smithy/util-retry@4.0.1': - resolution: - { - integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==} + engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.1.2': - resolution: - { - integrity: sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==, - } - engines: { node: '>=18.0.0' } + '@smithy/util-stream@4.0.2': + resolution: {integrity: sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==} + engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.0.0': - resolution: - { - integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': - resolution: - { - integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} '@smithy/util-utf8@4.0.0': - resolution: - { - integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + engines: {node: '>=18.0.0'} '@smithy/util-waiter@4.0.2': - resolution: - { - integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} + engines: {node: '>=18.0.0'} '@swc/counter@0.1.3': - resolution: - { - integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, - } + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.15': - resolution: - { - integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, - } + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@tailwindcss/typography@0.5.16': - resolution: - { - integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==, - } + resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' '@tokenizer/token@0.3.0': - resolution: - { - integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==, - } + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} '@types/acorn@4.0.6': - resolution: - { - integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==, - } + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} '@types/busboy@1.5.4': - resolution: - { - integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==, - } + resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==} '@types/debug@4.1.12': - resolution: - { - integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, - } + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} '@types/escape-html@1.0.4': - resolution: - { - integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==, - } + resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} '@types/estree-jsx@1.0.5': - resolution: - { - integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, - } + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} '@types/estree@1.0.6': - resolution: - { - integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, - } + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/hast@3.0.4': - resolution: - { - integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, - } + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} '@types/json-schema@7.0.15': - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': - resolution: - { - integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, - } + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.16': - resolution: - { - integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==, - } + '@types/lodash@4.17.14': + resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} '@types/mdast@4.0.4': - resolution: - { - integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, - } + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': - resolution: - { - integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, - } + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@22.5.4': - resolution: - { - integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==, - } + resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} '@types/parse-json@4.0.2': - resolution: - { - integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==, - } + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} '@types/prismjs@1.26.5': - resolution: - { - integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==, - } + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} '@types/react-dom@19.0.4': - resolution: - { - integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==, - } + resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: '@types/react': ^19.0.0 '@types/react-transition-group@4.4.12': - resolution: - { - integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==, - } + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} peerDependencies: '@types/react': '*' '@types/react@19.0.10': - resolution: - { - integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==, - } + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} '@types/unist@2.0.11': - resolution: - { - integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, - } + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} '@types/unist@3.0.3': - resolution: - { - integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, - } + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@types/uuid@10.0.0': - resolution: - { - integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==, - } + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/webidl-conversions@7.0.3': - resolution: - { - integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==, - } + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} '@types/whatwg-url@11.0.5': - resolution: - { - integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==, - } + resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==} - '@typescript-eslint/eslint-plugin@8.25.0': - resolution: - { - integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/eslint-plugin@8.20.0': + resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.25.0': - resolution: - { - integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/parser@8.20.0': + resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.25.0': - resolution: - { - integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/scope-manager@8.20.0': + resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.25.0': - resolution: - { - integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/type-utils@8.20.0': + resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.25.0': - resolution: - { - integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/types@8.20.0': + resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.25.0': - resolution: - { - integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/typescript-estree@8.20.0': + resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.25.0': - resolution: - { - integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/utils@8.20.0': + resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.25.0': - resolution: - { - integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + '@typescript-eslint/visitor-keys@8.20.0': + resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.12.1: - resolution: - { - integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} hasBin: true acorn@8.14.0: - resolution: - { - integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} amazon-cognito-identity-js@6.3.12: - resolution: - { - integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==, - } + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} arg@5.0.2: - resolution: - { - integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, - } + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-hidden@1.2.4: - resolution: - { - integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} aria-query@5.3.2: - resolution: - { - integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.2: - resolution: - { - integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} array-includes@3.1.8: - resolution: - { - integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} array.prototype.findlast@1.2.5: - resolution: - { - integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} array.prototype.findlastindex@1.2.5: - resolution: - { - integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: - resolution: - { - integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.3: - resolution: - { - integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: - resolution: - { - integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.4: - resolution: - { - integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} ast-types-flow@0.0.8: - resolution: - { - integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, - } - - async-function@1.0.0: - resolution: - { - integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} atomic-sleep@1.0.0: - resolution: - { - integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} autoprefixer@10.4.20: - resolution: - { - integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: - { - integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} axe-core@4.10.2: - resolution: - { - integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} + engines: {node: '>=4'} axobject-query@4.1.0: - resolution: - { - integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} b4a@1.6.7: - resolution: - { - integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==, - } + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} babel-plugin-macros@3.1.0: - resolution: - { - integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==, - } - engines: { node: '>=10', npm: '>=6' } + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} bare-events@2.5.4: - resolution: - { - integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==, - } + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} bare-fs@4.0.1: - resolution: - { - integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==, - } - engines: { bare: '>=1.7.0' } + resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} + engines: {bare: '>=1.7.0'} - bare-os@3.5.1: - resolution: - { - integrity: sha512-LvfVNDcWLw2AnIw5f2mWUgumW3I3N/WYGiWeimhQC1Ybt71n2FjlS9GJKeCnFeg1MKZHxzIFmpFnBXDI+sBeFg==, - } - engines: { bare: '>=1.14.0' } + bare-os@3.4.0: + resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} + engines: {bare: '>=1.6.0'} bare-path@3.0.0: - resolution: - { - integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==, - } + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.5: - resolution: - { - integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==, - } + bare-stream@2.6.4: + resolution: {integrity: sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -2948,423 +1879,228 @@ packages: optional: true base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} body-scroll-lock@4.0.0-beta.0: - resolution: - { - integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==, - } + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} bowser@2.11.0: - resolution: - { - integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==, - } + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browserslist@4.24.4: - resolution: - { - integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bson-objectid@2.0.4: - resolution: - { - integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==, - } + resolution: {integrity: sha512-vgnKAUzcDoa+AeyYwXCoHyF2q6u/8H46dxu5JN+4/TZeq/Dlinn0K6GvxsCLb3LHUJl0m/TLiEK31kUwtgocMQ==} - bson@6.10.3: - resolution: - { - integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==, - } - engines: { node: '>=16.20.1' } + bson@6.10.1: + resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==} + engines: {node: '>=16.20.1'} buffer@4.9.2: - resolution: - { - integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==, - } + resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} buffer@5.6.0: - resolution: - { - integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==, - } + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: '>=10.16.0' } + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} - call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: '>= 0.4' } + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { - integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.3: - resolution: - { - integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camelcase-css@2.0.1: - resolution: - { - integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} - caniuse-lite@1.0.30001701: - resolution: - { - integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==, - } + caniuse-lite@1.0.30001692: + resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} ccount@2.0.1: - resolution: - { - integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, - } + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} character-entities-html4@2.1.0: - resolution: - { - integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, - } + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} character-entities-legacy@3.0.0: - resolution: - { - integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, - } + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} character-entities@2.0.2: - resolution: - { - integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, - } + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} character-reference-invalid@2.0.1: - resolution: - { - integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, - } + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} charenc@0.0.2: - resolution: - { - integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, - } + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: '>= 8.10.0' } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} ci-info@4.1.0: - resolution: - { - integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} class-variance-authority@0.7.1: - resolution: - { - integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==, - } + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} classnames@2.5.1: - resolution: - { - integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, - } + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} client-only@0.0.1: - resolution: - { - integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, - } + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} clsx@2.1.1: - resolution: - { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@4.2.3: - resolution: - { - integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, - } - engines: { node: '>=12.5.0' } + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} console-table-printer@2.12.1: - resolution: - { - integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==, - } + resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==} convert-source-map@1.9.0: - resolution: - { - integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, - } + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} copyfiles@2.4.1: - resolution: - { - integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==, - } + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cosmiconfig@7.1.0: - resolution: - { - integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} croner@9.0.0: - resolution: - { - integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==, - } - engines: { node: '>=18.0' } + resolution: {integrity: sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==} + engines: {node: '>=18.0'} cross-env@7.0.3: - resolution: - { - integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==, - } - engines: { node: '>=10.14', npm: '>=6', yarn: '>=1' } + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} crypt@0.0.2: - resolution: - { - integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, - } + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true cssfilter@0.0.10: - resolution: - { - integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==, - } + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} csstype@3.1.3: - resolution: - { - integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, - } + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} damerau-levenshtein@1.0.8: - resolution: - { - integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, - } + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} data-view-buffer@1.0.2: - resolution: - { - integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} data-view-byte-length@1.0.2: - resolution: - { - integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: - resolution: - { - integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} dataloader@2.2.3: - resolution: - { - integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==, - } + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} date-fns@3.6.0: - resolution: - { - integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==, - } + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} date-fns@4.1.0: - resolution: - { - integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==, - } + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} dateformat@4.6.3: - resolution: - { - integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==, - } + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3372,11 +2108,8 @@ packages: optional: true debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3384,249 +2117,137 @@ packages: optional: true decode-named-character-reference@1.0.2: - resolution: - { - integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, - } + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} dequal@2.0.3: - resolution: - { - integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} detect-libc@2.0.3: - resolution: - { - integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} detect-node-es@1.1.0: - resolution: - { - integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==, - } + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} devlop@1.1.0: - resolution: - { - integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, - } + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} didyoumean@1.2.2: - resolution: - { - integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, - } + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} diff@5.2.0: - resolution: - { - integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, - } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} dlv@1.1.3: - resolution: - { - integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, - } + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} doctrine@2.1.0: - resolution: - { - integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dom-helpers@5.2.1: - resolution: - { - integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==, - } + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.109: - resolution: - { - integrity: sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==, - } + electron-to-chromium@1.5.83: + resolution: {integrity: sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.18.1: - resolution: - { - integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, - } - engines: { node: '>=10.13.0' } + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + engines: {node: '>=10.13.0'} error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} es-abstract@1.23.9: - resolution: - { - integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-iterator-helpers@1.2.1: - resolution: - { - integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: - { - integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, - } - engines: { node: '>= 0.4' } + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} es-to-primitive@1.3.0: - resolution: - { - integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} esbuild@0.23.1: - resolution: - { - integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} eslint-config-next@15.2.0: - resolution: - { - integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==, - } + resolution: {integrity: sha512-LkG0KKpinAoNPk2HXSx0fImFb/hQ6RnhSxTkpJFTkQ0SmnzsbRsjjN95WC/mDY34nKOenpptYEVvfkCR/h+VjA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 typescript: '>=3.3.1' @@ -3635,17 +2256,11 @@ packages: optional: true eslint-import-resolver-node@0.3.9: - resolution: - { - integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, - } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.3: - resolution: - { - integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -3657,11 +2272,8 @@ packages: optional: true eslint-module-utils@2.12.0: - resolution: - { - integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -3681,11 +2293,8 @@ packages: optional: true eslint-plugin-import@2.31.0: - resolution: - { - integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 @@ -3694,59 +2303,38 @@ packages: optional: true eslint-plugin-jsx-a11y@6.10.2: - resolution: - { - integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.2.0: - resolution: - { - integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==, - } - engines: { node: '>=10' } + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react@7.37.4: - resolution: - { - integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-scope@8.2.0: - resolution: - { - integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.0: - resolution: - { - integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.21.0: - resolution: - { - integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + eslint@9.18.0: + resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -3755,153 +2343,84 @@ packages: optional: true espree@10.3.0: - resolution: - { - integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} estree-util-is-identifier-name@3.0.0: - resolution: - { - integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, - } + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} estree-util-visit@2.0.0: - resolution: - { - integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, - } + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} fast-base64-decode@1.0.0: - resolution: - { - integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==, - } + resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} fast-copy@3.0.2: - resolution: - { - integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==, - } + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-fifo@1.3.2: - resolution: - { - integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, - } + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} fast-glob@3.3.1: - resolution: - { - integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fast-redact@3.5.0: - resolution: - { - integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} fast-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@3.0.6: - resolution: - { - integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==, - } + fast-uri@3.0.5: + resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} fast-xml-parser@4.4.1: - resolution: - { - integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==, - } + resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastq@1.19.1: - resolution: - { - integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, - } + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fdir@6.4.3: - resolution: - { - integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==, - } + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -3909,1199 +2428,649 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-type@19.3.0: - resolution: - { - integrity: sha512-mROwiKLZf/Kwa/2Rol+OOZQn1eyTkPB3ZTwC0ExY6OLFCbgxHYZvBm7xI77NvfZFMKBsmuXfmLJnD4eEftEhrA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-mROwiKLZf/Kwa/2Rol+OOZQn1eyTkPB3ZTwC0ExY6OLFCbgxHYZvBm7xI77NvfZFMKBsmuXfmLJnD4eEftEhrA==} + engines: {node: '>=18'} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-root@1.1.0: - resolution: - { - integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==, - } + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} - flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} focus-trap@7.5.4: - resolution: - { - integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==, - } + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} - for-each@0.3.5: - resolution: - { - integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, - } - engines: { node: '>= 0.4' } + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: '>=14' } + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} fraction.js@4.3.7: - resolution: - { - integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, - } + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.8: - resolution: - { - integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} functions-have-names@1.2.3: - resolution: - { - integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, - } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} geist@1.3.1: - resolution: - { - integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==, - } + resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==} peerDependencies: next: '>=13.2.0' get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: '>= 0.4' } + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} get-nonce@1.0.1: - resolution: - { - integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-symbol-description@1.1.0: - resolution: - { - integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, - } - engines: { node: '>= 0.4' } - - get-tsconfig@4.10.0: - resolution: - { - integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==, - } + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} get-tsconfig@4.8.1: - resolution: - { - integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==, - } + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globalthis@1.0.4: - resolution: - { - integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} graphql-http@1.22.4: - resolution: - { - integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-OC3ucK988teMf+Ak/O+ZJ0N2ukcgrEurypp8ePyJFWq83VzwRAmHxxr+XxrMpxO/FIwI4a7m/Fzv3tWGJv0wPA==} + engines: {node: '>=12'} peerDependencies: graphql: '>=0.11 <=16' graphql-playground-html@1.6.30: - resolution: - { - integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==, - } + resolution: {integrity: sha512-tpCujhsJMva4aqE8ULnF7/l3xw4sNRZcSHu+R00VV+W0mfp+Q20Plvcrp+5UXD+2yS6oyCXncA+zoQJQqhGCEw==} graphql-scalars@1.22.2: - resolution: - { - integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ==} + engines: {node: '>=10'} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 graphql@16.10.0: - resolution: - { - integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==, - } - engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } + resolution: {integrity: sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} has-bigints@1.1.0: - resolution: - { - integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: - resolution: - { - integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} help-me@5.0.0: - resolution: - { - integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==, - } + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} hoist-non-react-statics@3.3.2: - resolution: - { - integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, - } + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} http-status@2.1.0: - resolution: - { - integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-O5kPr7AW7wYd/BBiOezTwnVAnmSNFY+J7hlZD2X5IOxVBetjcHAiTXhzj0gMrnojQlwy+UT1/Y3H3vJ3UlmvLA==} + engines: {node: '>= 0.4.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} image-size@1.2.0: - resolution: - { - integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==, - } - engines: { node: '>=16.x' } + resolution: {integrity: sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w==} + engines: {node: '>=16.x'} hasBin: true immutable@4.3.7: - resolution: - { - integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==, - } + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: '>=6' } + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} internal-slot@1.1.0: - resolution: - { - integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} is-alphabetical@2.0.1: - resolution: - { - integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, - } + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: - resolution: - { - integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, - } + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} is-array-buffer@3.0.5: - resolution: - { - integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-async-function@2.1.1: - resolution: - { - integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, - } - engines: { node: '>= 0.4' } + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} + engines: {node: '>= 0.4'} is-bigint@1.1.0: - resolution: - { - integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} - is-boolean-object@1.2.2: - resolution: - { - integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, - } - engines: { node: '>= 0.4' } + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} is-bun-module@1.3.0: - resolution: - { - integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==, - } + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} is-callable@1.2.7: - resolution: - { - integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-data-view@1.0.2: - resolution: - { - integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} is-date-object@1.1.0: - resolution: - { - integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} is-decimal@2.0.1: - resolution: - { - integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, - } + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.1: - resolution: - { - integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-generator-function@1.1.0: - resolution: - { - integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-hexadecimal@2.0.1: - resolution: - { - integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, - } + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} is-map@2.0.3: - resolution: - { - integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} is-number-object@1.1.1: - resolution: - { - integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-regex@1.2.1: - resolution: - { - integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} is-set@2.0.3: - resolution: - { - integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.4: - resolution: - { - integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} is-string@1.1.1: - resolution: - { - integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} is-symbol@1.1.1: - resolution: - { - integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} is-typed-array@1.1.15: - resolution: - { - integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} is-weakmap@2.0.2: - resolution: - { - integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} - is-weakref@1.1.1: - resolution: - { - integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, - } - engines: { node: '>= 0.4' } + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} is-weakset@2.0.4: - resolution: - { - integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} isarray@0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isarray@2.0.5: - resolution: - { - integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, - } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isomorphic-unfetch@3.1.0: - resolution: - { - integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==, - } + resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} isomorphic.js@0.2.5: - resolution: - { - integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==, - } + resolution: {integrity: sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==} iterator.prototype@1.1.5: - resolution: - { - integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@1.21.7: - resolution: - { - integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, - } + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jose@5.9.6: - resolution: - { - integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==, - } + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-cookie@2.2.1: - resolution: - { - integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==, - } + resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-to-typescript@15.0.3: - resolution: - { - integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==} + engines: {node: '>=16.0.0'} hasBin: true json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@1.0.2: - resolution: - { - integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, - } + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true jsox@1.2.121: - resolution: - { - integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==, - } + resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==} hasBin: true jsx-ast-utils@3.3.5: - resolution: - { - integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} kareem@2.6.3: - resolution: - { - integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} + engines: {node: '>=12.0.0'} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} language-subtag-registry@0.3.23: - resolution: - { - integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, - } + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} language-tags@1.0.9: - resolution: - { - integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} lexical@0.21.0: - resolution: - { - integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==, - } + resolution: {integrity: sha512-Dxc5SCG4kB+wF+Rh55ism3SuecOKeOtCtGHFGKd6pj2QKVojtjkxGTQPMt7//2z5rMSue4R+hmRM0pCEZflupA==} lib0@0.2.99: - resolution: - { - integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==} + engines: {node: '>=16'} hasBin: true lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.castarray@4.4.0: - resolution: - { - integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, - } + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} longest-streak@3.1.0: - resolution: - { - integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, - } + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lucide-react@0.378.0: - resolution: - { - integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==, - } + resolution: {integrity: sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} md5@2.3.0: - resolution: - { - integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, - } + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} mdast-util-from-markdown@2.0.2: - resolution: - { - integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, - } + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} mdast-util-mdx-jsx@3.1.3: - resolution: - { - integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==, - } + resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==} mdast-util-phrasing@4.1.0: - resolution: - { - integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, - } + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} mdast-util-to-markdown@2.1.2: - resolution: - { - integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, - } + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: - resolution: - { - integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, - } + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} memoize-one@6.0.0: - resolution: - { - integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==, - } + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} memory-pager@1.5.0: - resolution: - { - integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, - } + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - micromark-core-commonmark@2.0.3: - resolution: - { - integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, - } + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} micromark-extension-mdx-jsx@3.0.1: - resolution: - { - integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==, - } + resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==} micromark-factory-destination@2.0.1: - resolution: - { - integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, - } + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: - resolution: - { - integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, - } + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} micromark-factory-mdx-expression@2.0.2: - resolution: - { - integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==, - } + resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==} micromark-factory-space@2.0.1: - resolution: - { - integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, - } + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} micromark-factory-title@2.0.1: - resolution: - { - integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, - } + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} micromark-factory-whitespace@2.0.1: - resolution: - { - integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, - } + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} micromark-util-character@2.1.1: - resolution: - { - integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, - } + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} micromark-util-chunked@2.0.1: - resolution: - { - integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, - } + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} micromark-util-classify-character@2.0.1: - resolution: - { - integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, - } + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} micromark-util-combine-extensions@2.0.1: - resolution: - { - integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, - } + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} micromark-util-decode-numeric-character-reference@2.0.2: - resolution: - { - integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, - } + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} micromark-util-decode-string@2.0.1: - resolution: - { - integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, - } + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} micromark-util-encode@2.0.1: - resolution: - { - integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, - } + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} micromark-util-events-to-acorn@2.0.2: - resolution: - { - integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==, - } + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} micromark-util-html-tag-name@2.0.1: - resolution: - { - integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, - } + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} micromark-util-normalize-identifier@2.0.1: - resolution: - { - integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, - } + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} micromark-util-resolve-all@2.0.1: - resolution: - { - integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, - } + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} micromark-util-sanitize-uri@2.0.1: - resolution: - { - integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, - } + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.1.0: - resolution: - { - integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, - } + micromark-util-subtokenize@2.0.3: + resolution: {integrity: sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==} micromark-util-symbol@2.0.1: - resolution: - { - integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, - } + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.2: - resolution: - { - integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, - } + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} - micromark@4.0.2: - resolution: - { - integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, - } + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true monaco-editor@0.52.2: - resolution: - { - integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==, - } + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} mongodb-connection-string-url@3.0.2: - resolution: - { - integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==, - } + resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} mongodb@6.12.0: - resolution: - { - integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==, - } - engines: { node: '>=16.20.1' } + resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==} + engines: {node: '>=16.20.1'} peerDependencies: '@aws-sdk/credential-providers': ^3.188.0 '@mongodb-js/zstd': ^1.1.0 || ^2.0.0 @@ -5127,88 +3096,52 @@ packages: optional: true mongoose-aggregate-paginate-v2@1.1.2: - resolution: - { - integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-Ai478tHedZy3U2ITBEp2H4rQEviRan3TK4p/umlFqIzgPF1R0hNKvzzQGIb1l2h+Z32QLU3NqaoWKu4vOOUElQ==} + engines: {node: '>=4.0.0'} mongoose-paginate-v2@1.8.5: - resolution: - { - integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-kFxhot+yw9KmpAGSSrF/o+f00aC2uawgNUbhyaM0USS9L7dln1NA77/pLg4lgOaRgXMtfgCENamjqZwIM1Zrig==} + engines: {node: '>=4.0.0'} mongoose@8.9.5: - resolution: - { - integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==, - } - engines: { node: '>=16.20.1' } + resolution: {integrity: sha512-SPhOrgBm0nKV3b+IIHGqpUTOmgVL5Z3OO9AwkFEmvOZznXTvplbomstCnPOGAyungtRXE5pJTgKpKcZTdjeESg==} + engines: {node: '>=16.20.1'} mpath@0.9.0: - resolution: - { - integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} mquery@5.0.0: - resolution: - { - integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} + engines: {node: '>=14.0.0'} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoid@3.3.8: - resolution: - { - integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-build-utils@2.0.0: - resolution: - { - integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, - } + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} next-sitemap@4.2.3: - resolution: - { - integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==, - } - engines: { node: '>=14.18' } + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} hasBin: true peerDependencies: next: '*' next@15.2.0: - resolution: - { - integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==, - } - engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } + resolution: {integrity: sha512-VaiM7sZYX8KIAHBrRGSFytKknkrexNfGb8GlG6e93JqueCspuGte8i4ybn8z4ww1x3f2uzY4YpTaBEW4/hvsoQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -5227,25 +3160,16 @@ packages: sass: optional: true - node-abi@3.74.0: - resolution: - { - integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==, - } - engines: { node: '>=10' } + node-abi@3.73.0: + resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} + engines: {node: '>=10'} node-addon-api@6.1.0: - resolution: - { - integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==, - } + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -5253,345 +3177,198 @@ packages: optional: true node-releases@2.0.19: - resolution: - { - integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, - } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nodemailer@6.9.16: - resolution: - { - integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==} + engines: {node: '>=6.0.0'} noms@0.0.0: - resolution: - { - integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==, - } + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} normalize-range@0.1.2: - resolution: - { - integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} object-hash@3.0.0: - resolution: - { - integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} - object-inspect@1.13.4: - resolution: - { - integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, - } - engines: { node: '>= 0.4' } + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object-to-formdata@4.5.1: - resolution: - { - integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==, - } + resolution: {integrity: sha512-QiM9D0NiU5jV6J6tjE1g7b4Z2tcUnKs1OPUi4iMb2zH+7jwlcUrASghgkFk9GtzqNNq8rTQJtT8AzjBAvLoNMw==} object.assign@4.1.7: - resolution: - { - integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} object.entries@1.1.8: - resolution: - { - integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} object.fromentries@2.0.8: - resolution: - { - integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} object.groupby@1.0.3: - resolution: - { - integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} object.values@1.2.1: - resolution: - { - integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} on-exit-leak-free@2.1.2: - resolution: - { - integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} own-keys@1.0.1: - resolution: - { - integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-entities@4.0.2: - resolution: - { - integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, - } + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: '>=16 || 14 >=14.18' } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@6.3.0: - resolution: - { - integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==, - } + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - payload-admin-bar@1.0.6: - resolution: - { - integrity: sha512-hpQdOiPq4LpWTkbuAnvxDf5wQ2ysMp9kQt+X2U+FfvBwD1U6qoxJfmUymG1OjLlaZzCZ93FlOdTl4u4Z0/m/SA==, - } + payload-admin-bar@1.0.7: + resolution: {integrity: sha512-eY/FjfCGkyXOxRupv4IPZ+HFh8CQnJBQS++VItgTXe/g9H0B4RqxfdpU3g3tART3e8MzmZYGOBxV5EGGO2+jbg==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - payload@3.25.0: - resolution: - { - integrity: sha512-azT1qtirV8QqIPpyWaxbF5TJPoWT5fpYoxin83wZxF5gmg0O06bL5YKCGFfCpzgCcw4FrFtLSzD68zGMc5m5Eg==, - } - engines: { node: ^18.20.2 || >=20.9.0 } + payload@3.18.0: + resolution: {integrity: sha512-Wwa/DQ6IoQ7DGgQb6/IRkm85kGXX/DYKABaPLlDYRkY44UaHndt2pzUfiSBR9J9QSWsLOk5jBGdDSP4nPT3E5w==} + engines: {node: ^18.20.2 || >=20.9.0} hasBin: true peerDependencies: graphql: ^16.8.1 - peek-readable@5.4.2: - resolution: - { - integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==, - } - engines: { node: '>=14.16' } + peek-readable@5.3.1: + resolution: {integrity: sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==} + engines: {node: '>=14.16'} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.2: - resolution: - { - integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} pino-abstract-transport@2.0.0: - resolution: - { - integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==, - } + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} pino-pretty@13.0.0: - resolution: - { - integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==, - } + resolution: {integrity: sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==} hasBin: true pino-std-serializers@7.0.0: - resolution: - { - integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==, - } + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} pino@9.5.0: - resolution: - { - integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==, - } + resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} hasBin: true pirates@4.0.6: - resolution: - { - integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} pluralize@8.0.0: - resolution: - { - integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} - possible-typed-array-names@1.1.0: - resolution: - { - integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, - } - engines: { node: '>= 0.4' } + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} postcss-import@15.1.0: - resolution: - { - integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 postcss-js@4.0.1: - resolution: - { - integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, - } - engines: { node: ^12 || ^14 || >= 16 } + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 postcss-load-config@4.0.2: - resolution: - { - integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -5602,229 +3379,139 @@ packages: optional: true postcss-nested@6.2.0: - resolution: - { - integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, - } - engines: { node: '>=12.0' } + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 postcss-selector-parser@6.0.10: - resolution: - { - integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} postcss@8.4.31: - resolution: - { - integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} - postcss@8.5.3: - resolution: - { - integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, - } - engines: { node: ^10 || ^12 || >=14 } + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} - prebuild-install@7.1.3: - resolution: - { - integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==, - } - engines: { node: '>=10' } + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} hasBin: true prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - prettier@3.5.3: - resolution: - { - integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, - } - engines: { node: '>=14' } + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} hasBin: true prism-react-renderer@2.4.1: - resolution: - { - integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==, - } + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} peerDependencies: react: '>=16.0.0' prismjs@1.29.0: - resolution: - { - integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} process-warning@4.0.1: - resolution: - { - integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==, - } + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} prop-types@15.8.1: - resolution: - { - integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, - } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} pump@3.0.2: - resolution: - { - integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, - } + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} qs-esm@7.0.2: - resolution: - { - integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-D8NAthKSD7SGn748v+GLaaO6k08Mvpoqroa35PqIQC4gtUa8/Pb/k+r0m0NnGBVbHDP1gKZ2nVywqfMisRhV5A==} + engines: {node: '>=18'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} queue@6.0.2: - resolution: - { - integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, - } + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} quick-format-unescaped@4.0.4: - resolution: - { - integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==, - } + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true react-datepicker@7.6.0: - resolution: - { - integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==, - } + resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} peerDependencies: react: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-diff-viewer-continued@4.0.4: - resolution: - { - integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==, - } - engines: { node: '>= 16' } + react-diff-viewer-continued@3.2.6: + resolution: {integrity: sha512-GrzyqQnjIMoej+jMjWvtVSsQqhXgzEGqpXlJ2dAGfOk7Q26qcm8Gu6xtI430PBUyZsERe8BJSQf+7VZZo8IBNQ==} + engines: {node: '>= 8'} peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + react-dom: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom@19.0.0: - resolution: - { - integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==, - } + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: react: ^19.0.0 react-error-boundary@3.1.4: - resolution: - { - integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==, - } - engines: { node: '>=10', npm: '>=6' } + resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} + engines: {node: '>=10', npm: '>=6'} peerDependencies: react: '>=16.13.1' react-error-boundary@4.1.2: - resolution: - { - integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==, - } + resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: react: '>=16.13.1' react-hook-form@7.45.4: - resolution: - { - integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==, - } - engines: { node: '>=12.22.0' } + resolution: {integrity: sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==} + engines: {node: '>=12.22.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 react-image-crop@10.1.8: - resolution: - { - integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==, - } + resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==} peerDependencies: react: '>=16.13.1' react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-remove-scroll-bar@2.3.8: - resolution: - { - integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -5832,12 +3519,9 @@ packages: '@types/react': optional: true - react-remove-scroll@2.6.3: - resolution: - { - integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==, - } - engines: { node: '>=10' } + react-remove-scroll@2.6.2: + resolution: {integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -5846,20 +3530,14 @@ packages: optional: true react-select@5.9.0: - resolution: - { - integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==, - } + resolution: {integrity: sha512-nwRKGanVHGjdccsnzhFte/PULziueZxGD8LL2WojON78Mvnq7LdAMEtu2frrwld1fr3geixg3iiMBIc/LLAZpw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-style-singleton@2.2.3: - resolution: - { - integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -5868,548 +3546,305 @@ packages: optional: true react-transition-group@4.4.5: - resolution: - { - integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==, - } + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' react@19.0.0: - resolution: - { - integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} read-cache@1.0.0: - resolution: - { - integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, - } + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} readable-stream@1.0.34: - resolution: - { - integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==, - } + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} real-require@0.2.0: - resolution: - { - integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==, - } - engines: { node: '>= 12.13.0' } + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} reflect.getprototypeof@1.0.10: - resolution: - { - integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp.prototype.flags@1.5.4: - resolution: - { - integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: - resolution: - { - integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, - } + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-array-concat@1.1.3: - resolution: - { - integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safe-push-apply@1.0.0: - resolution: - { - integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: - resolution: - { - integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} safe-stable-stringify@2.5.0: - resolution: - { - integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} sanitize-filename@1.6.3: - resolution: - { - integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==, - } + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} sass@1.77.4: - resolution: - { - integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} + engines: {node: '>=14.0.0'} hasBin: true scheduler@0.25.0: - resolution: - { - integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==, - } + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} scmp@2.1.0: - resolution: - { - integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==, - } + resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} secure-json-parse@2.7.0: - resolution: - { - integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==, - } + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.1: - resolution: - { - integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, - } - engines: { node: '>=10' } + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} hasBin: true set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} set-function-name@2.0.2: - resolution: - { - integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} set-proto@1.0.0: - resolution: - { - integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} sharp@0.32.6: - resolution: - { - integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==, - } - engines: { node: '>=14.15.0' } + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} sharp@0.33.5: - resolution: - { - integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, - } - engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} sift@17.1.3: - resolution: - { - integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==, - } + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} simple-wcswidth@1.0.1: - resolution: - { - integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==, - } + resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==} sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} sonic-boom@4.2.0: - resolution: - { - integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==, - } + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} - sonner@1.7.4: - resolution: - { - integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==, - } + sonner@1.7.2: + resolution: {integrity: sha512-zMbseqjrOzQD1a93lxahm+qMGxWovdMxBlkTbbnZdNqVLt4j+amF9PQxUCL32WfztOFt9t9ADYkejAL3jF9iNA==} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map@0.5.7: - resolution: - { - integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} sparse-bitfield@3.0.3: - resolution: - { - integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==, - } + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} stable-hash@0.0.4: - resolution: - { - integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==, - } + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} state-local@1.0.7: - resolution: - { - integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==, - } + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} stream-browserify@3.0.0: - resolution: - { - integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, - } + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} - streamx@2.22.0: - resolution: - { - integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==, - } + streamx@2.21.1: + resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string.prototype.includes@2.0.1: - resolution: - { - integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} string.prototype.matchall@4.0.12: - resolution: - { - integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: - resolution: - { - integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, - } + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} string.prototype.trim@1.2.10: - resolution: - { - integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: - resolution: - { - integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: - resolution: - { - integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@0.10.31: - resolution: - { - integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==, - } + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} stringify-entities@4.0.4: - resolution: - { - integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, - } + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - strnum@1.1.2: - resolution: - { - integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==, - } + strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} strtok3@8.1.0: - resolution: - { - integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw==} + engines: {node: '>=16'} styled-jsx@5.1.6: - resolution: - { - integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' @@ -6421,178 +3856,100 @@ packages: optional: true stylis@4.2.0: - resolution: - { - integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==, - } + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} sucrase@3.35.0: - resolution: - { - integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} tabbable@6.2.0: - resolution: - { - integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, - } + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tailwind-merge@2.6.0: - resolution: - { - integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==, - } + resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} tailwindcss-animate@1.0.7: - resolution: - { - integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==, - } + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} peerDependencies: tailwindcss: '>=3.0.0 || insiders' tailwindcss@3.4.17: - resolution: - { - integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} + engines: {node: '>=14.0.0'} hasBin: true tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} tar-fs@2.1.2: - resolution: - { - integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==, - } + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} tar-fs@3.0.8: - resolution: - { - integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==, - } + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} tar-stream@3.1.7: - resolution: - { - integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==, - } + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} text-decoder@1.2.3: - resolution: - { - integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==, - } + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} thread-stream@3.1.0: - resolution: - { - integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==, - } + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: '>=12.0.0' } + tinyglobby@0.2.10: + resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} token-types@6.0.0: - resolution: - { - integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + engines: {node: '>=14.16'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@5.0.0: - resolution: - { - integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} truncate-utf8-bytes@1.0.2: - resolution: - { - integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==, - } + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - ts-api-utils@2.0.1: - resolution: - { - integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==, - } - engines: { node: '>=18.12' } + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} + engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' ts-essentials@10.0.3: - resolution: - { - integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==, - } + resolution: {integrity: sha512-/FrVAZ76JLTWxJOERk04fm8hYENDo0PWSP3YLQKxevLwWtxemGcl5JJEzN4iqfDlRve0ckyfFaOBu4xbNH/wZw==} peerDependencies: typescript: '>=4.5.0' peerDependenciesMeta: @@ -6600,170 +3957,95 @@ packages: optional: true ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsconfig-paths@3.15.0: - resolution: - { - integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, - } + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.19.2: - resolution: - { - integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} hasBin: true tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} typed-array-buffer@1.0.3: - resolution: - { - integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} typed-array-byte-length@1.0.3: - resolution: - { - integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.4: - resolution: - { - integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} typed-array-length@1.0.7: - resolution: - { - integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} typescript@5.7.3: - resolution: - { - integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} hasBin: true uint8array-extras@1.4.0: - resolution: - { - integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} unbox-primitive@1.1.0: - resolution: - { - integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} undici-types@6.19.8: - resolution: - { - integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==, - } + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} unfetch@4.2.0: - resolution: - { - integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==, - } + resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} unist-util-is@6.0.0: - resolution: - { - integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, - } + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position-from-estree@2.0.0: - resolution: - { - integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, - } + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} unist-util-stringify-position@4.0.0: - resolution: - { - integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, - } + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-parents@6.0.1: - resolution: - { - integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, - } + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} unist-util-visit@5.0.0: - resolution: - { - integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, - } + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} untildify@4.0.0: - resolution: - { - integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} - update-browserslist-db@1.1.3: - resolution: - { - integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, - } + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} use-callback-ref@1.3.3: - resolution: - { - integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -6772,19 +4054,13 @@ packages: optional: true use-context-selector@2.0.0: - resolution: - { - integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==, - } + resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==} peerDependencies: react: '>=18.0.0' scheduler: '>=0.19.0' use-isomorphic-layout-effect@1.2.0: - resolution: - { - integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==, - } + resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -6793,11 +4069,8 @@ packages: optional: true use-sidecar@1.1.3: - resolution: - { - integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -6806,132 +4079,75 @@ packages: optional: true utf8-byte-length@1.0.5: - resolution: - { - integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==, - } + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@10.0.0: - resolution: - { - integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, - } + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true uuid@9.0.1: - resolution: - { - integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, - } + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true vfile-message@4.0.2: - resolution: - { - integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, - } + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} - whatwg-url@14.1.1: - resolution: - { - integrity: sha512-mDGf9diDad/giZ/Sm9Xi2YcyzaFpbdLpJPr+E9fSkyQ7KpQD4SdFcugkRQYzhmfI4KeV4Qpnn2sKPdo+kmsgRQ==, - } - engines: { node: '>=18' } + whatwg-url@14.1.0: + resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} + engines: {node: '>=18'} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-boxed-primitive@1.1.1: - resolution: - { - integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} which-builtin-type@1.2.1: - resolution: - { - integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} which-collection@1.0.2: - resolution: - { - integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-typed-array@1.1.18: - resolution: - { - integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.1: - resolution: - { - integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==, - } - engines: { node: '>=10.0.0' } + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -6942,80 +4158,51 @@ packages: optional: true xss@1.0.15: - resolution: - { - integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==, - } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} hasBin: true xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yaml@1.10.2: - resolution: - { - integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} yaml@2.7.0: - resolution: - { - integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} hasBin: true yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} yjs@13.6.23: - resolution: - { - integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==, - } - engines: { node: '>=16.0.0', npm: '>=8.0.0' } + resolution: {integrity: sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} zwitch@2.0.4: - resolution: - { - integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, - } + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@alloc/quick-lru@5.2.0': {} - '@apidevtools/json-schema-ref-parser@11.9.3': + '@apidevtools/json-schema-ref-parser@11.7.3': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 @@ -7024,20 +4211,20 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7047,7 +4234,7 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -7055,13 +4242,13 @@ snapshots: '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -7070,52 +4257,52 @@ snapshots: '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-cognito-identity@3.758.0': + '@aws-sdk/client-cognito-identity@3.731.1': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/credential-provider-node': 3.758.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.758.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/credential-provider-node': 3.731.1 + '@aws-sdk/middleware-host-header': 3.731.0 + '@aws-sdk/middleware-logger': 3.731.0 + '@aws-sdk/middleware-recursion-detection': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.731.0 + '@aws-sdk/region-config-resolver': 3.731.0 + '@aws-sdk/types': 3.731.0 + '@aws-sdk/util-endpoints': 3.731.0 + '@aws-sdk/util-user-agent-browser': 3.731.0 + '@aws-sdk/util-user-agent-node': 3.731.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 + '@smithy/core': 3.1.1 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-endpoint': 4.0.2 + '@smithy/middleware-retry': 4.0.3 + '@smithy/middleware-serde': 4.0.1 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-defaults-mode-browser': 4.0.3 + '@smithy/util-defaults-mode-node': 4.0.3 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7124,32 +4311,32 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.758.0': + '@aws-sdk/client-s3@3.731.1': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/credential-provider-node': 3.758.0 - '@aws-sdk/middleware-bucket-endpoint': 3.734.0 - '@aws-sdk/middleware-expect-continue': 3.734.0 - '@aws-sdk/middleware-flexible-checksums': 3.758.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-location-constraint': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-sdk-s3': 3.758.0 - '@aws-sdk/middleware-ssec': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.758.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/signature-v4-multi-region': 3.758.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.758.0 - '@aws-sdk/xml-builder': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/credential-provider-node': 3.731.1 + '@aws-sdk/middleware-bucket-endpoint': 3.731.0 + '@aws-sdk/middleware-expect-continue': 3.731.0 + '@aws-sdk/middleware-flexible-checksums': 3.731.0 + '@aws-sdk/middleware-host-header': 3.731.0 + '@aws-sdk/middleware-location-constraint': 3.731.0 + '@aws-sdk/middleware-logger': 3.731.0 + '@aws-sdk/middleware-recursion-detection': 3.731.0 + '@aws-sdk/middleware-sdk-s3': 3.731.0 + '@aws-sdk/middleware-ssec': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.731.0 + '@aws-sdk/region-config-resolver': 3.731.0 + '@aws-sdk/signature-v4-multi-region': 3.731.0 + '@aws-sdk/types': 3.731.0 + '@aws-sdk/util-endpoints': 3.731.0 + '@aws-sdk/util-user-agent-browser': 3.731.0 + '@aws-sdk/util-user-agent-node': 3.731.0 + '@aws-sdk/xml-builder': 3.723.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 + '@smithy/core': 3.1.1 '@smithy/eventstream-serde-browser': 4.0.1 '@smithy/eventstream-serde-config-resolver': 4.0.1 '@smithy/eventstream-serde-node': 4.0.1 @@ -7160,66 +4347,66 @@ snapshots: '@smithy/invalid-dependency': 4.0.1 '@smithy/md5-js': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-endpoint': 4.0.2 + '@smithy/middleware-retry': 4.0.3 + '@smithy/middleware-serde': 4.0.1 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-defaults-mode-browser': 4.0.3 + '@smithy/util-defaults-mode-node': 4.0.3 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 '@smithy/util-waiter': 4.0.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.758.0': + '@aws-sdk/client-sso@3.731.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.758.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/middleware-host-header': 3.731.0 + '@aws-sdk/middleware-logger': 3.731.0 + '@aws-sdk/middleware-recursion-detection': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.731.0 + '@aws-sdk/region-config-resolver': 3.731.0 + '@aws-sdk/types': 3.731.0 + '@aws-sdk/util-endpoints': 3.731.0 + '@aws-sdk/util-user-agent-browser': 3.731.0 + '@aws-sdk/util-user-agent-node': 3.731.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 + '@smithy/core': 3.1.1 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-endpoint': 4.0.2 + '@smithy/middleware-retry': 4.0.3 + '@smithy/middleware-serde': 4.0.1 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-defaults-mode-browser': 4.0.3 + '@smithy/util-defaults-mode-node': 4.0.3 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7228,61 +4415,61 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.758.0': + '@aws-sdk/core@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 - '@smithy/core': 3.1.5 + '@aws-sdk/types': 3.731.0 + '@smithy/core': 3.1.1 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-cognito-identity@3.758.0': + '@aws-sdk/credential-provider-cognito-identity@3.731.1': dependencies: - '@aws-sdk/client-cognito-identity': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/client-cognito-identity': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-env@3.758.0': + '@aws-sdk/credential-provider-env@3.731.0': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.758.0': + '@aws-sdk/credential-provider-http@3.731.0': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/property-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.758.0': + '@aws-sdk/credential-provider-ini@3.731.1': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/credential-provider-env': 3.758.0 - '@aws-sdk/credential-provider-http': 3.758.0 - '@aws-sdk/credential-provider-process': 3.758.0 - '@aws-sdk/credential-provider-sso': 3.758.0 - '@aws-sdk/credential-provider-web-identity': 3.758.0 - '@aws-sdk/nested-clients': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/credential-provider-env': 3.731.0 + '@aws-sdk/credential-provider-http': 3.731.0 + '@aws-sdk/credential-provider-process': 3.731.0 + '@aws-sdk/credential-provider-sso': 3.731.1 + '@aws-sdk/credential-provider-web-identity': 3.731.1 + '@aws-sdk/nested-clients': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -7291,15 +4478,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.758.0': + '@aws-sdk/credential-provider-node@3.731.1': dependencies: - '@aws-sdk/credential-provider-env': 3.758.0 - '@aws-sdk/credential-provider-http': 3.758.0 - '@aws-sdk/credential-provider-ini': 3.758.0 - '@aws-sdk/credential-provider-process': 3.758.0 - '@aws-sdk/credential-provider-sso': 3.758.0 - '@aws-sdk/credential-provider-web-identity': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/credential-provider-env': 3.731.0 + '@aws-sdk/credential-provider-http': 3.731.0 + '@aws-sdk/credential-provider-ini': 3.731.1 + '@aws-sdk/credential-provider-process': 3.731.0 + '@aws-sdk/credential-provider-sso': 3.731.1 + '@aws-sdk/credential-provider-web-identity': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 @@ -7308,21 +4495,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.758.0': + '@aws-sdk/credential-provider-process@3.731.0': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.758.0': + '@aws-sdk/credential-provider-sso@3.731.1': dependencies: - '@aws-sdk/client-sso': 3.758.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/token-providers': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/client-sso': 3.731.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/token-providers': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -7330,32 +4517,31 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.758.0': + '@aws-sdk/credential-provider-web-identity@3.731.1': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/nested-clients': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/nested-clients': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-providers@3.758.0': + '@aws-sdk/credential-providers@3.731.1': dependencies: - '@aws-sdk/client-cognito-identity': 3.758.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/credential-provider-cognito-identity': 3.758.0 - '@aws-sdk/credential-provider-env': 3.758.0 - '@aws-sdk/credential-provider-http': 3.758.0 - '@aws-sdk/credential-provider-ini': 3.758.0 - '@aws-sdk/credential-provider-node': 3.758.0 - '@aws-sdk/credential-provider-process': 3.758.0 - '@aws-sdk/credential-provider-sso': 3.758.0 - '@aws-sdk/credential-provider-web-identity': 3.758.0 - '@aws-sdk/nested-clients': 3.758.0 - '@aws-sdk/types': 3.734.0 - '@smithy/core': 3.1.5 + '@aws-sdk/client-cognito-identity': 3.731.1 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/credential-provider-cognito-identity': 3.731.1 + '@aws-sdk/credential-provider-env': 3.731.0 + '@aws-sdk/credential-provider-http': 3.731.0 + '@aws-sdk/credential-provider-ini': 3.731.1 + '@aws-sdk/credential-provider-node': 3.731.1 + '@aws-sdk/credential-provider-process': 3.731.0 + '@aws-sdk/credential-provider-sso': 3.731.1 + '@aws-sdk/credential-provider-web-identity': 3.731.1 + '@aws-sdk/nested-clients': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/credential-provider-imds': 4.0.1 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 @@ -7363,20 +4549,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/lib-storage@3.758.0(@aws-sdk/client-s3@3.758.0)': + '@aws-sdk/lib-storage@3.731.1(@aws-sdk/client-s3@3.731.1)': dependencies: - '@aws-sdk/client-s3': 3.758.0 + '@aws-sdk/client-s3': 3.731.1 '@smithy/abort-controller': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/smithy-client': 4.1.6 + '@smithy/middleware-endpoint': 4.0.2 + '@smithy/smithy-client': 4.1.2 buffer: 5.6.0 events: 3.3.0 stream-browserify: 3.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.734.0': + '@aws-sdk/middleware-bucket-endpoint@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@aws-sdk/util-arn-parser': 3.723.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -7384,123 +4570,123 @@ snapshots: '@smithy/util-config-provider': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.734.0': + '@aws-sdk/middleware-expect-continue@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.758.0': + '@aws-sdk/middleware-flexible-checksums@3.731.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/is-array-buffer': 4.0.0 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.734.0': + '@aws-sdk/middleware-host-header@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.734.0': + '@aws-sdk/middleware-location-constraint@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.734.0': + '@aws-sdk/middleware-logger@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.734.0': + '@aws-sdk/middleware-recursion-detection@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.758.0': + '@aws-sdk/middleware-sdk-s3@3.731.0': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 '@aws-sdk/util-arn-parser': 3.723.0 - '@smithy/core': 3.1.5 + '@smithy/core': 3.1.1 '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.734.0': + '@aws-sdk/middleware-ssec@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.758.0': + '@aws-sdk/middleware-user-agent@3.731.0': dependencies: - '@aws-sdk/core': 3.758.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@smithy/core': 3.1.5 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/types': 3.731.0 + '@aws-sdk/util-endpoints': 3.731.0 + '@smithy/core': 3.1.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.758.0': + '@aws-sdk/nested-clients@3.731.1': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.758.0 - '@aws-sdk/middleware-host-header': 3.734.0 - '@aws-sdk/middleware-logger': 3.734.0 - '@aws-sdk/middleware-recursion-detection': 3.734.0 - '@aws-sdk/middleware-user-agent': 3.758.0 - '@aws-sdk/region-config-resolver': 3.734.0 - '@aws-sdk/types': 3.734.0 - '@aws-sdk/util-endpoints': 3.743.0 - '@aws-sdk/util-user-agent-browser': 3.734.0 - '@aws-sdk/util-user-agent-node': 3.758.0 + '@aws-sdk/core': 3.731.0 + '@aws-sdk/middleware-host-header': 3.731.0 + '@aws-sdk/middleware-logger': 3.731.0 + '@aws-sdk/middleware-recursion-detection': 3.731.0 + '@aws-sdk/middleware-user-agent': 3.731.0 + '@aws-sdk/region-config-resolver': 3.731.0 + '@aws-sdk/types': 3.731.0 + '@aws-sdk/util-endpoints': 3.731.0 + '@aws-sdk/util-user-agent-browser': 3.731.0 + '@aws-sdk/util-user-agent-node': 3.731.0 '@smithy/config-resolver': 4.0.1 - '@smithy/core': 3.1.5 + '@smithy/core': 3.1.1 '@smithy/fetch-http-handler': 5.0.1 '@smithy/hash-node': 4.0.1 '@smithy/invalid-dependency': 4.0.1 '@smithy/middleware-content-length': 4.0.1 - '@smithy/middleware-endpoint': 4.0.6 - '@smithy/middleware-retry': 4.0.7 - '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-endpoint': 4.0.2 + '@smithy/middleware-retry': 4.0.3 + '@smithy/middleware-serde': 4.0.1 '@smithy/middleware-stack': 4.0.1 '@smithy/node-config-provider': 4.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/protocol-http': 5.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.7 - '@smithy/util-defaults-mode-node': 4.0.7 + '@smithy/util-defaults-mode-browser': 4.0.3 + '@smithy/util-defaults-mode-node': 4.0.3 '@smithy/util-endpoints': 3.0.1 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 @@ -7509,28 +4695,28 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.734.0': + '@aws-sdk/region-config-resolver@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.758.0': + '@aws-sdk/signature-v4-multi-region@3.731.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/middleware-sdk-s3': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/signature-v4': 5.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.758.0': + '@aws-sdk/token-providers@3.731.1': dependencies: - '@aws-sdk/nested-clients': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/nested-clients': 3.731.1 + '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -7538,7 +4724,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.734.0': + '@aws-sdk/types@3.731.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7547,9 +4733,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.743.0': + '@aws-sdk/util-endpoints@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 '@smithy/util-endpoints': 3.0.1 tslib: 2.8.1 @@ -7558,17 +4744,17 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.734.0': + '@aws-sdk/util-user-agent-browser@3.731.0': dependencies: - '@aws-sdk/types': 3.734.0 + '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.758.0': + '@aws-sdk/util-user-agent-node@3.731.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.758.0 - '@aws-sdk/types': 3.734.0 + '@aws-sdk/middleware-user-agent': 3.731.0 + '@aws-sdk/types': 3.731.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7577,7 +4763,7 @@ snapshots: dependencies: tslib: 2.8.1 - '@aws-sdk/xml-builder@3.734.0': + '@aws-sdk/xml-builder@3.723.0': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -7588,18 +4774,18 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.26.9': + '@babel/generator@7.26.5': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color @@ -7607,41 +4793,39 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.9': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.9 + '@babel/types': 7.26.5 - '@babel/runtime@7.26.9': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.26.9': + '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - '@babel/traverse@7.26.9': + '@babel/traverse@7.26.5': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.9': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 '@corex/deepmerge@4.0.43': {} - '@date-fns/tz@1.2.0': {} - '@dnd-kit/accessibility@3.1.1(react@19.0.0)': dependencies: react: 19.0.0 @@ -7675,7 +4859,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -7712,7 +4896,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@19.0.10)(react@19.0.0)': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -7818,46 +5002,46 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0(jiti@1.21.7))': dependencies: - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.19.1': dependencies: - '@eslint/object-schema': 2.1.6 + '@eslint/object-schema': 2.1.5 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.12.0': + '@eslint/core@0.10.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.1 + import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.21.0': {} + '@eslint/js@9.18.0': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.5': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.2.5': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.10.0 levn: 0.4.1 '@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': @@ -7868,12 +5052,12 @@ snapshots: react-dom: 19.0.0(react@19.0.0) react-transition-group: 4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/scroll-info@2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@faceless-ui/window-info@3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@faceless-ui/window-info@3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -7893,7 +5077,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@floating-ui/react@0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@floating-ui/utils': 0.2.9 @@ -7914,7 +5098,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.1': {} '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -8170,23 +5354,26 @@ snapshots: lexical: 0.21.0 yjs: 13.6.23 - '@monaco-editor/loader@1.5.0': + '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)': dependencies: + monaco-editor: 0.52.2 state-local: 1.0.7 - '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@monaco-editor/loader': 1.5.0 + '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) monaco-editor: 0.52.2 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@mongodb-js/saslprep@1.2.0': + '@mongodb-js/saslprep@1.1.9': dependencies: sparse-bitfield: 3.0.3 '@next/env@13.5.8': {} + '@next/env@15.1.5': {} + '@next/env@15.2.0': {} '@next/eslint-plugin-next@15.2.0': @@ -8227,16 +5414,16 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.18.0 '@nolyfill/is-core-module@1.0.39': {} - '@payloadcms/db-mongodb@3.25.0(@aws-sdk/credential-providers@3.758.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': + '@payloadcms/db-mongodb@3.18.0(@aws-sdk/credential-providers@3.731.1)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': dependencies: - mongoose: 8.9.5(@aws-sdk/credential-providers@3.758.0) + mongoose: 8.9.5(@aws-sdk/credential-providers@3.731.1) mongoose-aggregate-paginate-v2: 1.1.2 mongoose-paginate-v2: 1.8.5 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) prompts: 2.4.2 uuid: 10.0.0 transitivePeerDependencies: @@ -8249,38 +5436,37 @@ snapshots: - socks - supports-color - '@payloadcms/email-nodemailer@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': + '@payloadcms/email-nodemailer@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': dependencies: nodemailer: 6.9.16 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)': + '@payloadcms/graphql@3.18.0(graphql@16.10.0)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3)': dependencies: graphql: 16.10.0 graphql-scalars: 1.22.2(graphql@16.10.0) - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) pluralize: 8.0.0 ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 transitivePeerDependencies: - typescript - '@payloadcms/live-preview-react@3.25.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@payloadcms/live-preview-react@3.18.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@payloadcms/live-preview': 3.25.0 + '@payloadcms/live-preview': 3.18.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@payloadcms/live-preview@3.25.0': {} + '@payloadcms/live-preview@3.18.0': {} - '@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/next@3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/graphql': 3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3) - '@payloadcms/translations': 3.25.0 - '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/graphql': 3.18.0(graphql@16.10.0)(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(typescript@5.7.3) + '@payloadcms/translations': 3.18.0 + '@payloadcms/ui': 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) busboy: 1.6.0 - dequal: 2.0.3 file-type: 19.3.0 graphql: 16.10.0 graphql-http: 1.22.4(graphql@16.10.0) @@ -8288,10 +5474,11 @@ snapshots: http-status: 2.1.0 next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) path-to-regexp: 6.3.0 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) qs-esm: 7.0.2 - react-diff-viewer-continued: 4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react-diff-viewer-continued: 3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: 1.77.4 + sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) uuid: 10.0.0 transitivePeerDependencies: - '@types/react' @@ -8301,25 +5488,25 @@ snapshots: - supports-color - typescript - '@payloadcms/payload-cloud@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': + '@payloadcms/payload-cloud@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': dependencies: - '@aws-sdk/client-cognito-identity': 3.758.0 - '@aws-sdk/client-s3': 3.758.0 - '@aws-sdk/credential-providers': 3.758.0 - '@aws-sdk/lib-storage': 3.758.0(@aws-sdk/client-s3@3.758.0) - '@payloadcms/email-nodemailer': 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3)) + '@aws-sdk/client-cognito-identity': 3.731.1 + '@aws-sdk/client-s3': 3.731.1 + '@aws-sdk/credential-providers': 3.731.1 + '@aws-sdk/lib-storage': 3.731.1(@aws-sdk/client-s3@3.731.1) + '@payloadcms/email-nodemailer': 3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)) amazon-cognito-identity-js: 6.3.12 nodemailer: 6.9.16 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) transitivePeerDependencies: - aws-crt - encoding - '@payloadcms/plugin-form-builder@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-form-builder@3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) escape-html: 1.0.3 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8329,19 +5516,19 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-nested-docs@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': + '@payloadcms/plugin-nested-docs@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': dependencies: - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/plugin-redirects@3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))': + '@payloadcms/plugin-redirects@3.18.0(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))': dependencies: - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/plugin-search@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-search@3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/next': 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + '@payloadcms/next': 3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/ui': 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8352,11 +5539,11 @@ snapshots: - supports-color - typescript - '@payloadcms/plugin-seo@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/plugin-seo@3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@payloadcms/translations': 3.25.0 - '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + '@payloadcms/translations': 3.18.0 + '@payloadcms/ui': 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: @@ -8366,10 +5553,10 @@ snapshots: - supports-color - typescript - '@payloadcms/richtext-lexical@3.25.0(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.23)': + '@payloadcms/richtext-lexical@3.18.0(mlgbdnqourdrhm64whzjvljgzi)': dependencies: '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@lexical/headless': 0.21.0 '@lexical/html': 0.21.0 '@lexical/link': 0.21.0 @@ -8380,9 +5567,9 @@ snapshots: '@lexical/selection': 0.21.0 '@lexical/table': 0.21.0 '@lexical/utils': 0.21.0 - '@payloadcms/next': 3.25.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) - '@payloadcms/translations': 3.25.0 - '@payloadcms/ui': 3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/next': 3.18.0(@types/react@19.0.10)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) + '@payloadcms/translations': 3.18.0 + '@payloadcms/ui': 3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) '@types/uuid': 10.0.0 acorn: 8.12.1 bson-objectid: 2.0.4 @@ -8393,7 +5580,7 @@ snapshots: mdast-util-from-markdown: 2.0.2 mdast-util-mdx-jsx: 3.1.3 micromark-extension-mdx-jsx: 3.0.1 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-error-boundary: 4.1.2(react@19.0.0) @@ -8405,29 +5592,28 @@ snapshots: - next - supports-color - typescript - - yjs - '@payloadcms/translations@3.25.0': + '@payloadcms/translations@3.18.0': dependencies: date-fns: 4.1.0 - '@payloadcms/ui@3.25.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': + '@payloadcms/ui@3.18.0(@types/react@19.0.10)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)': dependencies: - '@date-fns/tz': 1.2.0 '@dnd-kit/core': 6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) '@faceless-ui/modal': 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/scroll-info': 2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@faceless-ui/window-info': 3.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@monaco-editor/react': 4.7.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@payloadcms/translations': 3.25.0 + '@faceless-ui/scroll-info': 2.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@faceless-ui/window-info': 3.0.0-beta.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': 3.18.0 + body-scroll-lock: 4.0.0-beta.0 bson-objectid: 2.0.4 date-fns: 4.1.0 dequal: 2.0.3 md5: 2.3.0 next: 15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) object-to-formdata: 4.5.1 - payload: 3.25.0(graphql@16.10.0)(typescript@5.7.3) + payload: 3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3) qs-esm: 7.0.2 react: 19.0.0 react-datepicker: 7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8435,7 +5621,7 @@ snapshots: react-image-crop: 10.1.8(react@19.0.0) react-select: 5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) scheduler: 0.25.0 - sonner: 1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + sonner: 1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) ts-essentials: 10.0.3(typescript@5.7.3) use-context-selector: 2.0.0(react@19.0.0)(scheduler@0.25.0) uuid: 10.0.0 @@ -8452,22 +5638,22 @@ snapshots: '@radix-ui/primitive@1.1.1': {} - '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-arrow@1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.10)(react@19.0.0) @@ -8477,12 +5663,12 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-collection@1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -8507,11 +5693,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 @@ -8526,10 +5712,10 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -8544,22 +5730,22 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-popper@1.2.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.10)(react@19.0.0) @@ -8571,9 +5757,9 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-portal@1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -8591,45 +5777,45 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-select@2.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/number': 1.1.0 '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-collection': 1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-context': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-direction': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-id': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@radix-ui/react-slot': 1.1.2(@types/react@19.0.10)(react@19.0.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.1.1(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.10)(react@19.0.0) '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.10)(react@19.0.0) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) aria-hidden: 1.2.4 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-remove-scroll: 2.6.3(@types/react@19.0.10)(react@19.0.0) + react-remove-scroll: 2.6.2(@types/react@19.0.10)(react@19.0.0) optionalDependencies: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': + '@radix-ui/react-slot@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 @@ -8682,9 +5868,9 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) optionalDependencies: @@ -8719,14 +5905,14 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/core@3.1.5': + '@smithy/core@3.1.1': dependencies: - '@smithy/middleware-serde': 4.0.2 + '@smithy/middleware-serde': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-middleware': 4.0.1 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 @@ -8821,10 +6007,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.0.6': + '@smithy/middleware-endpoint@4.0.2': dependencies: - '@smithy/core': 3.1.5 - '@smithy/middleware-serde': 4.0.2 + '@smithy/core': 3.1.1 + '@smithy/middleware-serde': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 @@ -8832,19 +6018,19 @@ snapshots: '@smithy/util-middleware': 4.0.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.0.7': + '@smithy/middleware-retry@4.0.3': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/service-error-classification': 4.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 tslib: 2.8.1 uuid: 9.0.1 - '@smithy/middleware-serde@4.0.2': + '@smithy/middleware-serde@4.0.1': dependencies: '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -8861,7 +6047,7 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.0.3': + '@smithy/node-http-handler@4.0.2': dependencies: '@smithy/abort-controller': 4.0.1 '@smithy/protocol-http': 5.0.1 @@ -8910,14 +6096,14 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.1.6': + '@smithy/smithy-client@4.1.2': dependencies: - '@smithy/core': 3.1.5 - '@smithy/middleware-endpoint': 4.0.6 + '@smithy/core': 3.1.1 + '@smithy/middleware-endpoint': 4.0.2 '@smithy/middleware-stack': 4.0.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - '@smithy/util-stream': 4.1.2 + '@smithy/util-stream': 4.0.2 tslib: 2.8.1 '@smithy/types@4.1.0': @@ -8958,21 +6144,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.7': + '@smithy/util-defaults-mode-browser@4.0.3': dependencies: '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.7': + '@smithy/util-defaults-mode-node@4.0.3': dependencies: '@smithy/config-resolver': 4.0.1 '@smithy/credential-provider-imds': 4.0.1 '@smithy/node-config-provider': 4.0.1 '@smithy/property-provider': 4.0.1 - '@smithy/smithy-client': 4.1.6 + '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 tslib: 2.8.1 @@ -8997,10 +6183,10 @@ snapshots: '@smithy/types': 4.1.0 tslib: 2.8.1 - '@smithy/util-stream@4.1.2': + '@smithy/util-stream@4.0.2': dependencies: '@smithy/fetch-http-handler': 5.0.1 - '@smithy/node-http-handler': 4.0.3 + '@smithy/node-http-handler': 4.0.2 '@smithy/types': 4.1.0 '@smithy/util-base64': 4.0.0 '@smithy/util-buffer-from': 4.0.0 @@ -9072,7 +6258,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.16': {} + '@types/lodash@4.17.14': {} '@types/mdast@4.0.4': dependencies: @@ -9112,81 +6298,81 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.25.0 - eslint: 9.21.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.20.0 + eslint: 9.18.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.7.3) + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.20.0 debug: 4.4.0 - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.25.0': + '@typescript-eslint/scope-manager@8.20.0': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 - '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.21.0(jiti@1.21.7) - ts-api-utils: 2.0.1(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.25.0': {} + '@typescript-eslint/types@8.20.0': {} - '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/visitor-keys': 8.25.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.7.3) + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/utils@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.25.0 - '@typescript-eslint/types': 8.25.0 - '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) - eslint: 9.21.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.25.0': + '@typescript-eslint/visitor-keys@8.20.0': dependencies: - '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/types': 8.20.0 eslint-visitor-keys: 4.2.0 acorn-jsx@5.3.2(acorn@8.14.0): @@ -9207,7 +6393,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 + fast-uri: 3.0.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -9259,7 +6445,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -9269,7 +6455,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + es-shim-unscopables: 1.0.2 array.prototype.findlastindex@1.2.5: dependencies: @@ -9278,21 +6464,21 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 + es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 + es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: @@ -9300,7 +6486,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 + es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.4: dependencies: @@ -9309,28 +6495,26 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} - async-function@1.0.0: {} - atomic-sleep@1.0.0: {} - autoprefixer@10.4.20(postcss@8.5.3): + autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001701 + caniuse-lite: 1.0.30001692 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.1 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.1.0 + possible-typed-array-names: 1.0.0 axe-core@4.10.2: {} @@ -9340,7 +6524,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -9353,22 +6537,22 @@ snapshots: dependencies: bare-events: 2.5.4 bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.5.4) + bare-stream: 2.6.4(bare-events@2.5.4) transitivePeerDependencies: - bare-buffer optional: true - bare-os@3.5.1: + bare-os@3.4.0: optional: true bare-path@3.0.0: dependencies: - bare-os: 3.5.1 + bare-os: 3.4.0 optional: true - bare-stream@2.6.5(bare-events@2.5.4): + bare-stream@2.6.4(bare-events@2.5.4): dependencies: - streamx: 2.22.0 + streamx: 2.21.1 optionalDependencies: bare-events: 2.5.4 optional: true @@ -9402,14 +6586,14 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001701 - electron-to-chromium: 1.5.109 + caniuse-lite: 1.0.30001692 + electron-to-chromium: 1.5.83 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.2(browserslist@4.24.4) bson-objectid@2.0.4: {} - bson@6.10.3: {} + bson@6.10.1: {} buffer@4.9.2: dependencies: @@ -9431,28 +6615,28 @@ snapshots: dependencies: streamsearch: 1.1.0 - call-bind-apply-helpers@1.0.2: + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.2 + call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 callsites@3.1.0: {} camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001701: {} + caniuse-lite@1.0.30001692: {} ccount@2.0.1: {} @@ -9548,7 +6732,7 @@ snapshots: cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 + import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 @@ -9657,18 +6841,18 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 csstype: 3.1.3 dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.2 + call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.109: {} + electron-to-chromium@1.5.83: {} emoji-regex@8.0.0: {} @@ -9678,7 +6862,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.18.1: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -9703,7 +6887,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -9720,9 +6904,9 @@ snapshots: is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 - is-weakref: 1.1.1 + is-weakref: 1.1.0 math-intrinsics: 1.1.0 - object-inspect: 1.13.4 + object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.7 own-keys: 1.0.1 @@ -9754,7 +6938,7 @@ snapshots: es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9771,11 +6955,11 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.1.0: + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 @@ -9818,19 +7002,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@15.2.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): + eslint-config-next@15.2.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3): dependencies: '@next/eslint-plugin-next': 15.2.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.21.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@1.21.7)) - eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@1.21.7)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.4(eslint@9.18.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.1.0(eslint@9.18.0(jiti@1.21.7)) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -9846,33 +7030,34 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.1 - eslint: 9.21.0(jiti@1.21.7) - get-tsconfig: 4.10.0 + enhanced-resolve: 5.18.0 + eslint: 9.18.0(jiti@1.21.7) + fast-glob: 3.3.3 + get-tsconfig: 4.8.1 is-bun-module: 1.3.0 + is-glob: 4.0.3 stable-hash: 0.0.4 - tinyglobby: 0.2.12 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.21.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.18.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@1.21.7)) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.18.0(jiti@1.21.7)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9881,9 +7066,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0(jiti@1.21.7)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.18.0(jiti@1.21.7)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -9895,13 +7080,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0(jiti@1.21.7)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.18.0(jiti@1.21.7)): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 @@ -9911,7 +7096,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -9920,11 +7105,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.21.0(jiti@1.21.7)): + eslint-plugin-react-hooks@5.1.0(eslint@9.18.0(jiti@1.21.7)): dependencies: - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) - eslint-plugin-react@7.37.4(eslint@9.21.0(jiti@1.21.7)): + eslint-plugin-react@7.37.4(eslint@9.18.0(jiti@1.21.7)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -9932,7 +7117,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.21.0(jiti@1.21.7) + eslint: 9.18.0(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -9955,18 +7140,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.21.0(jiti@1.21.7): + eslint@9.18.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.21.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.10.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.18.0 + '@eslint/plugin-kit': 0.2.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 + '@humanwhocodes/retry': 0.4.1 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -10057,15 +7242,15 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@3.0.6: {} + fast-uri@3.0.5: {} fast-xml-parser@4.4.1: dependencies: - strnum: 1.1.2 + strnum: 1.0.5 - fastq@1.19.1: + fastq@1.18.0: dependencies: - reusify: 1.1.0 + reusify: 1.0.4 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -10094,20 +7279,20 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.3.2: {} focus-trap@7.5.4: dependencies: tabbable: 6.2.0 - for-each@0.3.5: + for-each@0.3.3: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -10140,9 +7325,9 @@ snapshots: get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: + get-intrinsic@1.2.7: dependencies: - call-bind-apply-helpers: 1.0.2 + call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -10164,11 +7349,7 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 + get-intrinsic: 1.2.7 get-tsconfig@4.8.1: dependencies: @@ -10186,7 +7367,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.1 + foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -10272,7 +7453,7 @@ snapshots: immutable@4.3.7: {} - import-fresh@3.3.1: + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -10305,15 +7486,14 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} is-arrayish@0.3.2: {} - is-async-function@2.1.1: + is-async-function@2.1.0: dependencies: - async-function: 1.0.0 call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 @@ -10327,7 +7507,7 @@ snapshots: dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.2.2: + is-boolean-object@1.2.1: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 @@ -10336,7 +7516,7 @@ snapshots: is-bun-module@1.3.0: dependencies: - semver: 7.7.1 + semver: 7.6.3 is-callable@1.2.7: {} @@ -10347,7 +7527,7 @@ snapshots: is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-typed-array: 1.1.15 is-date-object@1.1.0: @@ -10417,14 +7597,14 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.1.1: + is-weakref@1.1.0: dependencies: call-bound: 1.0.3 is-weakset@2.0.4: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 isarray@0.0.1: {} @@ -10447,7 +7627,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -10480,15 +7660,15 @@ snapshots: json-schema-to-typescript@15.0.3: dependencies: - '@apidevtools/json-schema-ref-parser': 11.9.3 + '@apidevtools/json-schema-ref-parser': 11.7.3 '@types/json-schema': 7.0.15 - '@types/lodash': 4.17.16 + '@types/lodash': 4.17.14 is-glob: 4.0.3 js-yaml: 4.1.0 lodash: 4.17.21 minimist: 1.2.8 - prettier: 3.5.3 - tinyglobby: 0.2.12 + prettier: 3.4.2 + tinyglobby: 0.2.10 json-schema-traverse@0.4.1: {} @@ -10577,12 +7757,12 @@ snapshots: decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color @@ -10631,7 +7811,7 @@ snapshots: merge2@1.4.1: {} - micromark-core-commonmark@2.0.3: + micromark-core-commonmark@2.0.2: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -10646,9 +7826,9 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 + micromark-util-subtokenize: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-extension-mdx-jsx@3.0.1: dependencies: @@ -10661,21 +7841,21 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 vfile-message: 4.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-factory-mdx-expression@2.0.2: dependencies: @@ -10685,33 +7865,33 @@ snapshots: micromark-util-character: 2.1.1 micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-chunked@2.0.1: dependencies: @@ -10721,12 +7901,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -10749,7 +7929,7 @@ snapshots: devlop: 1.1.0 estree-util-visit: 2.0.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 vfile-message: 4.0.2 micromark-util-html-tag-name@2.0.1: {} @@ -10760,7 +7940,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -10768,24 +7948,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.1.0: + micromark-util-subtokenize@2.0.3: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.2: {} + micromark-util-types@2.0.1: {} - micromark@4.0.2: + micromark@4.0.1: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 + micromark-core-commonmark: 2.0.2 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -10795,9 +7975,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 + micromark-util-subtokenize: 2.0.3 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + micromark-util-types: 2.0.1 transitivePeerDependencies: - supports-color @@ -10829,25 +8009,25 @@ snapshots: mongodb-connection-string-url@3.0.2: dependencies: '@types/whatwg-url': 11.0.5 - whatwg-url: 14.1.1 + whatwg-url: 14.1.0 - mongodb@6.12.0(@aws-sdk/credential-providers@3.758.0): + mongodb@6.12.0(@aws-sdk/credential-providers@3.731.1): dependencies: - '@mongodb-js/saslprep': 1.2.0 - bson: 6.10.3 + '@mongodb-js/saslprep': 1.1.9 + bson: 6.10.1 mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.758.0 + '@aws-sdk/credential-providers': 3.731.1 mongoose-aggregate-paginate-v2@1.1.2: {} mongoose-paginate-v2@1.8.5: {} - mongoose@8.9.5(@aws-sdk/credential-providers@3.758.0): + mongoose@8.9.5(@aws-sdk/credential-providers@3.731.1): dependencies: - bson: 6.10.3 + bson: 6.10.1 kareem: 2.6.3 - mongodb: 6.12.0(@aws-sdk/credential-providers@3.758.0) + mongodb: 6.12.0(@aws-sdk/credential-providers@3.731.1) mpath: 0.9.0 mquery: 5.0.0 ms: 2.1.3 @@ -10880,7 +8060,7 @@ snapshots: nanoid@3.3.8: {} - napi-build-utils@2.0.0: {} + napi-build-utils@1.0.2: {} natural-compare@1.4.0: {} @@ -10898,7 +8078,7 @@ snapshots: '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001701 + caniuse-lite: 1.0.30001692 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -10918,9 +8098,9 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-abi@3.74.0: + node-abi@3.73.0: dependencies: - semver: 7.7.1 + semver: 7.6.3 node-addon-api@6.1.0: {} @@ -10945,7 +8125,7 @@ snapshots: object-hash@3.0.0: {} - object-inspect@1.13.4: {} + object-inspect@1.13.3: {} object-keys@1.1.1: {} @@ -11003,7 +8183,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -11055,15 +8235,16 @@ snapshots: path-type@4.0.0: {} - payload-admin-bar@1.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + payload-admin-bar@1.0.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - payload@3.25.0(graphql@16.10.0)(typescript@5.7.3): + payload@3.18.0(graphql@16.10.0)(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3): dependencies: - '@next/env': 15.2.0 - '@payloadcms/translations': 3.25.0 + '@monaco-editor/react': 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@next/env': 15.1.5 + '@payloadcms/translations': 3.18.0 '@types/busboy': 1.5.4 ajv: 8.17.1 bson-objectid: 2.0.4 @@ -11091,13 +8272,16 @@ snapshots: ts-essentials: 10.0.3(typescript@5.7.3) tsx: 4.19.2 uuid: 10.0.0 - ws: 8.18.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil + - monaco-editor + - react + - react-dom - typescript - utf-8-validate - peek-readable@5.4.2: {} + peek-readable@5.3.1: {} picocolors@1.1.1: {} @@ -11147,30 +8331,30 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.1.0: {} + possible-typed-array-names@1.0.0: {} - postcss-import@15.1.0(postcss@8.5.3): + postcss-import@15.1.0(postcss@8.5.1): dependencies: - postcss: 8.5.3 + postcss: 8.5.1 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.3): + postcss-js@4.0.1(postcss@8.5.1): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.3 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.1 - postcss-nested@6.2.0(postcss@8.5.3): + postcss-nested@6.2.0(postcss@8.5.1): dependencies: - postcss: 8.5.3 + postcss: 8.5.1 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.0.10: @@ -11191,21 +8375,21 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.3: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 - prebuild-install@7.1.3: + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.74.0 + napi-build-utils: 1.0.2 + node-abi: 3.73.0 pump: 3.0.2 rc: 1.2.8 simple-get: 4.0.1 @@ -11214,7 +8398,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.5.3: {} + prettier@3.4.2: {} prism-react-renderer@2.4.1(react@19.0.0): dependencies: @@ -11250,6 +8434,8 @@ snapshots: queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + queue@6.0.2: dependencies: inherits: 2.0.4 @@ -11265,23 +8451,22 @@ snapshots: react-datepicker@7.6.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@floating-ui/react': 0.27.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@floating-ui/react': 0.27.3(react-dom@19.0.0(react@19.0.0))(react@19.0.0) clsx: 2.1.1 date-fns: 3.6.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@3.2.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 - '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) classnames: 2.5.1 diff: 5.2.0 memoize-one: 6.0.0 + prop-types: 15.8.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) transitivePeerDependencies: - - '@types/react' - supports-color react-dom@19.0.0(react@19.0.0): @@ -11291,12 +8476,12 @@ snapshots: react-error-boundary@3.1.4(react@19.0.0): dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 react: 19.0.0 react-error-boundary@4.1.2(react@19.0.0): dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 react: 19.0.0 react-hook-form@7.45.4(react@19.0.0): @@ -11317,7 +8502,7 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-remove-scroll@2.6.3(@types/react@19.0.10)(react@19.0.0): + react-remove-scroll@2.6.2(@types/react@19.0.10)(react@19.0.0): dependencies: react: 19.0.0 react-remove-scroll-bar: 2.3.8(@types/react@19.0.10)(react@19.0.0) @@ -11330,7 +8515,7 @@ snapshots: react-select@5.9.0(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 '@emotion/cache': 11.14.0 '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) '@floating-ui/dom': 1.6.13 @@ -11355,7 +8540,7 @@ snapshots: react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -11404,7 +8589,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -11439,7 +8624,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} + reusify@1.0.4: {} run-parallel@1.2.0: dependencies: @@ -11449,7 +8634,7 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 @@ -11488,14 +8673,14 @@ snapshots: semver@6.3.1: {} - semver@7.7.1: {} + semver@7.6.3: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -11517,8 +8702,8 @@ snapshots: color: 4.2.3 detect-libc: 2.0.3 node-addon-api: 6.1.0 - prebuild-install: 7.1.3 - semver: 7.7.1 + prebuild-install: 7.1.2 + semver: 7.6.3 simple-get: 4.0.1 tar-fs: 3.0.8 tunnel-agent: 0.6.0 @@ -11529,7 +8714,7 @@ snapshots: dependencies: color: 4.2.3 detect-libc: 2.0.3 - semver: 7.7.1 + semver: 7.6.3 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -11561,27 +8746,27 @@ snapshots: side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.4 + object-inspect: 1.13.3 side-channel-map@1.0.1: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 - object-inspect: 1.13.4 + object-inspect: 1.13.3 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -11610,7 +8795,7 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonner@1.7.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + sonner@1.7.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -11636,9 +8821,10 @@ snapshots: streamsearch@1.1.0: {} - streamx@2.22.0: + streamx@2.21.1: dependencies: fast-fifo: 1.3.2 + queue-tick: 1.0.1 text-decoder: 1.2.3 optionalDependencies: bare-events: 2.5.4 @@ -11669,7 +8855,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -11734,12 +8920,12 @@ snapshots: strip-json-comments@3.1.1: {} - strnum@1.1.2: {} + strnum@1.0.5: {} strtok3@8.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 + peek-readable: 5.3.1 styled-jsx@5.1.6(react@19.0.0): dependencies: @@ -11788,11 +8974,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) - postcss-nested: 6.2.0(postcss@8.5.3) + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-nested: 6.2.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -11830,7 +9016,7 @@ snapshots: dependencies: b4a: 1.6.7 fast-fifo: 1.3.2 - streamx: 2.22.0 + streamx: 2.21.1 text-decoder@1.2.3: dependencies: @@ -11853,7 +9039,7 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinyglobby@0.2.12: + tinyglobby@0.2.10: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -11877,7 +9063,7 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.0.1(typescript@5.7.3): + ts-api-utils@2.0.0(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -11922,7 +9108,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.5 + for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -11931,7 +9117,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.5 + for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -11940,10 +9126,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.5 + for-each: 0.3.3 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 + possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 typescript@5.7.3: {} @@ -11986,7 +9172,7 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: browserslist: 4.24.4 escalade: 3.2.0 @@ -12039,7 +9225,7 @@ snapshots: webidl-conversions@7.0.0: {} - whatwg-url@14.1.1: + whatwg-url@14.1.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 @@ -12052,7 +9238,7 @@ snapshots: which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 - is-boolean-object: 1.2.2 + is-boolean-object: 1.2.1 is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 @@ -12062,12 +9248,12 @@ snapshots: call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.1.1 + is-async-function: 2.1.0 is-date-object: 1.1.0 is-finalizationregistry: 1.1.1 is-generator-function: 1.1.0 is-regex: 1.2.1 - is-weakref: 1.1.1 + is-weakref: 1.1.0 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 @@ -12085,7 +9271,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - for-each: 0.3.5 + for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -12109,7 +9295,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.1: {} + ws@8.18.0: {} xss@1.0.15: dependencies: diff --git a/templates/with-vercel-website/package.json b/templates/with-vercel-website/package.json index cfcf8a683b..7dbac095f2 100644 --- a/templates/with-vercel-website/package.json +++ b/templates/with-vercel-website/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "cross-env NODE_OPTIONS=--no-deprecation next build", "postbuild": "next-sitemap --config next-sitemap.config.cjs", + "ci": "payload migrate && pnpm build", "dev": "cross-env NODE_OPTIONS=--no-deprecation next dev", "dev:prod": "cross-env NODE_OPTIONS=--no-deprecation rm -rf .next && pnpm build && pnpm start", "generate:importmap": "cross-env NODE_OPTIONS=--no-deprecation payload generate:importmap", @@ -16,10 +17,10 @@ "lint:fix": "cross-env NODE_OPTIONS=--no-deprecation next lint --fix", "payload": "cross-env NODE_OPTIONS=--no-deprecation payload", "reinstall": "cross-env NODE_OPTIONS=--no-deprecation rm -rf node_modules && rm pnpm-lock.yaml && pnpm --ignore-workspace install", - "start": "cross-env NODE_OPTIONS=--no-deprecation next start", - "ci": "payload migrate && pnpm build" + "start": "cross-env NODE_OPTIONS=--no-deprecation next start" }, "dependencies": { + "@payloadcms/db-vercel-postgres": "latest", "@payloadcms/live-preview-react": "latest", "@payloadcms/next": "latest", "@payloadcms/payload-cloud": "latest", @@ -29,6 +30,7 @@ "@payloadcms/plugin-search": "latest", "@payloadcms/plugin-seo": "latest", "@payloadcms/richtext-lexical": "latest", + "@payloadcms/storage-vercel-blob": "latest", "@payloadcms/ui": "latest", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-label": "^2.0.2", @@ -43,16 +45,14 @@ "next": "15.2.0", "next-sitemap": "^4.2.3", "payload": "latest", - "payload-admin-bar": "^1.0.6", + "payload-admin-bar": "^1.0.7", "prism-react-renderer": "^2.3.1", "react": "19.0.0", "react-dom": "19.0.0", "react-hook-form": "7.45.4", "sharp": "0.32.6", "tailwind-merge": "^2.3.0", - "tailwindcss-animate": "^1.0.7", - "@payloadcms/db-vercel-postgres": "latest", - "@payloadcms/storage-vercel-blob": "latest" + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", From 562acb749216058baf46ab3621d2342a88708360 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 3 Mar 2025 15:15:44 +0000 Subject: [PATCH 077/127] templates: fix vercel website template importmap error caused by missing import (#11500) The new client side handler was missing in the importmap on the template for the vercel blob storage adapter --- .../with-vercel-website/src/app/(payload)/admin/importMap.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/templates/with-vercel-website/src/app/(payload)/admin/importMap.js b/templates/with-vercel-website/src/app/(payload)/admin/importMap.js index 896ea84aba..c3c485e797 100644 --- a/templates/with-vercel-website/src/app/(payload)/admin/importMap.js +++ b/templates/with-vercel-website/src/app/(payload)/admin/importMap.js @@ -22,6 +22,7 @@ import { RowLabel as RowLabel_ec255a65fa6fa8d1faeb09cf35284224 } from '@/Header/ import { RowLabel as RowLabel_1f6ff6ff633e3695d348f4f3c58f1466 } from '@/Footer/RowLabel' import { default as default_1a7510af427896d367a49dbf838d2de6 } from '@/components/BeforeDashboard' import { default as default_8a7ab0eb7ab5c511aba12e68480bfe5e } from '@/components/BeforeLogin' +import { VercelBlobClientUploadHandler as VercelBlobClientUploadHandler_16c82c5e25f430251a3e3ba57219ff4e } from '@payloadcms/storage-vercel-blob/client' export const importMap = { '@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell': @@ -65,4 +66,6 @@ export const importMap = { '@/Footer/RowLabel#RowLabel': RowLabel_1f6ff6ff633e3695d348f4f3c58f1466, '@/components/BeforeDashboard#default': default_1a7510af427896d367a49dbf838d2de6, '@/components/BeforeLogin#default': default_8a7ab0eb7ab5c511aba12e68480bfe5e, + '@payloadcms/storage-vercel-blob/client#VercelBlobClientUploadHandler': + VercelBlobClientUploadHandler_16c82c5e25f430251a3e3ba57219ff4e, } From 4ddf96502cf91f301a0fd174dbfd5ae9801ae13c Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Mon, 3 Mar 2025 10:21:55 -0500 Subject: [PATCH 078/127] fix(examples): ensure working multi-tenant example with pg (#11501) ### What? There were a couple issues with the implementation within the example when using postgres. - `ensureUniqueUsername` tenant was being extracted incorrectly, should not constrain query unless it was present - `ensureUniqueSlug` was querying by NaN when tenant was not present on data or originalDoc - `users` read access was not correctly extracting the tenant id in the correct type depending on DB Fixes https://github.com/payloadcms/payload/issues/11484 --- examples/multi-tenant/.env.example | 2 + examples/multi-tenant/README.md | 4 +- examples/multi-tenant/next-env.d.ts | 2 +- examples/multi-tenant/package.json | 1 + examples/multi-tenant/pnpm-lock.yaml | 939 +++++++++++++++++- examples/multi-tenant/src/app/(app)/page.tsx | 6 +- .../src/app/(payload)/admin/importMap.js | 9 +- .../Pages/hooks/ensureUniqueSlug.ts | 37 +- .../src/collections/Users/access/read.ts | 10 +- .../Users/hooks/ensureUniqueUsername.ts | 45 +- .../Users/hooks/setCookieBasedOnDomain.ts | 2 +- examples/multi-tenant/src/payload-types.ts | 83 +- examples/multi-tenant/src/payload.config.ts | 16 +- .../multi-tenant/src/{migrations => }/seed.ts | 10 +- .../src/utilities/getCollectionIDType.ts | 9 + 15 files changed, 1099 insertions(+), 76 deletions(-) rename examples/multi-tenant/src/{migrations => }/seed.ts (91%) create mode 100644 examples/multi-tenant/src/utilities/getCollectionIDType.ts diff --git a/examples/multi-tenant/.env.example b/examples/multi-tenant/.env.example index 9344c5560c..56d50a07d3 100644 --- a/examples/multi-tenant/.env.example +++ b/examples/multi-tenant/.env.example @@ -1,3 +1,5 @@ DATABASE_URI=mongodb://127.0.0.1/payload-example-multi-tenant +POSTGRES_URL=postgres://127.0.0.1:5432/payload-example-multi-tenant PAYLOAD_SECRET=PAYLOAD_MULTI_TENANT_EXAMPLE_SECRET_KEY PAYLOAD_PUBLIC_SERVER_URL=http://localhost:3000 +SEED_DB=true \ No newline at end of file diff --git a/examples/multi-tenant/README.md b/examples/multi-tenant/README.md index 5626f3600e..9121c90308 100644 --- a/examples/multi-tenant/README.md +++ b/examples/multi-tenant/README.md @@ -46,12 +46,12 @@ See the [Collections](https://payloadcms.com/docs/configuration/collections) doc **Domain-based Tenant Setting**: - This example also supports domain-based tenant selection, where tenants can be associated with a specific domain. If a tenant is associated with a domain (e.g., `gold.test:3000`), when a user logs in from that domain, they will be automatically scoped to the matching tenant. This is accomplished through an optional `afterLogin` hook that sets a `payload-tenant` cookie based on the domain. + This example also supports domain-based tenant selection, where tenants can be associated with a specific domain. If a tenant is associated with a domain (e.g., `gold.localhost:3000`), when a user logs in from that domain, they will be automatically scoped to the matching tenant. This is accomplished through an optional `afterLogin` hook that sets a `payload-tenant` cookie based on the domain. For the domain portion of the example to function properly, you will need to add the following entries to your system's `/etc/hosts` file: ``` -127.0.0.1 gold.test silver.test bronze.test +127.0.0.1 gold.localhost silver.localhost bronze.localhost ``` - #### Pages diff --git a/examples/multi-tenant/next-env.d.ts b/examples/multi-tenant/next-env.d.ts index 40c3d68096..1b3be0840f 100644 --- a/examples/multi-tenant/next-env.d.ts +++ b/examples/multi-tenant/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/examples/multi-tenant/package.json b/examples/multi-tenant/package.json index 0f4a8a21d8..3f67662be9 100644 --- a/examples/multi-tenant/package.json +++ b/examples/multi-tenant/package.json @@ -17,6 +17,7 @@ }, "dependencies": { "@payloadcms/db-mongodb": "latest", + "@payloadcms/db-postgres": "^3.25.0", "@payloadcms/next": "latest", "@payloadcms/plugin-multi-tenant": "latest", "@payloadcms/richtext-lexical": "latest", diff --git a/examples/multi-tenant/pnpm-lock.yaml b/examples/multi-tenant/pnpm-lock.yaml index 0a8c1a5f12..139420c3d5 100644 --- a/examples/multi-tenant/pnpm-lock.yaml +++ b/examples/multi-tenant/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@payloadcms/db-mongodb': specifier: latest version: 3.25.0(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2)) + '@payloadcms/db-postgres': + specifier: ^3.25.0 + version: 3.25.0(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react@19.0.0) '@payloadcms/next': specifier: latest version: 3.25.0(@types/react@19.0.1)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.5.2) @@ -134,8 +137,8 @@ packages: '@dnd-kit/core@6.0.8': resolution: {integrity: sha512-lYaoP8yHTQSLlZe6Rr9qogouGUz9oRUj4AHhDQGQzq/hqaJRpFo65X+JKsdHf8oUFBzx5A+SJPUvxAwTF2OabA==} peerDependencies: - react: 19.0.0-rc-65a56d0e-20241020 - react-dom: 19.0.0-rc-65a56d0e-20241020 + react: '>=16.8.0' + react-dom: '>=16.8.0' '@dnd-kit/sortable@7.0.2': resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} @@ -148,6 +151,9 @@ packages: peerDependencies: react: '>=16.8.0' + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -195,6 +201,20 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} @@ -207,6 +227,18 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} @@ -219,6 +251,18 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} @@ -231,6 +275,18 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} @@ -243,6 +299,18 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} @@ -255,6 +323,18 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} @@ -267,6 +347,18 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} @@ -279,6 +371,18 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} @@ -291,6 +395,18 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} @@ -303,6 +419,18 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} @@ -315,6 +443,18 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} @@ -327,6 +467,18 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} @@ -339,6 +491,18 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} @@ -351,6 +515,18 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} @@ -363,6 +539,18 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} @@ -375,6 +563,18 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} @@ -387,6 +587,18 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} @@ -405,6 +617,18 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -429,6 +653,18 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} @@ -441,6 +677,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} @@ -453,6 +701,18 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} @@ -465,6 +725,18 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} @@ -477,6 +749,18 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -766,8 +1050,8 @@ packages: resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} peerDependencies: monaco-editor: '>= 0.25.0 < 1' - react: 19.0.0 - react-dom: 19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@mongodb-js/saslprep@1.2.0': resolution: {integrity: sha512-+ywrb0AqkfaYuhHs6LxKWgqbh3I72EpEgESCw37o+9qPx9WTCkgDm2B+eMrwehGtHBWHFU4GXvnSCNiFhhausg==} @@ -847,6 +1131,16 @@ packages: peerDependencies: payload: 3.25.0 + '@payloadcms/db-postgres@3.25.0': + resolution: {integrity: sha512-wrYQErmJIbiHzw/BY8c52M2l6Q9HGoF41Km+2H3n3cmXtg9RbAgp7PmxucEDitk6JCRCn6G0WxtrAfGyqizosQ==} + peerDependencies: + payload: 3.25.0 + + '@payloadcms/drizzle@3.25.0': + resolution: {integrity: sha512-8ZRwQhTqS3PcvXae8k+RIoNaaFCTD4kdeoOCeIt6/Y/F6OzYzespU1Wci7jDlaJruUxzb+CdZWHWZbv27pbwzQ==} + peerDependencies: + payload: 3.25.0 + '@payloadcms/graphql@3.25.0': resolution: {integrity: sha512-JbffYYHcsqOPK7GH6WgQd+xbtNQxG+is3el+qxIVIqTGwrZtGy7EFg2OK3XMk3Hb/bJUH/Ino3X3XsgdD6ffyg==} hasBin: true @@ -1018,6 +1312,9 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pg@8.10.2': + resolution: {integrity: sha512-MKFs9P6nJ+LAeHLU3V0cODEOgyThJ3OAnmOlsZsxux6sfQs3HRXR5bBn7xG5DjckEFhTAxsXi7k7cd0pCMxpJw==} + '@types/react-dom@19.0.1': resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==} @@ -1254,6 +1551,13 @@ packages: resolution: {integrity: sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==} engines: {node: '>=16.20.1'} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1478,6 +1782,102 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + drizzle-kit@0.28.0: + resolution: {integrity: sha512-KqI+CS2Ga9GYIrXpxpCDUJJrH/AT/k4UY0Pb4oRgQEGkgN1EdCnqp664cXgwPWjDr5RBtTsjZipw8+8C//K63A==} + hasBin: true + + drizzle-orm@0.36.1: + resolution: {integrity: sha512-F4hbimnMEhyWzDowQB4xEuVJJWXLHZYD7FYwvo8RImY+N7pStGqsbfmT95jDbec1s4qKmQbiuxEDZY90LRrfIw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1527,6 +1927,21 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} @@ -2413,6 +2828,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + on-exit-leak-free@2.1.2: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} @@ -2436,6 +2854,9 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -2480,6 +2901,48 @@ packages: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.7.1: + resolution: {integrity: sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.7.1: + resolution: {integrity: sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2517,6 +2980,41 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -2797,10 +3295,17 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} @@ -2927,10 +3432,19 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + to-no-case@1.0.2: + resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-snake-case@1.0.0: + resolution: {integrity: sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ==} + + to-space-case@1.0.0: + resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} + token-types@6.0.0: resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} engines: {node: '>=14.16'} @@ -3058,6 +3572,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -3114,6 +3632,10 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -3220,6 +3742,8 @@ snapshots: react: 19.0.0 tslib: 2.8.1 + '@drizzle-team/brocli@0.10.2': {} + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -3299,102 +3823,211 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.10.0 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + '@esbuild/linux-x64@0.23.1': optional: true @@ -3404,6 +4037,12 @@ snapshots: '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + '@esbuild/netbsd-x64@0.23.1': optional: true @@ -3416,30 +4055,60 @@ snapshots: '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + '@esbuild/win32-x64@0.23.1': optional: true @@ -3846,6 +4515,88 @@ snapshots: - socks - supports-color + '@payloadcms/db-postgres@3.25.0(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(react@19.0.0)': + dependencies: + '@payloadcms/drizzle': 3.25.0(@types/pg@8.10.2)(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(pg@8.11.3)(react@19.0.0) + '@types/pg': 8.10.2 + console-table-printer: 2.12.1 + drizzle-kit: 0.28.0 + drizzle-orm: 0.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) + pg: 8.11.3 + prompts: 2.4.2 + to-snake-case: 1.0.0 + uuid: 10.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg-native + - postgres + - prisma + - react + - sql.js + - sqlite3 + - supports-color + + '@payloadcms/drizzle@3.25.0(@types/pg@8.10.2)(@types/react@19.0.1)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(pg@8.11.3)(react@19.0.0)': + dependencies: + console-table-printer: 2.12.1 + drizzle-orm: 0.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0) + payload: 3.25.0(graphql@16.10.0)(typescript@5.5.2) + prompts: 2.4.2 + to-snake-case: 1.0.0 + uuid: 9.0.0 + transitivePeerDependencies: + - '@aws-sdk/client-rds-data' + - '@cloudflare/workers-types' + - '@electric-sql/pglite' + - '@libsql/client' + - '@libsql/client-wasm' + - '@neondatabase/serverless' + - '@op-engineering/op-sqlite' + - '@opentelemetry/api' + - '@planetscale/database' + - '@prisma/client' + - '@tidbcloud/serverless' + - '@types/better-sqlite3' + - '@types/pg' + - '@types/react' + - '@types/sql.js' + - '@vercel/postgres' + - '@xata.io/client' + - better-sqlite3 + - bun-types + - expo-sqlite + - knex + - kysely + - mysql2 + - pg + - postgres + - prisma + - react + - sql.js + - sqlite3 + '@payloadcms/graphql@3.25.0(graphql@16.10.0)(payload@3.25.0(graphql@16.10.0)(typescript@5.5.2))(typescript@5.5.2)': dependencies: graphql: 16.10.0 @@ -4073,6 +4824,12 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/pg@8.10.2': + dependencies: + '@types/node': 22.13.5 + pg-protocol: 1.7.1 + pg-types: 4.0.2 + '@types/react-dom@19.0.1': dependencies: '@types/react': 19.0.1 @@ -4357,6 +5114,10 @@ snapshots: bson@6.10.3: {} + buffer-from@1.1.2: {} + + buffer-writer@2.0.0: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -4567,6 +5328,22 @@ snapshots: dotenv@8.6.0: {} + drizzle-kit@0.28.0: + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.36.1(@types/pg@8.10.2)(@types/react@19.0.1)(pg@8.11.3)(react@19.0.0): + optionalDependencies: + '@types/pg': 8.10.2 + '@types/react': 19.0.1 + pg: 8.11.3 + react: 19.0.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4686,6 +5463,64 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.4.0 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + esbuild@0.23.1: optionalDependencies: '@esbuild/aix-ppc64': 0.23.1 @@ -5816,6 +6651,8 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + obuf@1.1.2: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: @@ -5845,6 +6682,8 @@ snapshots: dependencies: p-limit: 3.1.0 + packet-reader@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5917,6 +6756,55 @@ snapshots: peek-readable@5.4.2: {} + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.7.0: {} + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.7.1(pg@8.11.3): + dependencies: + pg: 8.11.3 + + pg-protocol@1.7.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.11.3: + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.7.0 + pg-pool: 3.7.1(pg@8.11.3) + pg-protocol: 1.7.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5969,6 +6857,28 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + + postgres-date@1.0.7: {} + + postgres-date@2.1.0: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 @@ -6327,8 +7237,15 @@ snapshots: source-map-js@1.2.1: {} + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map@0.5.7: {} + source-map@0.6.1: {} + sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 @@ -6485,10 +7402,20 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + to-no-case@1.0.2: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + to-snake-case@1.0.0: + dependencies: + to-space-case: 1.0.0 + + to-space-case@1.0.0: + dependencies: + to-no-case: 1.0.2 + token-types@6.0.0: dependencies: '@tokenizer/token': 0.3.0 @@ -6633,6 +7560,8 @@ snapshots: uuid@10.0.0: {} + uuid@9.0.0: {} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -6700,6 +7629,8 @@ snapshots: commander: 2.20.3 cssfilter: 0.0.10 + xtend@4.0.2: {} + yaml@1.10.2: {} yjs@13.6.23: diff --git a/examples/multi-tenant/src/app/(app)/page.tsx b/examples/multi-tenant/src/app/(app)/page.tsx index 2011e90eea..2979bf4369 100644 --- a/examples/multi-tenant/src/app/(app)/page.tsx +++ b/examples/multi-tenant/src/app/(app)/page.tsx @@ -10,10 +10,10 @@ export default async ({ params: paramsPromise }: { params: Promise<{ slug: strin

When you visit a tenant by domain, the domain is used to determine the tenant.

For example, visiting{' '} - - http://gold.test:3000/tenant-domains/login + + http://gold.localhost:3000/tenant-domains/login {' '} - will show the tenant with the domain "gold.test". + will show the tenant with the domain "gold.localhost".

Slugs

diff --git a/examples/multi-tenant/src/app/(payload)/admin/importMap.js b/examples/multi-tenant/src/app/(payload)/admin/importMap.js index f24146b1be..a17baac94a 100644 --- a/examples/multi-tenant/src/app/(payload)/admin/importMap.js +++ b/examples/multi-tenant/src/app/(payload)/admin/importMap.js @@ -3,10 +3,7 @@ import { TenantSelector as TenantSelector_1d0591e3cf4f332c83a86da13a0de59a } fro import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' export const importMap = { - '@payloadcms/plugin-multi-tenant/client#TenantField': - TenantField_1d0591e3cf4f332c83a86da13a0de59a, - '@payloadcms/plugin-multi-tenant/client#TenantSelector': - TenantSelector_1d0591e3cf4f332c83a86da13a0de59a, - '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider': - TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62, + "@payloadcms/plugin-multi-tenant/client#TenantField": TenantField_1d0591e3cf4f332c83a86da13a0de59a, + "@payloadcms/plugin-multi-tenant/client#TenantSelector": TenantSelector_1d0591e3cf4f332c83a86da13a0de59a, + "@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } diff --git a/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts b/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts index 55826874f5..6f0ebbacdd 100644 --- a/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts +++ b/examples/multi-tenant/src/collections/Pages/hooks/ensureUniqueSlug.ts @@ -1,8 +1,9 @@ -import type { FieldHook } from 'payload' +import type { FieldHook, Where } from 'payload' import { ValidationError } from 'payload' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' +import { extractID } from '@/utilities/extractID' export const ensureUniqueSlug: FieldHook = async ({ data, originalDoc, req, value }) => { // if value is unchanged, skip validation @@ -10,26 +11,30 @@ export const ensureUniqueSlug: FieldHook = async ({ data, originalDoc, req, valu return value } - const incomingTenantID = typeof data?.tenant === 'object' ? data.tenant.id : data?.tenant - const currentTenantID = - typeof originalDoc?.tenant === 'object' ? originalDoc.tenant.id : originalDoc?.tenant + const constraints: Where[] = [ + { + slug: { + equals: value, + }, + }, + ] + + const incomingTenantID = extractID(data?.tenant) + const currentTenantID = extractID(originalDoc?.tenant) const tenantIDToMatch = incomingTenantID || currentTenantID + if (tenantIDToMatch) { + constraints.push({ + tenant: { + equals: tenantIDToMatch, + }, + }) + } + const findDuplicatePages = await req.payload.find({ collection: 'pages', where: { - and: [ - { - tenant: { - equals: tenantIDToMatch, - }, - }, - { - slug: { - equals: value, - }, - }, - ], + and: constraints, }, }) diff --git a/examples/multi-tenant/src/collections/Users/access/read.ts b/examples/multi-tenant/src/collections/Users/access/read.ts index c81e836009..235379089b 100644 --- a/examples/multi-tenant/src/collections/Users/access/read.ts +++ b/examples/multi-tenant/src/collections/Users/access/read.ts @@ -1,11 +1,11 @@ import type { User } from '@/payload-types' import type { Access, Where } from 'payload' - -import { parseCookies } from 'payload' +import { getTenantFromCookie } from '@payloadcms/plugin-multi-tenant/utilities' import { isSuperAdmin } from '../../../access/isSuperAdmin' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' import { isAccessingSelf } from './isAccessingSelf' +import { getCollectionIDType } from '@/utilities/getCollectionIDType' export const readAccess: Access = ({ req, id }) => { if (!req?.user) { @@ -16,9 +16,11 @@ export const readAccess: Access = ({ req, id }) => { return true } - const cookies = parseCookies(req.headers) const superAdmin = isSuperAdmin(req.user) - const selectedTenant = cookies.get('payload-tenant') + const selectedTenant = getTenantFromCookie( + req.headers, + getCollectionIDType({ payload: req.payload, collectionSlug: 'tenants' }), + ) const adminTenantAccessIDs = getUserTenantIDs(req.user, 'tenant-admin') if (selectedTenant) { diff --git a/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts b/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts index 7c5d8ae5eb..787e210715 100644 --- a/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts +++ b/examples/multi-tenant/src/collections/Users/hooks/ensureUniqueUsername.ts @@ -1,8 +1,11 @@ -import type { FieldHook } from 'payload' +import type { FieldHook, Where } from 'payload' import { ValidationError } from 'payload' import { getUserTenantIDs } from '../../../utilities/getUserTenantIDs' +import { extractID } from '@/utilities/extractID' +import { getTenantFromCookie } from '@payloadcms/plugin-multi-tenant/utilities' +import { getCollectionIDType } from '@/utilities/getCollectionIDType' export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, value }) => { // if value is unchanged, skip validation @@ -10,26 +13,31 @@ export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, return value } - const incomingTenantID = typeof data?.tenant === 'object' ? data.tenant.id : data?.tenant - const currentTenantID = - typeof originalDoc?.tenant === 'object' ? originalDoc.tenant.id : originalDoc?.tenant - const tenantIDToMatch = incomingTenantID || currentTenantID + const constraints: Where[] = [ + { + username: { + equals: value, + }, + }, + ] + + const selectedTenant = getTenantFromCookie( + req.headers, + getCollectionIDType({ payload: req.payload, collectionSlug: 'tenants' }), + ) + + if (selectedTenant) { + constraints.push({ + 'tenants.tenant': { + equals: selectedTenant, + }, + }) + } const findDuplicateUsers = await req.payload.find({ collection: 'users', where: { - and: [ - { - 'tenants.tenant': { - equals: tenantIDToMatch, - }, - }, - { - username: { - equals: value, - }, - }, - ], + and: constraints, }, }) @@ -39,7 +47,8 @@ export const ensureUniqueUsername: FieldHook = async ({ data, originalDoc, req, // provide a more specific error message if (req.user.roles?.includes('super-admin') || tenantIDs.length > 1) { const attemptedTenantChange = await req.payload.findByID({ - id: tenantIDToMatch, + // @ts-ignore - selectedTenant will match DB ID type + id: selectedTenant, collection: 'tenants', }) diff --git a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts index 36f6a70d22..fe01891054 100644 --- a/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts +++ b/examples/multi-tenant/src/collections/Users/hooks/setCookieBasedOnDomain.ts @@ -21,7 +21,7 @@ export const setCookieBasedOnDomain: CollectionAfterLoginHook = async ({ req, us expires: getCookieExpiration({ seconds: 7200 }), path: '/', returnCookieAsObject: false, - value: relatedOrg.docs[0].id, + value: String(relatedOrg.docs[0].id), }) // Merge existing responseHeaders with the new Set-Cookie header diff --git a/examples/multi-tenant/src/payload-types.ts b/examples/multi-tenant/src/payload-types.ts index c343c7998f..7b62e9a168 100644 --- a/examples/multi-tenant/src/payload-types.ts +++ b/examples/multi-tenant/src/payload-types.ts @@ -6,10 +6,65 @@ * and re-run `payload generate:types` to regenerate this file. */ +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + export interface Config { auth: { users: UserAuthOperations; }; + blocks: {}; collections: { pages: Page; users: User; @@ -28,7 +83,7 @@ export interface Config { 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; }; db: { - defaultIDType: string; + defaultIDType: number; }; globals: {}; globalsSelect: {}; @@ -64,8 +119,8 @@ export interface UserAuthOperations { * via the `definition` "pages". */ export interface Page { - id: string; - tenant?: (string | null) | Tenant; + id: number; + tenant?: (number | null) | Tenant; title?: string | null; slug?: string | null; updatedAt: string; @@ -76,7 +131,7 @@ export interface Page { * via the `definition` "tenants". */ export interface Tenant { - id: string; + id: number; name: string; /** * Used for domain-based tenant handling @@ -98,12 +153,12 @@ export interface Tenant { * via the `definition` "users". */ export interface User { - id: string; + id: number; roles?: ('super-admin' | 'user')[] | null; username?: string | null; tenants?: | { - tenant: string | Tenant; + tenant: number | Tenant; roles: ('tenant-admin' | 'tenant-viewer')[]; id?: string | null; }[] @@ -124,24 +179,24 @@ export interface User { * via the `definition` "payload-locked-documents". */ export interface PayloadLockedDocument { - id: string; + id: number; document?: | ({ relationTo: 'pages'; - value: string | Page; + value: number | Page; } | null) | ({ relationTo: 'users'; - value: string | User; + value: number | User; } | null) | ({ relationTo: 'tenants'; - value: string | Tenant; + value: number | Tenant; } | null); globalSlug?: string | null; user: { relationTo: 'users'; - value: string | User; + value: number | User; }; updatedAt: string; createdAt: string; @@ -151,10 +206,10 @@ export interface PayloadLockedDocument { * via the `definition` "payload-preferences". */ export interface PayloadPreference { - id: string; + id: number; user: { relationTo: 'users'; - value: string | User; + value: number | User; }; key?: string | null; value?: @@ -174,7 +229,7 @@ export interface PayloadPreference { * via the `definition` "payload-migrations". */ export interface PayloadMigration { - id: string; + id: number; name?: string | null; batch?: number | null; updatedAt: string; diff --git a/examples/multi-tenant/src/payload.config.ts b/examples/multi-tenant/src/payload.config.ts index c7ce37f678..9d464800ce 100644 --- a/examples/multi-tenant/src/payload.config.ts +++ b/examples/multi-tenant/src/payload.config.ts @@ -1,4 +1,5 @@ import { mongooseAdapter } from '@payloadcms/db-mongodb' +import { postgresAdapter } from '@payloadcms/db-postgres' import { lexicalEditor } from '@payloadcms/richtext-lexical' import path from 'path' import { buildConfig } from 'payload' @@ -11,6 +12,7 @@ import { multiTenantPlugin } from '@payloadcms/plugin-multi-tenant' import { isSuperAdmin } from './access/isSuperAdmin' import type { Config } from './payload-types' import { getUserTenantIDs } from './utilities/getUserTenantIDs' +import { seed } from './seed' const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) @@ -21,9 +23,19 @@ export default buildConfig({ user: 'users', }, collections: [Pages, Users, Tenants], - db: mongooseAdapter({ - url: process.env.DATABASE_URI as string, + // db: mongooseAdapter({ + // url: process.env.DATABASE_URI as string, + // }), + db: postgresAdapter({ + pool: { + connectionString: process.env.POSTGRES_URL, + }, }), + onInit: async (args) => { + if (process.env.SEED_DB) { + await seed(args) + } + }, editor: lexicalEditor({}), graphQL: { schemaOutputFile: path.resolve(dirname, 'generated-schema.graphql'), diff --git a/examples/multi-tenant/src/migrations/seed.ts b/examples/multi-tenant/src/seed.ts similarity index 91% rename from examples/multi-tenant/src/migrations/seed.ts rename to examples/multi-tenant/src/seed.ts index 21d4bb73c2..78cf44bef9 100644 --- a/examples/multi-tenant/src/migrations/seed.ts +++ b/examples/multi-tenant/src/seed.ts @@ -1,12 +1,12 @@ -import type { MigrateUpArgs } from '@payloadcms/db-mongodb' +import { Config } from 'payload' -export async function up({ payload }: MigrateUpArgs): Promise { +export const seed: NonNullable = async (payload): Promise => { const tenant1 = await payload.create({ collection: 'tenants', data: { name: 'Tenant 1', slug: 'gold', - domain: 'gold.test', + domain: 'gold.localhost', }, }) @@ -15,7 +15,7 @@ export async function up({ payload }: MigrateUpArgs): Promise { data: { name: 'Tenant 2', slug: 'silver', - domain: 'silver.test', + domain: 'silver.localhost', }, }) @@ -24,7 +24,7 @@ export async function up({ payload }: MigrateUpArgs): Promise { data: { name: 'Tenant 3', slug: 'bronze', - domain: 'bronze.test', + domain: 'bronze.localhost', }, }) diff --git a/examples/multi-tenant/src/utilities/getCollectionIDType.ts b/examples/multi-tenant/src/utilities/getCollectionIDType.ts new file mode 100644 index 0000000000..02ed72f73d --- /dev/null +++ b/examples/multi-tenant/src/utilities/getCollectionIDType.ts @@ -0,0 +1,9 @@ +import type { CollectionSlug, Payload } from 'payload' + +type Args = { + collectionSlug: CollectionSlug + payload: Payload +} +export const getCollectionIDType = ({ collectionSlug, payload }: Args): 'number' | 'text' => { + return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType +} From a3fe60778cfa78a2704831ff73abc1212693e976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Jablo=C3=B1ski?= <43938777+GermanJablo@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:01:14 -0300 Subject: [PATCH 079/127] chore(translations): enable TypeScript strict mode (#11494) --- .../translations/src/importDateFNSLocale.ts | 4 ++- .../translations/src/utilities/copyFile.ts | 3 +- .../src/utilities/deepMergeSimple.ts | 3 ++ .../src/utilities/ensureDirExists.ts | 6 ++-- .../src/utilities/getTranslation.ts | 5 ++- .../src/utilities/getTranslationsByContext.ts | 12 +++---- packages/translations/src/utilities/init.ts | 36 ++++++++++--------- .../translations/src/utilities/languages.ts | 2 +- packages/translations/tsconfig.json | 4 --- 9 files changed, 43 insertions(+), 32 deletions(-) diff --git a/packages/translations/src/importDateFNSLocale.ts b/packages/translations/src/importDateFNSLocale.ts index 2556dcaadc..cd0101d731 100644 --- a/packages/translations/src/importDateFNSLocale.ts +++ b/packages/translations/src/importDateFNSLocale.ts @@ -150,7 +150,9 @@ export const importDateFNSLocale = async (locale: string): Promise => { break } - if (result.default) { + // @ts-expect-error - I'm not sure if this is still necessary. + if (result?.default) { + // @ts-expect-error - I'm not sure if this is still necessary. return result.default } diff --git a/packages/translations/src/utilities/copyFile.ts b/packages/translations/src/utilities/copyFile.ts index a5c36a8524..8d80382089 100644 --- a/packages/translations/src/utilities/copyFile.ts +++ b/packages/translations/src/utilities/copyFile.ts @@ -1,6 +1,7 @@ +/* eslint-disable no-console */ import fs from 'fs' -export function copyFile(source, destination) { +export function copyFile(source: string, destination: string) { fs.copyFile(source, destination, (err) => { if (err) { // Handle error diff --git a/packages/translations/src/utilities/deepMergeSimple.ts b/packages/translations/src/utilities/deepMergeSimple.ts index 6de2acfdbd..010cfa4264 100644 --- a/packages/translations/src/utilities/deepMergeSimple.ts +++ b/packages/translations/src/utilities/deepMergeSimple.ts @@ -13,9 +13,12 @@ export function deepMergeSimple(obj1: object, obj2: object): T { for (const key in obj2) { if (Object.prototype.hasOwnProperty.call(obj2, key)) { + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve if (typeof obj2[key] === 'object' && !Array.isArray(obj2[key]) && obj1[key]) { + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve output[key] = deepMergeSimple(obj1[key], obj2[key]) } else { + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve output[key] = obj2[key] } } diff --git a/packages/translations/src/utilities/ensureDirExists.ts b/packages/translations/src/utilities/ensureDirExists.ts index d2fb9dda25..16930aea39 100644 --- a/packages/translations/src/utilities/ensureDirExists.ts +++ b/packages/translations/src/utilities/ensureDirExists.ts @@ -1,11 +1,13 @@ import fs from 'fs' -export function ensureDirectoryExists(directory) { +export function ensureDirectoryExists(directory: string) { try { if (!fs.existsSync(directory)) { fs.mkdirSync(directory, { recursive: true }) } } catch (error) { - console.error(`Error creating directory '${directory}': ${error.message}`) + const msg = error instanceof Error ? error.message : 'Unknown error' + // eslint-disable-next-line no-console + console.error(`Error creating directory '${directory}': ${msg}`) } } diff --git a/packages/translations/src/utilities/getTranslation.ts b/packages/translations/src/utilities/getTranslation.ts index 334b85a0ca..05251b02ba 100644 --- a/packages/translations/src/utilities/getTranslation.ts +++ b/packages/translations/src/utilities/getTranslation.ts @@ -14,7 +14,9 @@ export const getTranslation = ( ): T extends JSX.Element ? JSX.Element : string => { // If it's a Record, look for translation. If string or React Element, pass through if (typeof label === 'object' && !Object.prototype.hasOwnProperty.call(label, '$$typeof')) { + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve if (label[i18n.language]) { + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve return label[i18n.language] } @@ -25,8 +27,9 @@ export const getTranslation = ( fallbacks = i18n.fallbackLanguage } - const fallbackLang = fallbacks.find((language) => label[language]) + const fallbackLang = fallbacks.find((language) => label[language as keyof typeof label]) + // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve return fallbackLang && label[fallbackLang] ? label[fallbackLang] : label[Object.keys(label)[0]] } diff --git a/packages/translations/src/utilities/getTranslationsByContext.ts b/packages/translations/src/utilities/getTranslationsByContext.ts index 952bb971d3..f3b699d904 100644 --- a/packages/translations/src/utilities/getTranslationsByContext.ts +++ b/packages/translations/src/utilities/getTranslationsByContext.ts @@ -2,8 +2,8 @@ import type { Language } from '../types.js' import { clientTranslationKeys } from '../clientKeys.js' -function filterKeys(obj, parentGroupKey = '', keys) { - const result = {} +function filterKeys(obj: Record, parentGroupKey = '', keys: string[]) { + const result: Record = {} for (const [namespaceKey, value] of Object.entries(obj)) { // Skip $schema key @@ -13,7 +13,7 @@ function filterKeys(obj, parentGroupKey = '', keys) { } if (typeof value === 'object') { - const filteredObject = filterKeys(value, namespaceKey, keys) + const filteredObject = filterKeys(value as Record, namespaceKey, keys) if (Object.keys(filteredObject).length > 0) { result[namespaceKey] = filteredObject } @@ -40,13 +40,13 @@ function filterKeys(obj, parentGroupKey = '', keys) { return result } -function sortObject(obj) { - const sortedObject = {} +function sortObject(obj: Record) { + const sortedObject: Record = {} Object.keys(obj) .sort() .forEach((key) => { if (typeof obj[key] === 'object') { - sortedObject[key] = sortObject(obj[key]) + sortedObject[key] = sortObject(obj[key] as Record) } else { sortedObject[key] = obj[key] } diff --git a/packages/translations/src/utilities/init.ts b/packages/translations/src/utilities/init.ts index dec0066b5e..f34d1ca7c6 100644 --- a/packages/translations/src/utilities/init.ts +++ b/packages/translations/src/utilities/init.ts @@ -145,9 +145,13 @@ export function t< const initTFunction: InitTFunction = (args) => { const { config, language, translations } = args - const mergedTranslations = config?.translations?.[language] - ? deepMergeSimple(translations, config?.translations?.[language]) - : translations + const mergedTranslations = + language && config?.translations?.[language as keyof typeof config.translations] + ? deepMergeSimple( + translations, + config.translations[language as keyof typeof config.translations]!, + ) + : translations return { t: (key, vars) => { @@ -161,18 +165,14 @@ const initTFunction: InitTFunction = (args) => { } } -function memoize( - fn: (args: Parameters[0]) => Promise, - keys: string[], -): ( - args: { - context: 'api' | 'client' - } & Parameters[0], -) => Promise { - const cacheMap = new Map() +function memoize[0], K extends keyof T>( + fn: (args: T) => Promise, + keys: K[], +): (args: T) => Promise { + const cacheMap = new Map() - const memoized = async (args) => { - const cacheKey = keys.reduce((acc, key) => acc + args[key], '') + const memoized = async (args: T) => { + const cacheKey = keys.reduce((acc, key) => acc + String(args[key]), '') if (!cacheMap.has(cacheKey)) { const result = await fn(args) @@ -187,7 +187,11 @@ function memoize( export const initI18n = memoize( async ({ config, context, language = config.fallbackLanguage }) => { - const translations = getTranslationsByContext(config.supportedLanguages[language], context) + if (!language || !config.supportedLanguages?.[language]) { + throw new Error(`Language ${language} not supported`) + } + + const translations = getTranslationsByContext(config.supportedLanguages?.[language], context) const { t, translations: mergedTranslations } = initTFunction({ config: config as any, @@ -202,7 +206,7 @@ export const initI18n = memoize( const i18n: I18n = { dateFNS, dateFNSKey, - fallbackLanguage: config.fallbackLanguage, + fallbackLanguage: config.fallbackLanguage!, language: language || config.fallbackLanguage, t, translations: mergedTranslations, diff --git a/packages/translations/src/utilities/languages.ts b/packages/translations/src/utilities/languages.ts index d7cdde2385..2c95bde2f3 100644 --- a/packages/translations/src/utilities/languages.ts +++ b/packages/translations/src/utilities/languages.ts @@ -152,7 +152,7 @@ function parseAcceptLanguage(acceptLanguageHeader: string): LanguagePreference[] export function extractHeaderLanguage(acceptLanguageHeader: string): AcceptedLanguages | undefined { const parsedHeader = parseAcceptLanguage(acceptLanguageHeader) - let matchedLanguage: AcceptedLanguages + let matchedLanguage: AcceptedLanguages | undefined for (const { language } of parsedHeader) { if (!matchedLanguage && acceptedLanguages.includes(language)) { diff --git a/packages/translations/tsconfig.json b/packages/translations/tsconfig.json index 108dd3ebcb..96a27d9cc8 100644 --- a/packages/translations/tsconfig.json +++ b/packages/translations/tsconfig.json @@ -1,7 +1,3 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - /* TODO: remove the following lines */ - "strict": false, - } } From d57a78616a9da2b674a60d7eb0b8c439a5b895e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20N=C3=BDvlt?= Date: Mon, 3 Mar 2025 19:24:05 +0100 Subject: [PATCH 080/127] docs: clarify that image resizing/cropping require `sharp` to be specified in payload config (#11470) ### What Clarifies that `sharp` must be specified in payload config for image resizing & cropping to work. Also adds link to the configuration page for further information. ### Why It is not immediately clear from this single documentation page alone. While it says that the feature relies on sharp, it does not say that it must be added to config. Most people won't probably run into this since they're probably going to use `create-payload-app`, which configures sharp by default. But those who use custom config (like me) may be left wondering why this feature does not work. See [Crop images and preview sizes not working](https://payloadcms.com/community-help/discord/crop-images-and-preview-sizes-not-working) in community help. --- docs/upload/overview.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/upload/overview.mdx b/docs/upload/overview.mdx index aa88c68702..f12a06160e 100644 --- a/docs/upload/overview.mdx +++ b/docs/upload/overview.mdx @@ -185,6 +185,8 @@ The [Admin Panel](../admin/overview) will also automatically display all availab Behind the scenes, Payload relies on [`sharp`](https://sharp.pixelplumbing.com/api-resize#resize) to perform its image resizing. You can specify additional options for `sharp` to use while resizing your images. +Note that for image resizing to work, `sharp` must be specified in your [Payload Config](../configuration/overview). This is configured by default if you created your Payload project with `create-payload-app`. See `sharp` in [Config Options](../configuration/overview#config-options). + #### Accessing the resized images in hooks All auto-resized images are exposed to be re-used in hooks and similar via an object that is bound to `req.payloadUploadSizes`. From efce1549d0de8d199126bdca65dd33f285c366c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Jablo=C3=B1ski?= <43938777+GermanJablo@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:31:26 -0300 Subject: [PATCH 081/127] chore(plugin-search): enable TypeScript strict mode (#11508) --- packages/plugin-search/src/Search/index.ts | 8 ++++++-- .../Search/ui/ReindexButton/index.client.tsx | 10 +++++----- .../src/Search/ui/ReindexButton/index.tsx | 1 + packages/plugin-search/src/index.ts | 4 ++-- packages/plugin-search/src/types.ts | 5 +++++ .../src/utilities/generateReindexHandler.ts | 18 ++++++++++++++---- .../src/utilities/syncDocAsSearchIndex.ts | 2 +- packages/plugin-search/tsconfig.json | 4 ---- 8 files changed, 34 insertions(+), 18 deletions(-) diff --git a/packages/plugin-search/src/Search/index.ts b/packages/plugin-search/src/Search/index.ts index 425259909a..9941cb68fc 100644 --- a/packages/plugin-search/src/Search/index.ts +++ b/packages/plugin-search/src/Search/index.ts @@ -1,13 +1,13 @@ import type { CollectionConfig, Field } from 'payload' -import type { SearchPluginConfigWithLocales } from '../types.js' +import type { SanitizedSearchPluginConfig } from '../types.js' import type { ReindexButtonServerProps } from './ui/ReindexButton/types.js' import { generateReindexHandler } from '../utilities/generateReindexHandler.js' // all settings can be overridden by the config export const generateSearchCollection = ( - pluginConfig: SearchPluginConfigWithLocales, + pluginConfig: SanitizedSearchPluginConfig, ): CollectionConfig => { const searchSlug = pluginConfig?.searchOverrides?.slug || 'search' const searchCollections = pluginConfig?.collections || [] @@ -55,6 +55,10 @@ export const generateSearchCollection = ( }, ] + if (!collectionLabels) { + throw new Error('collectionLabels is required') + } + const newConfig: CollectionConfig = { ...(pluginConfig?.searchOverrides || {}), slug: searchSlug, diff --git a/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx b/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx index ef46bf14e5..2c4f1a9d7c 100644 --- a/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx +++ b/packages/plugin-search/src/Search/ui/ReindexButton/index.client.tsx @@ -89,7 +89,7 @@ export const ReindexButtonClient: React.FC = ({ if (typeof label === 'string') { return label } else { - return Object.hasOwn(label, locale.code) ? label[locale.code] : slug + return label && Object.hasOwn(label, locale.code) ? label[locale.code] : slug } }, [collectionLabels, locale.code], @@ -97,7 +97,10 @@ export const ReindexButtonClient: React.FC = ({ const pluralizedLabels = useMemo(() => { return searchCollections.reduce>((acc, slug) => { - acc[slug] = getPluralizedLabel(slug) + const label = getPluralizedLabel(slug) + if (label) { + acc[slug] = label + } return acc }, {}) }, [searchCollections, getPluralizedLabel]) @@ -111,9 +114,6 @@ export const ReindexButtonClient: React.FC = ({ const modalDescription = selectedAll ? t('general:confirmReindexDescriptionAll') : t('general:confirmReindexDescription', { collections: selectedLabels }) - const loadingText = selectedAll - ? t('general:reindexingAll', { collections: t('general:collections') }) - : t('general:reindexingAll', { collections: selectedLabels }) return (
diff --git a/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx b/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx index 03327ca4db..6f08a481fb 100644 --- a/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx +++ b/packages/plugin-search/src/Search/ui/ReindexButton/index.tsx @@ -12,6 +12,7 @@ export const ReindexButton: SearchReindexButtonServerComponent = (props) => { const pluralLabel = labels?.plural if (typeof pluralLabel === 'function') { + // @ts-expect-error - I don't know why it gives an error. pluralLabel and i18n.t should both resolve to TFunction return [collection, pluralLabel({ t: i18n.t })] } diff --git a/packages/plugin-search/src/index.ts b/packages/plugin-search/src/index.ts index a43939d1c6..05a4939dc1 100644 --- a/packages/plugin-search/src/index.ts +++ b/packages/plugin-search/src/index.ts @@ -1,6 +1,6 @@ import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, Config } from 'payload' -import type { SearchPluginConfig, SearchPluginConfigWithLocales } from './types.js' +import type { SanitizedSearchPluginConfig, SearchPluginConfig } from './types.js' import { deleteFromSearch } from './Search/hooks/deleteFromSearch.js' import { syncWithSearch } from './Search/hooks/syncWithSearch.js' @@ -35,7 +35,7 @@ export const searchPlugin = .map((collection) => [collection.slug, collection.labels]), ) - const pluginConfig: SearchPluginConfigWithLocales = { + const pluginConfig: SanitizedSearchPluginConfig = { // write any config defaults here deleteDrafts: true, labels, diff --git a/packages/plugin-search/src/types.ts b/packages/plugin-search/src/types.ts index 48bdf0749e..4b0e4c1f36 100644 --- a/packages/plugin-search/src/types.ts +++ b/packages/plugin-search/src/types.ts @@ -77,6 +77,11 @@ export type SearchPluginConfigWithLocales = { locales?: string[] } & SearchPluginConfig +export type SanitizedSearchPluginConfig = { + reindexBatchSize: number + syncDrafts: boolean +} & SearchPluginConfigWithLocales + export type SyncWithSearchArgs = { collection: string pluginConfig: SearchPluginConfig diff --git a/packages/plugin-search/src/utilities/generateReindexHandler.ts b/packages/plugin-search/src/utilities/generateReindexHandler.ts index c773373014..b14184228c 100644 --- a/packages/plugin-search/src/utilities/generateReindexHandler.ts +++ b/packages/plugin-search/src/utilities/generateReindexHandler.ts @@ -9,7 +9,7 @@ import { killTransaction, } from 'payload' -import type { SearchPluginConfigWithLocales } from '../types.js' +import type { SanitizedSearchPluginConfig } from '../types.js' import { syncDocAsSearchIndex } from './syncDocAsSearchIndex.js' @@ -19,19 +19,29 @@ type ValidationResult = { } export const generateReindexHandler = - (pluginConfig: SearchPluginConfigWithLocales): PayloadHandler => + (pluginConfig: SanitizedSearchPluginConfig): PayloadHandler => async (req) => { addLocalesToRequestFromData(req) + if (!req.json) { + return new Response('Req.json is undefined', { status: 400 }) + } const { collections = [] } = (await req.json()) as { collections: string[] } const t = req.t const searchSlug = pluginConfig?.searchOverrides?.slug || 'search' const searchCollections = pluginConfig?.collections || [] - const reindexLocales = pluginConfig?.locales?.length ? pluginConfig.locales : [req.locale] + const reindexLocales = pluginConfig?.locales?.length + ? pluginConfig.locales + : req.locale + ? [req.locale] + : [] const validatePermissions = async (): Promise => { const accessResults = await getAccessResults({ req }) - const searchAccessResults = accessResults.collections[searchSlug] + const searchAccessResults = accessResults.collections?.[searchSlug] + if (!searchAccessResults) { + return { isValid: false, message: t('error:notAllowedToPerformAction') } + } const permissions = [searchAccessResults.delete, searchAccessResults.update] // plugin doesn't allow create by default: diff --git a/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts b/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts index bb8734439f..2f2159815f 100644 --- a/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts +++ b/packages/plugin-search/src/utilities/syncDocAsSearchIndex.ts @@ -56,7 +56,7 @@ export const syncDocAsSearchIndex = async ({ `Error gathering default priority for ${searchSlug} documents related to ${collection}`, ) } - } else { + } else if (priority !== undefined) { defaultPriority = priority } } diff --git a/packages/plugin-search/tsconfig.json b/packages/plugin-search/tsconfig.json index 1d4d43b8fc..fb21182864 100644 --- a/packages/plugin-search/tsconfig.json +++ b/packages/plugin-search/tsconfig.json @@ -1,8 +1,4 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { - /* TODO: remove the following lines */ - "strict": false, - }, "references": [{ "path": "../payload" }, { "path": "../ui" }, { "path": "../next" }] } From c417e3a627dbaf8e8f1226ef28cfa2aeb1b81466 Mon Sep 17 00:00:00 2001 From: Patrik Date: Mon, 3 Mar 2025 14:58:39 -0500 Subject: [PATCH 082/127] fix: avif images not converting to `upload.formatOptions` set file types (#11505) Previously, AVIF images were not converted to other file types as expected, despite `upload.formatOptions` specifying a different file type. The issue was due to `canResizeImage` not recognizing `'image/avif',` causing `fileSupportsResize` to return `false` and preventing the image from undergoing format conversion. This fix updates `canResizeImage` to include `'image/avif'`, ensuring that AVIF images are processed correctly and converted to a different file type when specified in `formatOptions`. Fixes #10694 Fixes #9985 --- packages/payload/src/uploads/canResizeImage.ts | 6 +++++- test/uploads/e2e.spec.ts | 13 +++++++++++++ test/uploads/test-image-avif.avif | Bin 0 -> 495 bytes 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 test/uploads/test-image-avif.avif diff --git a/packages/payload/src/uploads/canResizeImage.ts b/packages/payload/src/uploads/canResizeImage.ts index 15f4c63b1f..b3df32d1b3 100644 --- a/packages/payload/src/uploads/canResizeImage.ts +++ b/packages/payload/src/uploads/canResizeImage.ts @@ -1,3 +1,7 @@ export function canResizeImage(mimeType: string): boolean { - return ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/tiff'].indexOf(mimeType) > -1 + return ( + ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/tiff', 'image/avif'].indexOf( + mimeType, + ) > -1 + ) } diff --git a/test/uploads/e2e.spec.ts b/test/uploads/e2e.spec.ts index 6d1032b9cc..5ccb6d42bd 100644 --- a/test/uploads/e2e.spec.ts +++ b/test/uploads/e2e.spec.ts @@ -223,6 +223,19 @@ describe('Uploads', () => { await saveDocAndAssert(page) }) + test('should properly convert avif image to png', async () => { + await page.goto(mediaURL.create) + + await page.setInputFiles('input[type="file"]', path.resolve(dirname, './test-image-avif.avif')) + const filename = page.locator('.file-field__filename') + await expect(filename).toHaveValue('test-image-avif.avif') + + await saveDocAndAssert(page) + + const fileMetaSizeType = page.locator('.file-meta__size-type') + await expect(fileMetaSizeType).toHaveText(/image\/png/) + }) + test('should create animated file upload', async () => { await page.goto(animatedTypeMediaURL.create) diff --git a/test/uploads/test-image-avif.avif b/test/uploads/test-image-avif.avif new file mode 100644 index 0000000000000000000000000000000000000000..111d24b178f8f77ea227228f6937445da3be4c46 GIT binary patch literal 495 zcmZQzU{FXasVqn=%S>Yc0uY^>nP!-qnV9D5Xy^nK`jnemk_eIm0*#E6oFWL5fuSHX zxdg@r(K(q(Fk|=%GD~v7a*RMyE;A=T8N_p8U|ym^~f&&%Jk{L?8N-=jv}mArp{ODqd`D*Wf<^t+`|qR~>U#TRs}8pRd1 S{fzojwvM|kBFI%-$N>Nk9+L Date: Mon, 3 Mar 2025 16:46:47 -0500 Subject: [PATCH 083/127] fix(next): incorrect active state for partial matches of collection names in sidebar (#11511) Previously, collections with similar names (e.g., `uploads` and `uploads-poly`) both appeared active when viewing either collection. This was due to `pathname.startsWith(href)`, which caused partial matches. This update refines the `isActive` logic to prevent partial matches. --- .../next/src/elements/Nav/index.client.tsx | 3 +- test/admin/collections/UploadTwo.ts | 14 ++++++ test/admin/config.ts | 3 ++ test/admin/e2e/general/e2e.spec.ts | 24 +++++++++++ test/admin/payload-types.ts | 43 +++++++++++++++++++ test/admin/slugs.ts | 2 + 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 test/admin/collections/UploadTwo.ts diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index cdc357758b..dd1274f55a 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -44,7 +44,8 @@ export const DefaultNavClient: React.FC<{ id = `nav-global-${slug}` } - const isActive = pathname.startsWith(href) + const isActive = + pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]) const Label = ( <> diff --git a/test/admin/collections/UploadTwo.ts b/test/admin/collections/UploadTwo.ts new file mode 100644 index 0000000000..9640a5ba9c --- /dev/null +++ b/test/admin/collections/UploadTwo.ts @@ -0,0 +1,14 @@ +import type { CollectionConfig } from 'payload' + +import { uploadTwoCollectionSlug } from '../slugs.js' + +export const UploadTwoCollection: CollectionConfig = { + slug: uploadTwoCollectionSlug, + fields: [ + { + name: 'title', + type: 'text', + }, + ], + upload: true, +} diff --git a/test/admin/config.ts b/test/admin/config.ts index b17dc86f4c..54db8bf1e8 100644 --- a/test/admin/config.ts +++ b/test/admin/config.ts @@ -19,6 +19,7 @@ import { CollectionNoApiView } from './collections/NoApiView.js' import { CollectionNotInView } from './collections/NotInView.js' import { Posts } from './collections/Posts.js' import { UploadCollection } from './collections/Upload.js' +import { UploadTwoCollection } from './collections/UploadTwo.js' import { Users } from './collections/Users.js' import { with300Documents } from './collections/With300Documents.js' import { CustomGlobalViews1 } from './globals/CustomViews1.js' @@ -40,6 +41,7 @@ import { protectedCustomNestedViewPath, publicCustomViewPath, } from './shared.js' + export default buildConfigWithDefaults({ admin: { importMap: { @@ -141,6 +143,7 @@ export default buildConfigWithDefaults({ }, collections: [ UploadCollection, + UploadTwoCollection, Posts, Users, CollectionHidden, diff --git a/test/admin/e2e/general/e2e.spec.ts b/test/admin/e2e/general/e2e.spec.ts index e62eb98682..045c3e926e 100644 --- a/test/admin/e2e/general/e2e.spec.ts +++ b/test/admin/e2e/general/e2e.spec.ts @@ -39,6 +39,7 @@ import { notInViewCollectionSlug, postsCollectionSlug, settingsGlobalSlug, + uploadTwoCollectionSlug, } from '../../slugs.js' const { beforeAll, beforeEach, describe } = test @@ -73,6 +74,7 @@ describe('General', () => { let disableDuplicateURL: AdminUrlUtil let serverURL: string let adminRoutes: ReturnType + let uploadsTwo: AdminUrlUtil beforeAll(async ({ browser }, testInfo) => { const prebuild = false // Boolean(process.env.CI) @@ -90,6 +92,7 @@ describe('General', () => { globalURL = new AdminUrlUtil(serverURL, globalSlug) customViewsURL = new AdminUrlUtil(serverURL, customViews2CollectionSlug) disableDuplicateURL = new AdminUrlUtil(serverURL, disableDuplicateSlug) + uploadsTwo = new AdminUrlUtil(serverURL, uploadTwoCollectionSlug) context = await browser.newContext() page = await context.newPage() @@ -424,6 +427,27 @@ describe('General', () => { expect(tagName).toBe('a') }) + test('should only have one nav item active at a time', async () => { + await page.goto(uploadsTwo.list) + await openNav(page) + + // Locate "uploads" and "uploads-two" nav items + const uploadsNavItem = page.locator('.nav-group__content #nav-uploads') + const uploadsTwoNavItem = page.locator('.nav-group__content #nav-uploads-two') + + // Ensure both exist before continuing + await expect(uploadsNavItem).toBeVisible() + await expect(uploadsTwoNavItem).toBeVisible() + + // Locate all nav items containing the nav__link-indicator + const activeNavItems = page.locator( + '.nav-group__content .nav__link:has(.nav__link-indicator), .nav-group__content div.nav__link:has(.nav__link-indicator)', + ) + + // Expect exactly one nav item to have the indicator + await expect(activeNavItems).toHaveCount(1) + }) + test('breadcrumbs — should navigate from list to dashboard', async () => { await page.goto(postsUrl.list) await page.locator(`.step-nav a[href="${adminRoutes.routes.admin}"]`).click() diff --git a/test/admin/payload-types.ts b/test/admin/payload-types.ts index 639d13eac3..bc1a09915a 100644 --- a/test/admin/payload-types.ts +++ b/test/admin/payload-types.ts @@ -66,6 +66,7 @@ export interface Config { }; collections: { uploads: Upload; + 'uploads-two': UploadsTwo; posts: Post; users: User; 'hidden-collection': HiddenCollection; @@ -90,6 +91,7 @@ export interface Config { collectionsJoins: {}; collectionsSelect: { uploads: UploadsSelect | UploadsSelect; + 'uploads-two': UploadsTwoSelect | UploadsTwoSelect; posts: PostsSelect | PostsSelect; users: UsersSelect | UsersSelect; 'hidden-collection': HiddenCollectionSelect | HiddenCollectionSelect; @@ -192,6 +194,25 @@ export interface Upload { }; }; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "uploads-two". + */ +export interface UploadsTwo { + id: string; + title?: string | null; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; +} /** * This is a custom collection description. * @@ -469,6 +490,10 @@ export interface PayloadLockedDocument { relationTo: 'uploads'; value: string | Upload; } | null) + | ({ + relationTo: 'uploads-two'; + value: string | UploadsTwo; + } | null) | ({ relationTo: 'posts'; value: string | Post; @@ -611,6 +636,24 @@ export interface UploadsSelect { }; }; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "uploads-two_select". + */ +export interface UploadsTwoSelect { + title?: T; + updatedAt?: T; + createdAt?: T; + url?: T; + thumbnailURL?: T; + filename?: T; + mimeType?: T; + filesize?: T; + width?: T; + height?: T; + focalX?: T; + focalY?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "posts_select". diff --git a/test/admin/slugs.ts b/test/admin/slugs.ts index 5bd73c26ce..f87638b76c 100644 --- a/test/admin/slugs.ts +++ b/test/admin/slugs.ts @@ -12,6 +12,8 @@ export const notInViewCollectionSlug = 'not-in-view-collection' export const noApiViewCollectionSlug = 'collection-no-api-view' export const disableDuplicateSlug = 'disable-duplicate' export const uploadCollectionSlug = 'uploads' + +export const uploadTwoCollectionSlug = 'uploads-two' export const customFieldsSlug = 'custom-fields' export const listDrawerSlug = 'with-list-drawer' From f143d25728daeb4ffccc606e7c0be3da2f16f3af Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:57:30 +0200 Subject: [PATCH 084/127] fix(storage-uploadthing): files are duplicated to the storage via client uploads (#11518) When uploading file via client side upload we invalidate it then on the server side with re-uploading. This works fine with most adapters since they just replace the old file under the same key. UploadThing works differently and generates a new key every time. Example of the issue: image Now, we clear the old file before doing re-upload. --- packages/payload/src/types/index.ts | 4 ++++ .../payload/src/utilities/addDataAndFileToRequest.ts | 1 + .../plugin-cloud-storage/src/hooks/beforeChange.ts | 8 +++++++- packages/plugin-cloud-storage/src/types.ts | 2 ++ .../src/utilities/getIncomingFiles.ts | 1 + packages/storage-uploadthing/src/handleUpload.ts | 12 +++++++++++- 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/payload/src/types/index.ts b/packages/payload/src/types/index.ts index 3c3496f10d..b1793e9c5d 100644 --- a/packages/payload/src/types/index.ts +++ b/packages/payload/src/types/index.ts @@ -90,6 +90,10 @@ type PayloadRequestData = { data?: JsonObject /** The file on the request, same rules apply as the `data` property */ file?: { + /** + * Context of the file when it was uploaded via client side. + */ + clientUploadContext?: unknown data: Buffer mimetype: string name: string diff --git a/packages/payload/src/utilities/addDataAndFileToRequest.ts b/packages/payload/src/utilities/addDataAndFileToRequest.ts index b08954ccc0..4e24fe4ee4 100644 --- a/packages/payload/src/utilities/addDataAndFileToRequest.ts +++ b/packages/payload/src/utilities/addDataAndFileToRequest.ts @@ -87,6 +87,7 @@ export const addDataAndFileToRequest: AddDataAndFileToRequest = async (req) => { req.file = { name: filename, + clientUploadContext, data: Buffer.from(await response.arrayBuffer()), mimetype: response.headers.get('Content-Type') || mimeType, size, diff --git a/packages/plugin-cloud-storage/src/hooks/beforeChange.ts b/packages/plugin-cloud-storage/src/hooks/beforeChange.ts index 5450683a8b..0503ba5b0c 100644 --- a/packages/plugin-cloud-storage/src/hooks/beforeChange.ts +++ b/packages/plugin-cloud-storage/src/hooks/beforeChange.ts @@ -44,7 +44,13 @@ export const getBeforeChangeHook = } const promises = files.map(async (file) => { - await adapter.handleUpload({ collection, data, file, req }) + await adapter.handleUpload({ + clientUploadContext: file.clientUploadContext, + collection, + data, + file, + req, + }) }) await Promise.all(promises) diff --git a/packages/plugin-cloud-storage/src/types.ts b/packages/plugin-cloud-storage/src/types.ts index ca27701e14..a46de6c536 100644 --- a/packages/plugin-cloud-storage/src/types.ts +++ b/packages/plugin-cloud-storage/src/types.ts @@ -10,6 +10,7 @@ import type { export interface File { buffer: Buffer + clientUploadContext?: unknown filename: string filesize: number mimeType: string @@ -28,6 +29,7 @@ export type ClientUploadsConfig = | boolean export type HandleUpload = (args: { + clientUploadContext: unknown collection: CollectionConfig data: any file: File diff --git a/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts b/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts index 7fa8b85572..282bc55ecb 100644 --- a/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts +++ b/packages/plugin-cloud-storage/src/utilities/getIncomingFiles.ts @@ -16,6 +16,7 @@ export function getIncomingFiles({ if (file && data.filename && data.mimeType) { const mainFile: File = { buffer: file.data, + clientUploadContext: file.clientUploadContext, filename: data.filename, filesize: file.size, mimeType: data.mimeType, diff --git a/packages/storage-uploadthing/src/handleUpload.ts b/packages/storage-uploadthing/src/handleUpload.ts index a20f590587..7387511166 100644 --- a/packages/storage-uploadthing/src/handleUpload.ts +++ b/packages/storage-uploadthing/src/handleUpload.ts @@ -12,8 +12,18 @@ type HandleUploadArgs = { } export const getHandleUpload = ({ acl, utApi }: HandleUploadArgs): HandleUpload => { - return async ({ data, file }) => { + return async ({ clientUploadContext, data, file }) => { try { + if ( + clientUploadContext && + typeof clientUploadContext === 'object' && + 'key' in clientUploadContext && + typeof clientUploadContext.key === 'string' + ) { + // Clear the old file + await utApi.deleteFiles(clientUploadContext.key) + } + const { buffer, filename, mimeType } = file const blob = new Blob([buffer], { type: mimeType }) From 1d168318d035c08a39bc61f5c4b573e1cb025d91 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 4 Mar 2025 10:01:54 -0500 Subject: [PATCH 085/127] chore(release): v3.26.0 [skip ci] --- package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/db-sqlite/package.json | 2 +- packages/db-vercel-postgres/package.json | 2 +- packages/drizzle/package.json | 2 +- packages/email-nodemailer/package.json | 2 +- packages/email-resend/package.json | 2 +- packages/graphql/package.json | 2 +- packages/live-preview-react/package.json | 2 +- packages/live-preview-vue/package.json | 2 +- packages/live-preview/package.json | 2 +- packages/next/package.json | 2 +- packages/payload-cloud/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-multi-tenant/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-sentry/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/plugin-stripe/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/storage-azure/package.json | 2 +- packages/storage-gcs/package.json | 2 +- packages/storage-s3/package.json | 2 +- packages/storage-uploadthing/package.json | 2 +- packages/storage-vercel-blob/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index ee711df3e7..a593536f1a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.25.0", + "version": "3.26.0", "private": true, "type": "module", "scripts": { diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 0fc55dab30..9e6203f023 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.25.0", + "version": "3.26.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index 7608eab212..ac84d04d40 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.25.0", + "version": "3.26.0", "description": "The officially supported MongoDB database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index 81d7d4db8c..dd018f2540 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.25.0", + "version": "3.26.0", "description": "The officially supported Postgres database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index b3b9bfa649..b35d8d31dd 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-sqlite", - "version": "3.25.0", + "version": "3.26.0", "description": "The officially supported SQLite database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index 60c50d6758..ddbf0ae558 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-vercel-postgres", - "version": "3.25.0", + "version": "3.26.0", "description": "Vercel Postgres adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index 2d9744511e..7dd4fabfa2 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/drizzle", - "version": "3.25.0", + "version": "3.26.0", "description": "A library of shared functions used by different payload database adapters", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-nodemailer/package.json b/packages/email-nodemailer/package.json index 4b397d14c1..1696bb862f 100644 --- a/packages/email-nodemailer/package.json +++ b/packages/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-nodemailer", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload Nodemailer Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-resend/package.json b/packages/email-resend/package.json index 0192611e1c..7028cd5743 100644 --- a/packages/email-resend/package.json +++ b/packages/email-resend/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-resend", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload Resend Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/graphql/package.json b/packages/graphql/package.json index b5e4d59fc5..e8256e888d 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.25.0", + "version": "3.26.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index 67e9a1c7ec..99ce8d83f5 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-react", - "version": "3.25.0", + "version": "3.26.0", "description": "The official React SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview-vue/package.json b/packages/live-preview-vue/package.json index 9f18d5124a..12089445c1 100644 --- a/packages/live-preview-vue/package.json +++ b/packages/live-preview-vue/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-vue", - "version": "3.25.0", + "version": "3.26.0", "description": "The official Vue SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 21faa1d42a..922645c339 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview", - "version": "3.25.0", + "version": "3.26.0", "description": "The official live preview JavaScript SDK for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/next/package.json b/packages/next/package.json index c9660d0d84..5de03394d6 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.25.0", + "version": "3.26.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/payload-cloud/package.json b/packages/payload-cloud/package.json index ae43a532ea..e77d61537c 100644 --- a/packages/payload-cloud/package.json +++ b/packages/payload-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/payload-cloud", - "version": "3.25.0", + "version": "3.26.0", "description": "The official Payload Cloud plugin", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/payload/package.json b/packages/payload/package.json index 93eb11892b..c709dd66c6 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.25.0", + "version": "3.26.0", "description": "Node, React, Headless CMS and Application Framework built on Next.js", "keywords": [ "admin panel", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 3fa532cdaa..69f4186173 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-cloud-storage", - "version": "3.25.0", + "version": "3.26.0", "description": "The official cloud storage plugin for Payload CMS", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 5db4617bcf..4a948f75e3 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-form-builder", - "version": "3.25.0", + "version": "3.26.0", "description": "Form builder plugin for Payload CMS", "keywords": [ "payload", diff --git a/packages/plugin-multi-tenant/package.json b/packages/plugin-multi-tenant/package.json index 21ebbf4b68..01d831c1d2 100644 --- a/packages/plugin-multi-tenant/package.json +++ b/packages/plugin-multi-tenant/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-multi-tenant", - "version": "3.25.0", + "version": "3.26.0", "description": "Multi Tenant plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index 0eb2ca9010..d7b7eee9a8 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.25.0", + "version": "3.26.0", "description": "The official Nested Docs plugin for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 331737dae1..2878954427 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.25.0", + "version": "3.26.0", "description": "Redirects plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index d658081823..0f7d496680 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.25.0", + "version": "3.26.0", "description": "Search plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index 014cbd2268..6aa1ab4c53 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-sentry", - "version": "3.25.0", + "version": "3.26.0", "description": "Sentry plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 42e2e170ff..714b69a674 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.25.0", + "version": "3.26.0", "description": "SEO plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index b3e22e1171..5996927be6 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-stripe", - "version": "3.25.0", + "version": "3.26.0", "description": "Stripe plugin for Payload", "keywords": [ "payload", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index fec476c50c..e1030ebaa1 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.25.0", + "version": "3.26.0", "description": "The officially supported Lexical richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 7f07f565ab..01b9b6133f 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.25.0", + "version": "3.26.0", "description": "The officially supported Slate richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-azure/package.json b/packages/storage-azure/package.json index e3ffab1b58..8c063b22d9 100644 --- a/packages/storage-azure/package.json +++ b/packages/storage-azure/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-azure", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload storage adapter for Azure Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-gcs/package.json b/packages/storage-gcs/package.json index 07d4191587..18f0d0e59b 100644 --- a/packages/storage-gcs/package.json +++ b/packages/storage-gcs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-gcs", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload storage adapter for Google Cloud Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-s3/package.json b/packages/storage-s3/package.json index e7e7d18a49..70ebb53fe5 100644 --- a/packages/storage-s3/package.json +++ b/packages/storage-s3/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-s3", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload storage adapter for Amazon S3", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-uploadthing/package.json b/packages/storage-uploadthing/package.json index 0a5b7c4fc0..35f7ca2497 100644 --- a/packages/storage-uploadthing/package.json +++ b/packages/storage-uploadthing/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-uploadthing", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload storage adapter for uploadthing", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-vercel-blob/package.json b/packages/storage-vercel-blob/package.json index b933223759..aeed8cd5c3 100644 --- a/packages/storage-vercel-blob/package.json +++ b/packages/storage-vercel-blob/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-vercel-blob", - "version": "3.25.0", + "version": "3.26.0", "description": "Payload storage adapter for Vercel Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/translations/package.json b/packages/translations/package.json index e2ed2b970c..f164f7ff0d 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.25.0", + "version": "3.26.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/ui/package.json b/packages/ui/package.json index 38bbb61ea2..6568ba7683 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.25.0", + "version": "3.26.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", From 56dec138206d922476d59d018ac1ee9e8a85fdaa Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Tue, 4 Mar 2025 11:55:36 -0500 Subject: [PATCH 086/127] fix: format admin url inside forgot pw email (#11509) ### What? Supersedes https://github.com/payloadcms/payload/pull/11490. Refactors imports of `formatAdminURL` to import from `payload/shared` instead of `@payloadcms/ui/shared`. The ui package now imports and re-exports the function to prevent this from being a breaking change. ### Why? This makes it easier for other packages/plugins to consume the `formatAdminURL` function instead of needing to implement their own or rely on the ui package for the utility. --- .../DocumentHeader/Tabs/Tab/TabLink.tsx | 2 +- .../next/src/elements/Nav/index.client.tsx | 3 +- .../utilities/initPage/handleAuthRedirect.ts | 2 +- .../src/views/Dashboard/Default/index.tsx | 3 +- packages/next/src/views/Document/index.tsx | 3 +- .../next/src/views/ForgotPassword/index.tsx | 3 +- packages/next/src/views/List/index.tsx | 4 +- .../src/views/LivePreview/index.client.tsx | 2 +- .../next/src/views/Login/LoginForm/index.tsx | 3 +- .../next/src/views/Logout/LogoutClient.tsx | 2 +- packages/next/src/views/NotFound/index.tsx | 2 +- .../ResetPassword/ResetPasswordForm/index.tsx | 2 +- .../next/src/views/ResetPassword/index.tsx | 3 +- .../next/src/views/Root/getViewFromConfig.ts | 2 +- packages/next/src/views/Root/index.tsx | 4 +- .../next/src/views/Unauthorized/index.tsx | 2 +- packages/next/src/views/Verify/index.tsx | 2 +- .../src/views/Version/Default/SetStepNav.tsx | 4 +- .../next/src/views/Version/Restore/index.tsx | 3 +- .../views/Versions/cells/CreatedAt/index.tsx | 3 +- .../src/auth/operations/forgotPassword.ts | 9 ++- packages/payload/src/config/types.ts | 56 +++++++++++++------ packages/payload/src/exports/shared.ts | 4 +- .../payload/src/utilities/formatAdminURL.ts | 24 ++++++++ .../src/Search/ui/LinkToDoc/index.client.tsx | 2 +- .../richtext-lexical/src/cell/rscEntry.tsx | 2 +- packages/richtext-slate/src/cell/rscEntry.tsx | 2 +- packages/ui/src/elements/AppHeader/index.tsx | 2 +- .../elements/BulkUpload/EditForm/index.tsx | 2 +- .../ui/src/elements/DeleteDocument/index.tsx | 2 +- .../src/elements/DocumentControls/index.tsx | 2 +- .../src/elements/DuplicateDocument/index.tsx | 2 +- packages/ui/src/elements/Logout/index.tsx | 2 +- .../ui/src/elements/StayLoggedIn/index.tsx | 2 +- .../src/elements/Table/DefaultCell/index.tsx | 5 +- packages/ui/src/graphics/Account/index.tsx | 2 +- packages/ui/src/providers/Auth/index.tsx | 2 +- packages/ui/src/utilities/formatAdminURL.ts | 23 +------- .../src/utilities/handleBackToDashboard.tsx | 2 +- packages/ui/src/utilities/handleGoBack.tsx | 2 +- .../views/Edit/SetDocumentStepNav/index.tsx | 2 +- packages/ui/src/views/Edit/index.tsx | 2 +- test/helpers.ts | 26 ++++----- test/helpers/adminUrlUtil.ts | 4 +- 44 files changed, 135 insertions(+), 102 deletions(-) create mode 100644 packages/payload/src/utilities/formatAdminURL.ts diff --git a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx index 526551dfbb..55832945bc 100644 --- a/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx +++ b/packages/next/src/elements/DocumentHeader/Tabs/Tab/TabLink.tsx @@ -2,8 +2,8 @@ import type { SanitizedConfig } from 'payload' import { Link } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useParams, usePathname, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React from 'react' export const DocumentTabLink: React.FC<{ diff --git a/packages/next/src/elements/Nav/index.client.tsx b/packages/next/src/elements/Nav/index.client.tsx index dd1274f55a..95379a1480 100644 --- a/packages/next/src/elements/Nav/index.client.tsx +++ b/packages/next/src/elements/Nav/index.client.tsx @@ -5,8 +5,9 @@ import type { NavPreferences } from 'payload' import { getTranslation } from '@payloadcms/translations' import { Link, NavGroup, useConfig, useTranslation } from '@payloadcms/ui' -import { EntityType, formatAdminURL } from '@payloadcms/ui/shared' +import { EntityType } from '@payloadcms/ui/shared' import { usePathname } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' const baseClass = 'nav' diff --git a/packages/next/src/utilities/initPage/handleAuthRedirect.ts b/packages/next/src/utilities/initPage/handleAuthRedirect.ts index 937592fdf8..ea5463ff00 100644 --- a/packages/next/src/utilities/initPage/handleAuthRedirect.ts +++ b/packages/next/src/utilities/initPage/handleAuthRedirect.ts @@ -1,6 +1,6 @@ import type { User } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import * as qs from 'qs-esm' type Args = { diff --git a/packages/next/src/views/Dashboard/Default/index.tsx b/packages/next/src/views/Dashboard/Default/index.tsx index 524761f8c3..e8111bdb12 100644 --- a/packages/next/src/views/Dashboard/Default/index.tsx +++ b/packages/next/src/views/Dashboard/Default/index.tsx @@ -4,7 +4,8 @@ import type { ClientUser, Locale, ServerProps } from 'payload' import { getTranslation } from '@payloadcms/translations' import { Button, Card, Gutter, Locked } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { EntityType, formatAdminURL } from '@payloadcms/ui/shared' +import { EntityType } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import './index.scss' diff --git a/packages/next/src/views/Document/index.tsx b/packages/next/src/views/Document/index.tsx index 5b37230980..74d96af927 100644 --- a/packages/next/src/views/Document/index.tsx +++ b/packages/next/src/views/Document/index.tsx @@ -9,10 +9,11 @@ import type { import { DocumentInfoProvider, EditDepthProvider, HydrateAuthProvider } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { formatAdminURL, isEditing as getIsEditing } from '@payloadcms/ui/shared' +import { isEditing as getIsEditing } from '@payloadcms/ui/shared' import { buildFormState } from '@payloadcms/ui/utilities/buildFormState' import { notFound, redirect } from 'next/navigation.js' import { logError } from 'payload' +import { formatAdminURL } from 'payload/shared' import React from 'react' import type { GenerateEditViewMetadata } from './getMetaBySegment.js' diff --git a/packages/next/src/views/ForgotPassword/index.tsx b/packages/next/src/views/ForgotPassword/index.tsx index 38d8e42a5d..4dc4f25017 100644 --- a/packages/next/src/views/ForgotPassword/index.tsx +++ b/packages/next/src/views/ForgotPassword/index.tsx @@ -1,7 +1,8 @@ import type { AdminViewServerProps } from 'payload' import { Button, Link } from '@payloadcms/ui' -import { formatAdminURL, Translation } from '@payloadcms/ui/shared' +import { Translation } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index 7671018f32..3ad3e8f8e0 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -1,7 +1,7 @@ import { DefaultListView, HydrateAuthProvider, ListQueryProvider } from '@payloadcms/ui' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' import { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc' -import { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared' +import { mergeListSearchAndWhere } from '@payloadcms/ui/shared' import { notFound } from 'next/navigation.js' import { type AdminViewServerProps, @@ -12,7 +12,7 @@ import { type ListViewServerPropsOnly, type Where, } from 'payload' -import { isNumber, transformColumnsToPreferences } from 'payload/shared' +import { formatAdminURL, isNumber, transformColumnsToPreferences } from 'payload/shared' import React, { Fragment } from 'react' import { renderListViewSlots } from './renderListViewSlots.js' diff --git a/packages/next/src/views/LivePreview/index.client.tsx b/packages/next/src/views/LivePreview/index.client.tsx index a1cb8eb93d..30181d28fd 100644 --- a/packages/next/src/views/LivePreview/index.client.tsx +++ b/packages/next/src/views/LivePreview/index.client.tsx @@ -35,13 +35,13 @@ import { } from '@payloadcms/ui' import { abortAndIgnore, - formatAdminURL, handleAbortRef, handleBackToDashboard, handleGoBack, handleTakeOver, } from '@payloadcms/ui/shared' import { useRouter, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react' import { useLivePreviewContext } from './Context/context.js' diff --git a/packages/next/src/views/Login/LoginForm/index.tsx b/packages/next/src/views/Login/LoginForm/index.tsx index 1816c8b8cd..a258da9bcc 100644 --- a/packages/next/src/views/Login/LoginForm/index.tsx +++ b/packages/next/src/views/Login/LoginForm/index.tsx @@ -16,8 +16,7 @@ import { useConfig, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' -import { getLoginOptions } from 'payload/shared' +import { formatAdminURL, getLoginOptions } from 'payload/shared' import type { LoginFieldProps } from '../LoginField/index.js' diff --git a/packages/next/src/views/Logout/LogoutClient.tsx b/packages/next/src/views/Logout/LogoutClient.tsx index 88fba7f02a..066d32c37f 100644 --- a/packages/next/src/views/Logout/LogoutClient.tsx +++ b/packages/next/src/views/Logout/LogoutClient.tsx @@ -7,8 +7,8 @@ import { useRouteTransition, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useEffect } from 'react' import './index.scss' diff --git a/packages/next/src/views/NotFound/index.tsx b/packages/next/src/views/NotFound/index.tsx index 45f24d76c3..49e0e3b8df 100644 --- a/packages/next/src/views/NotFound/index.tsx +++ b/packages/next/src/views/NotFound/index.tsx @@ -2,7 +2,7 @@ import type { I18n } from '@payloadcms/translations' import type { Metadata } from 'next' import type { AdminViewServerProps, ImportMap, SanitizedConfig } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { DefaultTemplate } from '../../templates/Default/index.js' diff --git a/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx b/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx index 8e1aa600fa..1bb70bffc2 100644 --- a/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx +++ b/packages/next/src/views/ResetPassword/ResetPasswordForm/index.tsx @@ -9,9 +9,9 @@ import { useConfig, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' import { type FormState } from 'payload' +import { formatAdminURL } from 'payload/shared' import React from 'react' type Args = { diff --git a/packages/next/src/views/ResetPassword/index.tsx b/packages/next/src/views/ResetPassword/index.tsx index 46a60f3f92..138e92473e 100644 --- a/packages/next/src/views/ResetPassword/index.tsx +++ b/packages/next/src/views/ResetPassword/index.tsx @@ -1,7 +1,8 @@ import type { AdminViewServerProps } from 'payload' import { Button, Link } from '@payloadcms/ui' -import { formatAdminURL, Translation } from '@payloadcms/ui/shared' +import { Translation } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/Root/getViewFromConfig.ts b/packages/next/src/views/Root/getViewFromConfig.ts index 3ae02d6c8e..4911791882 100644 --- a/packages/next/src/views/Root/getViewFromConfig.ts +++ b/packages/next/src/views/Root/getViewFromConfig.ts @@ -9,7 +9,7 @@ import type { } from 'payload' import type React from 'react' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import type { initPage } from '../../utilities/initPage/index.js' diff --git a/packages/next/src/views/Root/index.tsx b/packages/next/src/views/Root/index.tsx index 9877ed539d..625510b256 100644 --- a/packages/next/src/views/Root/index.tsx +++ b/packages/next/src/views/Root/index.tsx @@ -8,9 +8,9 @@ import type { } from 'payload' import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent' -import { formatAdminURL } from '@payloadcms/ui/shared' import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig' import { notFound, redirect } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment } from 'react' import { DefaultTemplate } from '../../templates/Default/index.js' @@ -56,7 +56,7 @@ export const RootPage = async ({ const currentRoute = formatAdminURL({ adminRoute, - path: `${Array.isArray(params.segments) ? `/${params.segments.join('/')}` : ''}`, + path: Array.isArray(params.segments) ? `/${params.segments.join('/')}` : null, }) const segments = Array.isArray(params.segments) ? params.segments : [] diff --git a/packages/next/src/views/Unauthorized/index.tsx b/packages/next/src/views/Unauthorized/index.tsx index cb297fc8b4..eee1e8e63f 100644 --- a/packages/next/src/views/Unauthorized/index.tsx +++ b/packages/next/src/views/Unauthorized/index.tsx @@ -1,7 +1,7 @@ import type { AdminViewServerProps } from 'payload' import { Button } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { FormHeader } from '../../elements/FormHeader/index.js' diff --git a/packages/next/src/views/Verify/index.tsx b/packages/next/src/views/Verify/index.tsx index 5fcc3d7b57..18601ec584 100644 --- a/packages/next/src/views/Verify/index.tsx +++ b/packages/next/src/views/Verify/index.tsx @@ -1,6 +1,6 @@ import type { AdminViewServerProps } from 'payload' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { Logo } from '../../elements/Logo/index.js' diff --git a/packages/next/src/views/Version/Default/SetStepNav.tsx b/packages/next/src/views/Version/Default/SetStepNav.tsx index 8af753fe94..53717e103e 100644 --- a/packages/next/src/views/Version/Default/SetStepNav.tsx +++ b/packages/next/src/views/Version/Default/SetStepNav.tsx @@ -5,8 +5,8 @@ import type React from 'react' import { getTranslation } from '@payloadcms/translations' import { useConfig, useLocale, useStepNav, useTranslation } from '@payloadcms/ui' -import { formatAdminURL, formatDate } from '@payloadcms/ui/shared' -import { fieldAffectsData } from 'payload/shared' +import { formatDate } from '@payloadcms/ui/shared' +import { fieldAffectsData, formatAdminURL } from 'payload/shared' import { useEffect } from 'react' export const SetStepNav: React.FC<{ diff --git a/packages/next/src/views/Version/Restore/index.tsx b/packages/next/src/views/Version/Restore/index.tsx index bd0c0fa475..d10de9d120 100644 --- a/packages/next/src/views/Version/Restore/index.tsx +++ b/packages/next/src/views/Version/Restore/index.tsx @@ -11,8 +11,9 @@ import { useRouteTransition, useTranslation, } from '@payloadcms/ui' -import { formatAdminURL, requests } from '@payloadcms/ui/shared' +import { requests } from '@payloadcms/ui/shared' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useCallback, useState } from 'react' import type { Props } from './types.js' diff --git a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx index 9bee7ca9c5..ce245fb2b7 100644 --- a/packages/next/src/views/Versions/cells/CreatedAt/index.tsx +++ b/packages/next/src/views/Versions/cells/CreatedAt/index.tsx @@ -1,6 +1,7 @@ 'use client' import { Link, useConfig, useTranslation } from '@payloadcms/ui' -import { formatAdminURL, formatDate } from '@payloadcms/ui/shared' +import { formatDate } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' type CreatedAtCellProps = { diff --git a/packages/payload/src/auth/operations/forgotPassword.ts b/packages/payload/src/auth/operations/forgotPassword.ts index f0ce36af7c..a51f947b32 100644 --- a/packages/payload/src/auth/operations/forgotPassword.ts +++ b/packages/payload/src/auth/operations/forgotPassword.ts @@ -14,6 +14,7 @@ import { buildAfterOperation } from '../../collections/operations/utils.js' import { APIError } from '../../errors/index.js' import { Forbidden } from '../../index.js' import { commitTransaction } from '../../utilities/commitTransaction.js' +import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { initTransaction } from '../../utilities/initTransaction.js' import { killTransaction } from '../../utilities/killTransaction.js' import { getLoginOptions } from '../getLoginOptions.js' @@ -155,9 +156,13 @@ export const forgotPasswordOperation = async ( config.serverURL !== null && config.serverURL !== '' ? config.serverURL : `${protocol}//${req.headers.get('host')}` - + const forgotURL = formatAdminURL({ + adminRoute: config.routes.admin, + path: `${config.admin.routes.reset}/${token}`, + serverURL, + }) let html = `${req.t('authentication:youAreReceivingResetPassword')} - ${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token} + ${forgotURL} ${req.t('authentication:youDidNotRequestPassword')}` if (typeof collectionConfig.auth.forgotPassword?.generateEmailHTML === 'function') { diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 41aa07e0a2..1d82a4366e 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -881,22 +881,46 @@ export type Config = { /** Base meta data to use for the Admin Panel. Included properties are titleSuffix, ogImage, and favicon. */ meta?: MetaConfig routes?: { - /** The route for the account page. */ - account?: string - /** The route for the create first user page. */ - createFirstUser?: string - /** The route for the forgot password page. */ - forgot?: string - /** The route the user will be redirected to after being inactive for too long. */ - inactivity?: string - /** The route for the login page. */ - login?: string - /** The route for the logout page. */ - logout?: string - /** The route for the reset password page. */ - reset?: string - /** The route for the unauthorized page. */ - unauthorized?: string + /** The route for the account page. + * + * @default '/account' + */ + account?: `/${string}` + /** The route for the create first user page. + * + * @default '/create-first-user' + */ + createFirstUser?: `/${string}` + /** The route for the forgot password page. + * + * @default '/forgot' + */ + forgot?: `/${string}` + /** The route the user will be redirected to after being inactive for too long. + * + * @default '/logout-inactivity' + */ + inactivity?: `/${string}` + /** The route for the login page. + * + * @default '/login' + */ + login?: `/${string}` + /** The route for the logout page. + * + * @default '/logout' + */ + logout?: `/${string}` + /** The route for the reset password page. + * + * @default '/reset' + */ + reset?: `/${string}` + /** The route for the unauthorized page. + * + * @default '/unauthorized' + */ + unauthorized?: `/${string}` } /** * Suppresses React hydration mismatch warnings during the hydration of the root tag. diff --git a/packages/payload/src/exports/shared.ts b/packages/payload/src/exports/shared.ts index f55aa13a66..520f369bae 100644 --- a/packages/payload/src/exports/shared.ts +++ b/packages/payload/src/exports/shared.ts @@ -64,10 +64,12 @@ export { fieldSchemaToJSON } from '../utilities/fieldSchemaToJSON.js' export { flattenAllFields } from '../utilities/flattenAllFields.js' export { default as flattenTopLevelFields } from '../utilities/flattenTopLevelFields.js' -export { getDataByPath } from '../utilities/getDataByPath.js' +export { formatAdminURL } from '../utilities/formatAdminURL.js' +export { getDataByPath } from '../utilities/getDataByPath.js' export { getSelectMode } from '../utilities/getSelectMode.js' export { getSiblingData } from '../utilities/getSiblingData.js' + export { getUniqueListBy } from '../utilities/getUniqueListBy.js' export { isNextBuild } from '../utilities/isNextBuild.js' diff --git a/packages/payload/src/utilities/formatAdminURL.ts b/packages/payload/src/utilities/formatAdminURL.ts new file mode 100644 index 0000000000..2ba612838e --- /dev/null +++ b/packages/payload/src/utilities/formatAdminURL.ts @@ -0,0 +1,24 @@ +import type { Config } from '../config/types.js' + +/** Will read the `routes.admin` config and appropriately handle `"/"` admin paths */ +export const formatAdminURL = (args: { + adminRoute: NonNullable['admin'] + basePath?: string + path: '' | `/${string}` | null | undefined + serverURL?: Config['serverURL'] +}): string => { + const { adminRoute, basePath = '', path: pathFromArgs, serverURL } = args + const path = pathFromArgs || '' + + if (adminRoute) { + if (adminRoute === '/') { + if (!path) { + return `${serverURL || ''}${basePath}${adminRoute}` + } + } else { + return `${serverURL || ''}${basePath}${adminRoute}${path}` + } + } + + return `${serverURL || ''}${basePath}${path}` +} diff --git a/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx b/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx index b3960fd24f..1f31a074ab 100644 --- a/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx +++ b/packages/plugin-search/src/Search/ui/LinkToDoc/index.client.tsx @@ -1,7 +1,7 @@ 'use client' import { CopyToClipboard, Link, useConfig, useField } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' export const LinkToDocClient: React.FC = () => { diff --git a/packages/richtext-lexical/src/cell/rscEntry.tsx b/packages/richtext-lexical/src/cell/rscEntry.tsx index 7ecec35bee..c8f1649b11 100644 --- a/packages/richtext-lexical/src/cell/rscEntry.tsx +++ b/packages/richtext-lexical/src/cell/rscEntry.tsx @@ -3,7 +3,7 @@ import type { Payload } from 'payload' import { getTranslation, type I18nClient } from '@payloadcms/translations' import { Link } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' import type { SanitizedServerEditorConfig } from '../lexical/config/types.js' diff --git a/packages/richtext-slate/src/cell/rscEntry.tsx b/packages/richtext-slate/src/cell/rscEntry.tsx index 3bc44aff75..563b7a80da 100644 --- a/packages/richtext-slate/src/cell/rscEntry.tsx +++ b/packages/richtext-slate/src/cell/rscEntry.tsx @@ -2,7 +2,7 @@ import type { DefaultServerCellComponentProps, Payload } from 'payload' import { getTranslation, type I18nClient } from '@payloadcms/translations' import { Link } from '@payloadcms/ui' -import { formatAdminURL } from '@payloadcms/ui/shared' +import { formatAdminURL } from 'payload/shared' import React from 'react' export const RscEntrySlateCell: React.FC< diff --git a/packages/ui/src/elements/AppHeader/index.tsx b/packages/ui/src/elements/AppHeader/index.tsx index da539789b6..e68c2768c1 100644 --- a/packages/ui/src/elements/AppHeader/index.tsx +++ b/packages/ui/src/elements/AppHeader/index.tsx @@ -1,11 +1,11 @@ 'use client' +import { formatAdminURL } from 'payload/shared' import React, { useEffect, useRef, useState } from 'react' import { Account } from '../../graphics/Account/index.js' import { useActions } from '../../providers/Actions/index.js' import { useConfig } from '../../providers/Config/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { Hamburger } from '../Hamburger/index.js' import { Link } from '../Link/index.js' import { Localizer } from '../Localizer/index.js' diff --git a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx index 3cc517d09e..7c186d498b 100644 --- a/packages/ui/src/elements/BulkUpload/EditForm/index.tsx +++ b/packages/ui/src/elements/BulkUpload/EditForm/index.tsx @@ -1,6 +1,7 @@ 'use client' import { useRouter, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback, useEffect } from 'react' import type { EditFormProps } from './types.js' @@ -17,7 +18,6 @@ import { useRouteTransition } from '../../../providers/RouteTransition/index.js' import { useServerFunctions } from '../../../providers/ServerFunctions/index.js' import { useUploadEdits } from '../../../providers/UploadEdits/index.js' import { abortAndIgnore, handleAbortRef } from '../../../utilities/abortAndIgnore.js' -import { formatAdminURL } from '../../../utilities/formatAdminURL.js' import { useDocumentDrawerContext } from '../../DocumentDrawer/Provider.js' import { DocumentFields } from '../../DocumentFields/index.js' import { Upload } from '../../Upload/index.js' diff --git a/packages/ui/src/elements/DeleteDocument/index.tsx b/packages/ui/src/elements/DeleteDocument/index.tsx index cb934a5bd7..59e5d24fdf 100644 --- a/packages/ui/src/elements/DeleteDocument/index.tsx +++ b/packages/ui/src/elements/DeleteDocument/index.tsx @@ -4,6 +4,7 @@ import type { SanitizedCollectionConfig } from 'payload' import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback } from 'react' import { toast } from 'sonner' @@ -15,7 +16,6 @@ import { useDocumentInfo } from '../../providers/DocumentInfo/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' import { Translation } from '../Translation/index.js' diff --git a/packages/ui/src/elements/DocumentControls/index.tsx b/packages/ui/src/elements/DocumentControls/index.tsx index be8d3495da..58712616f5 100644 --- a/packages/ui/src/elements/DocumentControls/index.tsx +++ b/packages/ui/src/elements/DocumentControls/index.tsx @@ -7,6 +7,7 @@ import type { } from 'payload' import { getTranslation } from '@payloadcms/translations' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useEffect } from 'react' import type { DocumentDrawerContextType } from '../DocumentDrawer/Provider.js' @@ -15,7 +16,6 @@ import { useFormInitializing, useFormProcessing } from '../../forms/Form/context import { useConfig } from '../../providers/Config/index.js' import { useEditDepth } from '../../providers/EditDepth/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { formatDate } from '../../utilities/formatDate.js' import { Autosave } from '../Autosave/index.js' import { Button } from '../Button/index.js' diff --git a/packages/ui/src/elements/DuplicateDocument/index.tsx b/packages/ui/src/elements/DuplicateDocument/index.tsx index bac2266787..65e9710c30 100644 --- a/packages/ui/src/elements/DuplicateDocument/index.tsx +++ b/packages/ui/src/elements/DuplicateDocument/index.tsx @@ -5,6 +5,7 @@ import type { SanitizedCollectionConfig } from 'payload' import { useModal } from '@faceless-ui/modal' import { getTranslation } from '@payloadcms/translations' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback } from 'react' import { toast } from 'sonner' @@ -16,7 +17,6 @@ import { useLocale } from '../../providers/Locale/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' import { PopupList } from '../Popup/index.js' diff --git a/packages/ui/src/elements/Logout/index.tsx b/packages/ui/src/elements/Logout/index.tsx index 2da58c7322..182fd7a1cb 100644 --- a/packages/ui/src/elements/Logout/index.tsx +++ b/packages/ui/src/elements/Logout/index.tsx @@ -1,10 +1,10 @@ 'use client' +import { formatAdminURL } from 'payload/shared' import React from 'react' import { LogOutIcon } from '../../icons/LogOut/index.js' import { useConfig } from '../../providers/Config/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { Link } from '../Link/index.js' const baseClass = 'nav' diff --git a/packages/ui/src/elements/StayLoggedIn/index.tsx b/packages/ui/src/elements/StayLoggedIn/index.tsx index 10655240ec..bd4b8c1b15 100644 --- a/packages/ui/src/elements/StayLoggedIn/index.tsx +++ b/packages/ui/src/elements/StayLoggedIn/index.tsx @@ -1,5 +1,6 @@ 'use client' import { useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { useCallback } from 'react' import type { OnCancel } from '../ConfirmationModal/index.js' @@ -8,7 +9,6 @@ import { useAuth } from '../../providers/Auth/index.js' import { useConfig } from '../../providers/Config/index.js' import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useTranslation } from '../../providers/Translation/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { ConfirmationModal } from '../ConfirmationModal/index.js' export const stayLoggedInModalSlug = 'stay-logged-in' diff --git a/packages/ui/src/elements/Table/DefaultCell/index.tsx b/packages/ui/src/elements/Table/DefaultCell/index.tsx index e9ba11ae00..b1969f4b5a 100644 --- a/packages/ui/src/elements/Table/DefaultCell/index.tsx +++ b/packages/ui/src/elements/Table/DefaultCell/index.tsx @@ -1,13 +1,12 @@ 'use client' -import type { ClientCollectionConfig, DefaultCellComponentProps, UploadFieldClient } from 'payload' +import type { DefaultCellComponentProps, UploadFieldClient } from 'payload' import { getTranslation } from '@payloadcms/translations' -import { fieldAffectsData, fieldIsID } from 'payload/shared' +import { fieldAffectsData, fieldIsID, formatAdminURL } from 'payload/shared' import React from 'react' // TODO: abstract this out to support all routers import { useConfig } from '../../../providers/Config/index.js' import { useTranslation } from '../../../providers/Translation/index.js' -import { formatAdminURL } from '../../../utilities/formatAdminURL.js' import { Link } from '../../Link/index.js' import { CodeCell } from './fields/Code/index.js' import { cellComponents } from './fields/index.js' diff --git a/packages/ui/src/graphics/Account/index.tsx b/packages/ui/src/graphics/Account/index.tsx index d64c51e293..8332cf0b8e 100644 --- a/packages/ui/src/graphics/Account/index.tsx +++ b/packages/ui/src/graphics/Account/index.tsx @@ -1,11 +1,11 @@ 'use client' import { usePathname } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React from 'react' // import { RenderComponent } from '../../elements/RenderComponent/client.js' import { useAuth } from '../../providers/Auth/index.js' import { useConfig } from '../../providers/Config/index.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { DefaultAccountIcon } from './Default/index.js' import { GravatarAccountIcon } from './Gravatar/index.js' diff --git a/packages/ui/src/providers/Auth/index.tsx b/packages/ui/src/providers/Auth/index.tsx index afd62b1e70..ba35bc388b 100644 --- a/packages/ui/src/providers/Auth/index.tsx +++ b/packages/ui/src/providers/Auth/index.tsx @@ -3,6 +3,7 @@ import type { ClientUser, SanitizedPermissions, User } from 'payload' import { useModal } from '@faceless-ui/modal' import { usePathname, useRouter } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import * as qs from 'qs-esm' import React, { createContext, useCallback, useContext, useEffect, useState } from 'react' import { toast } from 'sonner' @@ -11,7 +12,6 @@ import { stayLoggedInModalSlug } from '../../elements/StayLoggedIn/index.js' import { useDebounce } from '../../hooks/useDebounce.js' import { useTranslation } from '../../providers/Translation/index.js' import { requests } from '../../utilities/api.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { useConfig } from '../Config/index.js' import { useRouteTransition } from '../RouteTransition/index.js' diff --git a/packages/ui/src/utilities/formatAdminURL.ts b/packages/ui/src/utilities/formatAdminURL.ts index 20a053a4ba..e2df8abf0e 100644 --- a/packages/ui/src/utilities/formatAdminURL.ts +++ b/packages/ui/src/utilities/formatAdminURL.ts @@ -1,23 +1,2 @@ -import type { Config } from 'payload' - /** Will read the `routes.admin` config and appropriately handle `"/"` admin paths */ -export const formatAdminURL = (args: { - adminRoute: Config['routes']['admin'] - basePath?: string - path: string - serverURL?: Config['serverURL'] -}): string => { - const { adminRoute, basePath = '', path, serverURL } = args - - if (adminRoute) { - if (adminRoute === '/') { - if (!path) { - return `${serverURL || ''}${basePath}${adminRoute}` - } - } else { - return `${serverURL || ''}${basePath}${adminRoute}${path}` - } - } - - return `${serverURL || ''}${basePath}${path}` -} +export { formatAdminURL } from 'payload/shared' diff --git a/packages/ui/src/utilities/handleBackToDashboard.tsx b/packages/ui/src/utilities/handleBackToDashboard.tsx index fbc40f1287..ca8ecf28e7 100644 --- a/packages/ui/src/utilities/handleBackToDashboard.tsx +++ b/packages/ui/src/utilities/handleBackToDashboard.tsx @@ -1,6 +1,6 @@ import type { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime.js' -import { formatAdminURL } from './formatAdminURL.js' +import { formatAdminURL } from 'payload/shared' type BackToDashboardProps = { adminRoute: string diff --git a/packages/ui/src/utilities/handleGoBack.tsx b/packages/ui/src/utilities/handleGoBack.tsx index da51b745a1..ab86552f25 100644 --- a/packages/ui/src/utilities/handleGoBack.tsx +++ b/packages/ui/src/utilities/handleGoBack.tsx @@ -1,6 +1,6 @@ import type { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime.js' -import { formatAdminURL } from './formatAdminURL.js' +import { formatAdminURL } from 'payload/shared' type GoBackProps = { adminRoute: string diff --git a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx index 7cffb4b175..918563bf04 100644 --- a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx +++ b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx @@ -2,6 +2,7 @@ import type { SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload' import { getTranslation } from '@payloadcms/translations' +import { formatAdminURL } from 'payload/shared' import { useEffect } from 'react' import type { StepNavItem } from '../../../elements/StepNav/index.js' @@ -12,7 +13,6 @@ import { useDocumentInfo } from '../../../providers/DocumentInfo/index.js' import { useEditDepth } from '../../../providers/EditDepth/index.js' import { useEntityVisibility } from '../../../providers/EntityVisibility/index.js' import { useTranslation } from '../../../providers/Translation/index.js' -import { formatAdminURL } from '../../../utilities/formatAdminURL.js' export const SetDocumentStepNav: React.FC<{ collectionSlug?: SanitizedCollectionConfig['slug'] diff --git a/packages/ui/src/views/Edit/index.tsx b/packages/ui/src/views/Edit/index.tsx index 0925d6ba7d..4c5ce2238c 100644 --- a/packages/ui/src/views/Edit/index.tsx +++ b/packages/ui/src/views/Edit/index.tsx @@ -3,6 +3,7 @@ import type { ClientUser, DocumentViewClientProps, FormState } from 'payload' import { useRouter, useSearchParams } from 'next/navigation.js' +import { formatAdminURL } from 'payload/shared' import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react' import type { FormProps } from '../../forms/Form/index.js' @@ -27,7 +28,6 @@ import { useRouteTransition } from '../../providers/RouteTransition/index.js' import { useServerFunctions } from '../../providers/ServerFunctions/index.js' import { useUploadEdits } from '../../providers/UploadEdits/index.js' import { abortAndIgnore, handleAbortRef } from '../../utilities/abortAndIgnore.js' -import { formatAdminURL } from '../../utilities/formatAdminURL.js' import { handleBackToDashboard } from '../../utilities/handleBackToDashboard.js' import { handleGoBack } from '../../utilities/handleGoBack.js' import { handleTakeOver } from '../../utilities/handleTakeOver.js' diff --git a/test/helpers.ts b/test/helpers.ts index 4510cc3820..2c10b86c85 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -17,15 +17,17 @@ import { setTimeout } from 'timers/promises' import { devUser } from './credentials.js' import { POLL_TOPASS_TIMEOUT } from './playwright.config.js' +type AdminRoutes = NonNullable['routes'] + type FirstRegisterArgs = { - customAdminRoutes?: Config['admin']['routes'] + customAdminRoutes?: AdminRoutes customRoutes?: Config['routes'] page: Page serverURL: string } type LoginArgs = { - customAdminRoutes?: Config['admin']['routes'] + customAdminRoutes?: AdminRoutes customRoutes?: Config['routes'] data?: { email: string @@ -78,16 +80,14 @@ export async function ensureCompilationIsDone({ noAutoLogin, readyURL, }: { - customAdminRoutes?: Config['admin']['routes'] + customAdminRoutes?: AdminRoutes customRoutes?: Config['routes'] noAutoLogin?: boolean page: Page readyURL?: string serverURL: string }): Promise { - const { - routes: { admin: adminRoute }, - } = getRoutes({ customAdminRoutes, customRoutes }) + const { routes: { admin: adminRoute } = {} } = getRoutes({ customAdminRoutes, customRoutes }) const adminURL = `${serverURL}${adminRoute}` @@ -170,9 +170,7 @@ export async function throttleTest({ export async function firstRegister(args: FirstRegisterArgs): Promise { const { customAdminRoutes, customRoutes, page, serverURL } = args - const { - routes: { admin: adminRoute }, - } = getRoutes({ customAdminRoutes, customRoutes }) + const { routes: { admin: adminRoute } = {} } = getRoutes({ customAdminRoutes, customRoutes }) await page.goto(`${serverURL}${adminRoute}`) await page.fill('#field-email', devUser.email) @@ -187,10 +185,8 @@ export async function login(args: LoginArgs): Promise { const { customAdminRoutes, customRoutes, data = devUser, page, serverURL } = args const { - admin: { - routes: { createFirstUser, login: incomingLoginRoute }, - }, - routes: { admin: incomingAdminRoute }, + admin: { routes: { createFirstUser, login: incomingLoginRoute } = {} }, + routes: { admin: incomingAdminRoute } = {}, } = getRoutes({ customAdminRoutes, customRoutes }) const adminRoute = formatAdminURL({ serverURL, adminRoute: incomingAdminRoute, path: '' }) @@ -462,8 +458,6 @@ export function describeIfInCIOrHasLocalstack(): jest.Describe { return describe } -type AdminRoutes = Config['admin']['routes'] - export function getRoutes({ customAdminRoutes, customRoutes, @@ -477,7 +471,7 @@ export function getRoutes({ routes: Config['routes'] } { let routes = defaults.routes - let adminRoutes = defaults.admin.routes + let adminRoutes = defaults.admin?.routes if (customAdminRoutes) { adminRoutes = { diff --git a/test/helpers/adminUrlUtil.ts b/test/helpers/adminUrlUtil.ts index 46bcdef114..326097d0f7 100644 --- a/test/helpers/adminUrlUtil.ts +++ b/test/helpers/adminUrlUtil.ts @@ -71,7 +71,7 @@ export class AdminUrlUtil { collection(slug: string): string { return formatAdminURL({ - adminRoute: this.routes.admin, + adminRoute: this.routes?.admin, path: `/collections/${slug}`, serverURL: this.serverURL, }) @@ -83,7 +83,7 @@ export class AdminUrlUtil { global(slug: string): string { return formatAdminURL({ - adminRoute: this.routes.admin, + adminRoute: this.routes?.admin, path: `/globals/${slug}`, serverURL: this.serverURL, }) From 5adb764b08f5782e700d8c9ad82b0516558f3a79 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 4 Mar 2025 14:02:26 -0700 Subject: [PATCH 087/127] fix: collection config deep merge during sanitization causing unpredictable behavior (#11524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deep‐merging the collection config defaults during sanitization causes all collection fields to end up with different object references. This is not only slow, but can also lead to unpredictable behavior: mutations made before collection sanitization are reflected in the field config, while mutations made afterward, using the same object reference, are not reflected in the collection’s field config. Specifically, the following happened: 1. A Block was defined in the module scope. 2. It was then added to both a collection’s blocks field and the config.blocks property. 3. Rich text sanitization promises for config.blocks were collected. 4. The collection config was sanitized. 5. The config.blocks sanitization promises were awaited. 6. Rich text fields were sanitized in config.blocks, but ended up not being sanitized in the collection config referencing the same block, because the object reference held by the promise callback no longer matched the collection config’s object reference. The collection config block did not create its own rich text sanitization promise, as `_sanitized: true` was set on the block during the earlier config.blocks sanitization, which skipped it. Our config defaults pattern was brittle in general. It’s easy to misuse object spreading or to mutate the config defaults later when you intended only to mutate the payload or collection config. Our current approach was vulnerable to this because it retained some object references from the config defaults. This PR introduces reliable merge functions that are faster and ensure no object references are shared with defaults that reside in the module scope. --- .../src/collections/config/defaults.ts | 98 +++++++++++++ .../src/collections/config/sanitize.ts | 36 +++-- .../payload/src/collections/config/types.ts | 5 + packages/payload/src/config/defaults.ts | 82 +++++++++++ packages/payload/src/config/sanitize.ts | 135 +++++++----------- .../payload/src/fields/config/sanitize.ts | 7 +- .../payload/src/globals/config/sanitize.ts | 5 +- packages/payload/src/globals/config/types.ts | 5 + .../src/queues/config/jobsCollection.ts | 8 +- .../src/utilities/configToJSONSchema.spec.ts | 78 ++++++++++ 10 files changed, 342 insertions(+), 117 deletions(-) diff --git a/packages/payload/src/collections/config/defaults.ts b/packages/payload/src/collections/config/defaults.ts index e3d292b652..1c44245bae 100644 --- a/packages/payload/src/collections/config/defaults.ts +++ b/packages/payload/src/collections/config/defaults.ts @@ -3,6 +3,9 @@ import type { CollectionConfig } from './types.js' import defaultAccess from '../../auth/defaultAccess.js' +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const defaults: Partial = { access: { create: defaultAccess, @@ -50,6 +53,66 @@ export const defaults: Partial = { versions: false, } +export const addDefaultsToCollectionConfig = (collection: CollectionConfig): CollectionConfig => { + collection.access = { + create: defaultAccess, + delete: defaultAccess, + read: defaultAccess, + unlock: defaultAccess, + update: defaultAccess, + ...(collection.access || {}), + } + + collection.admin = { + components: {}, + custom: {}, + enableRichTextLink: true, + enableRichTextRelationship: true, + useAsTitle: 'id', + ...(collection.admin || {}), + pagination: { + defaultLimit: 10, + limits: [5, 10, 25, 50, 100], + ...(collection.admin?.pagination || {}), + }, + } + + collection.auth = collection.auth ?? false + collection.custom = collection.custom ?? {} + collection.endpoints = collection.endpoints ?? [] + collection.fields = collection.fields ?? [] + + collection.hooks = { + afterChange: [], + afterDelete: [], + afterForgotPassword: [], + afterLogin: [], + afterLogout: [], + afterMe: [], + afterOperation: [], + afterRead: [], + afterRefresh: [], + beforeChange: [], + beforeDelete: [], + beforeLogin: [], + beforeOperation: [], + beforeRead: [], + beforeValidate: [], + me: [], + refresh: [], + ...(collection.hooks || {}), + } + + collection.timestamps = collection.timestamps ?? true + collection.upload = collection.upload ?? false + collection.versions = collection.versions ?? false + + return collection +} + +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const authDefaults: IncomingAuthType = { cookies: { sameSite: 'Lax', @@ -63,8 +126,43 @@ export const authDefaults: IncomingAuthType = { verify: false, } +export const addDefaultsToAuthConfig = (auth: IncomingAuthType): IncomingAuthType => { + auth.cookies = { + sameSite: 'Lax', + secure: false, + ...(auth.cookies || {}), + } + + auth.forgotPassword = auth.forgotPassword ?? {} + auth.lockTime = auth.lockTime ?? 600000 // 10 minutes + auth.loginWithUsername = auth.loginWithUsername ?? false + auth.maxLoginAttempts = auth.maxLoginAttempts ?? 5 + auth.tokenExpiration = auth.tokenExpiration ?? 7200 + auth.verify = auth.verify ?? false + auth.strategies = auth.strategies ?? [] + + if (!auth.disableLocalStrategy && auth.verify === true) { + auth.verify = {} + } + + return auth +} + +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const loginWithUsernameDefaults: LoginWithUsernameOptions = { allowEmailLogin: false, requireEmail: false, requireUsername: true, } + +export const addDefaultsToLoginWithUsernameConfig = ( + loginWithUsername: LoginWithUsernameOptions, +): LoginWithUsernameOptions => + ({ + allowEmailLogin: false, + requireEmail: false, + requireUsername: true, + ...(loginWithUsername || {}), + }) as LoginWithUsernameOptions diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index 28a78a3bf8..401f0f6c63 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -1,5 +1,4 @@ // @ts-strict-ignore -import type { LoginWithUsernameOptions } from '../../auth/types.js' import type { Config, SanitizedConfig } from '../../config/types.js' import type { CollectionConfig, @@ -16,13 +15,16 @@ import { fieldAffectsData } from '../../fields/config/types.js' import mergeBaseFields from '../../fields/mergeBaseFields.js' import { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js' import { getBaseUploadFields } from '../../uploads/getBaseFields.js' -import { deepMergeWithReactComponents } from '../../utilities/deepMerge.js' import { flattenAllFields } from '../../utilities/flattenAllFields.js' import { formatLabels } from '../../utilities/formatLabels.js' import baseVersionFields from '../../versions/baseFields.js' import { versionDefaults } from '../../versions/defaults.js' import { defaultCollectionEndpoints } from '../endpoints/index.js' -import { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js' +import { + addDefaultsToAuthConfig, + addDefaultsToCollectionConfig, + addDefaultsToLoginWithUsernameConfig, +} from './defaults.js' import { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js' import { validateUseAsTitle } from './useAsTitle.js' @@ -36,11 +38,15 @@ export const sanitizeCollection = async ( richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise>, _validRelationships?: string[], ): Promise => { + if (collection._sanitized) { + return collection as SanitizedCollectionConfig + } + collection._sanitized = true // ///////////////////////////////// // Make copy of collection config // ///////////////////////////////// - const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection) + const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection) // ///////////////////////////////// // Sanitize fields @@ -190,30 +196,20 @@ export const sanitizeCollection = async ( // sanitize fields for reserved names sanitizeAuthFields(sanitized.fields, sanitized) - sanitized.auth = deepMergeWithReactComponents( - authDefaults, - typeof sanitized.auth === 'object' ? sanitized.auth : {}, + sanitized.auth = addDefaultsToAuthConfig( + typeof sanitized.auth === 'boolean' ? {} : sanitized.auth, ) - if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) { - sanitized.auth.verify = {} - } - // disable duplicate for auth enabled collections by default sanitized.disableDuplicate = sanitized.disableDuplicate ?? true - if (!sanitized.auth.strategies) { - sanitized.auth.strategies = [] - } - if (sanitized.auth.loginWithUsername) { if (sanitized.auth.loginWithUsername === true) { - sanitized.auth.loginWithUsername = loginWithUsernameDefaults + sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({}) } else { - const loginWithUsernameWithDefaults = { - ...loginWithUsernameDefaults, - ...sanitized.auth.loginWithUsername, - } as LoginWithUsernameOptions + const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig( + sanitized.auth.loginWithUsername, + ) // if allowEmailLogin is false, requireUsername must be true if (loginWithUsernameWithDefaults.allowEmailLogin === false) { diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index 9ca4472c06..af92b83724 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -369,6 +369,11 @@ export type CollectionAdminOptions = { /** Manage all aspects of a data collection */ export type CollectionConfig = { + /** + * Do not set this property manually. This is set to true during sanitization, to avoid + * sanitizing the same collection multiple times. + */ + _sanitized?: boolean /** * Access control */ diff --git a/packages/payload/src/config/defaults.ts b/packages/payload/src/config/defaults.ts index 283ebe2fbb..88e79c3b1f 100644 --- a/packages/payload/src/config/defaults.ts +++ b/packages/payload/src/config/defaults.ts @@ -3,6 +3,9 @@ import type { Config } from './types.js' import defaultAccess from '../auth/defaultAccess.js' +/** + * @deprecated - remove in 4.0. This is error-prone, as mutating this object will affect any objects that use the defaults as a base. + */ export const defaults: Omit = { admin: { avatar: 'gravatar', @@ -69,3 +72,82 @@ export const defaults: Omit = { }, upload: {}, } + +export const addDefaultsToConfig = (config: Config): Config => { + config.admin = { + avatar: 'gravatar', + components: {}, + custom: {}, + dateFormat: 'MMMM do yyyy, h:mm a', + dependencies: {}, + theme: 'all', + ...(config.admin || {}), + importMap: { + baseDir: `${typeof process?.cwd === 'function' ? process.cwd() : ''}`, + ...(config?.admin?.importMap || {}), + }, + meta: { + defaultOGImageType: 'dynamic', + titleSuffix: '- Payload', + ...(config?.admin?.meta || {}), + }, + routes: { + account: '/account', + createFirstUser: '/create-first-user', + forgot: '/forgot', + inactivity: '/logout-inactivity', + login: '/login', + logout: '/logout', + reset: '/reset', + unauthorized: '/unauthorized', + ...(config?.admin?.routes || {}), + }, + } + + config.bin = config.bin ?? [] + config.collections = config.collections ?? [] + config.cookiePrefix = config.cookiePrefix ?? 'payload' + config.cors = config.cors ?? [] + config.csrf = config.csrf ?? [] + config.custom = config.custom ?? {} + config.defaultDepth = config.defaultDepth ?? 2 + config.defaultMaxTextLength = config.defaultMaxTextLength ?? 40000 + config.endpoints = config.endpoints ?? [] + config.globals = config.globals ?? [] + config.graphQL = { + disablePlaygroundInProduction: true, + maxComplexity: 1000, + schemaOutputFile: `${typeof process?.cwd === 'function' ? process.cwd() : ''}/schema.graphql`, + ...(config.graphQL || {}), + } + config.hooks = config.hooks ?? {} + config.i18n = config.i18n ?? {} + config.jobs = { + deleteJobOnComplete: true, + depth: 0, + ...(config.jobs || {}), + access: { + run: defaultAccess, + ...(config.jobs?.access || {}), + }, + } as JobsConfig + config.localization = config.localization ?? false + config.maxDepth = config.maxDepth ?? 10 + config.routes = { + admin: '/admin', + api: (process.env.NEXT_BASE_PATH ?? '') + '/api', + graphQL: '/graphql', + graphQLPlayground: '/graphql-playground', + ...(config.routes || {}), + } + config.serverURL = config.serverURL ?? '' + config.telemetry = config.telemetry ?? true + config.typescript = { + autoGenerate: true, + outputFile: `${typeof process?.cwd === 'function' ? process.cwd() : ''}/payload-types.ts`, + ...(config.typescript || {}), + } + config.upload = config.upload ?? {} + + return config +} diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 8168f3c073..5a475f3ee5 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -31,7 +31,7 @@ import getPreferencesCollection from '../preferences/preferencesCollection.js' import { getDefaultJobsCollection } from '../queues/config/jobsCollection.js' import { flattenBlock } from '../utilities/flattenAllFields.js' import { getSchedulePublishTask } from '../versions/schedule/job.js' -import { defaults } from './defaults.js' +import { addDefaultsToConfig } from './defaults.js' const sanitizeAdminConfig = (configToSanitize: Config): Partial => { const sanitizedConfig = { ...configToSanitize } @@ -100,55 +100,7 @@ const sanitizeAdminConfig = (configToSanitize: Config): Partial } export const sanitizeConfig = async (incomingConfig: Config): Promise => { - const configWithDefaults = { - ...defaults, - ...incomingConfig, - admin: { - ...defaults.admin, - ...incomingConfig?.admin, - meta: { - ...defaults.admin.meta, - ...incomingConfig?.admin?.meta, - }, - routes: { - ...defaults.admin.routes, - ...incomingConfig?.admin?.routes, - }, - }, - graphQL: { - ...defaults.graphQL, - ...incomingConfig?.graphQL, - }, - jobs: { - ...defaults.jobs, - ...incomingConfig?.jobs, - access: { - ...defaults.jobs.access, - ...incomingConfig?.jobs?.access, - }, - tasks: incomingConfig?.jobs?.tasks || [], - workflows: incomingConfig?.jobs?.workflows || [], - }, - routes: { - ...defaults.routes, - ...incomingConfig?.routes, - }, - typescript: { - ...defaults.typescript, - ...incomingConfig?.typescript, - }, - } - - if (!configWithDefaults?.serverURL) { - configWithDefaults.serverURL = '' - } - - if (process.env.NEXT_BASE_PATH) { - if (!incomingConfig?.routes?.api) { - // check for incomingConfig, as configWithDefaults will always have a default value for routes.api - configWithDefaults.routes.api = process.env.NEXT_BASE_PATH + '/api' - } - } + const configWithDefaults = addDefaultsToConfig(incomingConfig) const config: Partial = sanitizeAdminConfig(configWithDefaults) @@ -326,46 +278,57 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise Promise>, _validRelationships?: string[], ): Promise => { - const { collections } = config + if (global._sanitized) { + return global as SanitizedGlobalConfig + } + global._sanitized = true global.label = global.label || toWords(global.slug) diff --git a/packages/payload/src/globals/config/types.ts b/packages/payload/src/globals/config/types.ts index 7b8b071a38..ba36e7cf8f 100644 --- a/packages/payload/src/globals/config/types.ts +++ b/packages/payload/src/globals/config/types.ts @@ -143,6 +143,11 @@ export type GlobalAdminOptions = { } export type GlobalConfig = { + /** + * Do not set this property manually. This is set to true during sanitization, to avoid + * sanitizing the same global multiple times. + */ + _sanitized?: boolean access?: { read?: Access readDrafts?: Access diff --git a/packages/payload/src/queues/config/jobsCollection.ts b/packages/payload/src/queues/config/jobsCollection.ts index 545a16bd80..c2b50146f9 100644 --- a/packages/payload/src/queues/config/jobsCollection.ts +++ b/packages/payload/src/queues/config/jobsCollection.ts @@ -6,20 +6,16 @@ import { runJobsEndpoint } from '../restEndpointRun.js' import { getJobTaskStatus } from '../utilities/getJobTaskStatus.js' export const getDefaultJobsCollection: (config: Config) => CollectionConfig | null = (config) => { - if (!Array.isArray(config?.jobs?.workflows)) { - return null - } - const workflowSlugs: Set = new Set() const taskSlugs: Set = new Set(['inline']) - if (config.jobs?.workflows.length) { + if (config.jobs?.workflows?.length) { config.jobs?.workflows.forEach((workflow) => { workflowSlugs.add(workflow.slug) }) } - if (config.jobs?.tasks.length) { + if (config.jobs?.tasks?.length) { config.jobs.tasks.forEach((task) => { if (workflowSlugs.has(task.slug)) { throw new Error( diff --git a/packages/payload/src/utilities/configToJSONSchema.spec.ts b/packages/payload/src/utilities/configToJSONSchema.spec.ts index e456c68cc1..3bb159559f 100644 --- a/packages/payload/src/utilities/configToJSONSchema.spec.ts +++ b/packages/payload/src/utilities/configToJSONSchema.spec.ts @@ -4,6 +4,7 @@ import type { Config } from '../config/types.js' import { sanitizeConfig } from '../config/sanitize.js' import { configToJSONSchema } from './configToJSONSchema.js' +import type { Block, BlocksField, RichTextField } from '../fields/config/types.js' describe('configToJSONSchema', () => { it('should handle optional arrays with required fields', async () => { @@ -333,4 +334,81 @@ describe('configToJSONSchema', () => { title: 'Test', }) }) + + it('should handle same block object being referenced in both collection and config.blocks', async () => { + const sharedBlock: Block = { + slug: 'sharedBlock', + interfaceName: 'SharedBlock', + fields: [ + { + name: 'richText', + type: 'richText', + editor: () => { + // stub rich text editor + return { + CellComponent: '', + FieldComponent: '', + validate: () => true, + } + }, + }, + ], + } + + // @ts-expect-error + const config: Config = { + blocks: [sharedBlock], + collections: [ + { + slug: 'test', + fields: [ + { + name: 'someBlockField', + type: 'blocks', + blocks: [sharedBlock], + }, + ], + timestamps: false, + }, + ], + } + + // Ensure both rich text editor are sanitized + const sanitizedConfig = await sanitizeConfig(config) + expect(typeof (sanitizedConfig?.blocks?.[0]?.fields?.[0] as RichTextField)?.editor).toBe( + 'object', + ) + expect( + typeof ( + (sanitizedConfig.collections[0].fields[0] as BlocksField)?.blocks?.[0] + ?.fields?.[0] as RichTextField + )?.editor, + ).toBe('object') + + const schema = configToJSONSchema(sanitizedConfig, 'text') + + expect(schema?.definitions?.test).toStrictEqual({ + type: 'object', + additionalProperties: false, + title: 'Test', + properties: { + id: { + type: 'string', + }, + someBlockField: { + type: ['array', 'null'], + items: { + oneOf: [ + { + $ref: '#/definitions/SharedBlock', + }, + ], + }, + }, + }, + required: ['id'], + }) + + expect(schema?.definitions?.SharedBlock).toBeDefined() + }) }) From 64b63f6833cc885b959dfd362e71e892e3cc9942 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Tue, 4 Mar 2025 17:02:43 -0500 Subject: [PATCH 088/127] ci: cache mongodb image to avoid rate limiting (#11529) Adding usage of `ScribeMD/docker-cache` to cache the mongodb image. We utilize the [supercharge/mongodb-github-action](https://github.com/supercharge/mongodb-github-action) for pulling and starting our mongo image. This would at times cause `You have reached your unauthenticated pull rate limit` errors because of how many jobs our CI spins up at one time. --- .github/workflows/main.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b587046bfd..d961c552f5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -417,6 +417,7 @@ jobs: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: payloadtests + MONGODB_VERSION: 6.0 steps: - uses: actions/checkout@v4 @@ -456,8 +457,14 @@ jobs: echo "POSTGRES_URL=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/$POSTGRES_DB" >> $GITHUB_ENV if: matrix.database == 'postgres' + # Avoid dockerhub rate-limiting + - name: Cache Docker images + uses: ScribeMD/docker-cache@0.5.0 + with: + key: docker-${{ runner.os }}-mongo-${{ env.MONGODB_VERSION }} + - name: Start MongoDB - uses: supercharge/mongodb-github-action@1.11.0 + uses: supercharge/mongodb-github-action@1.12.0 with: mongodb-version: 6.0 if: matrix.database == 'mongodb' From cc05937633c4bcb4e72c3c8ec0746ea1a6b3f3a5 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 4 Mar 2025 17:04:03 -0700 Subject: [PATCH 089/127] fix(next): admin panel fails compiling when fullySpecified is set in next config (#11531) If `experimental.fullySpecified` is set to `true` in the next config, the Payload admin panel fails to compile, throwing the following error: ```ts Failed to compile. ../../node_modules/.pnpm/@payloadcms+next@3.25.0-canary.46647b4_@types+react@18.3.1_graphql@16.10.0_monaco-editor@0.40_w3ro7ziou6gzev7zbe3qqrwaqe/node_modules/@payloadcms/next/dist/views/Version/RenderFieldsToDiff/fields/Select/DiffViewer/index.js Attempted import error: 'DiffMethod' is not exported from 'react-diff-viewer-continued' (imported as 'DiffMethod'). ``` The issue stems from incorrect import statements in `react-diff-viewer-continued` 4.0.4. This was fixed in `react-diff-viewer-continued` 4.0.5. This PR also enables `fullySpecified` in our test suites, to catch these issues going forward. --- next.config.mjs | 1 + packages/next/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- test/fields/collections/ConditionalLogic/index.ts | 8 ++++---- test/fields/collections/JSON/index.tsx | 2 +- test/next.config.mjs | 1 + 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index c05dd022f1..07ee236932 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -20,6 +20,7 @@ const config = withBundleAnalyzer( ignoreBuildErrors: true, }, experimental: { + fullySpecified: true, serverActions: { bodySizeLimit: '5mb', }, diff --git a/packages/next/package.json b/packages/next/package.json index 5de03394d6..7ebe99590f 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -94,7 +94,7 @@ "http-status": "2.1.0", "path-to-regexp": "6.3.0", "qs-esm": "7.0.2", - "react-diff-viewer-continued": "4.0.4", + "react-diff-viewer-continued": "4.0.5", "sass": "1.77.4", "uuid": "10.0.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb86539f22..b4e8469a75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -714,8 +714,8 @@ importers: specifier: 7.0.2 version: 7.0.2 react-diff-viewer-continued: - specifier: 4.0.4 - version: 4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 4.0.5 + version: 4.0.5(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) sass: specifier: 1.77.4 version: 1.77.4 @@ -8959,8 +8959,8 @@ packages: react: 19.0.0 react-dom: 19.0.0 - react-diff-viewer-continued@4.0.4: - resolution: {integrity: sha512-AQ+LST2L9+sjr0h/nkeZyoUzUcajen3qPkymSuFm8KhObK1aincaZFg/auIwOGc0fAGhY4TgDBq0qFH+9WhLsA==} + react-diff-viewer-continued@4.0.5: + resolution: {integrity: sha512-L43gIPdhHgu1MYdip4vNqAt5s2JLICKe2/RyGUr2ohAxfhYaH1+QZ6vBO0qgo4xGBhE3jmvbOA/swq4/gdS/0g==} engines: {node: '>= 16'} peerDependencies: react: 19.0.0 @@ -19134,7 +19134,7 @@ snapshots: react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - react-diff-viewer-continued@4.0.4(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-diff-viewer-continued@4.0.5(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@emotion/css': 11.13.5 '@emotion/react': 11.14.0(@types/react@19.0.10)(react@19.0.0) diff --git a/test/fields/collections/ConditionalLogic/index.ts b/test/fields/collections/ConditionalLogic/index.ts index 8929aa3ee5..4cdc7101a4 100644 --- a/test/fields/collections/ConditionalLogic/index.ts +++ b/test/fields/collections/ConditionalLogic/index.ts @@ -29,7 +29,7 @@ const ConditionalLogic: CollectionConfig = { type: 'text', admin: { components: { - Field: '/collections/ConditionalLogic/CustomFieldWithField', + Field: '/collections/ConditionalLogic/CustomFieldWithField.js', }, condition: ({ toggleField }) => Boolean(toggleField), }, @@ -40,7 +40,7 @@ const ConditionalLogic: CollectionConfig = { type: 'text', admin: { components: { - Field: '/collections/ConditionalLogic/CustomFieldWithHOC', + Field: '/collections/ConditionalLogic/CustomFieldWithHOC.js', }, condition: ({ toggleField }) => Boolean(toggleField), }, @@ -50,7 +50,7 @@ const ConditionalLogic: CollectionConfig = { type: 'text', admin: { components: { - Field: '/collections/ConditionalLogic/CustomClientField', + Field: '/collections/ConditionalLogic/CustomClientField.js', }, condition: ({ toggleField }) => Boolean(toggleField), }, @@ -60,7 +60,7 @@ const ConditionalLogic: CollectionConfig = { type: 'text', admin: { components: { - Field: '/collections/ConditionalLogic/CustomServerField', + Field: '/collections/ConditionalLogic/CustomServerField.js', }, condition: ({ toggleField }) => Boolean(toggleField), }, diff --git a/test/fields/collections/JSON/index.tsx b/test/fields/collections/JSON/index.tsx index 5952f4f4c4..cc06cf1b70 100644 --- a/test/fields/collections/JSON/index.tsx +++ b/test/fields/collections/JSON/index.tsx @@ -72,7 +72,7 @@ const JSON: CollectionConfig = { type: 'json', admin: { components: { - afterInput: ['./collections/JSON/AfterField#AfterField'], + afterInput: ['./collections/JSON/AfterField.js#AfterField'], }, }, label: 'Custom Json', diff --git a/test/next.config.mjs b/test/next.config.mjs index 65697b4dfa..49b14a2c13 100644 --- a/test/next.config.mjs +++ b/test/next.config.mjs @@ -20,6 +20,7 @@ export default withBundleAnalyzer( ignoreBuildErrors: true, }, experimental: { + fullySpecified: true, serverActions: { bodySizeLimit: '5mb', }, From 4f822a439ba2b51a6139adf41ab2ffccbc497a3d Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 4 Mar 2025 20:06:43 -0500 Subject: [PATCH 090/127] feat: plugin-import-export initial work (#10795) Adds new plugin-import-export initial version. Allows for direct download and creation of downloadable collection data stored to a json or csv uses the access control of the user creating the request to make the file. config options: ```ts /** * Collections to include the Import/Export controls in * Defaults to all collections */ collections?: string[] /** * Enable to force the export to run synchronously */ disableJobsQueue?: boolean /** * This function takes the default export collection configured in the plugin and allows you to override it by modifying and returning it * @param collection * @returns collection */ overrideExportCollection?: (collection: CollectionOverride) => CollectionOverride // payload.config.ts: plugins: [ importExportPlugin({ collections: ['pages', 'users'], overrideExportCollection: (collection) => { collection.admin.group = 'System' collection.upload.staticDir = path.resolve(dirname, 'uploads') return collection }, disableJobsQueue: true, }), ], ``` --------- Co-authored-by: Jessica Chowdhury Co-authored-by: Kendell Joseph --- .github/workflows/main.yml | 1 + .idea/payload.iml | 3 +- package.json | 1 + .../src/versions/payloadPackageList.ts | 1 + packages/plugin-import-export/.gitignore | 7 + packages/plugin-import-export/.prettierignore | 12 + packages/plugin-import-export/.swcrc | 24 + packages/plugin-import-export/README.md | 7 + .../plugin-import-export/eslint.config.js | 18 + packages/plugin-import-export/license.md | 22 + packages/plugin-import-export/package.json | 101 +++ .../src/components/CollectionField/index.tsx | 22 + .../components/ExportListMenuItem/index.scss | 52 ++ .../components/ExportListMenuItem/index.tsx | 38 + .../src/components/ExportSaveButton/index.tsx | 72 ++ .../src/components/FieldsToExport/index.scss | 0 .../src/components/FieldsToExport/index.tsx | 102 +++ .../FieldsToExport/reduceFields.tsx | 111 +++ .../components/ImportExportProvider/index.tsx | 30 + .../src/components/Preview/index.scss | 8 + .../src/components/Preview/index.tsx | 109 +++ .../src/components/SortBy/index.scss | 4 + .../src/components/SortBy/index.tsx | 90 +++ .../src/components/WhereField/index.scss | 0 .../src/components/WhereField/index.tsx | 71 ++ .../src/export/createExport.ts | 151 ++++ .../src/export/download.ts | 26 + .../src/export/flattenObject.ts | 23 + .../export/getCreateExportCollectionTask.ts | 55 ++ .../src/export/getFields.ts | 189 +++++ .../src/export/getFilename.ts | 7 + .../src/export/getSelect.ts | 31 + .../plugin-import-export/src/exports/rsc.ts | 8 + .../plugin-import-export/src/exports/types.ts | 1 + .../src/getExportCollection.ts | 88 +++ packages/plugin-import-export/src/index.ts | 72 ++ .../src/translations/en.ts | 9 + .../src/translations/index.ts | 11 + .../src/translations/translation-schema.json | 24 + packages/plugin-import-export/src/types.ts | 24 + packages/plugin-import-export/tsconfig.json | 25 + pnpm-lock.yaml | 44 ++ test/joins/payload-types.ts | 5 +- test/package.json | 2 + test/plugin-import-export/.gitignore | 1 + .../plugin-import-export/collections/Pages.ts | 117 +++ .../plugin-import-export/collections/Users.ts | 16 + test/plugin-import-export/config.ts | 51 ++ test/plugin-import-export/e2e.spec.ts | 50 ++ test/plugin-import-export/eslint.config.js | 19 + test/plugin-import-export/helpers.ts | 51 ++ test/plugin-import-export/int.spec.ts | 400 +++++++++++ test/plugin-import-export/payload-types.ts | 670 ++++++++++++++++++ test/plugin-import-export/seed/index.ts | 135 ++++ .../plugin-import-export/seed/richTextData.ts | 110 +++ test/plugin-import-export/shared.ts | 1 + .../plugin-import-export/tsconfig.eslint.json | 13 + test/plugin-import-export/tsconfig.json | 3 + test/setupProd.ts | 1 + tsconfig.base.json | 11 +- tsconfig.json | 3 + 61 files changed, 3345 insertions(+), 8 deletions(-) create mode 100644 packages/plugin-import-export/.gitignore create mode 100644 packages/plugin-import-export/.prettierignore create mode 100644 packages/plugin-import-export/.swcrc create mode 100644 packages/plugin-import-export/README.md create mode 100644 packages/plugin-import-export/eslint.config.js create mode 100644 packages/plugin-import-export/license.md create mode 100644 packages/plugin-import-export/package.json create mode 100644 packages/plugin-import-export/src/components/CollectionField/index.tsx create mode 100644 packages/plugin-import-export/src/components/ExportListMenuItem/index.scss create mode 100644 packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx create mode 100644 packages/plugin-import-export/src/components/ExportSaveButton/index.tsx create mode 100644 packages/plugin-import-export/src/components/FieldsToExport/index.scss create mode 100644 packages/plugin-import-export/src/components/FieldsToExport/index.tsx create mode 100644 packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx create mode 100644 packages/plugin-import-export/src/components/ImportExportProvider/index.tsx create mode 100644 packages/plugin-import-export/src/components/Preview/index.scss create mode 100644 packages/plugin-import-export/src/components/Preview/index.tsx create mode 100644 packages/plugin-import-export/src/components/SortBy/index.scss create mode 100644 packages/plugin-import-export/src/components/SortBy/index.tsx create mode 100644 packages/plugin-import-export/src/components/WhereField/index.scss create mode 100644 packages/plugin-import-export/src/components/WhereField/index.tsx create mode 100644 packages/plugin-import-export/src/export/createExport.ts create mode 100644 packages/plugin-import-export/src/export/download.ts create mode 100644 packages/plugin-import-export/src/export/flattenObject.ts create mode 100644 packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts create mode 100644 packages/plugin-import-export/src/export/getFields.ts create mode 100644 packages/plugin-import-export/src/export/getFilename.ts create mode 100644 packages/plugin-import-export/src/export/getSelect.ts create mode 100644 packages/plugin-import-export/src/exports/rsc.ts create mode 100644 packages/plugin-import-export/src/exports/types.ts create mode 100644 packages/plugin-import-export/src/getExportCollection.ts create mode 100644 packages/plugin-import-export/src/index.ts create mode 100644 packages/plugin-import-export/src/translations/en.ts create mode 100644 packages/plugin-import-export/src/translations/index.ts create mode 100644 packages/plugin-import-export/src/translations/translation-schema.json create mode 100644 packages/plugin-import-export/src/types.ts create mode 100644 packages/plugin-import-export/tsconfig.json create mode 100644 test/plugin-import-export/.gitignore create mode 100644 test/plugin-import-export/collections/Pages.ts create mode 100644 test/plugin-import-export/collections/Users.ts create mode 100644 test/plugin-import-export/config.ts create mode 100644 test/plugin-import-export/e2e.spec.ts create mode 100644 test/plugin-import-export/eslint.config.js create mode 100644 test/plugin-import-export/helpers.ts create mode 100644 test/plugin-import-export/int.spec.ts create mode 100644 test/plugin-import-export/payload-types.ts create mode 100644 test/plugin-import-export/seed/index.ts create mode 100644 test/plugin-import-export/seed/richTextData.ts create mode 100644 test/plugin-import-export/shared.ts create mode 100644 test/plugin-import-export/tsconfig.eslint.json create mode 100644 test/plugin-import-export/tsconfig.json diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d961c552f5..f8aa258f69 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -313,6 +313,7 @@ jobs: - i18n - plugin-cloud-storage - plugin-form-builder + - plugin-import-export - plugin-nested-docs - plugin-seo - versions diff --git a/.idea/payload.iml b/.idea/payload.iml index 89c279912a..ea3e14c847 100644 --- a/.idea/payload.iml +++ b/.idea/payload.iml @@ -80,8 +80,9 @@ + - + \ No newline at end of file diff --git a/package.json b/package.json index a593536f1a..1a25ae1ade 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "build:payload-cloud": "turbo build --filter \"@payloadcms/payload-cloud\"", "build:plugin-cloud-storage": "turbo build --filter \"@payloadcms/plugin-cloud-storage\"", "build:plugin-form-builder": "turbo build --filter \"@payloadcms/plugin-form-builder\"", + "build:plugin-import-export": "turbo build --filter \"@payloadcms/plugin-import-export\"", "build:plugin-multi-tenant": "turbo build --filter \"@payloadcms/plugin-multi-tenant\"", "build:plugin-nested-docs": "turbo build --filter \"@payloadcms/plugin-nested-docs\"", "build:plugin-redirects": "turbo build --filter \"@payloadcms/plugin-redirects\"", diff --git a/packages/payload/src/versions/payloadPackageList.ts b/packages/payload/src/versions/payloadPackageList.ts index f223f9e4e6..7f824c5a86 100644 --- a/packages/payload/src/versions/payloadPackageList.ts +++ b/packages/payload/src/versions/payloadPackageList.ts @@ -13,6 +13,7 @@ export const PAYLOAD_PACKAGE_LIST = [ '@payloadcms/plugin-cloud-storage', '@payloadcms/payload-cloud', '@payloadcms/plugin-form-builder', + '@payloadcms/plugin-import-export', // '@payloadcms/plugin-multi-tenant', '@payloadcms/plugin-nested-docs', '@payloadcms/plugin-redirects', diff --git a/packages/plugin-import-export/.gitignore b/packages/plugin-import-export/.gitignore new file mode 100644 index 0000000000..4baaac85f0 --- /dev/null +++ b/packages/plugin-import-export/.gitignore @@ -0,0 +1,7 @@ +node_modules +.env +dist +demo/uploads +build +.DS_Store +package-lock.json diff --git a/packages/plugin-import-export/.prettierignore b/packages/plugin-import-export/.prettierignore new file mode 100644 index 0000000000..17883dc0e5 --- /dev/null +++ b/packages/plugin-import-export/.prettierignore @@ -0,0 +1,12 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp +**/docs/** +tsconfig.json diff --git a/packages/plugin-import-export/.swcrc b/packages/plugin-import-export/.swcrc new file mode 100644 index 0000000000..b4fb882caa --- /dev/null +++ b/packages/plugin-import-export/.swcrc @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/plugin-import-export/README.md b/packages/plugin-import-export/README.md new file mode 100644 index 0000000000..a25c4e55f9 --- /dev/null +++ b/packages/plugin-import-export/README.md @@ -0,0 +1,7 @@ +# Payload Import/Export Plugin + +A plugin for [Payload](https://github.com/payloadcms/payload) to easily import and export data. + +- [Source code](https://github.com/payloadcms/payload/tree/main/packages/plugin-import-export) +- [Documentation](https://payloadcms.com/docs/plugins/import-export) +- [Documentation source](https://github.com/payloadcms/payload/tree/main/docs/plugins/import-export.mdx) diff --git a/packages/plugin-import-export/eslint.config.js b/packages/plugin-import-export/eslint.config.js new file mode 100644 index 0000000000..f9d341be50 --- /dev/null +++ b/packages/plugin-import-export/eslint.config.js @@ -0,0 +1,18 @@ +import { rootEslintConfig, rootParserOptions } from '../../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...rootEslintConfig, + { + languageOptions: { + parserOptions: { + ...rootParserOptions, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +] + +export default index diff --git a/packages/plugin-import-export/license.md b/packages/plugin-import-export/license.md new file mode 100644 index 0000000000..b31a68cbd0 --- /dev/null +++ b/packages/plugin-import-export/license.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2018-2024 Payload CMS, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/plugin-import-export/package.json b/packages/plugin-import-export/package.json new file mode 100644 index 0000000000..4ec2a14d1f --- /dev/null +++ b/packages/plugin-import-export/package.json @@ -0,0 +1,101 @@ +{ + "name": "@payloadcms/plugin-import-export", + "version": "3.26.0", + "description": "Import-Export plugin for Payload", + "keywords": [ + "payload", + "cms", + "plugin", + "typescript", + "react", + "nextjs", + "import", + "export" + ], + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/plugin-import-export" + }, + "license": "MIT", + "author": "Payload (https://payloadcms.com)", + "maintainers": [ + { + "name": "Payload", + "email": "info@payloadcms.com", + "url": "https://payloadcms.com" + } + ], + "type": "module", + "exports": { + ".": { + "import": "./src/index.ts", + "types": "./src/index.ts", + "default": "./src/index.ts" + }, + "./types": { + "import": "./src/exports/types.ts", + "types": "./src/exports/types.ts", + "default": "./src/exports/types.ts" + }, + "./rsc": { + "import": "./src/exports/rsc.ts", + "types": "./src/exports/rsc.ts", + "default": "./src/exports/rsc.ts" + } + }, + "main": "./src/index.ts", + "types": "./src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc", + "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", + "build:types": "tsc --emitDeclarationOnly --outDir dist", + "clean": "rimraf {dist,*.tsbuildinfo}", + "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "dependencies": { + "@faceless-ui/modal": "3.0.0-beta.2", + "@payloadcms/translations": "workspace:*", + "@payloadcms/ui": "workspace:*", + "csv-parse": "^5.6.0", + "csv-stringify": "^6.5.2", + "qs-esm": "7.0.2" + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "@payloadcms/ui": "workspace:*", + "payload": "workspace:*" + }, + "peerDependencies": { + "@payloadcms/ui": "workspace:*", + "payload": "workspace:*" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "./types": { + "import": "./dist/exports/types.js", + "types": "./dist/exports/types.d.ts", + "default": "./dist/exports/types.js" + }, + "./rsc": { + "import": "./dist/exports/rsc.js", + "types": "./dist/exports/rsc.d.ts", + "default": "./dist/exports/rsc.js" + } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" + }, + "homepage:": "https://payloadcms.com" +} diff --git a/packages/plugin-import-export/src/components/CollectionField/index.tsx b/packages/plugin-import-export/src/components/CollectionField/index.tsx new file mode 100644 index 0000000000..efda7073ac --- /dev/null +++ b/packages/plugin-import-export/src/components/CollectionField/index.tsx @@ -0,0 +1,22 @@ +'use client' +import type React from 'react' + +import { useDocumentInfo, useField } from '@payloadcms/ui' +import { useEffect } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' + +export const CollectionField: React.FC = () => { + const { id } = useDocumentInfo() + const { setValue } = useField({ path: 'collectionSlug' }) + const { collection } = useImportExport() + + useEffect(() => { + if (id) { + return + } + setValue(collection) + }, [id, collection, setValue]) + + return null +} diff --git a/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss b/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss new file mode 100644 index 0000000000..eb05087f51 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportListMenuItem/index.scss @@ -0,0 +1,52 @@ +@import '~@payloadcms/ui/scss'; + +@layer payload-default { + .export-list-menu-item { + .doc-drawer__toggler { + height: 100%; + width: 100%; + text-align: left; + } + + + // TODO: is any of this css needed? + &__subheader, + &__header { + padding: 0 var(--gutter-h); + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--theme-border-color); + + & h2 { + margin: calc(var(--gutter-h) * 0.5) 0; + } + } + + &__options, + &__preview { + padding: calc(var(--gutter-h) * 0.5) var(--gutter-h); + } + + &__preview-title { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: calc(var(--gutter-h) * 0.5); + } + + &__close { + @include btn-reset; + } + + &__icon { + width: 3rem; + height: 3rem; + cursor: pointer; + + &:hover { + opacity: 0.8; + } + } + } +} diff --git a/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx b/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx new file mode 100644 index 0000000000..e018917880 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportListMenuItem/index.tsx @@ -0,0 +1,38 @@ +'use client' + +import { getTranslation } from '@payloadcms/translations' +import { PopupList, useConfig, useDocumentDrawer, useTranslation } from '@payloadcms/ui' +import React, { useEffect } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import './index.scss' + +const baseClass = 'export-list-menu-item' + +export const ExportListMenuItem: React.FC<{ + collectionSlug: string + exportCollectionSlug: string +}> = ({ collectionSlug, exportCollectionSlug }) => { + const { getEntityConfig } = useConfig() + const { i18n } = useTranslation() + const currentCollectionConfig = getEntityConfig({ collectionSlug }) + + const [DocumentDrawer, DocumentDrawerToggler] = useDocumentDrawer({ + collectionSlug: exportCollectionSlug, + }) + const { setCollection } = useImportExport() + + // Set collection and selected items on mount or when selection changes + useEffect(() => { + setCollection(currentCollectionConfig.slug ?? '') + }, [currentCollectionConfig, setCollection]) + + return ( + + + Export {getTranslation(currentCollectionConfig.labels.plural, i18n)} + + + + ) +} diff --git a/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx b/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx new file mode 100644 index 0000000000..2ebd46f478 --- /dev/null +++ b/packages/plugin-import-export/src/components/ExportSaveButton/index.tsx @@ -0,0 +1,72 @@ +'use client' + +import { Button, SaveButton, useConfig, useForm, useTranslation } from '@payloadcms/ui' +import React from 'react' + +export const ExportSaveButton: React.FC = () => { + const { t } = useTranslation() + const { + config: { + routes: { api }, + serverURL, + }, + } = useConfig() + + const { getData } = useForm() + + const label = t('general:save') + + const handleDownload = async () => { + try { + const data = getData() + const response = await fetch(`${serverURL}${api}/exports/download`, { + body: JSON.stringify({ + data, + }), + credentials: 'include', + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + }) + + if (!response.ok) { + throw new Error('Failed to download file') + } + + const fileStream = response.body + const reader = fileStream?.getReader() + const decoder = new TextDecoder() + let result = '' + + while (reader) { + const { done, value } = await reader.read() + if (done) { + break + } + result += decoder.decode(value, { stream: true }) + } + + const blob = new Blob([result], { type: 'text/plain' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `${data.name}.${data.format}` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + } catch (error) { + console.error('Error downloading file:', error) + } + } + + return ( + + + + + ) +} diff --git a/packages/plugin-import-export/src/components/FieldsToExport/index.scss b/packages/plugin-import-export/src/components/FieldsToExport/index.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/plugin-import-export/src/components/FieldsToExport/index.tsx b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx new file mode 100644 index 0000000000..1a33f1fe1e --- /dev/null +++ b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx @@ -0,0 +1,102 @@ +'use client' + +import type { ListPreferences, SelectFieldClientComponent } from 'payload' +import type { ReactNode } from 'react' + +import { + FieldLabel, + ReactSelect, + useConfig, + useDocumentInfo, + useField, + usePreferences, +} from '@payloadcms/ui' +import React, { useEffect, useState } from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import { reduceFields } from './reduceFields.js' + +const baseClass = 'fields-to-export' + +export const FieldsToExport: SelectFieldClientComponent = (props) => { + const { id } = useDocumentInfo() + const { path } = props + const { setValue, value } = useField({ path }) + const { value: collectionSlug } = useField({ path: 'collectionSlug' }) + const { getEntityConfig } = useConfig() + const { collection } = useImportExport() + const { getPreference } = usePreferences() + const [displayedValue, setDisplayedValue] = useState< + { id: string; label: ReactNode; value: string }[] + >([]) + + const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection }) + const fieldOptions = reduceFields({ fields: collectionConfig?.fields }) + + useEffect(() => { + if (value && value.length > 0) { + setDisplayedValue((prevDisplayedValue) => { + if (prevDisplayedValue.length > 0) { + return prevDisplayedValue + } // Prevent unnecessary updates + + return value.map((field) => { + const match = fieldOptions.find((option) => option.value === field) + return match ? { ...match, id: field } : { id: field, label: field, value: field } + }) + }) + } + }, [value, fieldOptions]) + + useEffect(() => { + if (id || !collectionSlug) { + return + } + const doAsync = async () => { + const currentPreferences = await getPreference<{ + columns: ListPreferences['columns'] + }>(`${collectionSlug}-list`) + + const columns = currentPreferences?.columns?.filter((a) => a.active).map((b) => b.accessor) + setValue(columns ?? collectionConfig?.admin?.defaultColumns ?? []) + } + + void doAsync() + }, [ + getPreference, + collection, + setValue, + collectionSlug, + id, + collectionConfig?.admin?.defaultColumns, + ]) + const onChange = (options: { id: string; label: ReactNode; value: string }[]) => { + if (!options) { + setValue([]) + return + } + const updatedValue = options?.map((option) => + typeof option === 'object' ? option.value : option, + ) + setValue(updatedValue) + setDisplayedValue(options) + } + + return ( +
+ + String(option.value)} + isClearable={true} + isMulti={true} + isSortable={true} + // @ts-expect-error react select option + onChange={onChange} + options={fieldOptions} + value={displayedValue} + /> +
+ ) +} diff --git a/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx b/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx new file mode 100644 index 0000000000..9d71530511 --- /dev/null +++ b/packages/plugin-import-export/src/components/FieldsToExport/reduceFields.tsx @@ -0,0 +1,111 @@ +import type { ClientField } from 'payload' + +import { fieldAffectsData, fieldHasSubFields } from 'payload/shared' +import React, { Fragment } from 'react' + +const createNestedClientFieldPath = (parentPath: string, field: ClientField): string => { + if (parentPath) { + if (fieldAffectsData(field)) { + return `${parentPath}.${field.name}` + } + return parentPath + } + + if (fieldAffectsData(field)) { + return field.name + } + + return '' +} + +const combineLabel = ({ + field, + prefix, +}: { + field: ClientField + prefix?: React.ReactNode +}): React.ReactNode => { + return ( + + {prefix ? ( + + {prefix} + {' > '} + + ) : null} + + {'label' in field && typeof field.label === 'string' + ? field.label + : (('name' in field && field.name) ?? 'unnamed field')} + + + ) +} + +export const reduceFields = ({ + fields, + labelPrefix = null, + path = '', +}: { + fields: ClientField[] + labelPrefix?: React.ReactNode + path?: string +}): { id: string; label: React.ReactNode; value: string }[] => { + if (!fields) { + return [] + } + + return fields.reduce<{ id: string; label: React.ReactNode; value: string }[]>( + (fieldsToUse, field) => { + // escape for a variety of reasons, include ui fields as they have `name`. + if (field.type === 'ui') { + return fieldsToUse + } + + if (!(field.type === 'array' || field.type === 'blocks') && fieldHasSubFields(field)) { + return [ + ...fieldsToUse, + ...reduceFields({ + fields: field.fields, + labelPrefix: combineLabel({ field, prefix: labelPrefix }), + path: createNestedClientFieldPath(path, field), + }), + ] + } + + if (field.type === 'tabs' && 'tabs' in field) { + return [ + ...fieldsToUse, + ...field.tabs.reduce<{ id: string; label: React.ReactNode; value: string }[]>( + (tabFields, tab) => { + if ('fields' in tab) { + const isNamedTab = 'name' in tab && tab.name + return [ + ...tabFields, + ...reduceFields({ + fields: tab.fields, + labelPrefix, + path: isNamedTab ? createNestedClientFieldPath(path, field) : path, + }), + ] + } + return tabFields + }, + [], + ), + ] + } + + const val = createNestedClientFieldPath(path, field) + + const formattedField = { + id: val, + label: combineLabel({ field, prefix: labelPrefix }), + value: val, + } + + return [...fieldsToUse, formattedField] + }, + [], + ) +} diff --git a/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx b/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx new file mode 100644 index 0000000000..fc4c4d03f4 --- /dev/null +++ b/packages/plugin-import-export/src/components/ImportExportProvider/index.tsx @@ -0,0 +1,30 @@ +'use client' +import React, { createContext, useCallback, useContext, useState } from 'react' + +type ImportExportContext = { + collection: string + setCollection: (collection: string) => void +} + +export const ImportExportContext = createContext({} as ImportExportContext) + +export const ImportExportProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [collection, setCollectionState] = useState('') + + const setCollection = useCallback((collection: string) => { + setCollectionState(collection) + }, []) + + return ( + + {children} + + ) +} + +export const useImportExport = (): ImportExportContext => useContext(ImportExportContext) diff --git a/packages/plugin-import-export/src/components/Preview/index.scss b/packages/plugin-import-export/src/components/Preview/index.scss new file mode 100644 index 0000000000..4571ee6231 --- /dev/null +++ b/packages/plugin-import-export/src/components/Preview/index.scss @@ -0,0 +1,8 @@ +.preview { + &__header { + display: flex; + justify-content: space-between; + align-items: flex-end; + margin-bottom: 10px; + } +} diff --git a/packages/plugin-import-export/src/components/Preview/index.tsx b/packages/plugin-import-export/src/components/Preview/index.tsx new file mode 100644 index 0000000000..0862c94305 --- /dev/null +++ b/packages/plugin-import-export/src/components/Preview/index.tsx @@ -0,0 +1,109 @@ +'use client' +import type { Column } from '@payloadcms/ui' +import type { ClientField, FieldAffectingDataClient } from 'payload' + +import { Table, useConfig, useField } from '@payloadcms/ui' +import { fieldAffectsData } from 'payload/shared' +import * as qs from 'qs-esm' +import React from 'react' + +import { useImportExport } from '../ImportExportProvider/index.js' +import './index.scss' + +const baseClass = 'preview' + +export const Preview = () => { + const { collection } = useImportExport() + const { config } = useConfig() + const { value: where } = useField({ path: 'where' }) + const { value: limit } = useField({ path: 'limit' }) + const { value: fields } = useField({ path: 'fields' }) + const { value: sort } = useField({ path: 'sort' }) + const { value: draft } = useField({ path: 'draft' }) + const [dataToRender, setDataToRender] = React.useState([]) + const [resultCount, setResultCount] = React.useState('') + const [columns, setColumns] = React.useState([]) + + const collectionSlug = typeof collection === 'string' && collection + const collectionConfig = config.collections.find( + (collection) => collection.slug === collectionSlug, + ) + + React.useEffect(() => { + const fetchData = async () => { + if (!collectionSlug) { + return + } + + try { + const whereQuery = qs.stringify( + { + depth: 0, + draft, + limit: limit > 10 ? 10 : limit, + sort, + where, + }, + { + addQueryPrefix: true, + }, + ) + const response = await fetch(`/api/${collectionSlug}${whereQuery}`, { + headers: { + 'Content-Type': 'application/json', + }, + method: 'GET', + }) + + if (response.ok) { + const data = await response.json() + setResultCount(limit && limit < data.totalDocs ? limit : data.totalDocs) + // TODO: check if this data is in the correct format for the table + + const filteredFields = (collectionConfig?.fields?.filter((field) => { + if (!fieldAffectsData(field)) { + return false + } + if (fields?.length > 0) { + return fields.includes(field.name) + } + return true + }) ?? []) as FieldAffectingDataClient[] + + setColumns( + filteredFields.map((field) => ({ + accessor: field.name || '', + active: true, + field: field as ClientField, + Heading: field?.label || field.name, + renderedCells: data.docs.map((doc: Record) => { + if (!field.name || !doc[field.name]) { + return null + } + if (typeof doc[field.name] === 'object') { + return JSON.stringify(doc[field.name]) + } + return String(doc[field.name]) + }), + })) as Column[], + ) + setDataToRender(data.docs) + } + } catch (error) { + console.error('Error fetching data:', error) + } + } + + void fetchData() + }, [collectionConfig?.fields, collectionSlug, draft, fields, limit, sort, where]) + + return ( +
+
+

Preview

+ {resultCount && {resultCount} total documents} +
+ {dataToRender &&
} + + ) +} diff --git a/packages/plugin-import-export/src/components/SortBy/index.scss b/packages/plugin-import-export/src/components/SortBy/index.scss new file mode 100644 index 0000000000..b142d9f3c3 --- /dev/null +++ b/packages/plugin-import-export/src/components/SortBy/index.scss @@ -0,0 +1,4 @@ +.sort-by-fields { + display: block; + width: 33%; +} diff --git a/packages/plugin-import-export/src/components/SortBy/index.tsx b/packages/plugin-import-export/src/components/SortBy/index.tsx new file mode 100644 index 0000000000..75d7cbb297 --- /dev/null +++ b/packages/plugin-import-export/src/components/SortBy/index.tsx @@ -0,0 +1,90 @@ +'use client' + +import type { SelectFieldClientComponent } from 'payload' +import type { ReactNode } from 'react' + +import { + FieldLabel, + ReactSelect, + useConfig, + useDocumentInfo, + useField, + useListQuery, +} from '@payloadcms/ui' +import React, { useEffect, useState } from 'react' + +import { reduceFields } from '../FieldsToExport/reduceFields.js' +import { useImportExport } from '../ImportExportProvider/index.js' + +const baseClass = 'sort-by-fields' + +export const SortBy: SelectFieldClientComponent = (props) => { + const { id } = useDocumentInfo() + const { path } = props + const { setValue, value } = useField({ path }) + const { value: collectionSlug } = useField({ path: 'collectionSlug' }) + const { query } = useListQuery() + const { getEntityConfig } = useConfig() + const { collection } = useImportExport() + const [displayedValue, setDisplayedValue] = useState<{ + id: string + label: ReactNode + value: string + } | null>(null) + + const collectionConfig = getEntityConfig({ collectionSlug: collectionSlug ?? collection }) + const fieldOptions = reduceFields({ fields: collectionConfig?.fields }) + + // Sync displayedValue with value from useField + useEffect(() => { + if (!value) { + setDisplayedValue(null) + return + } + + const option = fieldOptions.find((field) => field.value === value) + if (option && (!displayedValue || displayedValue.value !== value)) { + setDisplayedValue(option) + } + }, [value, fieldOptions]) + + useEffect(() => { + if (id || !query?.sort || value) { + return + } + + const option = fieldOptions.find((field) => field.value === query.sort) + if (option) { + setValue(option.value) + setDisplayedValue(option) + } + }, [fieldOptions, id, query?.sort, value, setValue]) + + const onChange = (option: { id: string; label: ReactNode; value: string } | null) => { + if (!option) { + setValue('') + setDisplayedValue(null) + } else { + setValue(option.value) + setDisplayedValue(option) + } + } + + return ( +
+ + String(option.value)} + isClearable={true} + isSortable={true} + // @ts-expect-error react select option + onChange={onChange} + options={fieldOptions} + // @ts-expect-error react select + value={displayedValue} + /> +
+ ) +} diff --git a/packages/plugin-import-export/src/components/WhereField/index.scss b/packages/plugin-import-export/src/components/WhereField/index.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/plugin-import-export/src/components/WhereField/index.tsx b/packages/plugin-import-export/src/components/WhereField/index.tsx new file mode 100644 index 0000000000..02c1d3db38 --- /dev/null +++ b/packages/plugin-import-export/src/components/WhereField/index.tsx @@ -0,0 +1,71 @@ +'use client' + +import type React from 'react' + +import { useDocumentInfo, useField, useListQuery, useSelection } from '@payloadcms/ui' +import { useEffect } from 'react' + +import './index.scss' + +export const WhereField: React.FC = () => { + const { setValue: setSelectionToUseValue, value: selectionToUseValue } = useField({ + path: 'selectionToUse', + }) + const { setValue } = useField({ path: 'where' }) + const { selectAll, selected } = useSelection() + const { query } = useListQuery() + const { id } = useDocumentInfo() + + // setValue based on selectionToUseValue + useEffect(() => { + if (id) { + return + } + + if (selectionToUseValue === 'currentFilters' && query && query?.where) { + setValue(query.where) + } + + if (selectionToUseValue === 'currentSelection' && selected) { + const ids = [] + + for (const [key, value] of selected) { + if (value) { + ids.push(key) + } + } + + setValue({ + id: { + in: ids, + }, + }) + } + + if (selectionToUseValue === 'all' && selected) { + setValue({}) + } + + // Selected set a where query with IDs + }, [id, selectionToUseValue, query, selected, setValue]) + + // handles default value of selectionToUse + useEffect(() => { + if (id) { + return + } + let defaultSelection: 'all' | 'currentFilters' | 'currentSelection' = 'all' + + if (['allInPage', 'some'].includes(selectAll)) { + defaultSelection = 'currentSelection' + } + + if (defaultSelection === 'all' && query?.where) { + defaultSelection = 'currentFilters' + } + + setSelectionToUseValue(defaultSelection) + }, [id, query, selectAll, setSelectionToUseValue]) + + return null +} diff --git a/packages/plugin-import-export/src/export/createExport.ts b/packages/plugin-import-export/src/export/createExport.ts new file mode 100644 index 0000000000..ff408eacb9 --- /dev/null +++ b/packages/plugin-import-export/src/export/createExport.ts @@ -0,0 +1,151 @@ +import type { PaginatedDocs, PayloadRequest, Sort, User, Where } from 'payload' + +import { stringify } from 'csv-stringify/sync' +import { APIError } from 'payload' +import { Readable } from 'stream' + +import { flattenObject } from './flattenObject.js' +import { getFilename } from './getFilename.js' +import { getSelect } from './getSelect.js' + +type Export = { + collectionSlug: string + exportsCollection: string + fields?: string[] + format: 'csv' | 'json' + globals?: string[] + id: number | string + locale?: string + name: string + slug: string + sort: Sort + user: string + userCollection: string + where?: Where +} + +export type CreateExportArgs = { + /** + * If true, stream the file instead of saving it + */ + download?: boolean + input: Export + req: PayloadRequest + user?: User +} + +export const createExport = async (args: CreateExportArgs) => { + const { + download, + input: { + id, + name: nameArg, + collectionSlug, + exportsCollection, + fields, + format, + locale: localeInput, + sort, + user, + where, + }, + req: { locale: localeArg, payload }, + req, + } = args + const locale = localeInput ?? localeArg + const collectionConfig = payload.config.collections.find(({ slug }) => slug === collectionSlug) + if (!collectionConfig) { + throw new APIError(`Collection with slug ${collectionSlug} not found`) + } + + const name = `${nameArg ?? `${getFilename()}-${collectionSlug}`}.${format}` + const isCSV = format === 'csv' + + const findArgs = { + collection: collectionSlug, + depth: 0, + limit: 100, + locale, + overrideAccess: false, + page: 0, + select: fields ? getSelect(fields) : undefined, + sort, + user, + where, + } + + let result: PaginatedDocs = { hasNextPage: true } as PaginatedDocs + + if (download) { + const encoder = new TextEncoder() + const stream = new Readable({ + async read() { + let result = await payload.find(findArgs) + let isFirstBatch = true + + while (result.docs.length > 0) { + const csvInput = result.docs.map((doc) => flattenObject(doc)) + const csvString = stringify(csvInput, { header: isFirstBatch }) + this.push(encoder.encode(csvString)) + isFirstBatch = false + + if (!result.hasNextPage) { + this.push(null) // End the stream + break + } + + findArgs.page += 1 + result = await payload.find(findArgs) + } + }, + }) + + return new Response(stream as any, { + headers: { + 'Content-Disposition': `attachment; filename="${name}"`, + 'Content-Type': isCSV ? 'text/csv' : 'application/json', + }, + }) + } + + const outputData: string[] = [] + let isFirstBatch = true + + while (result.hasNextPage) { + findArgs.page += 1 + result = await payload.find(findArgs) + + if (isCSV) { + const csvInput = result.docs.map((doc) => flattenObject(doc)) + outputData.push(stringify(csvInput, { header: isFirstBatch })) + isFirstBatch = false + } else { + const jsonInput = result.docs.map((doc) => JSON.stringify(doc)) + outputData.push(jsonInput.join(',\n')) + } + } + + const buffer = Buffer.from(format === 'json' ? `[${outputData.join(',')}]` : outputData.join('')) + + if (!id) { + req.file = { + name, + data: buffer, + mimetype: isCSV ? 'text/csv' : 'application/json', + size: buffer.length, + } + } else { + await req.payload.update({ + id, + collection: exportsCollection, + data: {}, + file: { + name, + data: buffer, + mimetype: isCSV ? 'text/csv' : 'application/json', + size: buffer.length, + }, + user, + }) + } +} diff --git a/packages/plugin-import-export/src/export/download.ts b/packages/plugin-import-export/src/export/download.ts new file mode 100644 index 0000000000..86d02b0978 --- /dev/null +++ b/packages/plugin-import-export/src/export/download.ts @@ -0,0 +1,26 @@ +import type { PayloadHandler } from 'payload' + +import { APIError } from 'payload' + +import { createExport } from './createExport.js' + +export const download: PayloadHandler = async (req) => { + let body + if (typeof req?.json === 'function') { + body = await req.json() + } + + if (!body || !body.data) { + throw new APIError('Request data is required.') + } + + req.payload.logger.info(`Download request received ${body.data.collectionSlug}`) + + body.data.user = req.user + + return createExport({ + download: true, + input: body.data, + req, + }) as Promise +} diff --git a/packages/plugin-import-export/src/export/flattenObject.ts b/packages/plugin-import-export/src/export/flattenObject.ts new file mode 100644 index 0000000000..8fe2c83f23 --- /dev/null +++ b/packages/plugin-import-export/src/export/flattenObject.ts @@ -0,0 +1,23 @@ +export const flattenObject = (obj: any, prefix: string = ''): Record => { + const result: Record = {} + + Object.entries(obj).forEach(([key, value]) => { + const newKey = prefix ? `${prefix}_${key}` : key + + if (Array.isArray(value)) { + value.forEach((item, index) => { + if (typeof item === 'object' && item !== null) { + Object.assign(result, flattenObject(item, `${newKey}_${index}`)) + } else { + result[`${newKey}_${index}`] = item + } + }) + } else if (typeof value === 'object' && value !== null) { + Object.assign(result, flattenObject(value, newKey)) + } else { + result[newKey] = value + } + }) + + return result +} diff --git a/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts b/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts new file mode 100644 index 0000000000..6302f1c7f3 --- /dev/null +++ b/packages/plugin-import-export/src/export/getCreateExportCollectionTask.ts @@ -0,0 +1,55 @@ +import type { Config, TaskHandler, User } from 'payload' + +import type { CreateExportArgs } from './createExport.js' + +import { createExport } from './createExport.js' +import { getFields } from './getFields.js' + +export const getCreateCollectionExportTask = (config: Config): TaskHandler => { + const inputSchema = getFields(config).concat( + { + name: 'user', + type: 'text', + }, + { + name: 'userCollection', + type: 'text', + }, + { + name: 'exportsCollection', + type: 'text', + }, + ) + + return { + // @ts-expect-error plugin tasks cannot have predefined type slug + slug: 'createCollectionExport', + handler: async ({ input, req }: CreateExportArgs) => { + let user: undefined | User + + if (input.userCollection && input.user) { + user = (await req.payload.findByID({ + id: input.user, + collection: input.userCollection, + })) as User + } + + if (!user) { + throw new Error('User not found') + } + + await createExport({ input, req, user }) + + return { + success: true, + } + }, + inputSchema, + outputSchema: [ + { + name: 'success', + type: 'checkbox', + }, + ], + } +} diff --git a/packages/plugin-import-export/src/export/getFields.ts b/packages/plugin-import-export/src/export/getFields.ts new file mode 100644 index 0000000000..e088957d26 --- /dev/null +++ b/packages/plugin-import-export/src/export/getFields.ts @@ -0,0 +1,189 @@ +import type { Config, Field, SelectField } from 'payload' + +import { getFilename } from './getFilename.js' + +export const getFields = (config: Config): Field[] => { + let localeField: SelectField | undefined + if (config.localization) { + localeField = { + name: 'locale', + type: 'select', + admin: { + width: '33%', + }, + defaultValue: 'all', + label: 'Locale', + options: [ + { + label: 'All Locales', + value: 'all', + }, + ...config.localization.locales.map((locale) => ({ + label: typeof locale === 'string' ? locale : locale.label, + value: typeof locale === 'string' ? locale : locale.code, + })), + ], + } + } + + return [ + { + type: 'collapsible', + fields: [ + { + name: 'name', + type: 'text', + defaultValue: () => getFilename(), + label: 'File Name', + }, + { + type: 'row', + fields: [ + { + name: 'format', + type: 'select', + admin: { + width: '33%', + }, + defaultValue: 'csv', + label: 'Export Format', + options: [ + { + label: 'CSV', + value: 'csv', + }, + { + label: 'JSON', + value: 'json', + }, + ], + required: true, + }, + { + name: 'limit', + type: 'number', + admin: { + placeholder: 'No limit', + width: '33%', + }, + }, + { + name: 'sort', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#SortBy', + }, + }, + }, + ], + }, + { + type: 'row', + fields: [ + ...(localeField ? [localeField] : []), + { + name: 'drafts', + type: 'select', + admin: { + condition: (data) => { + const collectionConfig = (config.collections ?? []).find( + (collection) => collection.slug === data.collectionSlug, + ) + return Boolean( + typeof collectionConfig?.versions === 'object' && + collectionConfig?.versions?.drafts, + ) + }, + width: '33%', + }, + defaultValue: 'true', + label: 'Drafts', + options: [ + { + label: 'True', + value: 'true', + }, + { + label: 'False', + value: 'false', + }, + ], + }, + // { + // name: 'depth', + // type: 'number', + // admin: { + // width: '33%', + // }, + // defaultValue: 1, + // required: true, + // }, + ], + }, + { + // virtual field for the UI component to modify the hidden `where` field + name: 'selectionToUse', + type: 'radio', + defaultValue: 'all', + options: [ + { + label: 'Use current selection', + value: 'currentSelection', + }, + { + label: 'Use current filters', + value: 'currentFilters', + }, + { + label: 'Use all documents', + value: 'all', + }, + ], + virtual: true, + }, + { + name: 'fields', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#FieldsToExport', + }, + }, + hasMany: true, + }, + { + name: 'collectionSlug', + type: 'text', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#CollectionField', + }, + hidden: true, + }, + required: true, + }, + { + name: 'where', + type: 'json', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#WhereField', + }, + }, + defaultValue: {}, + }, + ], + label: 'Export Options', + }, + { + name: 'preview', + type: 'ui', + admin: { + components: { + Field: '@payloadcms/plugin-import-export/rsc#Preview', + }, + }, + }, + ] +} diff --git a/packages/plugin-import-export/src/export/getFilename.ts b/packages/plugin-import-export/src/export/getFilename.ts new file mode 100644 index 0000000000..d931c23d28 --- /dev/null +++ b/packages/plugin-import-export/src/export/getFilename.ts @@ -0,0 +1,7 @@ +export const getFilename = () => { + const now = new Date() + const yyymmdd = now.toISOString().split('T')[0] // "YYYY-MM-DD" + const hhmmss = now.toTimeString().split(' ')[0] // "HH:MM:SS" + + return `${yyymmdd} ${hhmmss}` +} diff --git a/packages/plugin-import-export/src/export/getSelect.ts b/packages/plugin-import-export/src/export/getSelect.ts new file mode 100644 index 0000000000..4e156816a3 --- /dev/null +++ b/packages/plugin-import-export/src/export/getSelect.ts @@ -0,0 +1,31 @@ +import type { SelectType } from 'payload' + +/** + * Takes an input of array of string paths in dot notation and returns a select object + * example args: ['id', 'title', 'group.value', 'createdAt', 'updatedAt'] + */ +export const getSelect = (fields: string[]): SelectType => { + const select: SelectType = {} + + fields.forEach((field) => { + // TODO: this can likely be removed, the form was not saving, leaving in for now + if (!field) { + return + } + const segments = field.split('.') + let selectRef = select + + segments.forEach((segment, i) => { + if (i === segments.length - 1) { + selectRef[segment] = true + } else { + if (!selectRef[segment]) { + selectRef[segment] = {} + } + selectRef = selectRef[segment] as SelectType + } + }) + }) + + return select +} diff --git a/packages/plugin-import-export/src/exports/rsc.ts b/packages/plugin-import-export/src/exports/rsc.ts new file mode 100644 index 0000000000..5072288925 --- /dev/null +++ b/packages/plugin-import-export/src/exports/rsc.ts @@ -0,0 +1,8 @@ +export { CollectionField } from '../components/CollectionField/index.js' +export { ExportListMenuItem } from '../components/ExportListMenuItem/index.js' +export { ExportSaveButton } from '../components/ExportSaveButton/index.js' +export { FieldsToExport } from '../components/FieldsToExport/index.js' +export { ImportExportProvider } from '../components/ImportExportProvider/index.js' +export { Preview } from '../components/Preview/index.js' +export { SortBy } from '../components/SortBy/index.js' +export { WhereField } from '../components/WhereField/index.js' diff --git a/packages/plugin-import-export/src/exports/types.ts b/packages/plugin-import-export/src/exports/types.ts new file mode 100644 index 0000000000..af681756fa --- /dev/null +++ b/packages/plugin-import-export/src/exports/types.ts @@ -0,0 +1 @@ +export type { ImportExportPluginConfig } from '../types.js' diff --git a/packages/plugin-import-export/src/getExportCollection.ts b/packages/plugin-import-export/src/getExportCollection.ts new file mode 100644 index 0000000000..9c863059ea --- /dev/null +++ b/packages/plugin-import-export/src/getExportCollection.ts @@ -0,0 +1,88 @@ +import type { + CollectionAfterChangeHook, + CollectionBeforeChangeHook, + CollectionBeforeOperationHook, + CollectionConfig, + Config, +} from 'payload' + +import type { CollectionOverride, ImportExportPluginConfig } from './types.js' + +import { createExport } from './export/createExport.js' +import { download } from './export/download.js' +import { getFields } from './export/getFields.js' + +export const getExportCollection = ({ + config, + pluginConfig, +}: { + config: Config + pluginConfig: ImportExportPluginConfig +}): CollectionConfig => { + const { overrideExportCollection } = pluginConfig + + const beforeOperation: CollectionBeforeOperationHook[] = [] + const afterChange: CollectionAfterChangeHook[] = [] + + let collection: CollectionOverride = { + slug: 'exports', + access: { + update: () => false, + }, + admin: { + group: false, + useAsTitle: 'name', + }, + disableDuplicate: true, + endpoints: [ + { + handler: download, + method: 'post', + path: '/download', + }, + ], + fields: getFields(config), + hooks: { + afterChange, + beforeOperation, + }, + upload: { + filesRequiredOnCreate: false, + hideFileInputOnCreate: true, + hideRemoveFile: true, + }, + } + + if (typeof overrideExportCollection === 'function') { + collection = overrideExportCollection(collection) + } + + if (pluginConfig.disableJobsQueue) { + beforeOperation.push(async ({ args, operation, req }) => { + if (operation !== 'create') { + return + } + const { user } = req + await createExport({ input: { ...args.data, user }, req }) + }) + } else { + afterChange.push(async ({ doc, operation, req }) => { + if (operation !== 'create') { + return + } + + const input = { + ...doc, + exportsCollection: collection.slug, + user: req?.user?.id || req?.user?.user?.id, + userCollection: 'users', + } + await req.payload.jobs.queue({ + input, + task: 'createCollectionExport', + }) + }) + } + + return collection +} diff --git a/packages/plugin-import-export/src/index.ts b/packages/plugin-import-export/src/index.ts new file mode 100644 index 0000000000..74326a2c6d --- /dev/null +++ b/packages/plugin-import-export/src/index.ts @@ -0,0 +1,72 @@ +import type { Config, JobsConfig } from 'payload' + +import { deepMergeSimple } from 'payload' + +import type { ImportExportPluginConfig } from './types.js' + +import { getCreateCollectionExportTask } from './export/getCreateExportCollectionTask.js' +import { getExportCollection } from './getExportCollection.js' +import { translations } from './translations/index.js' + +export const importExportPlugin = + (pluginConfig: ImportExportPluginConfig) => + (config: Config): Config => { + const exportCollection = getExportCollection({ config, pluginConfig }) + if (config.collections) { + config.collections.push(exportCollection) + } else { + config.collections = [exportCollection] + } + + // inject custom import export provider + config.admin = config.admin || {} + config.admin.components = config.admin.components || {} + config.admin.components.providers = config.admin.components.providers || [] + config.admin.components.providers.push( + '@payloadcms/plugin-import-export/rsc#ImportExportProvider', + ) + + // inject the createExport job into the config + config.jobs = + config.jobs || + ({ + tasks: [getCreateCollectionExportTask(config)], + } as unknown as JobsConfig) // cannot type jobs config inside of plugins + + let collectionsToUpdate = config.collections + + const usePluginCollections = pluginConfig.collections && pluginConfig.collections?.length > 0 + + if (usePluginCollections) { + collectionsToUpdate = config.collections?.filter((collection) => { + return pluginConfig.collections?.includes(collection.slug) + }) + } + + collectionsToUpdate.forEach((collection) => { + if (!collection.admin) { + collection.admin = { components: { listMenuItems: [] } } + } + const components = collection.admin.components || {} + if (!components.listMenuItems) { + components.listMenuItems = [] + } + if (!components.edit) { + components.edit = {} + } + if (!components.edit.SaveButton) { + components.edit.SaveButton = '@payloadcms/plugin-import-export/rsc#ExportSaveButton' + } + components.listMenuItems.push({ + clientProps: { + exportCollectionSlug: exportCollection.slug, + }, + path: '@payloadcms/plugin-import-export/rsc#ExportListMenuItem', + }) + collection.admin.components = components + }) + + config.i18n = deepMergeSimple(translations, config.i18n?.translations ?? {}) + + return config + } diff --git a/packages/plugin-import-export/src/translations/en.ts b/packages/plugin-import-export/src/translations/en.ts new file mode 100644 index 0000000000..3ae206461b --- /dev/null +++ b/packages/plugin-import-export/src/translations/en.ts @@ -0,0 +1,9 @@ +import type { GenericTranslationsObject } from '@payloadcms/translations' + +export const en: GenericTranslationsObject = { + $schema: './translation-schema.json', + 'plugin-seo': { + export: 'Export', + import: 'Import', + }, +} diff --git a/packages/plugin-import-export/src/translations/index.ts b/packages/plugin-import-export/src/translations/index.ts new file mode 100644 index 0000000000..82fb59f80d --- /dev/null +++ b/packages/plugin-import-export/src/translations/index.ts @@ -0,0 +1,11 @@ +import type { GenericTranslationsObject, NestedKeysStripped } from '@payloadcms/translations' + +import { en } from './en.js' + +export const translations = { + en, +} + +export type PluginImportExportTranslations = GenericTranslationsObject + +export type PluginImportExportTranslationKeys = NestedKeysStripped diff --git a/packages/plugin-import-export/src/translations/translation-schema.json b/packages/plugin-import-export/src/translations/translation-schema.json new file mode 100644 index 0000000000..a42e09dc5b --- /dev/null +++ b/packages/plugin-import-export/src/translations/translation-schema.json @@ -0,0 +1,24 @@ +{ + "type": "object", + "$schema": "http://json-schema.org/draft-04/schema#", + "additionalProperties": false, + "properties": { + "$schema": { + "type": "string" + }, + "plugin-import-export": { + "type": "object", + "additionalProperties": false, + "properties": { + "export": { + "type": "string" + }, + "import": { + "type": "string" + } + }, + "required": ["export", "import"] + } + }, + "required": ["plugin-import-export"] +} diff --git a/packages/plugin-import-export/src/types.ts b/packages/plugin-import-export/src/types.ts new file mode 100644 index 0000000000..a53cade0e0 --- /dev/null +++ b/packages/plugin-import-export/src/types.ts @@ -0,0 +1,24 @@ +import type { CollectionAdminOptions, CollectionConfig, UploadConfig } from 'payload' + +export type CollectionOverride = { + admin: CollectionAdminOptions + upload: UploadConfig +} & CollectionConfig + +export type ImportExportPluginConfig = { + /** + * Collections to include the Import/Export controls in + * Defaults to all collections + */ + collections?: string[] + /** + * Enable to force the export to run synchronously + */ + disableJobsQueue?: boolean + /** + * This function takes the default export collection configured in the plugin and allows you to override it by modifying and returning it + * @param collection + * @returns collection + */ + overrideExportCollection?: (collection: CollectionOverride) => CollectionOverride +} diff --git a/packages/plugin-import-export/tsconfig.json b/packages/plugin-import-export/tsconfig.json new file mode 100644 index 0000000000..261a42c3b2 --- /dev/null +++ b/packages/plugin-import-export/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, // Make sure typescript knows that this module depends on their references + "noEmit": false /* Do not emit outputs. */, + "emitDeclarationOnly": true, + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + "rootDir": "./src" /* Specify the root folder within your source files. */ + }, + "exclude": [ + "dist", + "build", + "tests", + "test", + "node_modules", + "eslint.config.js", + "src/**/*.spec.js", + "src/**/*.spec.jsx", + "src/**/*.spec.ts", + "src/**/*.spec.tsx" + ], + + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/**/*.ts", "src/**/**/*.tsx", "src/**/*.d.ts", "src/**/*.json", ], + "references": [{ "path": "../payload" }, { "path": "../ui"}] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4e8469a75..a54df297e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1025,6 +1025,34 @@ importers: specifier: workspace:* version: link:../payload + packages/plugin-import-export: + dependencies: + '@faceless-ui/modal': + specifier: 3.0.0-beta.2 + version: 3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@payloadcms/translations': + specifier: workspace:* + version: link:../translations + '@payloadcms/ui': + specifier: workspace:* + version: link:../ui + csv-parse: + specifier: ^5.6.0 + version: 5.6.0 + csv-stringify: + specifier: ^6.5.2 + version: 6.5.2 + qs-esm: + specifier: 7.0.2 + version: 7.0.2 + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + payload: + specifier: workspace:* + version: link:../payload + packages/plugin-multi-tenant: dependencies: next: @@ -1677,6 +1705,9 @@ importers: '@payloadcms/plugin-form-builder': specifier: workspace:* version: link:../packages/plugin-form-builder + '@payloadcms/plugin-import-export': + specifier: workspace:* + version: link:../packages/plugin-import-export '@payloadcms/plugin-multi-tenant': specifier: workspace:* version: link:../packages/plugin-multi-tenant @@ -1749,6 +1780,9 @@ importers: create-payload-app: specifier: workspace:* version: link:../packages/create-payload-app + csv-parse: + specifier: ^5.6.0 + version: 5.6.0 dequal: specifier: 2.0.3 version: 2.0.3 @@ -6302,6 +6336,12 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csv-parse@5.6.0: + resolution: {integrity: sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==} + + csv-stringify@6.5.2: + resolution: {integrity: sha512-RFPahj0sXcmUyjrObAK+DOWtMvMIFV328n4qZJhgX3x2RqkQgOTU2mCUmiFR0CzM6AzChlRSUErjiJeEt8BaQA==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -15963,6 +16003,10 @@ snapshots: csstype@3.1.3: {} + csv-parse@5.6.0: {} + + csv-stringify@6.5.2: {} + damerau-levenshtein@1.0.8: {} data-uri-to-buffer@4.0.1: {} diff --git a/test/joins/payload-types.ts b/test/joins/payload-types.ts index 50c6cac398..ad414e394c 100644 --- a/test/joins/payload-types.ts +++ b/test/joins/payload-types.ts @@ -1232,6 +1232,7 @@ export interface Auth { declare module 'payload' { - // @ts-ignore + // @ts-ignore export interface GeneratedTypes extends Config {} -} \ No newline at end of file +} + diff --git a/test/package.json b/test/package.json index 01442ac8f4..456357d771 100644 --- a/test/package.json +++ b/test/package.json @@ -41,6 +41,7 @@ "@payloadcms/payload-cloud": "workspace:*", "@payloadcms/plugin-cloud-storage": "workspace:*", "@payloadcms/plugin-form-builder": "workspace:*", + "@payloadcms/plugin-import-export": "workspace:*", "@payloadcms/plugin-multi-tenant": "workspace:*", "@payloadcms/plugin-nested-docs": "workspace:*", "@payloadcms/plugin-redirects": "workspace:*", @@ -65,6 +66,7 @@ "babel-plugin-react-compiler": "19.0.0-beta-714736e-20250131", "comment-json": "^4.2.3", "create-payload-app": "workspace:*", + "csv-parse": "^5.6.0", "dequal": "2.0.3", "dotenv": "16.4.7", "drizzle-kit": "0.28.0", diff --git a/test/plugin-import-export/.gitignore b/test/plugin-import-export/.gitignore new file mode 100644 index 0000000000..3f549faf91 --- /dev/null +++ b/test/plugin-import-export/.gitignore @@ -0,0 +1 @@ +uploads diff --git a/test/plugin-import-export/collections/Pages.ts b/test/plugin-import-export/collections/Pages.ts new file mode 100644 index 0000000000..04a777cb2b --- /dev/null +++ b/test/plugin-import-export/collections/Pages.ts @@ -0,0 +1,117 @@ +import type { CollectionConfig } from 'payload' + +import { pagesSlug } from '../shared.js' + +export const Pages: CollectionConfig = { + slug: pagesSlug, + labels: { + singular: 'Page', + plural: 'Pages', + }, + admin: { + useAsTitle: 'title', + }, + versions: { + drafts: true, + }, + fields: [ + { + name: 'title', + label: 'Title', + type: 'text', + required: true, + }, + { + name: 'localized', + type: 'text', + localized: true, + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'value', + type: 'text', + defaultValue: 'group value', + }, + { + name: 'ignore', + type: 'text', + }, + { + name: 'array', + type: 'array', + fields: [ + { + name: 'field1', + type: 'text', + }, + { + name: 'field2', + type: 'text', + }, + ], + }, + ], + }, + { + name: 'array', + type: 'array', + fields: [ + { + name: 'field1', + type: 'text', + }, + { + name: 'field2', + type: 'text', + }, + ], + }, + { + name: 'blocks', + type: 'blocks', + blocks: [ + { + slug: 'hero', + fields: [ + { + name: 'title', + type: 'text', + }, + ], + }, + { + slug: 'content', + fields: [ + { + name: 'richText', + type: 'richText', + }, + ], + }, + ], + }, + { + name: 'author', + type: 'relationship', + relationTo: 'users', + }, + { + name: 'hasManyNumber', + type: 'number', + hasMany: true, + }, + { + name: 'relationship', + type: 'relationship', + relationTo: 'users', + }, + { + name: 'excerpt', + label: 'Excerpt', + type: 'text', + }, + ], +} diff --git a/test/plugin-import-export/collections/Users.ts b/test/plugin-import-export/collections/Users.ts new file mode 100644 index 0000000000..b29c9debff --- /dev/null +++ b/test/plugin-import-export/collections/Users.ts @@ -0,0 +1,16 @@ +import type { CollectionConfig } from 'payload' + +export const Users: CollectionConfig = { + slug: 'users', + auth: true, + admin: { + useAsTitle: 'email', + }, + access: { + read: () => true, + }, + fields: [ + // Email added by default + // Add more fields as needed + ], +} diff --git a/test/plugin-import-export/config.ts b/test/plugin-import-export/config.ts new file mode 100644 index 0000000000..ab44964e1b --- /dev/null +++ b/test/plugin-import-export/config.ts @@ -0,0 +1,51 @@ +import { fileURLToPath } from 'node:url' +import path from 'path' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) +import { importExportPlugin } from '@payloadcms/plugin-import-export' + +import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' +import { Pages } from './collections/Pages.js' +import { Users } from './collections/Users.js' +import { seed } from './seed/index.js' + +export default buildConfigWithDefaults({ + admin: { + importMap: { + baseDir: path.resolve(dirname), + }, + }, + collections: [Users, Pages], + localization: { + defaultLocale: 'en', + fallback: true, + locales: ['en', 'es', 'de'], + }, + onInit: async (payload) => { + await seed(payload) + }, + plugins: [ + importExportPlugin({ + overrideExportCollection: (collection) => { + collection.admin.group = 'System' + collection.upload.staticDir = path.resolve(dirname, 'uploads') + return collection + }, + disableJobsQueue: true, + }), + importExportPlugin({ + collections: ['pages'], + overrideExportCollection: (collection) => { + collection.slug = 'exports-tasks' + if (collection.admin) { + collection.admin.group = 'System' + } + collection.upload.staticDir = path.resolve(dirname, 'uploads') + return collection + }, + }), + ], + typescript: { + outputFile: path.resolve(dirname, 'payload-types.ts'), + }, +}) diff --git a/test/plugin-import-export/e2e.spec.ts b/test/plugin-import-export/e2e.spec.ts new file mode 100644 index 0000000000..cbf771f96a --- /dev/null +++ b/test/plugin-import-export/e2e.spec.ts @@ -0,0 +1,50 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import * as path from 'path' +import { fileURLToPath } from 'url' + +import type { PayloadTestSDK } from '../helpers/sdk/index.js' +import type { Config } from './payload-types.js' + +import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' +import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' +import { POLL_TOPASS_TIMEOUT, TEST_TIMEOUT_LONG } from '../playwright.config.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +test.describe('Import Export', () => { + let page: Page + let pagesURL: AdminUrlUtil + let payload: PayloadTestSDK + + test.beforeAll(async ({ browser }, testInfo) => { + testInfo.setTimeout(TEST_TIMEOUT_LONG) + const { payload: payloadFromInit, serverURL } = await initPayloadE2ENoConfig({ + dirname, + }) + pagesURL = new AdminUrlUtil(serverURL, 'pages') + + payload = payloadFromInit + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + + await ensureCompilationIsDone({ page, serverURL }) + }) + + test.describe('Import', () => { + test('works', async () => { + // TODO: write e2e tests + }) + }) + + test.describe('Export', () => { + test('works', async () => { + // TODO: write e2e tests + }) + }) +}) diff --git a/test/plugin-import-export/eslint.config.js b/test/plugin-import-export/eslint.config.js new file mode 100644 index 0000000000..d6b5fea55e --- /dev/null +++ b/test/plugin-import-export/eslint.config.js @@ -0,0 +1,19 @@ +import { rootParserOptions } from '../../eslint.config.js' +import testEslintConfig from '../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...testEslintConfig, + { + languageOptions: { + parserOptions: { + tsconfigRootDir: import.meta.dirname, + ...rootParserOptions, + }, + }, + }, +] + +export default index diff --git a/test/plugin-import-export/helpers.ts b/test/plugin-import-export/helpers.ts new file mode 100644 index 0000000000..5ef507c3fc --- /dev/null +++ b/test/plugin-import-export/helpers.ts @@ -0,0 +1,51 @@ +import { parse } from 'csv-parse' +import fs from 'fs' + +export const readCSV = async (path: string): Promise => { + const buffer = fs.readFileSync(path) + const data: any[] = [] + const promise = new Promise((resolve) => { + const parser = parse({ bom: true, columns: true }) + + // Collect data from the CSV + parser.on('readable', () => { + let record + while ((record = parser.read())) { + data.push(record) + } + }) + + // Resolve the promise on 'end' + parser.on('end', () => { + resolve() + }) + + // Handle errors (optional, but good practice) + parser.on('error', (error) => { + console.error('Error parsing CSV:', error) + resolve() // Ensures promise doesn't hang on error + }) + + // Pipe the buffer into the parser + parser.write(buffer) + parser.end() + }) + + // Await the promise + await promise + + return data +} + +export const readJSON = async (path: string): Promise => { + const buffer = fs.readFileSync(path) + const str = buffer.toString() + + try { + const json = await JSON.parse(str) + return json + } catch (error) { + console.error('Error reading JSON file:', error) + throw error + } +} diff --git a/test/plugin-import-export/int.spec.ts b/test/plugin-import-export/int.spec.ts new file mode 100644 index 0000000000..96de3363ee --- /dev/null +++ b/test/plugin-import-export/int.spec.ts @@ -0,0 +1,400 @@ +import type { CollectionSlug, Payload } from 'payload' + +import path from 'path' +import { fileURLToPath } from 'url' + +import { devUser } from '../credentials.js' +import { initPayloadInt } from '../helpers/initPayloadInt.js' +import { readCSV, readJSON } from './helpers.js' +import { richTextData } from './seed/richTextData.js' + +let payload: Payload +let user: any + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +describe('@payloadcms/plugin-import-export', () => { + beforeAll(async () => { + ;({ payload } = (await initPayloadInt(dirname)) as { payload: Payload }) + user = await payload.login({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) + }) + + afterAll(async () => { + if (typeof payload.db.destroy === 'function') { + await payload.db.destroy() + } + }) + + describe('exports', () => { + it('should create a file for collection csv from defined fields', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + sort: 'createdAt', + fields: ['id', 'title', 'group.value', 'group.array.field1', 'createdAt', 'updatedAt'], + format: 'csv', + where: { + title: { contains: 'Title ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toContain('pages.csv') + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].id).toBeDefined() + expect(data[0].title).toStrictEqual('Title 0') + expect(data[0].group_value).toStrictEqual('group value') + expect(data[0].group_ignore).toBeUndefined() + expect(data[0].group_array_0_field1).toStrictEqual('test') + expect(data[0].createdAt).toBeDefined() + expect(data[0].updatedAt).toBeDefined() + }) + + it('should create a file for collection csv from one locale', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'localized'], + locale: 'en', + format: 'csv', + where: { + title: { contains: 'Localized ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].id).toBeDefined() + expect(data[0].localized).toStrictEqual('en test') + }) + + it('should create a file for collection csv from multiple locales', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'localized'], + locale: 'all', + format: 'csv', + where: { + title: { contains: 'Localized ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].id).toBeDefined() + expect(data[0].localized_en).toStrictEqual('en test') + expect(data[0].localized_es).toStrictEqual('es test') + }) + + it('should create a file for collection csv from array', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'array'], + format: 'csv', + where: { + title: { contains: 'Array ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].array_0_field1).toStrictEqual('foo') + expect(data[0].array_0_field2).toStrictEqual('bar') + expect(data[0].array_1_field1).toStrictEqual('foo') + expect(data[0].array_1_field2).toStrictEqual('baz') + }) + + it('should create a file for collection csv from array.subfield', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'array.field1'], + format: 'csv', + where: { + title: { contains: 'Array Subfield ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].array_0_field1).toStrictEqual('foo') + expect(data[0].array_0_field2).toBeUndefined() + expect(data[0].array_1_field1).toStrictEqual('foo') + expect(data[0].array_1_field2).toBeUndefined() + }) + + it('should create a file for collection csv from hasMany field', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'hasManyNumber'], + format: 'csv', + where: { + title: { contains: 'hasMany Number ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].hasManyNumber_0).toStrictEqual('0') + expect(data[0].hasManyNumber_1).toStrictEqual('1') + expect(data[0].hasManyNumber_2).toStrictEqual('1') + expect(data[0].hasManyNumber_3).toStrictEqual('2') + expect(data[0].hasManyNumber_4).toStrictEqual('3') + }) + + it('should create a file for collection csv from blocks field', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'blocks'], + format: 'csv', + where: { + title: { contains: 'Blocks ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].blocks_0_blockType).toStrictEqual('hero') + expect(data[0].blocks_1_blockType).toStrictEqual('content') + }) + + it('should create a JSON file for collection', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'title'], + format: 'json', + sort: 'title', + where: { + title: { contains: 'JSON ' }, + }, + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readJSON(expectedPath) + + expect(data[0].title).toStrictEqual('JSON 0') + }) + + it('should create an export with every field when no fields are defined', async () => { + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + format: 'json', + sort: 'title', + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readJSON(expectedPath) + + expect(data[0].id).toBeDefined() + expect(data[0].title).toBeDefined() + expect(data[0].createdAt).toBeDefined() + expect(data[0].updatedAt).toBeDefined() + }) + + it('should create jobs task for exports', async () => { + const doc = await payload.create({ + collection: 'exports-tasks' as CollectionSlug, + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'title'], + format: 'csv', + sort: 'title', + where: { + title: { contains: 'Jobs ' }, + }, + }, + }) + + const { docs } = await payload.find({ + collection: 'payload-jobs' as CollectionSlug, + }) + const job = docs[0] + + expect(job).toBeDefined() + + const { input } = job + + expect(input.id).toBeDefined() + expect(input.name).toBeDefined() + expect(input.format).toStrictEqual('csv') + expect(input.locale).toStrictEqual('all') + expect(input.fields).toStrictEqual(['id', 'title']) + expect(input.collectionSlug).toStrictEqual('pages') + expect(input.exportsCollection).toStrictEqual('exports-tasks') + expect(input.user).toBeDefined() + expect(input.userCollection).toBeDefined() + + await payload.jobs.run() + + const exportDoc = await payload.findByID({ + collection: 'exports-tasks' as CollectionSlug, + id: doc.id, + }) + + expect(exportDoc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', exportDoc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].title).toStrictEqual('Jobs 0') + }) + + // disabled so we don't always run a massive test + it.skip('should create a file from a large set of collection documents', async () => { + const allPromises = [] + let promises = [] + for (let i = 0; i < 100000; i++) { + promises.push( + payload.create({ + collectionSlug: 'pages', + data: { + title: `Array ${i}`, + blocks: [ + { + blockType: 'hero', + title: 'test', + }, + { + blockType: 'content', + richText: richTextData, + }, + ], + }, + }), + ) + if (promises.length >= 500) { + await Promise.all(promises) + promises = [] + } + if (i % 1000 === 0) { + console.log('created', i) + } + } + await Promise.all(promises) + + console.log('seeded') + + let doc = await payload.create({ + collection: 'exports', + user, + data: { + collectionSlug: 'pages', + fields: ['id', 'blocks'], + format: 'csv', + }, + }) + + doc = await payload.findByID({ + collection: 'exports', + id: doc.id, + }) + + expect(doc.filename).toBeDefined() + const expectedPath = path.join(dirname, './uploads', doc.filename as string) + const data = await readCSV(expectedPath) + + expect(data[0].blocks_0_blockType).toStrictEqual('hero') + expect(data[0].blocks_1_blockType).toStrictEqual('content') + }) + }) +}) diff --git a/test/plugin-import-export/payload-types.ts b/test/plugin-import-export/payload-types.ts new file mode 100644 index 0000000000..64164ec970 --- /dev/null +++ b/test/plugin-import-export/payload-types.ts @@ -0,0 +1,670 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * This file was automatically generated by Payload. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + +export interface Config { + auth: { + users: UserAuthOperations; + }; + blocks: {}; + collections: { + users: User; + pages: Page; + exports: Export; + 'exports-tasks': ExportsTask; + 'payload-jobs': PayloadJob; + 'payload-locked-documents': PayloadLockedDocument; + 'payload-preferences': PayloadPreference; + 'payload-migrations': PayloadMigration; + }; + collectionsJoins: {}; + collectionsSelect: { + users: UsersSelect | UsersSelect; + pages: PagesSelect | PagesSelect; + exports: ExportsSelect | ExportsSelect; + 'exports-tasks': ExportsTasksSelect | ExportsTasksSelect; + 'payload-jobs': PayloadJobsSelect | PayloadJobsSelect; + 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; + 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; + 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; + }; + db: { + defaultIDType: string; + }; + globals: {}; + globalsSelect: {}; + locale: 'en' | 'es' | 'de'; + user: User & { + collection: 'users'; + }; + jobs: { + tasks: { + createCollectionExport: TaskCreateCollectionExport; + inline: { + input: unknown; + output: unknown; + }; + }; + workflows: unknown; + }; +} +export interface UserAuthOperations { + forgotPassword: { + email: string; + password: string; + }; + login: { + email: string; + password: string; + }; + registerFirstUser: { + email: string; + password: string; + }; + unlock: { + email: string; + password: string; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "pages". + */ +export interface Page { + id: string; + title: string; + localized?: string | null; + group?: { + value?: string | null; + ignore?: string | null; + array?: + | { + field1?: string | null; + field2?: string | null; + id?: string | null; + }[] + | null; + }; + array?: + | { + field1?: string | null; + field2?: string | null; + id?: string | null; + }[] + | null; + blocks?: + | ( + | { + title?: string | null; + id?: string | null; + blockName?: string | null; + blockType: 'hero'; + } + | { + richText?: { + root: { + type: string; + children: { + type: string; + version: number; + [k: string]: unknown; + }[]; + direction: ('ltr' | 'rtl') | null; + format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | ''; + indent: number; + version: number; + }; + [k: string]: unknown; + } | null; + id?: string | null; + blockName?: string | null; + blockType: 'content'; + } + )[] + | null; + author?: (string | null) | User; + hasManyNumber?: number[] | null; + relationship?: (string | null) | User; + excerpt?: string | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "exports". + */ +export interface Export { + id: string; + name?: string | null; + format: 'csv' | 'json'; + limit?: number | null; + sort?: string | null; + locale?: ('all' | 'en' | 'es' | 'de') | null; + drafts?: ('true' | 'false') | null; + selectionToUse?: ('currentSelection' | 'currentFilters' | 'all') | null; + fields?: string[] | null; + collectionSlug: string; + where?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "exports-tasks". + */ +export interface ExportsTask { + id: string; + name?: string | null; + format: 'csv' | 'json'; + limit?: number | null; + sort?: string | null; + locale?: ('all' | 'en' | 'es' | 'de') | null; + drafts?: ('true' | 'false') | null; + selectionToUse?: ('currentSelection' | 'currentFilters' | 'all') | null; + fields?: string[] | null; + collectionSlug: string; + where?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-jobs". + */ +export interface PayloadJob { + id: string; + /** + * Input data provided to the job + */ + input?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + taskStatus?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + completedAt?: string | null; + totalTried?: number | null; + /** + * If hasError is true this job will not be retried + */ + hasError?: boolean | null; + /** + * If hasError is true, this is the error that caused it + */ + error?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + /** + * Task execution log + */ + log?: + | { + executedAt: string; + completedAt: string; + taskSlug: 'inline' | 'createCollectionExport'; + taskID: string; + input?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + output?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + state: 'failed' | 'succeeded'; + error?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + id?: string | null; + }[] + | null; + taskSlug?: ('inline' | 'createCollectionExport') | null; + queue?: string | null; + waitUntil?: string | null; + processing?: boolean | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents". + */ +export interface PayloadLockedDocument { + id: string; + document?: + | ({ + relationTo: 'users'; + value: string | User; + } | null) + | ({ + relationTo: 'pages'; + value: string | Page; + } | null) + | ({ + relationTo: 'exports'; + value: string | Export; + } | null) + | ({ + relationTo: 'exports-tasks'; + value: string | ExportsTask; + } | null) + | ({ + relationTo: 'payload-jobs'; + value: string | PayloadJob; + } | null); + globalSlug?: string | null; + user: { + relationTo: 'users'; + value: string | User; + }; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ +export interface PayloadPreference { + id: string; + user: { + relationTo: 'users'; + value: string | User; + }; + key?: string | null; + value?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ +export interface PayloadMigration { + id: string; + name?: string | null; + batch?: number | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users_select". + */ +export interface UsersSelect { + updatedAt?: T; + createdAt?: T; + email?: T; + resetPasswordToken?: T; + resetPasswordExpiration?: T; + salt?: T; + hash?: T; + loginAttempts?: T; + lockUntil?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "pages_select". + */ +export interface PagesSelect { + title?: T; + localized?: T; + group?: + | T + | { + value?: T; + ignore?: T; + array?: + | T + | { + field1?: T; + field2?: T; + id?: T; + }; + }; + array?: + | T + | { + field1?: T; + field2?: T; + id?: T; + }; + blocks?: + | T + | { + hero?: + | T + | { + title?: T; + id?: T; + blockName?: T; + }; + content?: + | T + | { + richText?: T; + id?: T; + blockName?: T; + }; + }; + author?: T; + hasManyNumber?: T; + relationship?: T; + excerpt?: T; + updatedAt?: T; + createdAt?: T; + _status?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "exports_select". + */ +export interface ExportsSelect { + name?: T; + format?: T; + limit?: T; + sort?: T; + locale?: T; + drafts?: T; + selectionToUse?: T; + fields?: T; + collectionSlug?: T; + where?: T; + updatedAt?: T; + createdAt?: T; + url?: T; + thumbnailURL?: T; + filename?: T; + mimeType?: T; + filesize?: T; + width?: T; + height?: T; + focalX?: T; + focalY?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "exports-tasks_select". + */ +export interface ExportsTasksSelect { + name?: T; + format?: T; + limit?: T; + sort?: T; + locale?: T; + drafts?: T; + selectionToUse?: T; + fields?: T; + collectionSlug?: T; + where?: T; + updatedAt?: T; + createdAt?: T; + url?: T; + thumbnailURL?: T; + filename?: T; + mimeType?: T; + filesize?: T; + width?: T; + height?: T; + focalX?: T; + focalY?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-jobs_select". + */ +export interface PayloadJobsSelect { + input?: T; + taskStatus?: T; + completedAt?: T; + totalTried?: T; + hasError?: T; + error?: T; + log?: + | T + | { + executedAt?: T; + completedAt?: T; + taskSlug?: T; + taskID?: T; + input?: T; + output?: T; + state?: T; + error?: T; + id?: T; + }; + taskSlug?: T; + queue?: T; + waitUntil?: T; + processing?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents_select". + */ +export interface PayloadLockedDocumentsSelect { + document?: T; + globalSlug?: T; + user?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences_select". + */ +export interface PayloadPreferencesSelect { + user?: T; + key?: T; + value?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations_select". + */ +export interface PayloadMigrationsSelect { + name?: T; + batch?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "TaskCreateCollectionExport". + */ +export interface TaskCreateCollectionExport { + input: { + name?: string | null; + format: 'csv' | 'json'; + limit?: number | null; + sort?: string | null; + locale?: ('all' | 'en' | 'es' | 'de') | null; + drafts?: ('true' | 'false') | null; + selectionToUse?: ('currentSelection' | 'currentFilters' | 'all') | null; + fields?: string[] | null; + collectionSlug: string; + where?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + user?: string | null; + userCollection?: string | null; + exportsCollection?: string | null; + }; + output: { + success?: boolean | null; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "auth". + */ +export interface Auth { + [k: string]: unknown; +} + + +declare module 'payload' { + // @ts-ignore + export interface GeneratedTypes extends Config {} +} \ No newline at end of file diff --git a/test/plugin-import-export/seed/index.ts b/test/plugin-import-export/seed/index.ts new file mode 100644 index 0000000000..bbc8dd3222 --- /dev/null +++ b/test/plugin-import-export/seed/index.ts @@ -0,0 +1,135 @@ +import type { Payload } from 'payload' + +import { devUser } from '../../credentials.js' +import { richTextData } from './richTextData.js' + +export const seed = async (payload: Payload): Promise => { + payload.logger.info('Seeding data...') + try { + await payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) + // create pages + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `Title ${i}`, + group: { + array: [{ field1: 'test' }], + }, + }, + }) + } + for (let i = 0; i < 5; i++) { + const doc = await payload.create({ + collection: 'pages', + data: { + title: `Localized ${i}`, + localized: 'en test', + }, + locale: 'en', + }) + await payload.update({ + collection: 'pages', + id: doc.id, + data: { + localized: 'es test', + }, + locale: 'es', + }) + } + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `Array ${i}`, + array: [ + { + field1: 'foo', + field2: 'bar', + }, + { + field1: 'foo', + field2: 'baz', + }, + ], + }, + }) + } + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `Array Subfield ${i}`, + array: [ + { + field1: 'foo', + field2: 'bar', + }, + { + field1: 'foo', + field2: 'baz', + }, + ], + }, + }) + } + + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `hasMany Number ${i}`, + hasManyNumber: [0, 1, 1, 2, 3, 5, 8, 13, 21], + }, + }) + } + + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `Blocks ${i}`, + blocks: [ + { + blockType: 'hero', + title: 'test', + }, + { + blockType: 'content', + richText: richTextData, + }, + ], + }, + }) + } + + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `JSON ${i}`, + }, + }) + } + + for (let i = 0; i < 5; i++) { + await payload.create({ + collection: 'pages', + data: { + title: `Jobs ${i}`, + }, + }) + } + + return true + } catch (err) { + console.error(err) + return false + } +} diff --git a/test/plugin-import-export/seed/richTextData.ts b/test/plugin-import-export/seed/richTextData.ts new file mode 100644 index 0000000000..1dbacf25e7 --- /dev/null +++ b/test/plugin-import-export/seed/richTextData.ts @@ -0,0 +1,110 @@ +export const richTextData = { + root: { + children: [ + { + children: [ + { + detail: 0, + format: 0, + mode: 'normal', + style: '', + text: 'This is some content in a block', + type: 'text', + version: 1, + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'heading', + version: 1, + tag: 'h2', + }, + { + children: [ + { + detail: 0, + format: 0, + mode: 'normal', + style: '', + text: 'Paragraph of text', + type: 'text', + version: 1, + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'paragraph', + version: 1, + textFormat: 0, + textStyle: '', + }, + { + children: [ + { + children: [ + { + detail: 0, + format: 0, + mode: 'normal', + style: '', + text: 'Testing ', + type: 'text', + version: 1, + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'listitem', + version: 1, + value: 1, + }, + { + children: [ + { + detail: 0, + format: 0, + mode: 'normal', + style: '', + text: 'Richtext', + type: 'text', + version: 1, + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'listitem', + version: 1, + value: 2, + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'list', + version: 1, + listType: 'number', + start: 1, + tag: 'ol', + }, + { + children: [], + direction: 'ltr', + format: '', + indent: 0, + type: 'paragraph', + version: 1, + textFormat: 0, + textStyle: '', + }, + ], + direction: 'ltr', + format: '', + indent: 0, + type: 'root', + version: 1, + }, +} diff --git a/test/plugin-import-export/shared.ts b/test/plugin-import-export/shared.ts new file mode 100644 index 0000000000..748a8a0172 --- /dev/null +++ b/test/plugin-import-export/shared.ts @@ -0,0 +1 @@ +export const pagesSlug = 'pages' diff --git a/test/plugin-import-export/tsconfig.eslint.json b/test/plugin-import-export/tsconfig.eslint.json new file mode 100644 index 0000000000..b34cc7afbb --- /dev/null +++ b/test/plugin-import-export/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + // extend your base config to share compilerOptions, etc + //"extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": [ + // whatever paths you intend to lint + "./**/*.ts", + "./**/*.tsx" + ] +} diff --git a/test/plugin-import-export/tsconfig.json b/test/plugin-import-export/tsconfig.json new file mode 100644 index 0000000000..3c43903cfd --- /dev/null +++ b/test/plugin-import-export/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../tsconfig.json" +} diff --git a/test/setupProd.ts b/test/setupProd.ts index 1f2a524f31..b906715670 100644 --- a/test/setupProd.ts +++ b/test/setupProd.ts @@ -23,6 +23,7 @@ export const tgzToPkgNameMap = { '@payloadcms/payload-cloud': 'payloadcms-payload-cloud-*', '@payloadcms/plugin-cloud-storage': 'payloadcms-plugin-cloud-storage-*', '@payloadcms/plugin-form-builder': 'payloadcms-plugin-form-builder-*', + '@payloadcms/plugin-import-export': 'payloadcms-plugin-import-export-*', '@payloadcms/plugin-multi-tenant': 'payloadcms-plugin-multi-tenant-*', '@payloadcms/plugin-nested-docs': 'payloadcms-plugin-nested-docs-*', '@payloadcms/plugin-redirects': 'payloadcms-plugin-redirects-*', diff --git a/tsconfig.base.json b/tsconfig.base.json index 26c3c9821e..4b37de3910 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,7 @@ } ], "paths": { - "@payload-config": ["./test/_community/config.ts"], + "@payload-config": ["./test/plugin-import-export/config.ts"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], @@ -55,6 +55,9 @@ "@payloadcms/plugin-form-builder/client": [ "./packages/plugin-form-builder/src/exports/client.ts" ], + "@payloadcms/plugin-import-export/rsc": [ + "./packages/plugin-import-export/src/exports/rsc.ts" + ], "@payloadcms/plugin-multi-tenant/rsc": ["./packages/plugin-multi-tenant/src/exports/rsc.ts"], "@payloadcms/plugin-multi-tenant/utilities": [ "./packages/plugin-multi-tenant/src/exports/utilities.ts" @@ -68,13 +71,11 @@ "@payloadcms/plugin-multi-tenant": ["./packages/plugin-multi-tenant/src/index.ts"], "@payloadcms/next": ["./packages/next/src/exports/*"], "@payloadcms/storage-s3/client": ["./packages/storage-s3/src/exports/client.ts"], - "@payloadcms/storage-vercel-blob/client": [ - "./packages/storage-vercel-blob/src/exports/client.ts" + "@payloadcms/storage-vercel-blob/client": ["./packages/storage-vercel-blob/src/exports/client.ts" ], "@payloadcms/storage-gcs/client": ["./packages/storage-gcs/src/exports/client.ts"], "@payloadcms/storage-uploadthing/client": [ - "./packages/storage-uploadthing/src/exports/client.ts" - ] + "./packages/storage-uploadthing/src/exports/client.ts"] } }, "include": ["${configDir}/src"], diff --git a/tsconfig.json b/tsconfig.json index 33c6a6c045..bcb2746e44 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -61,6 +61,9 @@ { "path": "./packages/plugin-seo" }, + { + "path": "./packages/plugin-import-export" + }, { "path": "./packages/plugin-stripe" }, From f01cfbcc57773ee9a337bcf1a5559b12638782eb Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Tue, 4 Mar 2025 18:07:29 -0700 Subject: [PATCH 091/127] feat: allows overriding import map location (#11532) By default, Payload only attempts to locate the import map file in the following locations: - `src/app/(payload)/{adminroute}/importMap.js` - `app/(payload)/{adminroute}/importMap.js` This is fine for most projects, but sometimes you may want to place the import map - or the Payload admin directory - somewhere else. This PR adds a new `importMapFile` property that allows you to override this heuristic and specify your own import map path. --- docs/custom-components/overview.mdx | 26 ++++++++++++++-- .../src/bin/generateImportMap/index.ts | 31 +++++++++++++------ packages/payload/src/config/types.ts | 11 +++++-- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/docs/custom-components/overview.mdx b/docs/custom-components/overview.mdx index bf0c376d26..9ab42d1d56 100644 --- a/docs/custom-components/overview.mdx +++ b/docs/custom-components/overview.mdx @@ -119,10 +119,32 @@ For details on how to build Custom Components, see [Building Custom Components]( ### Import Map -In order for Payload to make use of [Component Paths](#component-paths), an "Import Map" is automatically generated at `app/(payload)/admin/importMap.js`. This file contains every Custom Component in your config, keyed to their respective paths. When Payload needs to lookup a component, it uses this file to find the correct import. +In order for Payload to make use of [Component Paths](#component-paths), an "Import Map" is automatically generated at either `src/app/(payload)/admin/importMap.js` or `app/(payload)/admin/importMap.js`. This file contains every Custom Component in your config, keyed to their respective paths. When Payload needs to lookup a component, it uses this file to find the correct import. The Import Map is automatically regenerated at startup and whenever Hot Module Replacement (HMR) runs, or you can run `payload generate:importmap` to manually regenerate it. +#### Overriding Import Map Location + +Using the `config.admin.importMap.importMapFile` property, you can override the location of the import map. This is useful if you want to place the import map in a different location, or if you want to use a custom file name. + +```ts +import { buildConfig } from 'payload' +import { fileURLToPath } from 'node:url' +import path from 'path' +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +const config = buildConfig({ + // ... + admin: { + importMap: { + baseDir: path.resolve(dirname, 'src'), + importMapFile: path.resolve(dirname, 'app', '(payload)', 'custom-import-map.js'), // highlight-line + }, + }, +}) +``` + #### Custom Imports If needed, custom items can be appended onto the Import Map. This is mostly only relevant for plugin authors who need to add a custom import that is not referenced in a known location. @@ -146,7 +168,7 @@ export default buildConfig({ }, }, } -} +}) ``` ## Building Custom Components diff --git a/packages/payload/src/bin/generateImportMap/index.ts b/packages/payload/src/bin/generateImportMap/index.ts index fe0679f475..f77f9fcd8c 100644 --- a/packages/payload/src/bin/generateImportMap/index.ts +++ b/packages/payload/src/bin/generateImportMap/index.ts @@ -209,15 +209,28 @@ export async function writeImportMap({ log?: boolean rootDir: string }) { - let importMapFolderPath = '' - if (fs.existsSync(path.resolve(rootDir, `app/(payload)${config.routes.admin}/`))) { - importMapFolderPath = path.resolve(rootDir, `app/(payload)${config.routes.admin}/`) - } else if (fs.existsSync(path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`))) { - importMapFolderPath = path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`) + let importMapFilePath: string | undefined = undefined + + if (config?.admin?.importMap?.importMapFile?.length) { + if (!fs.existsSync(config.admin.importMap.importMapFile)) { + throw new Error( + `Could not find the import map file at ${config.admin.importMap.importMapFile}`, + ) + } + importMapFilePath = config.admin.importMap.importMapFile } else { - throw new Error( - `Could not find the payload admin directory. Looked in ${path.resolve(rootDir, `app/(payload)${config.routes.admin}/`)} and ${path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`)}`, - ) + const appLocation = path.resolve(rootDir, `app/(payload)${config.routes.admin}/`) + const srcAppLocation = path.resolve(rootDir, `src/app/(payload)${config.routes.admin}/`) + + if (fs.existsSync(appLocation)) { + importMapFilePath = path.resolve(appLocation, fileName) + } else if (fs.existsSync(srcAppLocation)) { + importMapFilePath = path.resolve(srcAppLocation, fileName) + } else { + throw new Error( + `Could not find Payload import map folder. Looked in ${appLocation} and ${srcAppLocation}`, + ) + } } const imports: string[] = [] @@ -237,8 +250,6 @@ ${mapKeys.join(',\n')} } ` - const importMapFilePath = path.resolve(importMapFolderPath, fileName) - if (!force) { // Read current import map and check in the IMPORTS if there are any new imports. If not, don't write the file. const currentImportMap = await fs.promises.readFile(importMapFilePath, 'utf-8') diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 1d82a4366e..14e4451a8a 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -855,9 +855,9 @@ export type Config = { * @default true */ autoGenerate?: boolean - /** The base directory for component paths starting with /. - * - * By default, this is process.cwd() + /** + * The base directory for component paths starting with /. + * @default process.cwd() **/ baseDir?: string /** @@ -873,6 +873,11 @@ export type Config = { imports: Imports }) => void > + /** + * If Payload cannot find the import map file location automatically, + * you can manually provide it here. + */ + importMapFile?: string } livePreview?: { collections?: string[] From bacc0f002a6e2cf3015560ed949a46d2e8b18347 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 03:09:24 +0200 Subject: [PATCH 092/127] feat: compound indexes (#11512) ### What? This PR adds ability to define indexes on several fields for collections (compound indexes). Example: ```ts { indexes: [{ unique: true, fields: ['title', 'group.name'] }] } ``` ### Why? This can be used to either speed up querying/sorting by 2 or more fields at the same time or to ensure uniqueness between several fields. ### How? Implements this logic in database adapters. Additionally, adds a utility `getFieldByPath`. --- docs/configuration/collections.mdx | 11 +-- packages/db-mongodb/src/init.ts | 7 +- .../src/models/buildCollectionSchema.ts | 1 + packages/db-mongodb/src/models/buildSchema.ts | 23 +++++- packages/drizzle/src/schema/build.ts | 60 +++++++++++++++- packages/drizzle/src/schema/buildRawSchema.ts | 8 ++- packages/drizzle/src/schema/traverseFields.ts | 2 +- .../payload/src/collections/config/client.ts | 12 +++- .../src/collections/config/defaults.ts | 1 + .../src/collections/config/sanitize.ts | 7 ++ .../config/sanitizeCompoundIndexes.ts | 40 +++++++++++ .../payload/src/collections/config/types.ts | 28 +++++++- packages/payload/src/index.ts | 15 ++-- .../payload/src/utilities/getFieldByPath.ts | 70 +++++++++++++++++++ .../versions/buildVersionCompoundIndexes.ts | 17 +++++ test/database/config.ts | 42 ++++++++++- test/database/int.spec.ts | 63 +++++++++++++++++ test/database/payload-types.ts | 37 ++++++++++ 18 files changed, 423 insertions(+), 21 deletions(-) create mode 100644 packages/payload/src/collections/config/sanitizeCompoundIndexes.ts create mode 100644 packages/payload/src/utilities/getFieldByPath.ts create mode 100644 packages/payload/src/versions/buildVersionCompoundIndexes.ts diff --git a/docs/configuration/collections.mdx b/docs/configuration/collections.mdx index cfc0d2138c..d544debe61 100644 --- a/docs/configuration/collections.mdx +++ b/docs/configuration/collections.mdx @@ -57,9 +57,9 @@ export const Posts: CollectionConfig = { The following options are available: -| Option | Description | -| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | +| Option | Description | +| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `admin` | The configuration options for the Admin Panel. [More details](#admin-options). | | `access` | Provide Access Control functions to define exactly who should be able to do what with Documents in this Collection. [More details](../access-control/collections). | | `auth` | Specify options if you would like this Collection to feature authentication. [More details](../authentication/overview). | | `custom` | Extension point for adding custom data (e.g. for plugins) | @@ -67,17 +67,18 @@ The following options are available: | `defaultSort` | Pass a top-level field to sort by default in the Collection List View. Prefix the name of the field with a minus symbol ("-") to sort in descending order. Multiple fields can be specified by using a string array. | | `dbName` | Custom table or Collection name depending on the Database Adapter. Auto-generated from slug if not defined. | | `endpoints` | Add custom routes to the REST API. Set to `false` to disable routes. [More details](../rest-api/overview#custom-endpoints). | -| `fields` * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | +| `fields` * | Array of field types that will determine the structure and functionality of the data stored within this Collection. [More details](../fields/overview). | | `graphQL` | Manage GraphQL-related properties for this collection. [More](#graphql) | | `hooks` | Entry point for Hooks. [More details](../hooks/overview#collection-hooks). | | `labels` | Singular and plural labels for use in identifying this Collection throughout Payload. Auto-generated from slug if not defined. | | `lockDocuments` | Enables or disables document locking. By default, document locking is enabled. Set to an object to configure, or set to `false` to disable locking. [More details](../admin/locked-documents). | -| `slug` * | Unique, URL-friendly string that will act as an identifier for this Collection. | +| `slug` * | Unique, URL-friendly string that will act as an identifier for this Collection. | | `timestamps` | Set to false to disable documents' automatically generated `createdAt` and `updatedAt` timestamps. | | `typescript` | An object with property `interface` as the text used in schema generation. Auto-generated from slug if not defined. | | `upload` | Specify options if you would like this Collection to support file uploads. For more, consult the [Uploads](../upload/overview) documentation. | | `versions` | Set to true to enable default options, or configure with object properties. [More details](../versions/overview#collection-config). | | `defaultPopulate` | Specify which fields to select when this Collection is populated from another document. [More Details](../queries/select#defaultpopulate-collection-config-property). | +| `indexes` | Define compound indexes for this collection. This can be used to either speed up querying/sorting by 2 or more fields at the same time or to ensure uniqueness between several fields. | _* An asterisk denotes that a property is required._ diff --git a/packages/db-mongodb/src/init.ts b/packages/db-mongodb/src/init.ts index f477d65920..01b306a8e9 100644 --- a/packages/db-mongodb/src/init.ts +++ b/packages/db-mongodb/src/init.ts @@ -3,7 +3,11 @@ import type { Init, SanitizedCollectionConfig } from 'payload' import mongoose from 'mongoose' import paginate from 'mongoose-paginate-v2' -import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' +import { + buildVersionCollectionFields, + buildVersionCompoundIndexes, + buildVersionGlobalFields, +} from 'payload' import type { MongooseAdapter } from './index.js' import type { CollectionModel, GlobalModel } from './types.js' @@ -36,6 +40,7 @@ export const init: Init = function init(this: MongooseAdapter) { }, ...schemaOptions, }, + compoundIndexes: buildVersionCompoundIndexes({ indexes: collection.sanitizedIndexes }), configFields: versionCollectionFields, payload: this.payload, }) diff --git a/packages/db-mongodb/src/models/buildCollectionSchema.ts b/packages/db-mongodb/src/models/buildCollectionSchema.ts index 8c4070f865..01eb24acd1 100644 --- a/packages/db-mongodb/src/models/buildCollectionSchema.ts +++ b/packages/db-mongodb/src/models/buildCollectionSchema.ts @@ -23,6 +23,7 @@ export const buildCollectionSchema = ( ...schemaOptions, }, }, + compoundIndexes: collection.sanitizedIndexes, configFields: collection.fields, payload, }) diff --git a/packages/db-mongodb/src/models/buildSchema.ts b/packages/db-mongodb/src/models/buildSchema.ts index bd350ca171..4cd833ccec 100644 --- a/packages/db-mongodb/src/models/buildSchema.ts +++ b/packages/db-mongodb/src/models/buildSchema.ts @@ -2,7 +2,6 @@ import type { IndexOptions, Schema, SchemaOptions, SchemaTypeOptions } from 'mon import mongoose from 'mongoose' import { - APIError, type ArrayField, type BlocksField, type CheckboxField, @@ -22,6 +21,7 @@ import { type RelationshipField, type RichTextField, type RowField, + type SanitizedCompoundIndex, type SanitizedLocalizationConfig, type SelectField, type Tab, @@ -128,6 +128,7 @@ const localizeSchema = ( export const buildSchema = (args: { buildSchemaOptions: BuildSchemaOptions + compoundIndexes?: SanitizedCompoundIndex[] configFields: Field[] parentIsLocalized?: boolean payload: Payload @@ -166,6 +167,26 @@ export const buildSchema = (args: { } }) + if (args.compoundIndexes) { + for (const index of args.compoundIndexes) { + const indexDefinition: Record = {} + + for (const field of index.fields) { + if (field.pathHasLocalized && payload.config.localization) { + for (const locale of payload.config.localization.locales) { + indexDefinition[field.localizedPath.replace('', locale.code)] = 1 + } + } else { + indexDefinition[field.path] = 1 + } + } + + schema.index(indexDefinition, { + unique: args.buildSchemaOptions.disableUnique ? false : index.unique, + }) + } + } + return schema } diff --git a/packages/drizzle/src/schema/build.ts b/packages/drizzle/src/schema/build.ts index 045c7fd251..746ad3aada 100644 --- a/packages/drizzle/src/schema/build.ts +++ b/packages/drizzle/src/schema/build.ts @@ -1,5 +1,6 @@ -import type { FlattenedField } from 'payload' +import type { FlattenedField, SanitizedCompoundIndex } from 'payload' +import { InvalidConfiguration } from 'payload' import toSnakeCase from 'to-snake-case' import type { @@ -33,6 +34,7 @@ type Args = { baseIndexes?: Record buildNumbers?: boolean buildRelationships?: boolean + compoundIndexes?: SanitizedCompoundIndex[] disableNotNull: boolean disableRelsTableUnique?: boolean disableUnique: boolean @@ -68,6 +70,7 @@ export const buildTable = ({ baseColumns = {}, baseForeignKeys = {}, baseIndexes = {}, + compoundIndexes, disableNotNull, disableRelsTableUnique = false, disableUnique = false, @@ -268,6 +271,61 @@ export const buildTable = ({ adapter.rawRelations[localeTableName] = localeRelations } + if (compoundIndexes) { + for (const index of compoundIndexes) { + let someLocalized: boolean | null = null + const columns: string[] = [] + + const getTableToUse = () => { + if (someLocalized) { + return localesTable + } + + return table + } + + for (const { path, pathHasLocalized } of index.fields) { + if (someLocalized === null) { + someLocalized = pathHasLocalized + } + + if (someLocalized !== pathHasLocalized) { + throw new InvalidConfiguration( + `Compound indexes within localized and non localized fields are not supported in SQL. Expected ${path} to be ${someLocalized ? 'non' : ''} localized.`, + ) + } + + const columnPath = path.replaceAll('.', '_') + + if (!getTableToUse().columns[columnPath]) { + throw new InvalidConfiguration( + `Column ${columnPath} for compound index on ${path} was not found in the ${getTableToUse().name} table.`, + ) + } + + columns.push(columnPath) + } + + if (someLocalized) { + columns.push('_locale') + } + + let name = columns.join('_') + // truncate against the limit, buildIndexName will handle collisions + if (name.length > 63) { + name = 'compound_index' + } + + const indexName = buildIndexName({ name, adapter }) + + getTableToUse().indexes[indexName] = { + name: indexName, + on: columns, + unique: disableUnique ? false : index.unique, + } + } + } + if (isRoot) { if (hasManyTextField) { const textsTableName = `${rootTableName}_texts` diff --git a/packages/drizzle/src/schema/buildRawSchema.ts b/packages/drizzle/src/schema/buildRawSchema.ts index 101118f182..a669753235 100644 --- a/packages/drizzle/src/schema/buildRawSchema.ts +++ b/packages/drizzle/src/schema/buildRawSchema.ts @@ -1,4 +1,8 @@ -import { buildVersionCollectionFields, buildVersionGlobalFields } from 'payload' +import { + buildVersionCollectionFields, + buildVersionCompoundIndexes, + buildVersionGlobalFields, +} from 'payload' import toSnakeCase from 'to-snake-case' import type { DrizzleAdapter, RawIndex, SetColumnID } from '../types.js' @@ -52,6 +56,7 @@ export const buildRawSchema = ({ buildTable({ adapter, + compoundIndexes: collection.sanitizedIndexes, disableNotNull: !!collection?.versions?.drafts, disableUnique: false, fields: collection.flattenedFields, @@ -70,6 +75,7 @@ export const buildRawSchema = ({ buildTable({ adapter, + compoundIndexes: buildVersionCompoundIndexes({ indexes: collection.sanitizedIndexes }), disableNotNull: !!collection.versions?.drafts, disableUnique: true, fields: versionFields, diff --git a/packages/drizzle/src/schema/traverseFields.ts b/packages/drizzle/src/schema/traverseFields.ts index d5243366a5..f82bd34335 100644 --- a/packages/drizzle/src/schema/traverseFields.ts +++ b/packages/drizzle/src/schema/traverseFields.ts @@ -1,4 +1,4 @@ -import type { FlattenedField } from 'payload' +import type { CompoundIndex, FlattenedField } from 'payload' import { InvalidConfiguration } from 'payload' import { diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 9170a0234d..5894670860 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -17,7 +17,15 @@ import { createClientFields } from '../../fields/config/client.js' export type ServerOnlyCollectionProperties = keyof Pick< SanitizedCollectionConfig, - 'access' | 'custom' | 'endpoints' | 'flattenedFields' | 'hooks' | 'joins' | 'polymorphicJoins' + | 'access' + | 'custom' + | 'endpoints' + | 'flattenedFields' + | 'hooks' + | 'indexes' + | 'joins' + | 'polymorphicJoins' + | 'sanitizedIndexes' > export type ServerOnlyCollectionAdminProperties = keyof Pick< @@ -70,6 +78,8 @@ const serverOnlyCollectionProperties: Partial[] 'joins', 'polymorphicJoins', 'flattenedFields', + 'indexes', + 'sanitizedIndexes', // `upload` // `admin` // are all handled separately diff --git a/packages/payload/src/collections/config/defaults.ts b/packages/payload/src/collections/config/defaults.ts index 1c44245bae..3211688320 100644 --- a/packages/payload/src/collections/config/defaults.ts +++ b/packages/payload/src/collections/config/defaults.ts @@ -48,6 +48,7 @@ export const defaults: Partial = { me: [], refresh: [], }, + indexes: [], timestamps: true, upload: false, versions: false, diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index 401f0f6c63..c97ad6d57e 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -2,6 +2,7 @@ import type { Config, SanitizedConfig } from '../../config/types.js' import type { CollectionConfig, + CompoundIndex, SanitizedCollectionConfig, SanitizedJoin, SanitizedJoins, @@ -26,6 +27,7 @@ import { addDefaultsToLoginWithUsernameConfig, } from './defaults.js' import { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js' +import { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js' import { validateUseAsTitle } from './useAsTitle.js' export const sanitizeCollection = async ( @@ -241,5 +243,10 @@ export const sanitizeCollection = async ( sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields }) + sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({ + fields: sanitizedConfig.flattenedFields, + indexes: sanitizedConfig.indexes, + }) + return sanitizedConfig } diff --git a/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts b/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts new file mode 100644 index 0000000000..38f83fc49d --- /dev/null +++ b/packages/payload/src/collections/config/sanitizeCompoundIndexes.ts @@ -0,0 +1,40 @@ +import type { FlattenedField } from '../../fields/config/types.js' +import type { CompoundIndex, SanitizedCompoundIndex } from './types.js' + +import { InvalidConfiguration } from '../../errors/InvalidConfiguration.js' +import { getFieldByPath } from '../../utilities/getFieldByPath.js' + +export const sanitizeCompoundIndexes = ({ + fields, + indexes, +}: { + fields: FlattenedField[] + indexes: CompoundIndex[] +}): SanitizedCompoundIndex[] => { + const sanitizedCompoundIndexes: SanitizedCompoundIndex[] = [] + + for (const index of indexes) { + const sanitized: SanitizedCompoundIndex = { fields: [], unique: index.unique ?? false } + for (const path of index.fields) { + const result = getFieldByPath({ fields, path }) + + if (!result) { + throw new InvalidConfiguration(`Field ${path} was not found`) + } + + const { field, localizedPath, pathHasLocalized } = result + + if (['array', 'blocks', 'group', 'tab'].includes(field.type)) { + throw new InvalidConfiguration( + `Compound index on ${field.type} cannot be set. Path: ${localizedPath}`, + ) + } + + sanitized.fields.push({ field, localizedPath, path, pathHasLocalized }) + } + + sanitizedCompoundIndexes.push(sanitized) + } + + return sanitizedCompoundIndexes +} diff --git a/packages/payload/src/collections/config/types.ts b/packages/payload/src/collections/config/types.ts index af92b83724..7221eea5f7 100644 --- a/packages/payload/src/collections/config/types.ts +++ b/packages/payload/src/collections/config/types.ts @@ -464,6 +464,16 @@ export type CollectionConfig = { */ refresh?: RefreshHook[] } + /** + * Define compound indexes for this collection. + * This can be used to either speed up querying/sorting by 2 or more fields at the same time or + * to ensure uniqueness between several fields. + * Specify field paths + * @example + * [{ unique: true, fields: ['title', 'group.name'] }] + * @default [] + */ + indexes?: CompoundIndex[] /** * Label configuration */ @@ -542,7 +552,6 @@ export interface SanitizedCollectionConfig auth: Auth endpoints: Endpoint[] | false fields: Field[] - /** * Fields in the database schema structure * Rows / collapsible / tabs w/o name `fields` merged to top, UIs are excluded @@ -559,6 +568,8 @@ export interface SanitizedCollectionConfig */ polymorphicJoins: SanitizedJoin[] + sanitizedIndexes: SanitizedCompoundIndex[] + slug: CollectionSlug upload: SanitizedUploadConfig versions: SanitizedCollectionVersions @@ -602,3 +613,18 @@ export type TypeWithTimestamps = { id: number | string updatedAt: string } + +export type CompoundIndex = { + fields: string[] + unique?: boolean +} + +export type SanitizedCompoundIndex = { + fields: { + field: FlattenedField + localizedPath: string + path: string + pathHasLocalized: boolean + }[] + unique: boolean +} diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index a657cddaae..349befae35 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1058,6 +1058,8 @@ export type { TypeWithID, TypeWithTimestamps, } from './collections/config/types.js' +export type { CompoundIndex } from './collections/config/types.js' +export type { SanitizedCompoundIndex } from './collections/config/types.js' export { createDataloaderCacheKey, getDataLoader } from './collections/dataloader.js' export { countOperation } from './collections/operations/count.js' export { createOperation } from './collections/operations/create.js' @@ -1072,6 +1074,7 @@ export { findVersionsOperation } from './collections/operations/findVersions.js' export { restoreVersionOperation } from './collections/operations/restoreVersion.js' export { updateOperation } from './collections/operations/update.js' export { updateByIDOperation } from './collections/operations/updateByID.js' + export { buildConfig } from './config/build.js' export { type ClientConfig, @@ -1080,7 +1083,6 @@ export { serverOnlyConfigProperties, type UnsanitizedClientConfig, } from './config/client.js' - export { defaults } from './config/defaults.js' export { sanitizeConfig } from './config/sanitize.js' export type * from './config/types.js' @@ -1193,10 +1195,11 @@ export { ValidationError, ValidationErrorName, } from './errors/index.js' + export type { ValidationFieldError } from './errors/index.js' export { baseBlockFields } from './fields/baseFields/baseBlockFields.js' - export { baseIDField } from './fields/baseFields/baseIDField.js' + export { createClientField, createClientFields, @@ -1308,12 +1311,12 @@ export type { ValueWithRelation, } from './fields/config/types.js' export { getDefaultValue } from './fields/getDefaultValue.js' - export { traverseFields as afterChangeTraverseFields } from './fields/hooks/afterChange/traverseFields.js' export { promise as afterReadPromise } from './fields/hooks/afterRead/promise.js' export { traverseFields as afterReadTraverseFields } from './fields/hooks/afterRead/traverseFields.js' export { traverseFields as beforeChangeTraverseFields } from './fields/hooks/beforeChange/traverseFields.js' export { traverseFields as beforeValidateTraverseFields } from './fields/hooks/beforeValidate/traverseFields.js' + export { default as sortableFieldTypes } from './fields/sortableFieldTypes.js' export { validations } from './fields/validations.js' @@ -1348,6 +1351,7 @@ export type { UploadFieldValidation, UsernameFieldValidation, } from './fields/validations.js' + export { type ClientGlobalConfig, createClientGlobalConfig, @@ -1367,9 +1371,7 @@ export type { GlobalConfig, SanitizedGlobalConfig, } from './globals/config/types.js' - export { docAccessOperation as docAccessOperationGlobal } from './globals/operations/docAccess.js' - export { findOneOperation } from './globals/operations/findOne.js' export { findVersionByIDOperation as findVersionByIDOperationGlobal } from './globals/operations/findVersionByID.js' export { findVersionsOperation as findVersionsOperationGlobal } from './globals/operations/findVersions.js' @@ -1414,9 +1416,9 @@ export { importHandlerPath } from './queues/operations/runJobs/runJob/importHand export { getLocalI18n } from './translations/getLocalI18n.js' export * from './types/index.js' export { getFileByPath } from './uploads/getFileByPath.js' + export type * from './uploads/types.js' export { addDataAndFileToRequest } from './utilities/addDataAndFileToRequest.js' - export { addLocalesToRequestFromData, sanitizeLocales } from './utilities/addLocalesToRequest.js' export { commitTransaction } from './utilities/commitTransaction.js' export { @@ -1478,6 +1480,7 @@ export { traverseFields } from './utilities/traverseFields.js' export type { TraverseFieldsCallback } from './utilities/traverseFields.js' export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' export { buildVersionGlobalFields } from './versions/buildGlobalFields.js' +export { buildVersionCompoundIndexes } from './versions/buildVersionCompoundIndexes.js' export { versionDefaults } from './versions/defaults.js' export { deleteCollectionVersions } from './versions/deleteCollectionVersions.js' export { enforceMaxVersions } from './versions/enforceMaxVersions.js' diff --git a/packages/payload/src/utilities/getFieldByPath.ts b/packages/payload/src/utilities/getFieldByPath.ts new file mode 100644 index 0000000000..7760eacebf --- /dev/null +++ b/packages/payload/src/utilities/getFieldByPath.ts @@ -0,0 +1,70 @@ +import type { FlattenedField } from '../fields/config/types.js' + +/** + * Get the field from by its path. + * Can accept nested paths, e.g: group.title, array.group.title + * If there were any localized on the path, pathHasLocalized will be true and localizedPath will look like: + * group..title // group is localized here + */ +export const getFieldByPath = ({ + fields, + localizedPath = '', + path, +}: { + fields: FlattenedField[] + localizedPath?: string + path: string +}): { + field: FlattenedField + localizedPath: string + pathHasLocalized: boolean +} | null => { + let currentFields: FlattenedField[] = fields + + let currentField: FlattenedField | null = null + + const segments = path.split('.') + + let pathHasLocalized = false + + while (segments.length > 0) { + const segment = segments.shift() + localizedPath = `${localizedPath ? `${localizedPath}.` : ''}${segment}` + const field = currentFields.find((each) => each.name === segment) + + if (!field) { + return null + } + + if (field.localized) { + pathHasLocalized = true + localizedPath = `${localizedPath}.` + } + + if ('flattenedFields' in field) { + currentFields = field.flattenedFields + } + + if ('blocks' in field) { + for (const block of field.blocks) { + const maybeField = getFieldByPath({ + fields: block.flattenedFields, + localizedPath, + path: [...segments].join('.'), + }) + + if (maybeField) { + return maybeField + } + } + } + + currentField = field + } + + if (!currentField) { + return null + } + + return { field: currentField, localizedPath, pathHasLocalized } +} diff --git a/packages/payload/src/versions/buildVersionCompoundIndexes.ts b/packages/payload/src/versions/buildVersionCompoundIndexes.ts new file mode 100644 index 0000000000..3a5ccdfb7b --- /dev/null +++ b/packages/payload/src/versions/buildVersionCompoundIndexes.ts @@ -0,0 +1,17 @@ +import type { SanitizedCompoundIndex } from '../collections/config/types.js' + +export const buildVersionCompoundIndexes = ({ + indexes, +}: { + indexes: SanitizedCompoundIndex[] +}): SanitizedCompoundIndex[] => { + return indexes.map((each) => ({ + fields: each.fields.map(({ field, localizedPath, path, pathHasLocalized }) => ({ + field, + localizedPath: `version.${localizedPath}`, + path: `version.${path}`, + pathHasLocalized, + })), + unique: false, + })) +} diff --git a/test/database/config.ts b/test/database/config.ts index 14a086186c..7e372c6f6f 100644 --- a/test/database/config.ts +++ b/test/database/config.ts @@ -4,10 +4,9 @@ const filename = fileURLToPath(import.meta.url) const dirname = path.dirname(filename) import type { TextField } from 'payload' -import { v4 as uuid } from 'uuid' +import { randomUUID } from 'crypto' import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' -import { devUser } from '../credentials.js' import { seed } from './seed.js' import { customIDsSlug, @@ -501,7 +500,7 @@ export default buildConfigWithDefaults({ beforeChange: [ ({ value, operation }) => { if (operation === 'create') { - return uuid() + return randomUUID() } return value }, @@ -564,6 +563,43 @@ export default buildConfigWithDefaults({ ], versions: true, }, + { + slug: 'compound-indexes', + fields: [ + { + name: 'one', + type: 'text', + }, + { + name: 'two', + type: 'text', + }, + { + name: 'three', + type: 'text', + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'four', + type: 'text', + }, + ], + }, + ], + indexes: [ + { + fields: ['one', 'two'], + unique: true, + }, + { + fields: ['three', 'group.four'], + unique: true, + }, + ], + }, ], globals: [ { diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index 9b76303088..1509b5f980 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -7,6 +7,7 @@ import { migrateRelationshipsV2_V3, migrateVersionsV1_V2, } from '@payloadcms/db-mongodb/migration-utils' +import { randomUUID } from 'crypto' import { type Table } from 'drizzle-orm' import * as drizzlePg from 'drizzle-orm/pg-core' import * as drizzleSqlite from 'drizzle-orm/sqlite-core' @@ -305,6 +306,68 @@ describe('database', () => { }) }) + describe('Compound Indexes', () => { + beforeEach(async () => { + await payload.delete({ collection: 'compound-indexes', where: {} }) + }) + + it('top level: should throw a unique error', async () => { + await payload.create({ + collection: 'compound-indexes', + data: { three: randomUUID(), one: '1', two: '2' }, + }) + + // does not fail + await payload.create({ + collection: 'compound-indexes', + data: { three: randomUUID(), one: '1', two: '3' }, + }) + // does not fail + await payload.create({ + collection: 'compound-indexes', + data: { three: randomUUID(), one: '-1', two: '2' }, + }) + + // fails + await expect( + payload.create({ + collection: 'compound-indexes', + data: { three: randomUUID(), one: '1', two: '2' }, + }), + ).rejects.toBeTruthy() + }) + + it('combine group and top level: should throw a unique error', async () => { + await payload.create({ + collection: 'compound-indexes', + data: { + one: randomUUID(), + three: '3', + group: { four: '4' }, + }, + }) + + // does not fail + await payload.create({ + collection: 'compound-indexes', + data: { one: randomUUID(), three: '3', group: { four: '5' } }, + }) + // does not fail + await payload.create({ + collection: 'compound-indexes', + data: { one: randomUUID(), three: '4', group: { four: '4' } }, + }) + + // fails + await expect( + payload.create({ + collection: 'compound-indexes', + data: { one: randomUUID(), three: '3', group: { four: '4' } }, + }), + ).rejects.toBeTruthy() + }) + }) + describe('migrations', () => { let ranFreshTest = false diff --git a/test/database/payload-types.ts b/test/database/payload-types.ts index d2f2334eaa..a80a82aa00 100644 --- a/test/database/payload-types.ts +++ b/test/database/payload-types.ts @@ -78,6 +78,7 @@ export interface Config { 'custom-ids': CustomId; 'fake-custom-ids': FakeCustomId; 'relationships-migration': RelationshipsMigration; + 'compound-indexes': CompoundIndex; users: User; 'payload-locked-documents': PayloadLockedDocument; 'payload-preferences': PayloadPreference; @@ -97,6 +98,7 @@ export interface Config { 'custom-ids': CustomIdsSelect | CustomIdsSelect; 'fake-custom-ids': FakeCustomIdsSelect | FakeCustomIdsSelect; 'relationships-migration': RelationshipsMigrationSelect | RelationshipsMigrationSelect; + 'compound-indexes': CompoundIndexesSelect | CompoundIndexesSelect; users: UsersSelect | UsersSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; @@ -400,6 +402,21 @@ export interface RelationshipsMigration { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "compound-indexes". + */ +export interface CompoundIndex { + id: string; + one?: string | null; + two?: string | null; + three?: string | null; + group?: { + four?: string | null; + }; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users". @@ -472,6 +489,10 @@ export interface PayloadLockedDocument { relationTo: 'relationships-migration'; value: string | RelationshipsMigration; } | null) + | ({ + relationTo: 'compound-indexes'; + value: string | CompoundIndex; + } | null) | ({ relationTo: 'users'; value: string | User; @@ -755,6 +776,22 @@ export interface RelationshipsMigrationSelect { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "compound-indexes_select". + */ +export interface CompoundIndexesSelect { + one?: T; + two?: T; + three?: T; + group?: + | T + | { + four?: T; + }; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "users_select". From e36ab6aa2a876f4711a98e9d9c2bbf42abf55059 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 03:11:54 +0200 Subject: [PATCH 093/127] fix(storage-gcs): client uploads are enabled even if `clientUploads` is not set (#11527) Client uploads were always enabled because a wrong variable was used, when passing `enabled` to `initClientUploads`, `gcsStorageOptions.enabled` instead of `gcsStorageOptions.clientUploads` To enable client uploads with GCS you also additionally need to configure CORS on Google Cloud, therefore this change breaks existing logic --- packages/storage-gcs/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storage-gcs/src/index.ts b/packages/storage-gcs/src/index.ts index aca5f9b5c1..b64507755b 100644 --- a/packages/storage-gcs/src/index.ts +++ b/packages/storage-gcs/src/index.ts @@ -72,7 +72,7 @@ export const gcsStorage: GcsStoragePlugin = clientHandler: '@payloadcms/storage-gcs/client#GcsClientUploadHandler', collections: gcsStorageOptions.collections, config: incomingConfig, - enabled: !isPluginDisabled && Boolean(gcsStorageOptions.enabled), + enabled: !isPluginDisabled && Boolean(gcsStorageOptions.clientUploads), serverHandler: getGenerateSignedURLHandler({ access: typeof gcsStorageOptions.clientUploads === 'object' From 672dace96969b028ea30fb2f84aa154ff4b62756 Mon Sep 17 00:00:00 2001 From: Dan Ribbens Date: Tue, 4 Mar 2025 21:18:35 -0500 Subject: [PATCH 094/127] chore: add plugin-import-export to publishList release tool (#11535) --- tools/releaser/src/lib/publishList.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/releaser/src/lib/publishList.ts b/tools/releaser/src/lib/publishList.ts index 3b151fd354..7bb869b5b1 100644 --- a/tools/releaser/src/lib/publishList.ts +++ b/tools/releaser/src/lib/publishList.ts @@ -40,6 +40,7 @@ export const packagePublishList = [ 'plugin-cloud', 'plugin-cloud-storage', 'plugin-form-builder', + 'plugin-import-export', 'plugin-multi-tenant', 'plugin-nested-docs', 'plugin-redirects', From f0ea9185ef4fe3b8242be640fde88a6f99f0980c Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 04:23:03 +0200 Subject: [PATCH 095/127] chore: indexes are not iterable, corrects `indexes` default value sanitization (#11534) The PR https://github.com/payloadcms/payload/pull/11512 was merged without changes from this PR https://github.com/payloadcms/payload/pull/11524 Which caused all the tests to fail: image Corrects default value sanitization with the new strategy from #11524 --- packages/payload/src/collections/config/defaults.ts | 2 ++ packages/payload/src/collections/config/sanitize.ts | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/payload/src/collections/config/defaults.ts b/packages/payload/src/collections/config/defaults.ts index 3211688320..eb338df75e 100644 --- a/packages/payload/src/collections/config/defaults.ts +++ b/packages/payload/src/collections/config/defaults.ts @@ -108,6 +108,8 @@ export const addDefaultsToCollectionConfig = (collection: CollectionConfig): Col collection.upload = collection.upload ?? false collection.versions = collection.versions ?? false + collection.indexes = collection.indexes ?? [] + return collection } diff --git a/packages/payload/src/collections/config/sanitize.ts b/packages/payload/src/collections/config/sanitize.ts index c97ad6d57e..ae62293289 100644 --- a/packages/payload/src/collections/config/sanitize.ts +++ b/packages/payload/src/collections/config/sanitize.ts @@ -2,7 +2,6 @@ import type { Config, SanitizedConfig } from '../../config/types.js' import type { CollectionConfig, - CompoundIndex, SanitizedCollectionConfig, SanitizedJoin, SanitizedJoins, From 8f203bbbe1ee542f2f485c7c9a98e85d93d4d31e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Tue, 4 Mar 2025 23:05:34 -0500 Subject: [PATCH 096/127] chore: cleanup generated configs (#11536) Cleans up various Payload-generated configs, namely: - Renames config entry files from `preferencesCollection.ts`, `lockedDocumentsCollection.ts`, and `jobsCollection.ts` to `config.ts` - Standardizes collection slugs for `payload-preferences`, `payload-locked-documents`, and `payload-jobs` and reuses everywhere - Renames camel-cased `payloadPreferences` directory to kebab case, i.e. `payload-preferences` --- .../payload/src/collections/operations/find.ts | 3 ++- .../src/collections/operations/findByID.ts | 3 ++- packages/payload/src/config/sanitize.ts | 15 +++++++++------ .../payload/src/globals/operations/findOne.ts | 3 ++- .../config.ts} | 4 +++- .../{preferencesCollection.ts => config.ts} | 8 ++++---- .../src/preferences/deleteUserPreferences.ts | 6 ++++-- .../payload/src/preferences/operations/delete.ts | 3 ++- .../payload/src/preferences/operations/findOne.ts | 4 +++- .../payload/src/preferences/operations/update.ts | 5 ++--- .../queues/config/{jobsCollection.ts => index.ts} | 4 +++- packages/payload/src/queues/localAPI.ts | 7 ++++--- .../src/queues/operations/runJobs/index.ts | 7 ++++--- .../runJobs/runJob/getUpdateJobFunction.ts | 4 +++- .../src/utilities/checkDocumentLockStatus.ts | 5 +++-- .../src/utilities/sanitizePermissions.spec.ts | 3 ++- .../src/versions/deleteScheduledPublishJobs.ts | 3 ++- 17 files changed, 54 insertions(+), 33 deletions(-) rename packages/payload/src/{lockedDocuments/lockedDocumentsCollection.ts => locked-documents/config.ts} (88%) rename packages/payload/src/preferences/{preferencesCollection.ts => config.ts} (91%) rename packages/payload/src/queues/config/{jobsCollection.ts => index.ts} (98%) diff --git a/packages/payload/src/collections/operations/find.ts b/packages/payload/src/collections/operations/find.ts index 0de5ba87a8..766a4526e4 100644 --- a/packages/payload/src/collections/operations/find.ts +++ b/packages/payload/src/collections/operations/find.ts @@ -21,6 +21,7 @@ import { combineQueries } from '../../database/combineQueries.js' import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js' import { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { killTransaction } from '../../utilities/killTransaction.js' import { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js' import { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js' @@ -199,7 +200,7 @@ export const findOperation = async < const now = new Date().getTime() const lockedDocuments = await payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: sanitizedLimit, overrideAccess: false, diff --git a/packages/payload/src/collections/operations/findByID.ts b/packages/payload/src/collections/operations/findByID.ts index 135b23d3dd..dfb2a2c5c4 100644 --- a/packages/payload/src/collections/operations/findByID.ts +++ b/packages/payload/src/collections/operations/findByID.ts @@ -20,6 +20,7 @@ import { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js' import { NotFound } from '../../errors/index.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' import { validateQueryPaths } from '../../index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { killTransaction } from '../../utilities/killTransaction.js' import replaceWithDraftIfAvailable from '../../versions/drafts/replaceWithDraftIfAvailable.js' import { buildAfterOperation } from './utils.js' @@ -162,7 +163,7 @@ export const findByIDOperation = async < const lockDurationInMilliseconds = lockDuration * 1000 const lockedDocument = await req.payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: 1, overrideAccess: false, diff --git a/packages/payload/src/config/sanitize.ts b/packages/payload/src/config/sanitize.ts index 5a475f3ee5..aaff0a1271 100644 --- a/packages/payload/src/config/sanitize.ts +++ b/packages/payload/src/config/sanitize.ts @@ -26,9 +26,12 @@ import { type GlobalSlug, sanitizeFields, } from '../index.js' -import { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js' -import getPreferencesCollection from '../preferences/preferencesCollection.js' -import { getDefaultJobsCollection } from '../queues/config/jobsCollection.js' +import { + getLockedDocumentsCollection, + lockedDocumentsCollectionSlug, +} from '../locked-documents/config.js' +import { getPreferencesCollection, preferencesCollectionSlug } from '../preferences/config.js' +import { getDefaultJobsCollection, jobsCollectionSlug } from '../queues/config/index.js' import { flattenBlock } from '../utilities/flattenAllFields.js' import { getSchedulePublishTask } from '../versions/schedule/job.js' import { addDefaultsToConfig } from './defaults.js' @@ -179,9 +182,9 @@ export const sanitizeConfig = async (incomingConfig: Config): Promise c.slug) ?? []), - 'payload-jobs', - 'payload-locked-documents', - 'payload-preferences', + jobsCollectionSlug, + lockedDocumentsCollectionSlug, + preferencesCollectionSlug, ] /** diff --git a/packages/payload/src/globals/operations/findOne.ts b/packages/payload/src/globals/operations/findOne.ts index 48c989e977..c721d4f87d 100644 --- a/packages/payload/src/globals/operations/findOne.ts +++ b/packages/payload/src/globals/operations/findOne.ts @@ -5,6 +5,7 @@ import type { SanitizedGlobalConfig } from '../config/types.js' import executeAccess from '../../auth/executeAccess.js' import { afterRead } from '../../fields/hooks/afterRead/index.js' +import { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js' import { getSelectMode } from '../../utilities/getSelectMode.js' import { killTransaction } from '../../utilities/killTransaction.js' import replaceWithDraftIfAvailable from '../../versions/drafts/replaceWithDraftIfAvailable.js' @@ -80,7 +81,7 @@ export const findOneOperation = async >( const lockDurationInMilliseconds = lockDuration * 1000 const lockedDocument = await req.payload.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, depth: 1, limit: 1, overrideAccess: false, diff --git a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts b/packages/payload/src/locked-documents/config.ts similarity index 88% rename from packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts rename to packages/payload/src/locked-documents/config.ts index 59fa37f916..b450b72a8e 100644 --- a/packages/payload/src/lockedDocuments/lockedDocumentsCollection.ts +++ b/packages/payload/src/locked-documents/config.ts @@ -2,8 +2,10 @@ import type { CollectionConfig } from '../collections/config/types.js' import type { Config } from '../config/types.js' +export const lockedDocumentsCollectionSlug = 'payload-locked-documents' + export const getLockedDocumentsCollection = (config: Config): CollectionConfig => ({ - slug: 'payload-locked-documents', + slug: lockedDocumentsCollectionSlug, admin: { hidden: true, }, diff --git a/packages/payload/src/preferences/preferencesCollection.ts b/packages/payload/src/preferences/config.ts similarity index 91% rename from packages/payload/src/preferences/preferencesCollection.ts rename to packages/payload/src/preferences/config.ts index c6b0d4d5c0..cb4cdb06b6 100644 --- a/packages/payload/src/preferences/preferencesCollection.ts +++ b/packages/payload/src/preferences/config.ts @@ -18,8 +18,10 @@ const preferenceAccess: Access = ({ req }) => { } } -const getPreferencesCollection = (config: Config): CollectionConfig => ({ - slug: 'payload-preferences', +export const preferencesCollectionSlug = 'payload-preferences' + +export const getPreferencesCollection = (config: Config): CollectionConfig => ({ + slug: preferencesCollectionSlug, access: { delete: preferenceAccess, read: preferenceAccess, @@ -91,5 +93,3 @@ const getPreferencesCollection = (config: Config): CollectionConfig => ({ ], lockDocuments: false, }) - -export default getPreferencesCollection diff --git a/packages/payload/src/preferences/deleteUserPreferences.ts b/packages/payload/src/preferences/deleteUserPreferences.ts index b1a5f6f0e2..8676f6492b 100644 --- a/packages/payload/src/preferences/deleteUserPreferences.ts +++ b/packages/payload/src/preferences/deleteUserPreferences.ts @@ -2,6 +2,8 @@ import type { SanitizedCollectionConfig } from '../collections/config/types.js' import type { Payload } from '../index.js' import type { PayloadRequest } from '../types/index.js' +import { preferencesCollectionSlug } from './config.js' + type Args = { collectionConfig: SanitizedCollectionConfig /** @@ -14,7 +16,7 @@ type Args = { export const deleteUserPreferences = async ({ collectionConfig, ids, payload, req }: Args) => { if (collectionConfig.auth) { await payload.db.deleteMany({ - collection: 'payload-preferences', + collection: preferencesCollectionSlug, req, where: { or: [ @@ -36,7 +38,7 @@ export const deleteUserPreferences = async ({ collectionConfig, ids, payload, re }) } else { await payload.db.deleteMany({ - collection: 'payload-preferences', + collection: preferencesCollectionSlug, req, where: { key: { in: ids.map((id) => `collection-${collectionConfig.slug}-${id}`) }, diff --git a/packages/payload/src/preferences/operations/delete.ts b/packages/payload/src/preferences/operations/delete.ts index da55d20b09..c52814be8f 100644 --- a/packages/payload/src/preferences/operations/delete.ts +++ b/packages/payload/src/preferences/operations/delete.ts @@ -3,6 +3,7 @@ import type { PreferenceRequest } from '../types.js' import { NotFound } from '../../errors/NotFound.js' import { UnauthorizedError } from '../../errors/UnauthorizedError.js' +import { preferencesCollectionSlug } from '../config.js' export async function deleteOperation(args: PreferenceRequest): Promise { const { @@ -25,7 +26,7 @@ export async function deleteOperation(args: PreferenceRequest): Promise { const { key, @@ -24,7 +26,7 @@ export async function findOne(args: PreferenceRequest): Promise CollectionConfig | null = (config) => { const workflowSlugs: Set = new Set() const taskSlugs: Set = new Set(['inline']) @@ -91,7 +93,7 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu } const jobsCollection: CollectionConfig = { - slug: 'payload-jobs', + slug: jobsCollectionSlug, admin: { group: 'System', hidden: true, diff --git a/packages/payload/src/queues/localAPI.ts b/packages/payload/src/queues/localAPI.ts index 0ecb0060ac..d2cb3c55bd 100644 --- a/packages/payload/src/queues/localAPI.ts +++ b/packages/payload/src/queues/localAPI.ts @@ -8,6 +8,7 @@ import { type TypedJobs, type Where, } from '../index.js' +import { jobsCollectionSlug } from './config/index.js' import { runJobs } from './operations/runJobs/index.js' export const getJobsLocalAPI = (payload: Payload) => ({ @@ -72,7 +73,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({ } return (await payload.create({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, data, req: args.req, })) as TTaskOrWorkflowSlug extends keyof TypedJobs['workflows'] @@ -143,7 +144,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({ } await payload.db.updateMany({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { completedAt: null, error: { @@ -172,7 +173,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({ await payload.db.updateOne({ id: args.id, - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { completedAt: null, error: { diff --git a/packages/payload/src/queues/operations/runJobs/index.ts b/packages/payload/src/queues/operations/runJobs/index.ts index 9c67a0444b..e474401b6c 100644 --- a/packages/payload/src/queues/operations/runJobs/index.ts +++ b/packages/payload/src/queues/operations/runJobs/index.ts @@ -12,6 +12,7 @@ import type { RunJobResult } from './runJob/index.js' import { Forbidden } from '../../../errors/Forbidden.js' import isolateObjectProperty from '../../../utilities/isolateObjectProperty.js' +import { jobsCollectionSlug } from '../../config/index.js' import { getUpdateJobFunction } from './runJob/getUpdateJobFunction.js' import { importHandlerPath } from './runJob/importHandlerPath.js' import { runJob } from './runJob/index.js' @@ -110,7 +111,7 @@ export const runJobs = async ({ docs: [ (await req.payload.update({ id, - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { processing: true, seenByWorker: true, @@ -122,7 +123,7 @@ export const runJobs = async ({ ], } : ((await req.payload.update({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: { processing: true, seenByWorker: true, @@ -253,7 +254,7 @@ export const runJobs = async ({ if (jobsToDelete && jobsToDelete.length > 0) { try { await req.payload.delete({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, req, where: { id: { in: jobsToDelete } }, }) diff --git a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts index 7390dcc9ca..5967792ec2 100644 --- a/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts +++ b/packages/payload/src/queues/operations/runJobs/runJob/getUpdateJobFunction.ts @@ -2,13 +2,15 @@ import type { PayloadRequest } from '../../../../types/index.js' import type { BaseJob } from '../../../config/types/workflowTypes.js' +import { jobsCollectionSlug } from '../../../config/index.js' + export type UpdateJobFunction = (jobData: Partial) => Promise export function getUpdateJobFunction(job: BaseJob, req: PayloadRequest): UpdateJobFunction { return async (jobData) => { const updatedJob = (await req.payload.update({ id: job.id, - collection: 'payload-jobs', + collection: jobsCollectionSlug, data: jobData, depth: 0, disableTransaction: true, diff --git a/packages/payload/src/utilities/checkDocumentLockStatus.ts b/packages/payload/src/utilities/checkDocumentLockStatus.ts index 87accb2f54..a8c334bb30 100644 --- a/packages/payload/src/utilities/checkDocumentLockStatus.ts +++ b/packages/payload/src/utilities/checkDocumentLockStatus.ts @@ -3,6 +3,7 @@ import type { PaginatedDocs } from '../database/types.js' import type { JsonObject, PayloadRequest } from '../types/index.js' import { Locked } from '../errors/index.js' +import { lockedDocumentsCollectionSlug } from '../locked-documents/config.js' type CheckDocumentLockStatusArgs = { collectionSlug?: string @@ -60,7 +61,7 @@ export const checkDocumentLockStatus = async ({ const finalLockErrorMessage = lockErrorMessage || defaultLockErrorMessage const lockedDocumentResult: PaginatedDocs = await payload.db.find({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, limit: 1, pagination: false, sort: '-updatedAt', @@ -91,7 +92,7 @@ export const checkDocumentLockStatus = async ({ // Perform the delete operation regardless of overrideLock status await payload.db.deleteMany({ - collection: 'payload-locked-documents', + collection: lockedDocumentsCollectionSlug, // Not passing req fails on postgres req: payload.db.name === 'mongoose' ? undefined : req, where: lockedDocumentQuery, diff --git a/packages/payload/src/utilities/sanitizePermissions.spec.ts b/packages/payload/src/utilities/sanitizePermissions.spec.ts index b21fd90e2a..7c15b7a3e7 100644 --- a/packages/payload/src/utilities/sanitizePermissions.spec.ts +++ b/packages/payload/src/utilities/sanitizePermissions.spec.ts @@ -1,4 +1,5 @@ import type { CollectionPermission, Permissions } from '../auth/types.js' +import { preferencesCollectionSlug } from '../preferences/config.js' import { sanitizePermissions } from './sanitizePermissions.js' @@ -1561,7 +1562,7 @@ describe('sanitizePermissions', () => { const permissions: Permissions = { canAccessAdmin: false, collections: { - 'payload-preferences': { + preferencesCollectionSlug: { fields: { user: { create: { diff --git a/packages/payload/src/versions/deleteScheduledPublishJobs.ts b/packages/payload/src/versions/deleteScheduledPublishJobs.ts index 6d6faf8617..4020ad4fd6 100644 --- a/packages/payload/src/versions/deleteScheduledPublishJobs.ts +++ b/packages/payload/src/versions/deleteScheduledPublishJobs.ts @@ -1,6 +1,7 @@ import type { PayloadRequest } from '../types/index.js' import { type Payload } from '../index.js' +import { jobsCollectionSlug } from '../queues/config/index.js' type Args = { id?: number | string @@ -17,7 +18,7 @@ export const deleteScheduledPublishJobs = async ({ }: Args): Promise => { try { await payload.db.deleteMany({ - collection: 'payload-jobs', + collection: jobsCollectionSlug, req, where: { and: [ From 31e217967ec8507e0fdbbc052704b101efdbcf02 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 16:05:19 +0200 Subject: [PATCH 097/127] fix(ui): execute client upload handler only when file exists (#11538) Fixes https://github.com/payloadcms/payload/issues/11537 --- .../src/elements/BulkUpload/FormsManager/createFormData.ts | 7 +++---- packages/ui/src/forms/Form/index.tsx | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts index 68d0594303..b58c03d9d5 100644 --- a/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts +++ b/packages/ui/src/elements/BulkUpload/FormsManager/createFormData.ts @@ -18,11 +18,10 @@ export async function createFormData( delete data.file } - let clientUploadContext = null - - if (typeof uploadHandler === 'function') { + if (file && typeof uploadHandler === 'function') { let filename = file.name - clientUploadContext = await uploadHandler({ + + const clientUploadContext = await uploadHandler({ file, updateFilename: (value) => { filename = value diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 319ba9c090..63be10e3ac 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -507,10 +507,9 @@ export const Form: React.FC = (props) => { const handler = getUploadHandler({ collectionSlug }) - if (typeof handler === 'function') { - let clientUploadContext = null + if (file && typeof handler === 'function') { let filename = file.name - clientUploadContext = await handler({ + const clientUploadContext = await handler({ file, updateFilename: (value) => { filename = value From 62c0872bbb8194610f5d918a4c9c80924cb2b79c Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 16:21:24 +0200 Subject: [PATCH 098/127] test: add unit tests for `getFieldByPath` (#11533) Adds unit tests for the new function `getFieldByPath` that was added here https://github.com/payloadcms/payload/pull/11512 --- .../src/utilities/getFieldByPath.spec.ts | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 packages/payload/src/utilities/getFieldByPath.spec.ts diff --git a/packages/payload/src/utilities/getFieldByPath.spec.ts b/packages/payload/src/utilities/getFieldByPath.spec.ts new file mode 100644 index 0000000000..414b38147b --- /dev/null +++ b/packages/payload/src/utilities/getFieldByPath.spec.ts @@ -0,0 +1,108 @@ +import { assert } from 'ts-essentials' +import { flattenAllFields } from './flattenAllFields.js' +import { getFieldByPath } from './getFieldByPath.js' +import type { FlattenedArrayField, FlattenedGroupField } from '../fields/config/types.js' + +const fields = flattenAllFields({ + fields: [ + { + type: 'text', + name: 'text', + }, + { + type: 'text', + name: 'textLocalized', + localized: true, + }, + { + type: 'array', + name: 'array', + fields: [ + { + name: 'text', + type: 'text', + }, + { + name: 'textLocalized', + localized: true, + type: 'text', + }, + { + name: 'group', + type: 'group', + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }, + { + type: 'tabs', + tabs: [ + { + name: 'tab', + fields: [ + { + type: 'array', + name: 'localizedArray', + localized: true, + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }, + ], + }, + ], +}) + +describe('getFieldByPath', () => { + it('asserts getFieldByPath', () => { + const assert_1 = getFieldByPath({ fields, path: 'text' }) + assert(assert_1) + expect(assert_1.field).toBe(fields[0]) + expect(assert_1.pathHasLocalized).toBe(false) + + const assert_2 = getFieldByPath({ fields, path: 'textLocalized' }) + assert(assert_2) + expect(assert_2.field).toBe(fields[1]) + expect(assert_2.pathHasLocalized).toBe(true) + expect(assert_2.localizedPath).toBe('textLocalized.') + + const arrayField = fields[2] as FlattenedArrayField + const assert_3 = getFieldByPath({ fields, path: 'array' }) + assert(assert_3) + expect(assert_3.field).toBe(arrayField) + expect(assert_3.pathHasLocalized).toBe(false) + + const assert_4 = getFieldByPath({ fields, path: 'array.text' }) + assert(assert_4) + expect(assert_4.field).toBe(arrayField.flattenedFields[0]) + expect(assert_4.pathHasLocalized).toBe(false) + + const assert_5 = getFieldByPath({ fields, path: 'array.textLocalized' }) + assert(assert_5) + expect(assert_5.field).toBe(arrayField.flattenedFields[1]) + expect(assert_5.pathHasLocalized).toBe(true) + expect(assert_5.localizedPath).toBe('array.textLocalized.') + + const groupWithinArray = arrayField.flattenedFields[2] as FlattenedGroupField + const assert_6 = getFieldByPath({ fields, path: 'array.group.text' }) + assert(assert_6) + expect(assert_6.field).toBe(groupWithinArray.flattenedFields[0]) + expect(assert_6.pathHasLocalized).toBe(false) + + const assert_7 = getFieldByPath({ fields, path: 'tab.localizedArray.text' }) + assert(assert_7) + expect(assert_7.field).toBe((fields[3] as any).flattenedFields[0].flattenedFields[0]) + expect(assert_7.pathHasLocalized).toBe(true) + expect(assert_7.localizedPath).toBe('tab.localizedArray..text') + }) +}) From 04b046847beec8062d8d5b9b0243834edc350e1e Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 5 Mar 2025 10:07:30 -0500 Subject: [PATCH 099/127] fix(ui): views rendered in drawers can update step nav (#11548) When rendering views within a drawer outside of the edit view, i.e. from the list view, it updates the underlying step nav to the collection of the drawer. This is true for both document drawers and list drawers. This is because the logic controlling this behavior relies on the current edit depth, which is only incremented within the edit view itself. Instead of doing this, we can conditionally run the setter functions based the presence of a drawer slug. An alternative to this would be to subscribe to the `drawerDepth` context but this would be less efficient, as this requires an unnecessary hook and subsequent rendering cycle. --- .../src/views/Edit/SetDocumentStepNav/index.tsx | 8 +------- packages/ui/src/views/Edit/index.tsx | 16 +++++++++------- packages/ui/src/views/List/index.tsx | 8 +++----- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx index 918563bf04..5a914d3f57 100644 --- a/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx +++ b/packages/ui/src/views/Edit/SetDocumentStepNav/index.tsx @@ -10,7 +10,6 @@ import type { StepNavItem } from '../../../elements/StepNav/index.js' import { useStepNav } from '../../../elements/StepNav/index.js' import { useConfig } from '../../../providers/Config/index.js' import { useDocumentInfo } from '../../../providers/DocumentInfo/index.js' -import { useEditDepth } from '../../../providers/EditDepth/index.js' import { useEntityVisibility } from '../../../providers/EntityVisibility/index.js' import { useTranslation } from '../../../providers/Translation/index.js' @@ -41,8 +40,6 @@ export const SetDocumentStepNav: React.FC<{ }, } = useConfig() - const drawerDepth = useEditDepth() - useEffect(() => { const nav: StepNavItem[] = [] @@ -91,9 +88,7 @@ export const SetDocumentStepNav: React.FC<{ }) } - if (drawerDepth <= 1) { - setStepNav(nav) - } + setStepNav(nav) } }, [ setStepNav, @@ -109,7 +104,6 @@ export const SetDocumentStepNav: React.FC<{ collectionSlug, globalSlug, view, - drawerDepth, isVisible, ]) diff --git a/packages/ui/src/views/Edit/index.tsx b/packages/ui/src/views/Edit/index.tsx index 4c5ce2238c..e7f2d14dee 100644 --- a/packages/ui/src/views/Edit/index.tsx +++ b/packages/ui/src/views/Edit/index.tsx @@ -491,13 +491,15 @@ export function DefaultEditView({ /> )} {!isReadOnlyForIncomingUser && preventLeaveWithoutSaving && } - + {!isInDrawer && ( + + )} { - if (!drawerDepth) { + if (!isInDrawer) { setStepNav([ { label: labels?.plural, }, ]) } - }, [setStepNav, labels, drawerDepth]) + }, [setStepNav, labels, isInDrawer]) + return ( From ba30d7641f0a8d31d67d9769fffe70a9b0f1f44e Mon Sep 17 00:00:00 2001 From: Patrik Date: Wed, 5 Mar 2025 12:45:08 -0500 Subject: [PATCH 100/127] feat: threads path through field condition functions (#11528) This PR updates the field `condition` function property to include a new `path` argument. The `path` arg provides the schema path of the field, including array indices where applicable. #### Changes: - Added `path: (number | string)[]` in the Condition type. - Updated relevant condition checks to ensure correct parameter usage. --- docs/fields/overview.mdx | 22 +++++-- packages/payload/src/fields/config/types.ts | 5 ++ .../src/fields/hooks/beforeChange/promise.ts | 11 ++-- .../fieldSchemasToFormState/iterateFields.ts | 8 ++- .../collections/ConditionalLogic/e2e.spec.ts | 28 ++++++++- .../collections/ConditionalLogic/index.ts | 57 +++++++++++++++++++ test/fields/payload-types.ts | 36 ++++++++++++ 7 files changed, 155 insertions(+), 12 deletions(-) diff --git a/docs/fields/overview.mdx b/docs/fields/overview.mdx index 77f9f94872..867b0be73a 100644 --- a/docs/fields/overview.mdx +++ b/docs/fields/overview.mdx @@ -502,7 +502,7 @@ export const MyCollectionConfig: CollectionConfig = { All Description Functions receive the following arguments: -| Argument | Description | +| Argument | Description | | --- | --- | | **`t`** | The `t` function used to internationalize the Admin Panel. [More details](../configuration/i18n) | @@ -512,11 +512,21 @@ All Description Functions receive the following arguments: ### Conditional Logic -You can show and hide fields based on what other fields are doing by utilizing conditional logic on a field by field basis. The `condition` property on a field's admin config accepts a function which takes three arguments: +You can show and hide fields based on what other fields are doing by utilizing conditional logic on a field by field basis. The `condition` property on a field's admin config accepts a function which takes the following arguments: -- `data` - the entire document's data that is currently being edited -- `siblingData` - only the fields that are direct siblings to the field with the condition -- `{ user }` - the final argument is an object containing the currently authenticated user +| Argument | Description | +| --- | --- | +| **`data`** | The entire document's data that is currently being edited. | +| **`siblingData`** | Only the fields that are direct siblings to the field with the condition. | +| **`ctx`** | An object containing additional information about the field’s location and user. | + +The `ctx` object: + +| Property | Description | +| --- | --- | +| **`blockData`** | The nearest parent block's data. If the field is not inside a block, this will be `undefined`. | +| **`path`** | The full path to the field in the schema, including array indexes. Useful for dynamic lookups. | +| **`user`** | The currently authenticated user object. | The `condition` function should return a boolean that will control if the field should be displayed or not. @@ -535,7 +545,7 @@ The `condition` function should return a boolean that will control if the field type: 'text', admin: { // highlight-start - condition: (data, siblingData, { user }) => { + condition: (data, siblingData, { blockData, path, user }) => { if (data.enableGreeting) { return true } else { diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index c14a96db27..bcc4fbb6f0 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -264,12 +264,17 @@ export type Condition = ( siblingData: Partial, { blockData, + path, user, }: { /** * The data of the nearest parent block. If the field is not within a block, `blockData` will be equal to `undefined`. */ blockData: Partial + /** + * The path of the field, e.g. ["group", "myArray", 1, "textField"]. The path is the schemaPath but with indexes and would be used in the context of field data, not field schemas. + */ + path: (number | string)[] user: PayloadRequest['user'] }, ) => boolean diff --git a/packages/payload/src/fields/hooks/beforeChange/promise.ts b/packages/payload/src/fields/hooks/beforeChange/promise.ts index 6dafbd0141..2ad35d11ed 100644 --- a/packages/payload/src/fields/hooks/beforeChange/promise.ts +++ b/packages/payload/src/fields/hooks/beforeChange/promise.ts @@ -86,10 +86,6 @@ export const promise = async ({ parentSchemaPath, }) - const passesCondition = field.admin?.condition - ? Boolean(field.admin.condition(data, siblingData, { blockData, user: req.user })) - : true - let skipValidationFromHere = skipValidation || !passesCondition const { localization } = req.payload.config const defaultLocale = localization ? localization?.defaultLocale : 'en' const operationLocale = req.locale || defaultLocale @@ -98,6 +94,13 @@ export const promise = async ({ const schemaPathSegments = schemaPath ? schemaPath.split('.') : [] const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : [] + const passesCondition = field.admin?.condition + ? Boolean( + field.admin.condition(data, siblingData, { blockData, path: pathSegments, user: req.user }), + ) + : true + let skipValidationFromHere = skipValidation || !passesCondition + if (fieldAffectsData(field)) { // skip validation if the field is localized and the incoming data is null if (fieldShouldBeLocalized({ field, parentIsLocalized }) && operationLocale !== defaultLocale) { diff --git a/packages/ui/src/forms/fieldSchemasToFormState/iterateFields.ts b/packages/ui/src/forms/fieldSchemasToFormState/iterateFields.ts index c649fdfca8..82206b5450 100644 --- a/packages/ui/src/forms/fieldSchemasToFormState/iterateFields.ts +++ b/packages/ui/src/forms/fieldSchemasToFormState/iterateFields.ts @@ -118,12 +118,18 @@ export const iterateFields = async ({ parentSchemaPath, }) + const pathSegments = path ? path.split('.') : [] + if (!skipConditionChecks) { try { passesCondition = Boolean( (field?.admin?.condition ? Boolean( - field.admin.condition(fullData || {}, data || {}, { blockData, user: req.user }), + field.admin.condition(fullData || {}, data || {}, { + blockData, + path: pathSegments, + user: req.user, + }), ) : true) && parentPassesCondition, ) diff --git a/test/fields/collections/ConditionalLogic/e2e.spec.ts b/test/fields/collections/ConditionalLogic/e2e.spec.ts index b5c8c28aa1..a2a04c10c2 100644 --- a/test/fields/collections/ConditionalLogic/e2e.spec.ts +++ b/test/fields/collections/ConditionalLogic/e2e.spec.ts @@ -161,7 +161,7 @@ describe('Conditional Logic', () => { test('should not render fields when adding array or blocks rows until form state returns', async () => { await page.goto(url.create) - const addRowButton = page.locator('.array-field__add-row') + const addRowButton = page.locator('#field-arrayWithConditionalField .array-field__add-row') const fieldWithConditionSelector = 'input#field-arrayWithConditionalField__0__textWithCondition' await addRowButton.click() @@ -177,4 +177,30 @@ describe('Conditional Logic', () => { await fieldToToggle.click() await expect(page.locator(fieldWithConditionSelector)).toBeVisible() }) + + test('should render field based on path argument', async () => { + await page.goto(url.create) + + const arrayOneButton = page.locator('#field-arrayOne .array-field__add-row') + await arrayOneButton.click() + + const arrayTwoButton = page.locator('#arrayOne-row-0 .array-field__add-row') + await arrayTwoButton.click() + + const arrayThreeButton = page.locator('#arrayOne-0-arrayTwo-row-0 .array-field__add-row') + await arrayThreeButton.click() + + const numberField = page.locator('#field-arrayOne__0__arrayTwo__0__arrayThree__0__numberField') + + await expect(numberField).toBeHidden() + + const selectField = page.locator('#field-arrayOne__0__arrayTwo__0__selectOptions') + + await selectField.click({ delay: 100 }) + const options = page.locator('.rs__option') + + await options.locator('text=Option Two').click() + + await expect(numberField).toBeVisible() + }) }) diff --git a/test/fields/collections/ConditionalLogic/index.ts b/test/fields/collections/ConditionalLogic/index.ts index 4cdc7101a4..864eff4462 100644 --- a/test/fields/collections/ConditionalLogic/index.ts +++ b/test/fields/collections/ConditionalLogic/index.ts @@ -182,6 +182,63 @@ const ConditionalLogic: CollectionConfig = { }, ], }, + { + name: 'arrayOne', + type: 'array', + fields: [ + { + name: 'title', + type: 'text', + }, + { + name: 'arrayTwo', + type: 'array', + fields: [ + { + name: 'selectOptions', + type: 'select', + defaultValue: 'optionOne', + options: [ + { + label: 'Option One', + value: 'optionOne', + }, + { + label: 'Option Two', + value: 'optionTwo', + }, + ], + }, + { + name: 'arrayThree', + type: 'array', + fields: [ + { + name: 'numberField', + type: 'number', + admin: { + condition: (data, siblingData, { path, user }) => { + // Ensure path has enough depth + if (path.length < 5) { + return false + } + + const arrayOneIndex = parseInt(String(path[1]), 10) + const arrayTwoIndex = parseInt(String(path[3]), 10) + + const arrayOneItem = data.arrayOne?.[arrayOneIndex] + const arrayTwoItem = arrayOneItem?.arrayTwo?.[arrayTwoIndex] + + return arrayTwoItem?.selectOptions === 'optionTwo' + }, + }, + }, + ], + }, + ], + }, + ], + }, ], } diff --git a/test/fields/payload-types.ts b/test/fields/payload-types.ts index 5023784986..17c2df7354 100644 --- a/test/fields/payload-types.ts +++ b/test/fields/payload-types.ts @@ -1153,6 +1153,24 @@ export interface ConditionalLogic { blockType: 'blockWithConditionalField'; }[] | null; + arrayOne?: + | { + title?: string | null; + arrayTwo?: + | { + selectOptions?: ('optionOne' | 'optionTwo') | null; + arrayThree?: + | { + numberField?: number | null; + id?: string | null; + }[] + | null; + id?: string | null; + }[] + | null; + id?: string | null; + }[] + | null; updatedAt: string; createdAt: string; } @@ -2874,6 +2892,24 @@ export interface ConditionalLogicSelect { blockName?: T; }; }; + arrayOne?: + | T + | { + title?: T; + arrayTwo?: + | T + | { + selectOptions?: T; + arrayThree?: + | T + | { + numberField?: T; + id?: T; + }; + id?: T; + }; + id?: T; + }; updatedAt?: T; createdAt?: T; } From bbfff30d413adb9c5f80454df0931ddee2742d24 Mon Sep 17 00:00:00 2001 From: Said Akhrarov <36972061+akhrarovsaid@users.noreply.github.com> Date: Wed, 5 Mar 2025 12:54:20 -0500 Subject: [PATCH 101/127] docs: remove dead links from client live-preview (#11552) ### What? This PR removes two links from a time where there was two distinct live-preview examples. It also adjusts links for CORS and CSRF to a more appropriate location in the docs. ### Why? Now there's only the App Router example, so direct users there instead. ### How? Changes to `docs/live-preview/client.mdx` --- docs/live-preview/client.mdx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/live-preview/client.mdx b/docs/live-preview/client.mdx index 3ada88367b..5c107c20e7 100644 --- a/docs/live-preview/client.mdx +++ b/docs/live-preview/client.mdx @@ -239,16 +239,13 @@ export const useLivePreview = (props: { ## Example -For a working demonstration of this, check out the official [Live Preview Example](https://github.com/payloadcms/payload/tree/main/examples/live-preview). There you will find examples of various front-end frameworks and how to integrate each one of them, including: - -- [Next.js App Router](https://github.com/payloadcms/payload/tree/main/examples/live-preview/next-app) -- [Next.js Pages Router](https://github.com/payloadcms/payload/tree/main/examples/live-preview/next-pages) +For a working demonstration of this, check out the official [Live Preview Example](https://github.com/payloadcms/payload/tree/main/examples/live-preview). There you will find an example of a fully integrated Next.js App Router front-end that runs on the same server as Payload. ## Troubleshooting #### Relationships and/or uploads are not populating -If you are using relationships or uploads in your front-end application, and your front-end application runs on a different domain than your Payload server, you may need to configure [CORS](../configuration/overview) to allow requests to be made between the two domains. This includes sites that are running on a different port or subdomain. Similarly, if you are protecting resources behind user authentication, you may also need to configure [CSRF](../authentication/overview#csrf-protection) to allow cookies to be sent between the two domains. For example: +If you are using relationships or uploads in your front-end application, and your front-end application runs on a different domain than your Payload server, you may need to configure [CORS](../configuration/overview#cors) to allow requests to be made between the two domains. This includes sites that are running on a different port or subdomain. Similarly, if you are protecting resources behind user authentication, you may also need to configure [CSRF](../authentication/cookies#csrf-prevention) to allow cookies to be sent between the two domains. For example: ```ts // payload.config.ts From 4ebe67324a754961c81b9a8d58873d65c6389e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Jablo=C3=B1ski?= <43938777+GermanJablo@users.noreply.github.com> Date: Wed, 5 Mar 2025 15:06:24 -0300 Subject: [PATCH 102/127] fix(richtext-lexical): fix bug in $createAutoLinkNode when the link is preceded by a textnode (#11551) If you type "hello www.world.com" the autlink would remove the word "hello". --- .../features/link/client/plugins/autoLink/index.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/richtext-lexical/src/features/link/client/plugins/autoLink/index.tsx b/packages/richtext-lexical/src/features/link/client/plugins/autoLink/index.tsx index 73b0a6196d..a5707f715a 100644 --- a/packages/richtext-lexical/src/features/link/client/plugins/autoLink/index.tsx +++ b/packages/richtext-lexical/src/features/link/client/plugins/autoLink/index.tsx @@ -187,11 +187,13 @@ function $createAutoLinkNode_( const linkNode = $createAutoLinkNode({ fields }) if (nodes.length === 1) { - const split = ( - startIndex === 0 ? nodes[0]?.splitText(endIndex) : nodes[0]?.splitText(startIndex, endIndex) - )! - - const [linkTextNode, remainingTextNode] = split + const remainingTextNode = nodes[0]! + let linkTextNode: TextNode | undefined + if (startIndex === 0) { + ;[linkTextNode] = remainingTextNode.splitText(endIndex) + } else { + ;[, linkTextNode] = remainingTextNode.splitText(startIndex, endIndex) + } if (linkTextNode) { const textNode = $createTextNode(match.text) textNode.setFormat(linkTextNode.getFormat()) From 143b6e3b8e789e6b337668df0715c175dd7a0713 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 5 Mar 2025 18:24:39 +0000 Subject: [PATCH 103/127] feat: allow hiding the blockName field visible in blocks' headers via admin.disableBlockName (#11301) Adds a new `admin.disableBlockName` property that allows you to disable the blockName field entirely in the admin view. It defaults to false for backwards compatibility. --- docs/fields/blocks.mdx | 3 +- packages/payload/src/fields/config/client.ts | 9 +++ .../src/fields/config/sanitize.spec.ts | 67 +++++++++++++++++++ packages/payload/src/fields/config/types.ts | 8 ++- packages/ui/src/fields/Blocks/BlockRow.tsx | 4 +- test/fields/collections/Blocks/e2e.spec.ts | 35 ++++++++-- test/fields/collections/Blocks/index.ts | 13 ++++ test/fields/collections/Blocks/shared.ts | 4 ++ test/fields/payload-types.ts | 67 +++++++++++++++++-- 9 files changed, 198 insertions(+), 12 deletions(-) diff --git a/docs/fields/blocks.mdx b/docs/fields/blocks.mdx index f0299cf0e2..305f604345 100644 --- a/docs/fields/blocks.mdx +++ b/docs/fields/blocks.mdx @@ -84,6 +84,7 @@ The Blocks Field inherits all of the default options from the base [Field Admin | **`group`** | Text or localization object used to group this Block in the Blocks Drawer. | | **`initCollapsed`** | Set the initial collapsed state | | **`isSortable`** | Disable order sorting by setting this value to `false` | +| **`disableBlockName`** | Hide the blockName field by setting this value to `true` | #### Customizing the way your block is rendered in Lexical @@ -165,7 +166,7 @@ The `blockType` is saved as the slug of the block that has been selected. **`blockName`** -The Admin Panel provides each block with a `blockName` field which optionally allows editors to label their blocks for better editability and readability. +The Admin Panel provides each block with a `blockName` field which optionally allows editors to label their blocks for better editability and readability. This can be visually hidden via `admin.disableBlockName`. ## Example diff --git a/packages/payload/src/fields/config/client.ts b/packages/payload/src/fields/config/client.ts index 48d6be5733..478a282c99 100644 --- a/packages/payload/src/fields/config/client.ts +++ b/packages/payload/src/fields/config/client.ts @@ -126,6 +126,15 @@ export const createClientBlocks = ({ clientBlock.jsx = jsxResolved } + if (block?.admin?.disableBlockName) { + // Check for existing admin object, this way we don't have to spread it in + if (clientBlock.admin) { + clientBlock.admin.disableBlockName = block.admin.disableBlockName + } else { + clientBlock.admin = { disableBlockName: block.admin.disableBlockName } + } + } + if (block.labels) { clientBlock.labels = {} as unknown as LabelsClient diff --git a/packages/payload/src/fields/config/sanitize.spec.ts b/packages/payload/src/fields/config/sanitize.spec.ts index 5bd1ef17a0..3da7508577 100644 --- a/packages/payload/src/fields/config/sanitize.spec.ts +++ b/packages/payload/src/fields/config/sanitize.spec.ts @@ -362,4 +362,71 @@ describe('sanitizeFields', () => { expect(sanitizedFields).toStrictEqual([]) }) }) + describe('blocks', () => { + it('should maintain admin.blockName true after sanitization', async () => { + const fields: Field[] = [ + { + name: 'noLabelBlock', + type: 'blocks', + blocks: [ + { + slug: 'number', + admin: { + disableBlockName: true, + }, + fields: [ + { + name: 'testNumber', + type: 'number', + }, + ], + }, + ], + label: false, + }, + ] + const sanitizedField = ( + await sanitizeFields({ + config, + fields, + validRelationships: [], + }) + )[0] as BlocksField + + const sanitizedBlock = sanitizedField.blocks[0] + + expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(true) + }) + it('should default admin.disableBlockName to true after sanitization', async () => { + const fields: Field[] = [ + { + name: 'noLabelBlock', + type: 'blocks', + blocks: [ + { + slug: 'number', + fields: [ + { + name: 'testNumber', + type: 'number', + }, + ], + }, + ], + label: false, + }, + ] + const sanitizedField = ( + await sanitizeFields({ + config, + fields, + validRelationships: [], + }) + )[0] as BlocksField + + const sanitizedBlock = sanitizedField.blocks[0] + + expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(undefined) + }) + }) }) diff --git a/packages/payload/src/fields/config/types.ts b/packages/payload/src/fields/config/types.ts index bcc4fbb6f0..725e9f7293 100644 --- a/packages/payload/src/fields/config/types.ts +++ b/packages/payload/src/fields/config/types.ts @@ -1378,6 +1378,12 @@ export type Block = { } /** Extension point to add your custom data. Available in server and client. */ custom?: Record + /** + * Hides the block name field from the Block's header + * + * @default false + */ + disableBlockName?: boolean group?: Record | string jsx?: PayloadComponent } @@ -1407,7 +1413,7 @@ export type Block = { } export type ClientBlock = { - admin?: Pick + admin?: Pick fields: ClientField[] labels?: LabelsClient } & Pick diff --git a/packages/ui/src/fields/Blocks/BlockRow.tsx b/packages/ui/src/fields/Blocks/BlockRow.tsx index c3bdba4271..f4e867b18e 100644 --- a/packages/ui/src/fields/Blocks/BlockRow.tsx +++ b/packages/ui/src/fields/Blocks/BlockRow.tsx @@ -80,6 +80,8 @@ export const BlockRow: React.FC = ({ const fieldHasErrors = hasSubmitted && errorCount > 0 + const showBlockName = !block.admin?.disableBlockName + const classNames = [ `${baseClass}__row`, fieldHasErrors ? `${baseClass}__row--has-errors` : `${baseClass}__row--no-errors`, @@ -155,7 +157,7 @@ export const BlockRow: React.FC = ({ > {getTranslation(block.labels.singular, i18n)} - + {showBlockName && } {fieldHasErrors && } )} diff --git a/test/fields/collections/Blocks/e2e.spec.ts b/test/fields/collections/Blocks/e2e.spec.ts index e6a8c8216c..2d223c2661 100644 --- a/test/fields/collections/Blocks/e2e.spec.ts +++ b/test/fields/collections/Blocks/e2e.spec.ts @@ -16,7 +16,7 @@ import { AdminUrlUtil } from '../../../helpers/adminUrlUtil.js' import { initPayloadE2ENoConfig } from '../../../helpers/initPayloadE2ENoConfig.js' import { reInitializeDB } from '../../../helpers/reInitializeDB.js' import { RESTClient } from '../../../helpers/rest.js' -import { TEST_TIMEOUT_LONG } from '../../../playwright.config.js' +import { POLL_TOPASS_TIMEOUT, TEST_TIMEOUT_LONG } from '../../../playwright.config.js' const filename = fileURLToPath(import.meta.url) const currentFolder = path.dirname(filename) @@ -82,7 +82,7 @@ describe('Block fields', () => { const addedRow = page.locator('#field-blocks .blocks-field__row').last() await expect(addedRow).toBeVisible() await expect(addedRow.locator('.blocks-field__block-header')).toHaveText( - 'Custom Block Label: Content 04', + 'Custom Block Label: Content 05', ) }) @@ -156,7 +156,7 @@ describe('Block fields', () => { await duplicateButton.click() const blocks = page.locator('#field-blocks > .blocks-field__rows > div') - expect(await blocks.count()).toEqual(4) + expect(await blocks.count()).toEqual(5) }) test('should save when duplicating subblocks', async () => { @@ -171,7 +171,7 @@ describe('Block fields', () => { await duplicateButton.click() const blocks = page.locator('#field-blocks > .blocks-field__rows > div') - expect(await blocks.count()).toEqual(4) + expect(await blocks.count()).toEqual(5) await page.click('#action-save') await expect(page.locator('.payload-toast-container')).toContainText('successfully') @@ -379,6 +379,33 @@ describe('Block fields', () => { }) }) + describe('blockNames', () => { + test('should show blockName field', async () => { + await page.goto(url.create) + + const blockWithBlockname = page.locator('#field-blocks .blocks-field__rows #blocks-row-1') + + const blocknameField = blockWithBlockname.locator('.section-title') + + await expect(async () => await expect(blocknameField).toBeVisible()).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + + await expect(blocknameField).toHaveAttribute('data-value', 'Second block') + }) + + test("should not show blockName field when it's disabled", async () => { + await page.goto(url.create) + const blockWithBlockname = page.locator('#field-blocks .blocks-field__rows #blocks-row-3') + + await expect( + async () => await expect(blockWithBlockname.locator('.section-title')).toBeHidden(), + ).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + }) + }) + describe('block groups', () => { test('should render group labels', async () => { await page.goto(url.create) diff --git a/test/fields/collections/Blocks/index.ts b/test/fields/collections/Blocks/index.ts index 497f9dc5b6..01879ea566 100644 --- a/test/fields/collections/Blocks/index.ts +++ b/test/fields/collections/Blocks/index.ts @@ -30,6 +30,19 @@ export const getBlocksField = (prefix?: string): BlocksField => ({ }, ], }, + { + slug: prefix ? `${prefix}NoBlockname` : 'noBlockname', + interfaceName: prefix ? `${prefix}NoBlockname` : 'NoBlockname', + admin: { + disableBlockName: true, + }, + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, { slug: prefix ? `${prefix}Number` : 'number', interfaceName: prefix ? `${prefix}NumberBlock` : 'NumberBlock', diff --git a/test/fields/collections/Blocks/shared.ts b/test/fields/collections/Blocks/shared.ts index 6087295831..b1326d829c 100644 --- a/test/fields/collections/Blocks/shared.ts +++ b/test/fields/collections/Blocks/shared.ts @@ -32,6 +32,10 @@ export const getBlocksFieldSeedData = (prefix?: string): any => [ }, ], }, + { + blockType: prefix ? `${prefix}NoBlockname` : 'noBlockname', + text: 'Hello world', + }, ] export const blocksDoc: Partial = { diff --git a/test/fields/payload-types.ts b/test/fields/payload-types.ts index 17c2df7354..ccf48f98ad 100644 --- a/test/fields/payload-types.ts +++ b/test/fields/payload-types.ts @@ -699,16 +699,29 @@ export interface ArrayField { */ export interface BlockField { id: string; - blocks: (ContentBlock | NumberBlock | SubBlocksBlock | TabsBlock)[]; - duplicate: (ContentBlock | NumberBlock | SubBlocksBlock | TabsBlock)[]; + blocks: (ContentBlock | NoBlockname | NumberBlock | SubBlocksBlock | TabsBlock)[]; + duplicate: (ContentBlock | NoBlockname | NumberBlock | SubBlocksBlock | TabsBlock)[]; collapsedByDefaultBlocks: ( | LocalizedContentBlock + | LocalizedNoBlockname + | LocalizedNumberBlock + | LocalizedSubBlocksBlock + | LocalizedTabsBlock + )[]; + disableSort: ( + | LocalizedContentBlock + | LocalizedNoBlockname + | LocalizedNumberBlock + | LocalizedSubBlocksBlock + | LocalizedTabsBlock + )[]; + localizedBlocks: ( + | LocalizedContentBlock + | LocalizedNoBlockname | LocalizedNumberBlock | LocalizedSubBlocksBlock | LocalizedTabsBlock )[]; - disableSort: (LocalizedContentBlock | LocalizedNumberBlock | LocalizedSubBlocksBlock | LocalizedTabsBlock)[]; - localizedBlocks: (LocalizedContentBlock | LocalizedNumberBlock | LocalizedSubBlocksBlock | LocalizedTabsBlock)[]; i18nBlocks?: | { text?: string | null; @@ -883,6 +896,16 @@ export interface ContentBlock { blockName?: string | null; blockType: 'content'; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "NoBlockname". + */ +export interface NoBlockname { + text: string; + id?: string | null; + blockName?: string | null; + blockType: 'noBlockname'; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "NumberBlock". @@ -939,6 +962,16 @@ export interface LocalizedContentBlock { blockName?: string | null; blockType: 'localizedContent'; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localizedNoBlockname". + */ +export interface LocalizedNoBlockname { + text: string; + id?: string | null; + blockName?: string | null; + blockType: 'localizedNoBlockname'; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "localizedNumberBlock". @@ -1801,7 +1834,7 @@ export interface TabsField { text: string; id?: string | null; }[]; - blocks: (ContentBlock | NumberBlock | SubBlocksBlock | TabsBlock)[]; + blocks: (ContentBlock | NoBlockname | NumberBlock | SubBlocksBlock | TabsBlock)[]; group: { number: number; }; @@ -2461,6 +2494,7 @@ export interface BlockFieldsSelect { | T | { content?: T | ContentBlockSelect; + noBlockname?: T | NoBlocknameSelect; number?: T | NumberBlockSelect; subBlocks?: T | SubBlocksBlockSelect; tabs?: T | TabsBlockSelect; @@ -2469,6 +2503,7 @@ export interface BlockFieldsSelect { | T | { content?: T | ContentBlockSelect; + noBlockname?: T | NoBlocknameSelect; number?: T | NumberBlockSelect; subBlocks?: T | SubBlocksBlockSelect; tabs?: T | TabsBlockSelect; @@ -2477,6 +2512,7 @@ export interface BlockFieldsSelect { | T | { localizedContent?: T | LocalizedContentBlockSelect; + localizedNoBlockname?: T | LocalizedNoBlocknameSelect; localizedNumber?: T | LocalizedNumberBlockSelect; localizedSubBlocks?: T | LocalizedSubBlocksBlockSelect; localizedTabs?: T | LocalizedTabsBlockSelect; @@ -2485,6 +2521,7 @@ export interface BlockFieldsSelect { | T | { localizedContent?: T | LocalizedContentBlockSelect; + localizedNoBlockname?: T | LocalizedNoBlocknameSelect; localizedNumber?: T | LocalizedNumberBlockSelect; localizedSubBlocks?: T | LocalizedSubBlocksBlockSelect; localizedTabs?: T | LocalizedTabsBlockSelect; @@ -2493,6 +2530,7 @@ export interface BlockFieldsSelect { | T | { localizedContent?: T | LocalizedContentBlockSelect; + localizedNoBlockname?: T | LocalizedNoBlocknameSelect; localizedNumber?: T | LocalizedNumberBlockSelect; localizedSubBlocks?: T | LocalizedSubBlocksBlockSelect; localizedTabs?: T | LocalizedTabsBlockSelect; @@ -2690,6 +2728,15 @@ export interface ContentBlockSelect { id?: T; blockName?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "NoBlockname_select". + */ +export interface NoBlocknameSelect { + text?: T; + id?: T; + blockName?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "NumberBlock_select". @@ -2739,6 +2786,15 @@ export interface LocalizedContentBlockSelect { id?: T; blockName?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "localizedNoBlockname_select". + */ +export interface LocalizedNoBlocknameSelect { + text?: T; + id?: T; + blockName?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "localizedNumberBlock_select". @@ -3404,6 +3460,7 @@ export interface TabsFieldsSelect { | T | { content?: T | ContentBlockSelect; + noBlockname?: T | NoBlocknameSelect; number?: T | NumberBlockSelect; subBlocks?: T | SubBlocksBlockSelect; tabs?: T | TabsBlockSelect; From 6939a835ca0a54fc542e81731391c33815f641fc Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:34:08 -0500 Subject: [PATCH 104/127] fix: beforeValidate deleting value when access returns false (#11549) ### What? Regression caused by https://github.com/payloadcms/payload/pull/11433 If a beforeChange hook was checking for a missing or undefined `value` in order to change the value before inserting into the database, data could be lost. ### Why? In #11433 the logic for setting the fallback field value was moved above the logic that cleared the value when access control returned false. ### How? This change ensures that the fallback value is passed into the beforeValidate function _and_ still available with the fallback value on siblingData if access control returns false. Fixes https://github.com/payloadcms/payload/issues/11543 --- .../hooks/beforeValidate/getFallbackValue.ts | 31 +++ .../fields/hooks/beforeValidate/promise.ts | 36 +-- .../access-control/collections/hooks/index.ts | 44 +++ test/access-control/config.ts | 2 + test/access-control/int.spec.ts | 253 +++++++++++------- test/access-control/payload-types.ts | 29 ++ test/access-control/shared.ts | 1 + test/hooks/payload-types.ts | 4 + 8 files changed, 290 insertions(+), 110 deletions(-) create mode 100644 packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts create mode 100644 test/access-control/collections/hooks/index.ts diff --git a/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts b/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts new file mode 100644 index 0000000000..7c83848f9b --- /dev/null +++ b/packages/payload/src/fields/hooks/beforeValidate/getFallbackValue.ts @@ -0,0 +1,31 @@ +import type { JsonObject, JsonValue, PayloadRequest } from '../../../types/index.js' +import type { FieldAffectingData } from '../../config/types.js' + +import { getDefaultValue } from '../../getDefaultValue.js' +import { cloneDataFromOriginalDoc } from '../beforeChange/cloneDataFromOriginalDoc.js' + +export async function getFallbackValue({ + field, + req, + siblingDoc, +}: { + field: FieldAffectingData + req: PayloadRequest + siblingDoc: JsonObject +}): Promise { + let fallbackValue = undefined + if ('name' in field && field.name) { + if (typeof siblingDoc[field.name] !== 'undefined') { + fallbackValue = cloneDataFromOriginalDoc(siblingDoc[field.name]) + } else if ('defaultValue' in field && typeof field.defaultValue !== 'undefined') { + fallbackValue = await getDefaultValue({ + defaultValue: field.defaultValue, + locale: req.locale || '', + req, + user: req.user, + }) + } + } + + return fallbackValue +} diff --git a/packages/payload/src/fields/hooks/beforeValidate/promise.ts b/packages/payload/src/fields/hooks/beforeValidate/promise.ts index e1ab380eab..2cda4e9b38 100644 --- a/packages/payload/src/fields/hooks/beforeValidate/promise.ts +++ b/packages/payload/src/fields/hooks/beforeValidate/promise.ts @@ -8,10 +8,9 @@ import type { Block, Field, TabAsField } from '../../config/types.js' import { MissingEditorProp } from '../../../errors/index.js' import { fieldAffectsData, tabHasName, valueIsValueWithRelation } from '../../config/types.js' -import { getDefaultValue } from '../../getDefaultValue.js' import { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js' -import { cloneDataFromOriginalDoc } from '../beforeChange/cloneDataFromOriginalDoc.js' import { getExistingRowDoc } from '../beforeChange/getExistingRowDoc.js' +import { getFallbackValue } from './getFallbackValue.js' import { traverseFields } from './traverseFields.js' type Args = { @@ -274,21 +273,15 @@ export const promise = async ({ } } + // ensure the fallback value is only computed one time + // either here or when access control returns false + const fallbackResult = { + executed: false, + value: undefined, + } if (typeof siblingData[field.name] === 'undefined') { - // If no incoming data, but existing document data is found, merge it in - if (typeof siblingDoc[field.name] !== 'undefined') { - siblingData[field.name] = cloneDataFromOriginalDoc(siblingDoc[field.name]) - - // Otherwise compute default value - } else if (typeof field.defaultValue !== 'undefined') { - siblingData[field.name] = await getDefaultValue({ - defaultValue: field.defaultValue, - locale: req.locale, - req, - user: req.user, - value: siblingData[field.name], - }) - } + fallbackResult.value = await getFallbackValue({ field, req, siblingDoc }) + fallbackResult.executed = true } // Execute hooks @@ -312,7 +305,10 @@ export const promise = async ({ schemaPath: schemaPathSegments, siblingData, siblingFields, - value: siblingData[field.name], + value: + typeof siblingData[field.name] === 'undefined' + ? fallbackResult.value + : siblingData[field.name], }) if (hookedValue !== undefined) { @@ -331,6 +327,12 @@ export const promise = async ({ delete siblingData[field.name] } } + + if (typeof siblingData[field.name] === 'undefined') { + siblingData[field.name] = !fallbackResult.executed + ? await getFallbackValue({ field, req, siblingDoc }) + : fallbackResult.value + } } // Traverse subfields diff --git a/test/access-control/collections/hooks/index.ts b/test/access-control/collections/hooks/index.ts new file mode 100644 index 0000000000..960889ebed --- /dev/null +++ b/test/access-control/collections/hooks/index.ts @@ -0,0 +1,44 @@ +import type { CollectionConfig } from 'payload' + +import { hooksSlug } from '../../shared.js' + +export const Hooks: CollectionConfig = { + slug: hooksSlug, + access: { + update: () => true, + }, + fields: [ + { + name: 'cannotMutateRequired', + type: 'text', + access: { + update: () => false, + }, + required: true, + }, + { + name: 'cannotMutateNotRequired', + type: 'text', + access: { + update: () => false, + }, + hooks: { + beforeChange: [ + ({ value }) => { + if (!value) { + return 'no value found' + } + return value + }, + ], + }, + }, + { + name: 'canMutate', + type: 'text', + access: { + update: () => true, + }, + }, + ], +} diff --git a/test/access-control/config.ts b/test/access-control/config.ts index 17a3a271ff..182a834b50 100644 --- a/test/access-control/config.ts +++ b/test/access-control/config.ts @@ -10,6 +10,7 @@ import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' import { devUser } from '../credentials.js' import { textToLexicalJSON } from '../fields/collections/LexicalLocalized/textToLexicalJSON.js' import { Disabled } from './collections/Disabled/index.js' +import { Hooks } from './collections/hooks/index.js' import { Regression1 } from './collections/Regression-1/index.js' import { Regression2 } from './collections/Regression-2/index.js' import { RichText } from './collections/RichText/index.js' @@ -567,6 +568,7 @@ export default buildConfigWithDefaults( RichText, Regression1, Regression2, + Hooks, ], globals: [ { diff --git a/test/access-control/int.spec.ts b/test/access-control/int.spec.ts index df3055ffcd..a91d17fee8 100644 --- a/test/access-control/int.spec.ts +++ b/test/access-control/int.spec.ts @@ -8,7 +8,7 @@ import type { } from 'payload' import path from 'path' -import { Forbidden } from 'payload' +import { Forbidden, ValidationError } from 'payload' import { fileURLToPath } from 'url' import type { FullyRestricted, Post } from './payload-types.js' @@ -21,6 +21,7 @@ import { hiddenAccessCountSlug, hiddenAccessSlug, hiddenFieldsSlug, + hooksSlug, relyOnRequestHeadersSlug, restrictedVersionsSlug, secondArrayText, @@ -58,115 +59,181 @@ describe('Access Control', () => { } }) - it('should not affect hidden fields when patching data', async () => { - const doc = await payload.create({ - collection: hiddenFieldsSlug, - data: { - partiallyHiddenArray: [ - { + describe('Fields', () => { + it('should not affect hidden fields when patching data', async () => { + const doc = await payload.create({ + collection: hiddenFieldsSlug, + data: { + partiallyHiddenArray: [ + { + name: 'public_name', + value: 'private_value', + }, + ], + partiallyHiddenGroup: { name: 'public_name', value: 'private_value', }, - ], - partiallyHiddenGroup: { - name: 'public_name', - value: 'private_value', }, - }, + }) + + await payload.update({ + id: doc.id, + collection: hiddenFieldsSlug, + data: { + title: 'Doc Title', + }, + }) + + const updatedDoc = await payload.findByID({ + id: doc.id, + collection: hiddenFieldsSlug, + showHiddenFields: true, + }) + + expect(updatedDoc.partiallyHiddenGroup.value).toStrictEqual('private_value') + expect(updatedDoc.partiallyHiddenArray[0].value).toStrictEqual('private_value') }) - await payload.update({ - id: doc.id, - collection: hiddenFieldsSlug, - data: { - title: 'Doc Title', - }, - }) - - const updatedDoc = await payload.findByID({ - id: doc.id, - collection: hiddenFieldsSlug, - showHiddenFields: true, - }) - - expect(updatedDoc.partiallyHiddenGroup.value).toStrictEqual('private_value') - expect(updatedDoc.partiallyHiddenArray[0].value).toStrictEqual('private_value') - }) - - it('should not affect hidden fields when patching data - update many', async () => { - const docsMany = await payload.create({ - collection: hiddenFieldsSlug, - data: { - partiallyHiddenArray: [ - { + it('should not affect hidden fields when patching data - update many', async () => { + const docsMany = await payload.create({ + collection: hiddenFieldsSlug, + data: { + partiallyHiddenArray: [ + { + name: 'public_name', + value: 'private_value', + }, + ], + partiallyHiddenGroup: { name: 'public_name', value: 'private_value', }, - ], - partiallyHiddenGroup: { - name: 'public_name', - value: 'private_value', }, - }, + }) + + await payload.update({ + collection: hiddenFieldsSlug, + data: { + title: 'Doc Title', + }, + where: { + id: { equals: docsMany.id }, + }, + }) + + const updatedMany = await payload.findByID({ + id: docsMany.id, + collection: hiddenFieldsSlug, + showHiddenFields: true, + }) + + expect(updatedMany.partiallyHiddenGroup.value).toStrictEqual('private_value') + expect(updatedMany.partiallyHiddenArray[0].value).toStrictEqual('private_value') }) - await payload.update({ - collection: hiddenFieldsSlug, - data: { - title: 'Doc Title', - }, - where: { - id: { equals: docsMany.id }, - }, + it('should be able to restrict access based upon siblingData', async () => { + const { id } = await payload.create({ + collection: siblingDataSlug, + data: { + array: [ + { + allowPublicReadability: true, + text: firstArrayText, + }, + { + allowPublicReadability: false, + text: secondArrayText, + }, + ], + }, + }) + + const doc = await payload.findByID({ + id, + collection: siblingDataSlug, + overrideAccess: false, + }) + + expect(doc.array?.[0].text).toBe(firstArrayText) + // Should respect PublicReadabilityAccess function and not be sent + expect(doc.array?.[1].text).toBeUndefined() + + // Retrieve with default of overriding access + const docOverride = await payload.findByID({ + id, + collection: siblingDataSlug, + }) + + expect(docOverride.array?.[0].text).toBe(firstArrayText) + expect(docOverride.array?.[1].text).toBe(secondArrayText) }) - const updatedMany = await payload.findByID({ - id: docsMany.id, - collection: hiddenFieldsSlug, - showHiddenFields: true, + it('should use fallback value when trying to update a field without permission', async () => { + const doc = await payload.create({ + collection: hooksSlug, + data: { + cannotMutateRequired: 'original', + }, + }) + + const updatedDoc = await payload.update({ + id: doc.id, + collection: hooksSlug, + overrideAccess: false, + data: { + cannotMutateRequired: 'new', + canMutate: 'canMutate', + }, + }) + + expect(updatedDoc.cannotMutateRequired).toBe('original') }) - expect(updatedMany.partiallyHiddenGroup.value).toStrictEqual('private_value') - expect(updatedMany.partiallyHiddenArray[0].value).toStrictEqual('private_value') + it('should use fallback value when required data is missing', async () => { + const doc = await payload.create({ + collection: hooksSlug, + data: { + cannotMutateRequired: 'original', + }, + }) + + const updatedDoc = await payload.update({ + id: doc.id, + collection: hooksSlug, + overrideAccess: false, + data: { + canMutate: 'canMutate', + }, + }) + + // should fallback to original data and not throw validation error + expect(updatedDoc.cannotMutateRequired).toBe('original') + }) + + it('should pass fallback value through to beforeChange hook when access returns false', async () => { + const doc = await payload.create({ + collection: hooksSlug, + data: { + cannotMutateRequired: 'cannotMutateRequired', + cannotMutateNotRequired: 'cannotMutateNotRequired', + }, + }) + + const updatedDoc = await payload.update({ + id: doc.id, + collection: hooksSlug, + overrideAccess: false, + data: { + cannotMutateNotRequired: 'updated', + }, + }) + + // should fallback to original data and not throw validation error + expect(updatedDoc.cannotMutateRequired).toBe('cannotMutateRequired') + expect(updatedDoc.cannotMutateNotRequired).toBe('cannotMutateNotRequired') + }) }) - - it('should be able to restrict access based upon siblingData', async () => { - const { id } = await payload.create({ - collection: siblingDataSlug, - data: { - array: [ - { - allowPublicReadability: true, - text: firstArrayText, - }, - { - allowPublicReadability: false, - text: secondArrayText, - }, - ], - }, - }) - - const doc = await payload.findByID({ - id, - collection: siblingDataSlug, - overrideAccess: false, - }) - - expect(doc.array?.[0].text).toBe(firstArrayText) - // Should respect PublicReadabilityAccess function and not be sent - expect(doc.array?.[1].text).toBeUndefined() - - // Retrieve with default of overriding access - const docOverride = await payload.findByID({ - id, - collection: siblingDataSlug, - }) - - expect(docOverride.array?.[0].text).toBe(firstArrayText) - expect(docOverride.array?.[1].text).toBe(secondArrayText) - }) - describe('Collections', () => { describe('restricted collection', () => { it('field without read access should not show', async () => { diff --git a/test/access-control/payload-types.ts b/test/access-control/payload-types.ts index 8be2a00c1e..eda5877a67 100644 --- a/test/access-control/payload-types.ts +++ b/test/access-control/payload-types.ts @@ -89,6 +89,7 @@ export interface Config { 'rich-text': RichText; regression1: Regression1; regression2: Regression2; + hooks: Hook; 'payload-locked-documents': PayloadLockedDocument; 'payload-preferences': PayloadPreference; 'payload-migrations': PayloadMigration; @@ -117,6 +118,7 @@ export interface Config { 'rich-text': RichTextSelect | RichTextSelect; regression1: Regression1Select | Regression1Select; regression2: Regression2Select | Regression2Select; + hooks: HooksSelect | HooksSelect; 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; @@ -680,6 +682,18 @@ export interface Regression2 { updatedAt: string; createdAt: string; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "hooks". + */ +export interface Hook { + id: string; + cannotMutateRequired: string; + cannotMutateNotRequired?: string | null; + canMutate?: string | null; + updatedAt: string; + createdAt: string; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-locked-documents". @@ -774,6 +788,10 @@ export interface PayloadLockedDocument { | ({ relationTo: 'regression2'; value: string | Regression2; + } | null) + | ({ + relationTo: 'hooks'; + value: string | Hook; } | null); globalSlug?: string | null; user: @@ -1168,6 +1186,17 @@ export interface Regression2Select { updatedAt?: T; createdAt?: T; } +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "hooks_select". + */ +export interface HooksSelect { + cannotMutateRequired?: T; + cannotMutateNotRequired?: T; + canMutate?: T; + updatedAt?: T; + createdAt?: T; +} /** * This interface was referenced by `Config`'s JSON-Schema * via the `definition` "payload-locked-documents_select". diff --git a/test/access-control/shared.ts b/test/access-control/shared.ts index 0de87257e8..7e88f6bdaf 100644 --- a/test/access-control/shared.ts +++ b/test/access-control/shared.ts @@ -5,6 +5,7 @@ export const slug = 'posts' export const unrestrictedSlug = 'unrestricted' export const readOnlySlug = 'read-only-collection' export const readOnlyGlobalSlug = 'read-only-global' +export const hooksSlug = 'hooks' export const userRestrictedCollectionSlug = 'user-restricted-collection' export const fullyRestrictedSlug = 'fully-restricted' diff --git a/test/hooks/payload-types.ts b/test/hooks/payload-types.ts index 87ad25904d..073a259c06 100644 --- a/test/hooks/payload-types.ts +++ b/test/hooks/payload-types.ts @@ -156,6 +156,8 @@ export interface BeforeValidate { id: string; title?: string | null; selection?: ('a' | 'b') | null; + cannotMutate?: string | null; + canMutate?: string | null; updatedAt: string; createdAt: string; } @@ -741,6 +743,8 @@ export interface BeforeChangeHooksSelect { export interface BeforeValidateSelect { title?: T; selection?: T; + cannotMutate?: T; + canMutate?: T; updatedAt?: T; createdAt?: T; } From 5cc0e74471076ce596f64ed8ecfb3c1b0d247efc Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 20:59:49 +0200 Subject: [PATCH 105/127] fix(storage-*): client uploads with `disablePayloadAccessControl: true` (#11530) Fixes https://github.com/payloadcms/payload/issues/11473 Previously, when `disablePayloadAccessControl: true` was defined, client uploads were working improperly. The reason is that `addDataAndFileToRequest` expects `staticHandler` to be defined and we don't add in case if `disablePayloadAccessControl: true`. This PR makes it so otherwise and if we have `clientUploads`, it pushes the "proxied" handler that responses only when the file was requested in the context of client upload (from `addDataAndFileToRequest`) --- packages/plugin-cloud-storage/src/plugin.ts | 11 +++++++++++ packages/plugin-cloud-storage/src/types.ts | 1 + packages/storage-azure/src/index.ts | 9 ++++++++- packages/storage-gcs/src/index.ts | 3 ++- packages/storage-s3/src/index.ts | 3 ++- packages/storage-uploadthing/src/index.ts | 2 ++ packages/storage-vercel-blob/src/index.ts | 3 ++- 7 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/plugin-cloud-storage/src/plugin.ts b/packages/plugin-cloud-storage/src/plugin.ts index a7d4f7e80f..ae789cc936 100644 --- a/packages/plugin-cloud-storage/src/plugin.ts +++ b/packages/plugin-cloud-storage/src/plugin.ts @@ -60,6 +60,17 @@ export const cloudStoragePlugin = if (!options.disablePayloadAccessControl) { handlers.push(adapter.staticHandler) + // Else if disablePayloadAccessControl: true and clientUploads is used + // Build the "proxied" handler that responses only when the file was requested by client upload in addDataAndFileToRequest + } else if (adapter.clientUploads) { + handlers.push((req, args) => { + if ('clientUploadContext' in args.params) { + return adapter.staticHandler(req, args) + } + + // Otherwise still skip staticHandler + return null + }) } return { diff --git a/packages/plugin-cloud-storage/src/types.ts b/packages/plugin-cloud-storage/src/types.ts index a46de6c536..a1e1da9aee 100644 --- a/packages/plugin-cloud-storage/src/types.ts +++ b/packages/plugin-cloud-storage/src/types.ts @@ -63,6 +63,7 @@ export type StaticHandler = ( ) => Promise | Response export interface GeneratedAdapter { + clientUploads?: ClientUploadsConfig /** * Additional fields to be injected into the base collection and image sizes */ diff --git a/packages/storage-azure/src/index.ts b/packages/storage-azure/src/index.ts index dd965c450e..99788b1be2 100644 --- a/packages/storage-azure/src/index.ts +++ b/packages/storage-azure/src/index.ts @@ -134,7 +134,13 @@ export const azureStorage: AzureStoragePlugin = function azureStorageInternal( getStorageClient: () => ContainerClient, - { allowContainerCreate, baseURL, connectionString, containerName }: AzureStorageOptions, + { + allowContainerCreate, + baseURL, + clientUploads, + connectionString, + containerName, + }: AzureStorageOptions, ): Adapter { const createContainerIfNotExists = () => { void getStorageClientFunc({ connectionString, containerName }).createIfNotExists({ @@ -145,6 +151,7 @@ function azureStorageInternal( return ({ collection, prefix }): GeneratedAdapter => { return { name: 'azure', + clientUploads, generateURL: getGenerateURL({ baseURL, containerName }), handleDelete: getHandleDelete({ collection, getStorageClient }), handleUpload: getHandleUpload({ diff --git a/packages/storage-gcs/src/index.ts b/packages/storage-gcs/src/index.ts index b64507755b..c6f3b1a26f 100644 --- a/packages/storage-gcs/src/index.ts +++ b/packages/storage-gcs/src/index.ts @@ -128,11 +128,12 @@ export const gcsStorage: GcsStoragePlugin = function gcsStorageInternal( getStorageClient: () => Storage, - { acl, bucket }: GcsStorageOptions, + { acl, bucket, clientUploads }: GcsStorageOptions, ): Adapter { return ({ collection, prefix }): GeneratedAdapter => { return { name: 'gcs', + clientUploads, generateURL: getGenerateURL({ bucket, getStorageClient }), handleDelete: getHandleDelete({ bucket, getStorageClient }), handleUpload: getHandleUpload({ diff --git a/packages/storage-s3/src/index.ts b/packages/storage-s3/src/index.ts index e5d9baa3e4..b05942a259 100644 --- a/packages/storage-s3/src/index.ts +++ b/packages/storage-s3/src/index.ts @@ -142,11 +142,12 @@ export const s3Storage: S3StoragePlugin = function s3StorageInternal( getStorageClient: () => AWS.S3, - { acl, bucket, config = {} }: S3StorageOptions, + { acl, bucket, clientUploads, config = {} }: S3StorageOptions, ): Adapter { return ({ collection, prefix }): GeneratedAdapter => { return { name: 's3', + clientUploads, generateURL: getGenerateURL({ bucket, config }), handleDelete: getHandleDelete({ bucket, getStorageClient }), handleUpload: getHandleUpload({ diff --git a/packages/storage-uploadthing/src/index.ts b/packages/storage-uploadthing/src/index.ts index 96c7186c91..b47b499288 100644 --- a/packages/storage-uploadthing/src/index.ts +++ b/packages/storage-uploadthing/src/index.ts @@ -141,6 +141,7 @@ function uploadthingInternal(options: UploadthingStorageOptions): Adapter { return (): GeneratedAdapter => { const { + clientUploads, options: { acl = 'public-read', ...utOptions }, } = options @@ -148,6 +149,7 @@ function uploadthingInternal(options: UploadthingStorageOptions): Adapter { return { name: 'uploadthing', + clientUploads, fields, generateURL, handleDelete: getHandleDelete({ utApi }), diff --git a/packages/storage-vercel-blob/src/index.ts b/packages/storage-vercel-blob/src/index.ts index dc8c4ebf7b..a2480c6972 100644 --- a/packages/storage-vercel-blob/src/index.ts +++ b/packages/storage-vercel-blob/src/index.ts @@ -172,7 +172,7 @@ function vercelBlobStorageInternal( options: { baseUrl: string } & VercelBlobStorageOptions, ): Adapter { return ({ collection, prefix }): GeneratedAdapter => { - const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, token } = options + const { access, addRandomSuffix, baseUrl, cacheControlMaxAge, clientUploads, token } = options if (!token) { throw new Error('Vercel Blob storage token is required') @@ -180,6 +180,7 @@ function vercelBlobStorageInternal( return { name: 'vercel-blob', + clientUploads, generateURL: getGenerateUrl({ baseUrl, prefix }), handleDelete: getHandleDelete({ baseUrl, prefix, token }), handleUpload: getHandleUpload({ From 972406724263667fe4103f6c8d714001cd34df18 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Wed, 5 Mar 2025 14:14:35 -0500 Subject: [PATCH 106/127] feat: payload admin bar (#3684) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Imports https://github.com/payloadcms/payload-admin-bar into the Payload monorepo. This package will now be regularly maintained directly alongside all Payload packages and now includes its own test suite. A few changes minor have been made between v1.0.7 and latest: 1. The package name has changed from `payload-admin-bar` to `@payloadcms/admin-bar`. ```diff - import { PayloadAdminBar } from 'payload-admin-bar' + import { PayloadAdminBar } from '@payloadcms/admin-bar' ``` 2. The `collection` prop has been renamed to `collectionSlug` 3. The `authCollection` prop has been renamed to `authCollectionSlug` Here's a screenshot of the admin bar in use within the Website Template: Screenshot 2025-03-05 at 1 20 04 PM --------- Co-authored-by: Kalon Robson --- .github/workflows/main.yml | 1 + .gitignore | 2 + package.json | 1 + packages/admin-bar/.prettierignore | 10 + packages/admin-bar/.swcrc | 24 ++ packages/admin-bar/LICENSE.md | 22 ++ packages/admin-bar/README.md | 119 ++++++ packages/admin-bar/eslint.config.js | 18 + packages/admin-bar/package.json | 65 +++ packages/admin-bar/src/AdminBar.tsx | 349 +++++++++++++++++ packages/admin-bar/src/index.ts | 2 + packages/admin-bar/src/types.ts | 67 ++++ packages/admin-bar/tsconfig.json | 9 + pnpm-lock.yaml | 25 ++ test/admin-bar/.gitignore | 2 + .../admin/[[...segments]]/not-found.tsx | 25 ++ .../(payload)/admin/[[...segments]]/page.tsx | 25 ++ .../app/(payload)/admin/importMap.js | 1 + .../app/(payload)/api/[...slug]/route.ts | 10 + .../(payload)/api/graphql-playground/route.ts | 6 + .../app/(payload)/api/graphql/route.ts | 8 + test/admin-bar/app/(payload)/custom.scss | 7 + test/admin-bar/app/(payload)/layout.tsx | 31 ++ test/admin-bar/app/admin-bar/app.scss | 22 ++ test/admin-bar/app/admin-bar/layout.tsx | 29 ++ test/admin-bar/app/admin-bar/page.tsx | 12 + test/admin-bar/collections/Media/index.ts | 33 ++ test/admin-bar/collections/Posts/index.ts | 19 + test/admin-bar/config.ts | 39 ++ test/admin-bar/e2e.spec.ts | 37 ++ test/admin-bar/eslint.config.js | 19 + test/admin-bar/next-env.d.ts | 5 + test/admin-bar/next.config.mjs | 15 + test/admin-bar/payload-types.ts | 370 ++++++++++++++++++ test/admin-bar/tsconfig.eslint.json | 13 + test/admin-bar/tsconfig.json | 5 + test/admin-bar/types.d.ts | 9 + test/generateImportMap.ts | 8 +- test/package.json | 1 + test/setupProd.ts | 1 + test/tsconfig.typecheck.json | 3 + tools/releaser/src/lib/publishList.ts | 1 + tsconfig.base.json | 9 +- tsconfig.json | 4 +- 44 files changed, 1478 insertions(+), 5 deletions(-) create mode 100644 packages/admin-bar/.prettierignore create mode 100644 packages/admin-bar/.swcrc create mode 100644 packages/admin-bar/LICENSE.md create mode 100644 packages/admin-bar/README.md create mode 100644 packages/admin-bar/eslint.config.js create mode 100644 packages/admin-bar/package.json create mode 100644 packages/admin-bar/src/AdminBar.tsx create mode 100644 packages/admin-bar/src/index.ts create mode 100644 packages/admin-bar/src/types.ts create mode 100644 packages/admin-bar/tsconfig.json create mode 100644 test/admin-bar/.gitignore create mode 100644 test/admin-bar/app/(payload)/admin/[[...segments]]/not-found.tsx create mode 100644 test/admin-bar/app/(payload)/admin/[[...segments]]/page.tsx create mode 100644 test/admin-bar/app/(payload)/admin/importMap.js create mode 100644 test/admin-bar/app/(payload)/api/[...slug]/route.ts create mode 100644 test/admin-bar/app/(payload)/api/graphql-playground/route.ts create mode 100644 test/admin-bar/app/(payload)/api/graphql/route.ts create mode 100644 test/admin-bar/app/(payload)/custom.scss create mode 100644 test/admin-bar/app/(payload)/layout.tsx create mode 100644 test/admin-bar/app/admin-bar/app.scss create mode 100644 test/admin-bar/app/admin-bar/layout.tsx create mode 100644 test/admin-bar/app/admin-bar/page.tsx create mode 100644 test/admin-bar/collections/Media/index.ts create mode 100644 test/admin-bar/collections/Posts/index.ts create mode 100644 test/admin-bar/config.ts create mode 100644 test/admin-bar/e2e.spec.ts create mode 100644 test/admin-bar/eslint.config.js create mode 100644 test/admin-bar/next-env.d.ts create mode 100644 test/admin-bar/next.config.mjs create mode 100644 test/admin-bar/payload-types.ts create mode 100644 test/admin-bar/tsconfig.eslint.json create mode 100644 test/admin-bar/tsconfig.json create mode 100644 test/admin-bar/types.d.ts diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f8aa258f69..f46c5e9aee 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -275,6 +275,7 @@ jobs: - admin__e2e__general - admin__e2e__list-view - admin__e2e__document-view + - admin-bar - admin-root - auth - auth-basic diff --git a/.gitignore b/.gitignore index 45f9b34187..fce7617d11 100644 --- a/.gitignore +++ b/.gitignore @@ -306,6 +306,8 @@ $RECYCLE.BIN/ /build .swc app/(payload)/admin/importMap.js +test/admin-bar/app/(payload)/admin/importMap.js +/test/admin-bar/app/(payload)/admin/importMap.js test/live-preview/app/(payload)/admin/importMap.js /test/live-preview/app/(payload)/admin/importMap.js test/admin-root/app/(payload)/admin/importMap.js diff --git a/package.json b/package.json index 1a25ae1ade..7bc1096176 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "bf": "pnpm run build:force", "build": "pnpm run build:core", + "build:admin-bar": "turbo build --filter \"@payloadcms/admin-bar\"", "build:all": "turbo build", "build:app": "next build", "build:app:analyze": "cross-env ANALYZE=true next build", diff --git a/packages/admin-bar/.prettierignore b/packages/admin-bar/.prettierignore new file mode 100644 index 0000000000..247f3f12de --- /dev/null +++ b/packages/admin-bar/.prettierignore @@ -0,0 +1,10 @@ +.tmp +**/.git +**/.hg +**/.pnp.* +**/.svn +**/.yarn/** +**/build +**/dist/** +**/node_modules +**/temp diff --git a/packages/admin-bar/.swcrc b/packages/admin-bar/.swcrc new file mode 100644 index 0000000000..b4fb882caa --- /dev/null +++ b/packages/admin-bar/.swcrc @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "sourceMaps": true, + "jsc": { + "target": "esnext", + "parser": { + "syntax": "typescript", + "tsx": true, + "dts": true + }, + "transform": { + "react": { + "runtime": "automatic", + "pragmaFrag": "React.Fragment", + "throwIfNamespace": true, + "development": false, + "useBuiltins": true + } + } + }, + "module": { + "type": "es6" + } +} diff --git a/packages/admin-bar/LICENSE.md b/packages/admin-bar/LICENSE.md new file mode 100644 index 0000000000..b31f1fb3a1 --- /dev/null +++ b/packages/admin-bar/LICENSE.md @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2018-2025 Payload CMS, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/admin-bar/README.md b/packages/admin-bar/README.md new file mode 100644 index 0000000000..9b2e802bb9 --- /dev/null +++ b/packages/admin-bar/README.md @@ -0,0 +1,119 @@ +# Payload Admin Bar + +An admin bar for React apps using [Payload](https://github.com/payloadcms/payload). + +### Installation + +```bash +pnpm i @payloadcms/admin-bar +``` + +### Basic Usage + +```jsx +import { PayloadAdminBar } from '@payloadcms/admin-bar' + +export const App = () => { + return +} +``` + +Checks for authentication with Payload CMS by hitting the [`/me`](https://payloadcms.com/docs/authentication/operations#me) route. If authenticated, renders an admin bar with simple controls to do the following: + +- Navigate to the admin dashboard +- Navigate to the currently logged-in user's account +- Edit the current collection +- Create a new collection of the same type +- Logout +- Indicate and exit preview mode + +The admin bar ships with very little style and is fully customizable. + +### Dynamic props + +With client-side routing, we need to update the admin bar with a new collection type and document id on each route change. This will depend on your app's specific setup, but here are a some common examples: + +#### NextJS + +For NextJS apps using dynamic-routes, use `getStaticProps`: + +```ts +export const getStaticProps = async ({ params: { slug } }) => { + const props = {} + + const pageReq = await fetch( + `https://cms.website.com/api/pages?where[slug][equals]=${slug}&depth=1`, + ) + const pageData = await pageReq.json() + + if (pageReq.ok) { + const { docs } = pageData + const [doc] = docs + + props = { + ...doc, + collection: 'pages', + collectionLabels: { + singular: 'page', + plural: 'pages', + }, + } + } + + return props +} +``` + +Now your app can forward these props onto the admin bar. Something like this: + +```ts +import { PayloadAdminBar } from '@payloadcms/admin-bar'; + +export const App = (appProps) => { + const { + pageProps: { + collection, + collectionLabels, + id + } + } = appProps; + + return ( + + ) +} +``` + +### Props + +| Property | Type | Required | Default | Description | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------ | -------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| cmsURL | `string` | true | `http://localhost:8000` | `serverURL` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| adminPath | `string` | false | /admin | `routes` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| apiPath | `string` | false | /api | `routes` as defined in your [Payload config](https://payloadcms.com/docs/configuration/overview#options) | +| authCollectionSlug | `string` | false | 'users' | Slug of your [auth collection](https://payloadcms.com/docs/configuration/collections) | +| collectionSlug | `string` | true | undefined | Slug of your [collection](https://payloadcms.com/docs/configuration/collections) | +| collectionLabels | `{ singular?: string, plural?: string }` | false | undefined | Labels of your [collection](https://payloadcms.com/docs/configuration/collections) | +| id | `string` | true | undefined | id of the document | +| logo | `ReactElement` | false | undefined | Custom logo | +| classNames | `{ logo?: string, user?: string, controls?: string, create?: string, logout?: string, edit?: string, preview?: string }` | false | undefined | Custom class names, one for each rendered element | +| logoProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| userProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| divProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| createProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| logoutProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| editProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| previewProps | `{[key: string]?: unknown}` | false | undefined | Custom props | +| style | `CSSProperties` | false | undefined | Custom inline style | +| unstyled | `boolean` | false | undefined | If true, renders no inline style | +| onAuthChange | `(user: PayloadMeUser) => void` | false | undefined | Fired on each auth change | +| devMode | `boolean` | false | undefined | If true, fakes authentication (useful when dealing with [SameSite cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite)) | +| preview | `boolean` | false | undefined | If true, renders an exit button with your `onPreviewExit` handler) | +| onPreviewExit | `function` | false | undefined | Callback for the preview button `onClick` event) | diff --git a/packages/admin-bar/eslint.config.js b/packages/admin-bar/eslint.config.js new file mode 100644 index 0000000000..f9d341be50 --- /dev/null +++ b/packages/admin-bar/eslint.config.js @@ -0,0 +1,18 @@ +import { rootEslintConfig, rootParserOptions } from '../../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...rootEslintConfig, + { + languageOptions: { + parserOptions: { + ...rootParserOptions, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +] + +export default index diff --git a/packages/admin-bar/package.json b/packages/admin-bar/package.json new file mode 100644 index 0000000000..8d93001e3d --- /dev/null +++ b/packages/admin-bar/package.json @@ -0,0 +1,65 @@ +{ + "name": "@payloadcms/admin-bar", + "version": "1.0.7", + "description": "An admin bar for React apps using Payload", + "homepage": "https://payloadcms.com", + "repository": { + "type": "git", + "url": "https://github.com/payloadcms/payload.git", + "directory": "packages/admin-bar" + }, + "license": "MIT", + "author": "Payload (https://payloadcms.com)", + "maintainers": [ + { + "name": "Payload", + "email": "info@payloadcms.com", + "url": "https://payloadcms.com" + } + ], + "type": "module", + "exports": { + ".": { + "import": "./src/index.ts", + "types": "./src/index.ts", + "default": "./src/index.ts" + } + }, + "main": "./src/index.ts", + "types": "./src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "pnpm copyfiles && pnpm build:types && pnpm build:swc", + "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths", + "build:types": "tsc --emitDeclarationOnly --outDir dist", + "clean": "rimraf -g {dist,*.tsbuildinfo}", + "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "prepublishOnly": "pnpm clean && pnpm turbo build" + }, + "devDependencies": { + "@payloadcms/eslint-config": "workspace:*", + "@types/react": "19.0.10", + "@types/react-dom": "19.0.4", + "payload": "workspace:*" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "main": "./dist/index.js", + "registry": "https://registry.npmjs.org/", + "types": "./dist/index.d.ts" + } +} diff --git a/packages/admin-bar/src/AdminBar.tsx b/packages/admin-bar/src/AdminBar.tsx new file mode 100644 index 0000000000..371b8f13e7 --- /dev/null +++ b/packages/admin-bar/src/AdminBar.tsx @@ -0,0 +1,349 @@ +'use client' +import React, { useEffect, useState } from 'react' + +const dummyUser = { + id: '12345', + email: 'dev@email.com', +} + +import type { PayloadAdminBarProps, PayloadMeUser } from './types.js' + +export const PayloadAdminBar: React.FC = (props) => { + const { + id: docID, + adminPath = '/admin', + apiPath = '/api', + authCollectionSlug = 'users', + className, + classNames, + cmsURL = 'http://localhost:8000', + collectionLabels, + collectionSlug, + createProps, + devMode, + divProps, + editProps, + logo, + logoProps, + logoutProps, + onAuthChange, + onPreviewExit, + preview, + previewProps, + style, + unstyled, + userProps, + } = props + + const [user, setUser] = useState() + + useEffect(() => { + const fetchMe = async () => { + try { + const meRequest = await fetch(`${cmsURL}${apiPath}/${authCollectionSlug}/me`, { + credentials: 'include', + method: 'get', + }) + const meResponse = await meRequest.json() + const { user } = meResponse + + if (user) { + setUser(user) + } else { + if (devMode !== true) { + setUser(null) + } else { + setUser(dummyUser) + } + } + } catch (err) { + console.warn(err) + if (devMode === true) { + setUser(dummyUser) + } + } + } + + void fetchMe() + }, [cmsURL, adminPath, apiPath, devMode]) + + useEffect(() => { + if (typeof onAuthChange === 'function') { + onAuthChange(user) + } + }, [user, onAuthChange]) + + if (user) { + const { id: userID, email } = user + + return ( + + ) + } + + return null +} diff --git a/packages/admin-bar/src/index.ts b/packages/admin-bar/src/index.ts new file mode 100644 index 0000000000..f41e6be2b4 --- /dev/null +++ b/packages/admin-bar/src/index.ts @@ -0,0 +1,2 @@ +export { PayloadAdminBar } from './AdminBar.js' +export type { PayloadAdminBarProps, PayloadMeUser } from './types.js' diff --git a/packages/admin-bar/src/types.ts b/packages/admin-bar/src/types.ts new file mode 100644 index 0000000000..044aa6edb9 --- /dev/null +++ b/packages/admin-bar/src/types.ts @@ -0,0 +1,67 @@ +import type { CSSProperties, ReactElement } from 'react' + +export type PayloadMeUser = + | { + email: string + id: string + } + | null + | undefined + +export type PayloadAdminBarProps = { + adminPath?: string + apiPath?: string + authCollectionSlug?: string + className?: string + classNames?: { + controls?: string + create?: string + edit?: string + logo?: string + logout?: string + preview?: string + user?: string + } + cmsURL?: string + collectionLabels?: { + plural?: string + singular?: string + } + collectionSlug?: string + createProps?: { + [key: string]: unknown + style?: CSSProperties + } + devMode?: boolean + divProps?: { + [key: string]: unknown + style?: CSSProperties + } + editProps?: { + [key: string]: unknown + style?: CSSProperties + } + id?: string + logo?: ReactElement + logoProps?: { + [key: string]: unknown + style?: CSSProperties + } + logoutProps?: { + [key: string]: unknown + style?: CSSProperties + } + onAuthChange?: (user: PayloadMeUser) => void + onPreviewExit?: () => void + preview?: boolean + previewProps?: { + [key: string]: unknown + style?: CSSProperties + } + style?: CSSProperties + unstyled?: boolean + userProps?: { + [key: string]: unknown + style?: CSSProperties + } +} diff --git a/packages/admin-bar/tsconfig.json b/packages/admin-bar/tsconfig.json new file mode 100644 index 0000000000..14564e0715 --- /dev/null +++ b/packages/admin-bar/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + /* TODO: remove the following lines */ + "strict": false, + "noUncheckedIndexedAccess": false, + }, + "references": [{ "path": "../payload" }] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a54df297e2..159e22fb07 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,6 +191,28 @@ importers: specifier: 5.7.3 version: 5.7.3 + packages/admin-bar: + dependencies: + react: + specifier: 19.0.0 + version: 19.0.0 + react-dom: + specifier: 19.0.0 + version: 19.0.0(react@19.0.0) + devDependencies: + '@payloadcms/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/react': + specifier: 19.0.10 + version: 19.0.10 + '@types/react-dom': + specifier: 19.0.4 + version: 19.0.4(@types/react@19.0.10) + payload: + specifier: workspace:* + version: link:../payload + packages/create-payload-app: dependencies: '@clack/prompts': @@ -1657,6 +1679,9 @@ importers: '@next/env': specifier: 15.2.0 version: 15.2.0 + '@payloadcms/admin-bar': + specifier: workspace:* + version: link:../packages/admin-bar '@payloadcms/db-mongodb': specifier: workspace:* version: link:../packages/db-mongodb diff --git a/test/admin-bar/.gitignore b/test/admin-bar/.gitignore new file mode 100644 index 0000000000..cce01755f4 --- /dev/null +++ b/test/admin-bar/.gitignore @@ -0,0 +1,2 @@ +/media +/media-gif diff --git a/test/admin-bar/app/(payload)/admin/[[...segments]]/not-found.tsx b/test/admin-bar/app/(payload)/admin/[[...segments]]/not-found.tsx new file mode 100644 index 0000000000..180e6f81cd --- /dev/null +++ b/test/admin-bar/app/(payload)/admin/[[...segments]]/not-found.tsx @@ -0,0 +1,25 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import type { Metadata } from 'next' + +import config from '@payload-config' +import { generatePageMetadata, NotFoundPage } from '@payloadcms/next/views' + +import { importMap } from '../importMap.js' + +type Args = { + params: Promise<{ + segments: string[] + }> + searchParams: Promise<{ + [key: string]: string | string[] + }> +} + +export const generateMetadata = ({ params, searchParams }: Args): Promise => + generatePageMetadata({ config, params, searchParams }) + +const NotFound = ({ params, searchParams }: Args) => + NotFoundPage({ config, importMap, params, searchParams }) + +export default NotFound diff --git a/test/admin-bar/app/(payload)/admin/[[...segments]]/page.tsx b/test/admin-bar/app/(payload)/admin/[[...segments]]/page.tsx new file mode 100644 index 0000000000..e59b2d3a84 --- /dev/null +++ b/test/admin-bar/app/(payload)/admin/[[...segments]]/page.tsx @@ -0,0 +1,25 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import type { Metadata } from 'next' + +import config from '@payload-config' +import { generatePageMetadata, RootPage } from '@payloadcms/next/views' + +import { importMap } from '../importMap.js' + +type Args = { + params: Promise<{ + segments: string[] + }> + searchParams: Promise<{ + [key: string]: string | string[] + }> +} + +export const generateMetadata = ({ params, searchParams }: Args): Promise => + generatePageMetadata({ config, params, searchParams }) + +const Page = ({ params, searchParams }: Args) => + RootPage({ config, importMap, params, searchParams }) + +export default Page diff --git a/test/admin-bar/app/(payload)/admin/importMap.js b/test/admin-bar/app/(payload)/admin/importMap.js new file mode 100644 index 0000000000..8ef7021383 --- /dev/null +++ b/test/admin-bar/app/(payload)/admin/importMap.js @@ -0,0 +1 @@ +export const importMap = {} diff --git a/test/admin-bar/app/(payload)/api/[...slug]/route.ts b/test/admin-bar/app/(payload)/api/[...slug]/route.ts new file mode 100644 index 0000000000..183cf457f6 --- /dev/null +++ b/test/admin-bar/app/(payload)/api/[...slug]/route.ts @@ -0,0 +1,10 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import config from '@payload-config' +import { REST_DELETE, REST_GET, REST_OPTIONS, REST_PATCH, REST_POST } from '@payloadcms/next/routes' + +export const GET = REST_GET(config) +export const POST = REST_POST(config) +export const DELETE = REST_DELETE(config) +export const PATCH = REST_PATCH(config) +export const OPTIONS = REST_OPTIONS(config) diff --git a/test/admin-bar/app/(payload)/api/graphql-playground/route.ts b/test/admin-bar/app/(payload)/api/graphql-playground/route.ts new file mode 100644 index 0000000000..dffacb345f --- /dev/null +++ b/test/admin-bar/app/(payload)/api/graphql-playground/route.ts @@ -0,0 +1,6 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import config from '@payload-config' +import { GRAPHQL_PLAYGROUND_GET } from '@payloadcms/next/routes/index.js' + +export const GET = GRAPHQL_PLAYGROUND_GET(config) diff --git a/test/admin-bar/app/(payload)/api/graphql/route.ts b/test/admin-bar/app/(payload)/api/graphql/route.ts new file mode 100644 index 0000000000..2069ff86b0 --- /dev/null +++ b/test/admin-bar/app/(payload)/api/graphql/route.ts @@ -0,0 +1,8 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import config from '@payload-config' +import { GRAPHQL_POST, REST_OPTIONS } from '@payloadcms/next/routes' + +export const POST = GRAPHQL_POST(config) + +export const OPTIONS = REST_OPTIONS(config) diff --git a/test/admin-bar/app/(payload)/custom.scss b/test/admin-bar/app/(payload)/custom.scss new file mode 100644 index 0000000000..f557cd4277 --- /dev/null +++ b/test/admin-bar/app/(payload)/custom.scss @@ -0,0 +1,7 @@ +#custom-css { + font-family: monospace; +} + +#custom-css::after { + content: 'custom-css'; +} diff --git a/test/admin-bar/app/(payload)/layout.tsx b/test/admin-bar/app/(payload)/layout.tsx new file mode 100644 index 0000000000..93a5fcf45c --- /dev/null +++ b/test/admin-bar/app/(payload)/layout.tsx @@ -0,0 +1,31 @@ +/* THIS FILE WAS GENERATED AUTOMATICALLY BY PAYLOAD. */ +/* DO NOT MODIFY IT BECAUSE IT COULD BE REWRITTEN AT ANY TIME. */ +import type { ServerFunctionClient } from 'payload' + +import config from '@payload-config' +import { handleServerFunctions, RootLayout } from '@payloadcms/next/layouts' +import React from 'react' + +import { importMap } from './admin/importMap.js' +import './custom.scss' + +type Args = { + children: React.ReactNode +} + +const serverFunction: ServerFunctionClient = async function (args) { + 'use server' + return handleServerFunctions({ + ...args, + config, + importMap, + }) +} + +const Layout = ({ children }: Args) => ( + + {children} + +) + +export default Layout diff --git a/test/admin-bar/app/admin-bar/app.scss b/test/admin-bar/app/admin-bar/app.scss new file mode 100644 index 0000000000..0c374fce78 --- /dev/null +++ b/test/admin-bar/app/admin-bar/app.scss @@ -0,0 +1,22 @@ +:root { + --font-body: system-ui; +} + +* { + box-sizing: border-box; +} + +html { + -webkit-font-smoothing: antialiased; +} + +html, +body, +#app { + height: 100%; +} + +body { + font-family: var(--font-body); + margin: 0; +} diff --git a/test/admin-bar/app/admin-bar/layout.tsx b/test/admin-bar/app/admin-bar/layout.tsx new file mode 100644 index 0000000000..3e797358ee --- /dev/null +++ b/test/admin-bar/app/admin-bar/layout.tsx @@ -0,0 +1,29 @@ +import type { Metadata } from 'next' + +import { PayloadAdminBar } from '@payloadcms/admin-bar' +import React from 'react' + +import './app.scss' + +export const metadata: Metadata = { + description: 'Payload Admin Bar', + title: 'Payload Admin Bar', +} + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + {children} + + + ) +} diff --git a/test/admin-bar/app/admin-bar/page.tsx b/test/admin-bar/app/admin-bar/page.tsx new file mode 100644 index 0000000000..8be7a4cc95 --- /dev/null +++ b/test/admin-bar/app/admin-bar/page.tsx @@ -0,0 +1,12 @@ +import { Fragment } from 'react' + +const PageTemplate = () => { + return ( + +
+

Payload Admin Bar

+
+ ) +} + +export default PageTemplate diff --git a/test/admin-bar/collections/Media/index.ts b/test/admin-bar/collections/Media/index.ts new file mode 100644 index 0000000000..bb5edd0349 --- /dev/null +++ b/test/admin-bar/collections/Media/index.ts @@ -0,0 +1,33 @@ +import type { CollectionConfig } from 'payload' + +export const mediaSlug = 'media' + +export const MediaCollection: CollectionConfig = { + slug: mediaSlug, + access: { + create: () => true, + read: () => true, + }, + fields: [], + upload: { + crop: true, + focalPoint: true, + imageSizes: [ + { + name: 'thumbnail', + height: 200, + width: 200, + }, + { + name: 'medium', + height: 800, + width: 800, + }, + { + name: 'large', + height: 1200, + width: 1200, + }, + ], + }, +} diff --git a/test/admin-bar/collections/Posts/index.ts b/test/admin-bar/collections/Posts/index.ts new file mode 100644 index 0000000000..ffed2abbd1 --- /dev/null +++ b/test/admin-bar/collections/Posts/index.ts @@ -0,0 +1,19 @@ +import type { CollectionConfig } from 'payload' + +export const postsSlug = 'posts' + +export const PostsCollection: CollectionConfig = { + slug: postsSlug, + admin: { + useAsTitle: 'title', + }, + fields: [ + { + name: 'title', + type: 'text', + }, + ], + versions: { + drafts: true, + }, +} diff --git a/test/admin-bar/config.ts b/test/admin-bar/config.ts new file mode 100644 index 0000000000..5c56404df3 --- /dev/null +++ b/test/admin-bar/config.ts @@ -0,0 +1,39 @@ +import { fileURLToPath } from 'node:url' +import path from 'path' + +import { buildConfigWithDefaults } from '../buildConfigWithDefaults.js' +import { devUser } from '../credentials.js' +import { MediaCollection } from './collections/Media/index.js' +import { PostsCollection, postsSlug } from './collections/Posts/index.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +export default buildConfigWithDefaults({ + // ...extend config here + collections: [PostsCollection, MediaCollection], + admin: { + importMap: { + baseDir: path.resolve(dirname), + }, + }, + onInit: async (payload) => { + await payload.create({ + collection: 'users', + data: { + email: devUser.email, + password: devUser.password, + }, + }) + + await payload.create({ + collection: postsSlug, + data: { + title: 'example post', + }, + }) + }, + typescript: { + outputFile: path.resolve(dirname, 'payload-types.ts'), + }, +}) diff --git a/test/admin-bar/e2e.spec.ts b/test/admin-bar/e2e.spec.ts new file mode 100644 index 0000000000..b9c2f9026d --- /dev/null +++ b/test/admin-bar/e2e.spec.ts @@ -0,0 +1,37 @@ +import type { Page } from '@playwright/test' + +import { expect, test } from '@playwright/test' +import * as path from 'path' +import { fileURLToPath } from 'url' + +import { ensureCompilationIsDone, initPageConsoleErrorCatch } from '../helpers.js' +import { AdminUrlUtil } from '../helpers/adminUrlUtil.js' +import { initPayloadE2ENoConfig } from '../helpers/initPayloadE2ENoConfig.js' +import { TEST_TIMEOUT_LONG } from '../playwright.config.js' + +const filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(filename) + +test.describe('Admin Bar', () => { + let page: Page + let url: AdminUrlUtil + let serverURL: string + + test.beforeAll(async ({ browser }, testInfo) => { + testInfo.setTimeout(TEST_TIMEOUT_LONG) + + const { payload, serverURL: incomingServerURL } = await initPayloadE2ENoConfig({ dirname }) + url = new AdminUrlUtil(incomingServerURL, 'posts') + serverURL = incomingServerURL + + const context = await browser.newContext() + page = await context.newPage() + initPageConsoleErrorCatch(page) + await ensureCompilationIsDone({ page, serverURL: incomingServerURL }) + }) + + test('should render admin bar', async () => { + await page.goto(`${serverURL}/admin-bar`) + await expect(page.locator('#payload-admin-bar')).toBeVisible() + }) +}) diff --git a/test/admin-bar/eslint.config.js b/test/admin-bar/eslint.config.js new file mode 100644 index 0000000000..f295df083f --- /dev/null +++ b/test/admin-bar/eslint.config.js @@ -0,0 +1,19 @@ +import { rootParserOptions } from '../../eslint.config.js' +import { testEslintConfig } from '../eslint.config.js' + +/** @typedef {import('eslint').Linter.Config} Config */ + +/** @type {Config[]} */ +export const index = [ + ...testEslintConfig, + { + languageOptions: { + parserOptions: { + ...rootParserOptions, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, +] + +export default index diff --git a/test/admin-bar/next-env.d.ts b/test/admin-bar/next-env.d.ts new file mode 100644 index 0000000000..1b3be0840f --- /dev/null +++ b/test/admin-bar/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/test/admin-bar/next.config.mjs b/test/admin-bar/next.config.mjs new file mode 100644 index 0000000000..f6969a8284 --- /dev/null +++ b/test/admin-bar/next.config.mjs @@ -0,0 +1,15 @@ +import nextConfig from '../../next.config.mjs' + +import path from 'path' +import { fileURLToPath } from 'url' + +const __filename = fileURLToPath(import.meta.url) +const dirname = path.dirname(__filename) + +export default { + ...nextConfig, + env: { + PAYLOAD_CORE_DEV: 'true', + ROOT_DIR: path.resolve(dirname), + }, +} diff --git a/test/admin-bar/payload-types.ts b/test/admin-bar/payload-types.ts new file mode 100644 index 0000000000..34e0e5fb4c --- /dev/null +++ b/test/admin-bar/payload-types.ts @@ -0,0 +1,370 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * This file was automatically generated by Payload. + * DO NOT MODIFY IT BY HAND. Instead, modify your source Payload config, + * and re-run `payload generate:types` to regenerate this file. + */ + +/** + * Supported timezones in IANA format. + * + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "supportedTimezones". + */ +export type SupportedTimezones = + | 'Pacific/Midway' + | 'Pacific/Niue' + | 'Pacific/Honolulu' + | 'Pacific/Rarotonga' + | 'America/Anchorage' + | 'Pacific/Gambier' + | 'America/Los_Angeles' + | 'America/Tijuana' + | 'America/Denver' + | 'America/Phoenix' + | 'America/Chicago' + | 'America/Guatemala' + | 'America/New_York' + | 'America/Bogota' + | 'America/Caracas' + | 'America/Santiago' + | 'America/Buenos_Aires' + | 'America/Sao_Paulo' + | 'Atlantic/South_Georgia' + | 'Atlantic/Azores' + | 'Atlantic/Cape_Verde' + | 'Europe/London' + | 'Europe/Berlin' + | 'Africa/Lagos' + | 'Europe/Athens' + | 'Africa/Cairo' + | 'Europe/Moscow' + | 'Asia/Riyadh' + | 'Asia/Dubai' + | 'Asia/Baku' + | 'Asia/Karachi' + | 'Asia/Tashkent' + | 'Asia/Calcutta' + | 'Asia/Dhaka' + | 'Asia/Almaty' + | 'Asia/Jakarta' + | 'Asia/Bangkok' + | 'Asia/Shanghai' + | 'Asia/Singapore' + | 'Asia/Tokyo' + | 'Asia/Seoul' + | 'Australia/Sydney' + | 'Pacific/Guam' + | 'Pacific/Noumea' + | 'Pacific/Auckland' + | 'Pacific/Fiji'; + +export interface Config { + auth: { + users: UserAuthOperations; + }; + blocks: {}; + collections: { + posts: Post; + media: Media; + users: User; + 'payload-locked-documents': PayloadLockedDocument; + 'payload-preferences': PayloadPreference; + 'payload-migrations': PayloadMigration; + }; + collectionsJoins: {}; + collectionsSelect: { + posts: PostsSelect | PostsSelect; + media: MediaSelect | MediaSelect; + users: UsersSelect | UsersSelect; + 'payload-locked-documents': PayloadLockedDocumentsSelect | PayloadLockedDocumentsSelect; + 'payload-preferences': PayloadPreferencesSelect | PayloadPreferencesSelect; + 'payload-migrations': PayloadMigrationsSelect | PayloadMigrationsSelect; + }; + db: { + defaultIDType: string; + }; + globals: {}; + globalsSelect: {}; + locale: null; + user: User & { + collection: 'users'; + }; + jobs: { + tasks: unknown; + workflows: unknown; + }; +} +export interface UserAuthOperations { + forgotPassword: { + email: string; + password: string; + }; + login: { + email: string; + password: string; + }; + registerFirstUser: { + email: string; + password: string; + }; + unlock: { + email: string; + password: string; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "posts". + */ +export interface Post { + id: string; + title?: string | null; + updatedAt: string; + createdAt: string; + _status?: ('draft' | 'published') | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "media". + */ +export interface Media { + id: string; + updatedAt: string; + createdAt: string; + url?: string | null; + thumbnailURL?: string | null; + filename?: string | null; + mimeType?: string | null; + filesize?: number | null; + width?: number | null; + height?: number | null; + focalX?: number | null; + focalY?: number | null; + sizes?: { + thumbnail?: { + url?: string | null; + width?: number | null; + height?: number | null; + mimeType?: string | null; + filesize?: number | null; + filename?: string | null; + }; + medium?: { + url?: string | null; + width?: number | null; + height?: number | null; + mimeType?: string | null; + filesize?: number | null; + filename?: string | null; + }; + large?: { + url?: string | null; + width?: number | null; + height?: number | null; + mimeType?: string | null; + filesize?: number | null; + filename?: string | null; + }; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users". + */ +export interface User { + id: string; + updatedAt: string; + createdAt: string; + email: string; + resetPasswordToken?: string | null; + resetPasswordExpiration?: string | null; + salt?: string | null; + hash?: string | null; + loginAttempts?: number | null; + lockUntil?: string | null; + password?: string | null; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents". + */ +export interface PayloadLockedDocument { + id: string; + document?: + | ({ + relationTo: 'posts'; + value: string | Post; + } | null) + | ({ + relationTo: 'media'; + value: string | Media; + } | null) + | ({ + relationTo: 'users'; + value: string | User; + } | null); + globalSlug?: string | null; + user: { + relationTo: 'users'; + value: string | User; + }; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences". + */ +export interface PayloadPreference { + id: string; + user: { + relationTo: 'users'; + value: string | User; + }; + key?: string | null; + value?: + | { + [k: string]: unknown; + } + | unknown[] + | string + | number + | boolean + | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations". + */ +export interface PayloadMigration { + id: string; + name?: string | null; + batch?: number | null; + updatedAt: string; + createdAt: string; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "posts_select". + */ +export interface PostsSelect { + title?: T; + updatedAt?: T; + createdAt?: T; + _status?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "media_select". + */ +export interface MediaSelect { + updatedAt?: T; + createdAt?: T; + url?: T; + thumbnailURL?: T; + filename?: T; + mimeType?: T; + filesize?: T; + width?: T; + height?: T; + focalX?: T; + focalY?: T; + sizes?: + | T + | { + thumbnail?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + medium?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + large?: + | T + | { + url?: T; + width?: T; + height?: T; + mimeType?: T; + filesize?: T; + filename?: T; + }; + }; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "users_select". + */ +export interface UsersSelect { + updatedAt?: T; + createdAt?: T; + email?: T; + resetPasswordToken?: T; + resetPasswordExpiration?: T; + salt?: T; + hash?: T; + loginAttempts?: T; + lockUntil?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-locked-documents_select". + */ +export interface PayloadLockedDocumentsSelect { + document?: T; + globalSlug?: T; + user?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-preferences_select". + */ +export interface PayloadPreferencesSelect { + user?: T; + key?: T; + value?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "payload-migrations_select". + */ +export interface PayloadMigrationsSelect { + name?: T; + batch?: T; + updatedAt?: T; + createdAt?: T; +} +/** + * This interface was referenced by `Config`'s JSON-Schema + * via the `definition` "auth". + */ +export interface Auth { + [k: string]: unknown; +} + + +declare module 'payload' { + // @ts-ignore + export interface GeneratedTypes extends Config {} +} \ No newline at end of file diff --git a/test/admin-bar/tsconfig.eslint.json b/test/admin-bar/tsconfig.eslint.json new file mode 100644 index 0000000000..b34cc7afbb --- /dev/null +++ b/test/admin-bar/tsconfig.eslint.json @@ -0,0 +1,13 @@ +{ + // extend your base config to share compilerOptions, etc + //"extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": [ + // whatever paths you intend to lint + "./**/*.ts", + "./**/*.tsx" + ] +} diff --git a/test/admin-bar/tsconfig.json b/test/admin-bar/tsconfig.json new file mode 100644 index 0000000000..a838568167 --- /dev/null +++ b/test/admin-bar/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.json", + "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/test/admin-bar/types.d.ts b/test/admin-bar/types.d.ts new file mode 100644 index 0000000000..8d5bd7d65c --- /dev/null +++ b/test/admin-bar/types.d.ts @@ -0,0 +1,9 @@ +import type { RequestContext as OriginalRequestContext } from 'payload' + +declare module 'payload' { + // Create a new interface that merges your additional fields with the original one + export interface RequestContext extends OriginalRequestContext { + myObject?: string + // ... + } +} diff --git a/test/generateImportMap.ts b/test/generateImportMap.ts index 51fce17230..f21336cfd3 100644 --- a/test/generateImportMap.ts +++ b/test/generateImportMap.ts @@ -23,8 +23,14 @@ async function run() { const config: SanitizedConfig = await (await import(pathWithConfig)).default let rootDir = '' - if (testConfigDir === 'live-preview' || testConfigDir === 'admin-root') { + + if ( + testConfigDir === 'live-preview' || + testConfigDir === 'admin-root' || + testConfigDir === 'admin-bar' + ) { rootDir = testDir + if (process.env.PAYLOAD_TEST_PROD === 'true') { // If in prod mode, there may be a testSuite/prod folder. If so, use that as the rootDir const prodDir = path.resolve(testDir, 'prod') diff --git a/test/package.json b/test/package.json index 456357d771..817077514c 100644 --- a/test/package.json +++ b/test/package.json @@ -25,6 +25,7 @@ "@aws-sdk/client-s3": "^3.614.0", "@date-fns/tz": "1.2.0", "@next/env": "15.2.0", + "@payloadcms/admin-bar": "workspace:*", "@payloadcms/db-mongodb": "workspace:*", "@payloadcms/db-postgres": "workspace:*", "@payloadcms/db-sqlite": "workspace:*", diff --git a/test/setupProd.ts b/test/setupProd.ts index b906715670..ab6006fa0c 100644 --- a/test/setupProd.ts +++ b/test/setupProd.ts @@ -7,6 +7,7 @@ const dirname = path.dirname(filename) export const tgzToPkgNameMap = { payload: 'payload-*', + '@payloadcms/admin-bar': 'payloadcms-admin-bar-*', '@payloadcms/db-mongodb': 'payloadcms-db-mongodb-*', '@payloadcms/db-postgres': 'payloadcms-db-postgres-*', '@payloadcms/db-vercel-postgres': 'payloadcms-db-vercel-postgres-*', diff --git a/test/tsconfig.typecheck.json b/test/tsconfig.typecheck.json index 1f059a791b..4051bf0807 100644 --- a/test/tsconfig.typecheck.json +++ b/test/tsconfig.typecheck.json @@ -12,6 +12,9 @@ // "../packages/**/src/**/*.tsx" ], "references": [ + { + "path": "../packages/admin-bar" + }, { "path": "../packages/create-payload-app" }, diff --git a/tools/releaser/src/lib/publishList.ts b/tools/releaser/src/lib/publishList.ts index 7bb869b5b1..c0f6fbf011 100644 --- a/tools/releaser/src/lib/publishList.ts +++ b/tools/releaser/src/lib/publishList.ts @@ -9,6 +9,7 @@ export const packagePublishList = [ 'ui', 'next', 'graphql', + 'admin-bar', 'live-preview', 'live-preview-react', 'live-preview-vue', diff --git a/tsconfig.base.json b/tsconfig.base.json index 4b37de3910..f8e3c37711 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -31,7 +31,8 @@ } ], "paths": { - "@payload-config": ["./test/plugin-import-export/config.ts"], + "@payload-config": ["./test/admin-bar/config.ts"], + "@payloadcms/admin-bar": ["./packages/admin-bar/src"], "@payloadcms/live-preview": ["./packages/live-preview/src"], "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], @@ -71,11 +72,13 @@ "@payloadcms/plugin-multi-tenant": ["./packages/plugin-multi-tenant/src/index.ts"], "@payloadcms/next": ["./packages/next/src/exports/*"], "@payloadcms/storage-s3/client": ["./packages/storage-s3/src/exports/client.ts"], - "@payloadcms/storage-vercel-blob/client": ["./packages/storage-vercel-blob/src/exports/client.ts" + "@payloadcms/storage-vercel-blob/client": [ + "./packages/storage-vercel-blob/src/exports/client.ts" ], "@payloadcms/storage-gcs/client": ["./packages/storage-gcs/src/exports/client.ts"], "@payloadcms/storage-uploadthing/client": [ - "./packages/storage-uploadthing/src/exports/client.ts"] + "./packages/storage-uploadthing/src/exports/client.ts" + ] } }, "include": ["${configDir}/src"], diff --git a/tsconfig.json b/tsconfig.json index bcb2746e44..353ae6cb86 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,9 +4,11 @@ "composite": false, "noEmit": true, "baseUrl": ".", - }, "references": [ + { + "path": "./packages/admin-bar" + }, { "path": "./packages/create-payload-app" }, From 2163b0fdb50c6f4b2acaceae9d485d9f0886291a Mon Sep 17 00:00:00 2001 From: Jarrod Flesch <30633324+JarrodMFlesch@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:28:26 -0500 Subject: [PATCH 107/127] feat(ui): improves field error toast messages (#11521) ### What? Adjusts how field errors are displayed within toasts so they are easier to read. ![Frame 36 (1)](https://github.com/user-attachments/assets/3debec4f-8d78-42ef-84bc-efd574a63ac6) --- packages/payload/src/admin/RichText.ts | 9 ++- .../src/fields/hooks/beforeChange/index.ts | 1 + .../src/fields/hooks/beforeChange/promise.ts | 70 ++++++++++++++++-- .../hooks/beforeChange/traverseFields.ts | 8 ++ .../payload/src/utilities/getLabelFromPath.ts | 16 ---- packages/richtext-lexical/src/index.ts | 2 + .../ui/src/elements/Toasts/fieldErrors.tsx | 74 +++++++++++++++++++ packages/ui/src/forms/Form/index.tsx | 4 +- .../Lexical/e2e/blocks/e2e.spec.ts | 43 ++++++++--- test/fields/int.spec.ts | 8 +- 10 files changed, 194 insertions(+), 41 deletions(-) delete mode 100644 packages/payload/src/utilities/getLabelFromPath.ts create mode 100644 packages/ui/src/elements/Toasts/fieldErrors.tsx diff --git a/packages/payload/src/admin/RichText.ts b/packages/payload/src/admin/RichText.ts index f5cacf4c10..5644f07e30 100644 --- a/packages/payload/src/admin/RichText.ts +++ b/packages/payload/src/admin/RichText.ts @@ -87,6 +87,12 @@ export type BeforeChangeRichTextHookArgs< duplicate?: boolean errors?: ValidationFieldError[] + /** + * Built up field label + * + * @example "Group Field > Tab Field > Rich Text Field" + */ + fieldLabelPath: string /** Only available in `beforeChange` field hooks */ mergeLocaleActions?: (() => Promise | void)[] /** A string relating to which operation the field type is currently executing within. */ @@ -95,11 +101,11 @@ export type BeforeChangeRichTextHookArgs< previousSiblingDoc?: TData /** The previous value of the field, before changes */ previousValue?: TValue + /** * The original siblingData with locales (not modified by any hooks). */ siblingDocWithLocales?: JsonObject - skipValidation?: boolean } @@ -121,7 +127,6 @@ export type BaseRichTextHookArgs< /** The full original document in `update` operations. In the `afterChange` hook, this is the resulting document of the operation. */ originalDoc?: TData parentIsLocalized: boolean - /** * The path of the field, e.g. ["group", "myArray", 1, "textField"]. The path is the schemaPath but with indexes and would be used in the context of field data, not field schemas. */ diff --git a/packages/payload/src/fields/hooks/beforeChange/index.ts b/packages/payload/src/fields/hooks/beforeChange/index.ts index 4631d2b4e1..1571893011 100644 --- a/packages/payload/src/fields/hooks/beforeChange/index.ts +++ b/packages/payload/src/fields/hooks/beforeChange/index.ts @@ -54,6 +54,7 @@ export const beforeChange = async ({ doc, docWithLocales, errors, + fieldLabelPath: '', fields: collection?.fields || global?.fields, global, mergeLocaleActions, diff --git a/packages/payload/src/fields/hooks/beforeChange/promise.ts b/packages/payload/src/fields/hooks/beforeChange/promise.ts index 2ad35d11ed..46a43d1a52 100644 --- a/packages/payload/src/fields/hooks/beforeChange/promise.ts +++ b/packages/payload/src/fields/hooks/beforeChange/promise.ts @@ -9,13 +9,17 @@ import type { Block, Field, TabAsField, Validate } from '../../config/types.js' import { MissingEditorProp } from '../../../errors/index.js' import { deepMergeWithSourceArrays } from '../../../utilities/deepMerge.js' -import { getLabelFromPath } from '../../../utilities/getLabelFromPath.js' import { getTranslatedLabel } from '../../../utilities/getTranslatedLabel.js' import { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js' import { getFieldPathsModified as getFieldPaths } from '../../getFieldPaths.js' import { getExistingRowDoc } from './getExistingRowDoc.js' import { traverseFields } from './traverseFields.js' +function buildFieldLabel(parentLabel: string, label: string): string { + const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1) + return parentLabel ? `${parentLabel} > ${capitalizedLabel}` : capitalizedLabel +} + type Args = { /** * Data of the nearest parent block. If no parent block exists, this will be the `undefined` @@ -29,6 +33,12 @@ type Args = { errors: ValidationFieldError[] field: Field | TabAsField fieldIndex: number + /** + * Built up labels of parent fields + * + * @example "Group Field > Tab Field > Text Field" + */ + fieldLabelPath: string global: null | SanitizedGlobalConfig id?: number | string mergeLocaleActions: (() => Promise | void)[] @@ -64,6 +74,7 @@ export const promise = async ({ errors, field, fieldIndex, + fieldLabelPath, global, mergeLocaleActions, operation, @@ -175,13 +186,10 @@ export const promise = async ({ }) if (typeof validationResult === 'string') { - const label = getTranslatedLabel(field?.label || field?.name, req.i18n) - const parentPathSegments = parentPath ? parentPath.split('.') : [] - - const fieldLabel = - Array.isArray(parentPathSegments) && parentPathSegments.length > 0 - ? getLabelFromPath(parentPathSegments.concat(label)) - : label + const fieldLabel = buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ) errors.push({ label: fieldLabel, @@ -234,6 +242,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`, + ), fields: field.fields, global, mergeLocaleActions, @@ -292,6 +307,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`, + ), fields: block.fields, global, mergeLocaleActions, @@ -327,6 +349,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field.type === 'row' || field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.type, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -367,6 +396,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -424,6 +460,13 @@ export const promise = async ({ docWithLocales, errors, field, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), global, indexPath: indexPathSegments, mergeLocaleActions, @@ -484,6 +527,13 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel( + fieldLabelPath, + getTranslatedLabel(field?.label || field?.name, req.i18n), + ), fields: field.fields, global, mergeLocaleActions, @@ -512,6 +562,10 @@ export const promise = async ({ doc, docWithLocales, errors, + fieldLabelPath: + field?.label === false + ? fieldLabelPath + : buildFieldLabel(fieldLabelPath, getTranslatedLabel(field?.label || '', req.i18n)), fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })), global, mergeLocaleActions, diff --git a/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts b/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts index 84c9eabf9a..e5f3ac316c 100644 --- a/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts +++ b/packages/payload/src/fields/hooks/beforeChange/traverseFields.ts @@ -25,6 +25,12 @@ type Args = { */ docWithLocales: JsonObject errors: ValidationFieldError[] + /** + * Built up labels of parent fields + * + * @example "Group Field > Tab Field > Text Field" + */ + fieldLabelPath: string fields: (Field | TabAsField)[] global: null | SanitizedGlobalConfig id?: number | string @@ -67,6 +73,7 @@ export const traverseFields = async ({ doc, docWithLocales, errors, + fieldLabelPath, fields, global, mergeLocaleActions, @@ -96,6 +103,7 @@ export const traverseFields = async ({ errors, field, fieldIndex, + fieldLabelPath, global, mergeLocaleActions, operation, diff --git a/packages/payload/src/utilities/getLabelFromPath.ts b/packages/payload/src/utilities/getLabelFromPath.ts deleted file mode 100644 index fbf4bec5fc..0000000000 --- a/packages/payload/src/utilities/getLabelFromPath.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const getLabelFromPath = (path: (number | string)[]): string => { - return path - .filter((pathSegment) => !(typeof pathSegment === 'string' && pathSegment.includes('_index'))) - .reduce((acc, part) => { - if (typeof part === 'number' || (typeof part === 'string' && !isNaN(Number(part)))) { - // Convert index to 1-based and format as "Array 01", "Array 02", etc. - const fieldName = acc.pop() - acc.push(`${fieldName} ${Number(part) + 1}`) - } else { - // Capitalize field names - acc.push(part.charAt(0).toUpperCase() + part.slice(1)) - } - return acc - }, []) - .join(' > ') -} diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index e3d3acef7b..b6c2b14a11 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -421,6 +421,7 @@ export function lexicalEditor(args?: LexicalEditorProps): LexicalRichTextAdapter docWithLocales, errors, field, + fieldLabelPath, global, indexPath, mergeLocaleActions, @@ -554,6 +555,7 @@ export function lexicalEditor(args?: LexicalEditorProps): LexicalRichTextAdapter doc: originalDoc ?? {}, docWithLocales: docWithLocales ?? {}, errors: errors!, + fieldLabelPath, fields: subFields, global, mergeLocaleActions: mergeLocaleActions!, diff --git a/packages/ui/src/elements/Toasts/fieldErrors.tsx b/packages/ui/src/elements/Toasts/fieldErrors.tsx new file mode 100644 index 0000000000..67baf3d997 --- /dev/null +++ b/packages/ui/src/elements/Toasts/fieldErrors.tsx @@ -0,0 +1,74 @@ +'use client' + +import React from 'react' + +function groupSimilarErrors(items: string[]): string[] { + const result: string[] = [] + + for (const item of items) { + if (item) { + const parts = item.split(' → ') + let inserted = false + + // Find a place where a similar path exists + for (let i = 0; i < result.length; i++) { + if (result[i].startsWith(parts[0])) { + result.splice(i + 1, 0, item) + inserted = true + break + } + } + + // If no similar path was found, add to the end + if (!inserted) { + result.push(item) + } + } + } + + return result +} + +function createErrorsFromMessage(message: string): { + errors?: string[] + message: string +} { + const [intro, errorsString] = message.split(':') + const errors = (errorsString || '') + .split(',') + .map((error) => error.replaceAll(' > ', ' → ').trim()) + + if (errors.length === 0) { + return { + message: intro, + } + } + + if (errors.length === 1) { + return { + message: `${intro}: ${errors[0]}`, + } + } + + return { + errors: groupSimilarErrors(errors), + message: `${intro} (${errors.length}):`, + } +} + +export function FieldErrorsToast({ errorMessage }) { + const [{ errors, message }] = React.useState(() => createErrorsFromMessage(errorMessage)) + + return ( +
+ {message} + {Array.isArray(errors) && errors.length > 0 ? ( +
    + {errors.map((error, index) => { + return
  • {error}
  • + })} +
+ ) : null} +
+ ) +} diff --git a/packages/ui/src/forms/Form/index.tsx b/packages/ui/src/forms/Form/index.tsx index 63be10e3ac..7ee655ab2f 100644 --- a/packages/ui/src/forms/Form/index.tsx +++ b/packages/ui/src/forms/Form/index.tsx @@ -21,6 +21,7 @@ import type { SubmitOptions, } from './types.js' +import { FieldErrorsToast } from '../../elements/Toasts/fieldErrors.js' import { useDebouncedEffect } from '../../hooks/useDebouncedEffect.js' import { useEffectEvent } from '../../hooks/useEffectEvent.js' import { useThrottledEffect } from '../../hooks/useThrottledEffect.js' @@ -392,7 +393,6 @@ export const Form: React.FC = (props) => { contextRef.current = { ...contextRef.current } // triggers rerender of all components that subscribe to form if (json.message) { errorToast(json.message) - return } @@ -432,7 +432,7 @@ export const Form: React.FC = (props) => { }) nonFieldErrors.forEach((err) => { - errorToast(err.message || t('error:unknown')) + errorToast() }) return diff --git a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts index e384a5b9c6..fde13f4d18 100644 --- a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts @@ -570,9 +570,17 @@ describe('lexicalBlocks', () => { await topLevelDocTextField.fill('invalid') await saveDocAndAssert(page, '#action-save', 'error') - await expect(page.locator('.payload-toast-container')).toHaveText( - 'The following fields are invalid: Lexical With Blocks, LexicalWithBlocks > Group > Text Depends On Doc Data', - ) + await expect( + page + .locator('.payload-toast-container li') + .filter({ hasText: 'The following fields are invalid (2):' }), + ).toBeVisible() + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(0), + ).toHaveText('Lexical With Blocks') + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(1), + ).toHaveText('Lexical With Blocks → Group → Text Depends On Doc Data') await expect(page.locator('.payload-toast-container .payload-toast-item')).toBeHidden() await trackNetworkRequests( @@ -593,9 +601,18 @@ describe('lexicalBlocks', () => { await blockGroupTextField.fill('invalid') await saveDocAndAssert(page, '#action-save', 'error') - await expect(page.locator('.payload-toast-container')).toHaveText( - 'The following fields are invalid: Lexical With Blocks, LexicalWithBlocks > Group > Text Depends On Sibling Data', - ) + await expect( + page + .locator('.payload-toast-container li') + .filter({ hasText: 'The following fields are invalid (2):' }), + ).toBeVisible() + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(0), + ).toHaveText('Lexical With Blocks') + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(1), + ).toHaveText('Lexical With Blocks → Group → Text Depends On Sibling Data') + await expect(page.locator('.payload-toast-container .payload-toast-item')).toBeHidden() await trackNetworkRequests( @@ -616,9 +633,17 @@ describe('lexicalBlocks', () => { await blockTextField.fill('invalid') await saveDocAndAssert(page, '#action-save', 'error') - await expect(page.locator('.payload-toast-container')).toHaveText( - 'The following fields are invalid: Lexical With Blocks, LexicalWithBlocks > Group > Text Depends On Block Data', - ) + await expect( + page + .locator('.payload-toast-container li') + .filter({ hasText: 'The following fields are invalid (2):' }), + ).toBeVisible() + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(0), + ).toHaveText('Lexical With Blocks') + await expect( + page.locator('.payload-toast-container [data-testid="field-errors"] li').nth(1), + ).toHaveText('Lexical With Blocks → Group → Text Depends On Block Data') await expect(page.locator('.payload-toast-container .payload-toast-item')).toBeHidden() diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index 3b36ffacf5..b56670b05a 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -1815,7 +1815,7 @@ describe('Fields', () => { ], }, }), - ).rejects.toThrow('The following field is invalid: Items 1 > SubArray 1 > Second text field') + ).rejects.toThrow('The following field is invalid: Items 1 > Sub Array 1 > Second text field') }) it('should show proper validation error on text field in row field in nested array', async () => { @@ -1835,7 +1835,7 @@ describe('Fields', () => { ], }, }), - ).rejects.toThrow('The following field is invalid: Items 1 > SubArray 1 > Text In Row') + ).rejects.toThrow('The following field is invalid: Items 1 > Sub Array 1 > Text In Row') }) }) @@ -2363,7 +2363,7 @@ describe('Fields', () => { ], }, }), - ).rejects.toThrow('The following field is invalid: Array 3 > Text') + ).rejects.toThrow('The following field is invalid: Tab with Array > Array 3 > Text') }) }) @@ -2667,7 +2667,7 @@ describe('Fields', () => { }, }), ).rejects.toThrow( - 'The following field is invalid: Group > SubGroup > Required Text Within Sub Group', + 'The following field is invalid: Collapsible Field > Group > Sub Group > Required Text Within Sub Group', ) }) }) From 312aa639b6751680a551ccf7c7c75f83e7e5dd7e Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Wed, 5 Mar 2025 23:34:23 +0200 Subject: [PATCH 108/127] fix: safe auth strategy execution (#11515) Previously when `authenticate` method from an authentication strategy failed it stopped execution of the current request in `createPayloadRequest` which isn't a good behavior. Right now it completely prevents the admin panel from loading: image Now, each `strategy.authenticate` call is wrapped into `try` / `catch`, if an error happens we use `logError` to correctly log that error by its logging level. --- .../payload/src/auth/executeAuthStrategies.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/payload/src/auth/executeAuthStrategies.ts b/packages/payload/src/auth/executeAuthStrategies.ts index 29c67107ca..9da6598361 100644 --- a/packages/payload/src/auth/executeAuthStrategies.ts +++ b/packages/payload/src/auth/executeAuthStrategies.ts @@ -1,5 +1,6 @@ import type { AuthStrategyFunctionArgs, AuthStrategyResult } from './index.js' +import { logError } from '../utilities/logError.js' import { mergeHeaders } from '../utilities/mergeHeaders.js' export const executeAuthStrategies = async ( args: AuthStrategyFunctionArgs, @@ -14,14 +15,18 @@ export const executeAuthStrategies = async ( // add the configured AuthStrategy `name` to the strategy function args args.strategyName = strategy.name - const authResult = await strategy.authenticate(args) - if (authResult.responseHeaders) { - authResult.responseHeaders = mergeHeaders( - result.responseHeaders || new Headers(), - authResult.responseHeaders || new Headers(), - ) + try { + const authResult = await strategy.authenticate(args) + if (authResult.responseHeaders) { + authResult.responseHeaders = mergeHeaders( + result.responseHeaders || new Headers(), + authResult.responseHeaders || new Headers(), + ) + } + result = authResult + } catch (err) { + logError({ err, payload: args.payload }) } - result = authResult if (result.user) { return result From 54acdad190573337de6a3e16a5a3edb68edd0a8a Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 5 Mar 2025 16:44:09 -0500 Subject: [PATCH 109/127] chore(release): v3.27.0 [skip ci] --- package.json | 2 +- packages/admin-bar/package.json | 2 +- packages/create-payload-app/package.json | 2 +- packages/db-mongodb/package.json | 2 +- packages/db-postgres/package.json | 2 +- packages/db-sqlite/package.json | 2 +- packages/db-vercel-postgres/package.json | 2 +- packages/drizzle/package.json | 2 +- packages/email-nodemailer/package.json | 2 +- packages/email-resend/package.json | 2 +- packages/graphql/package.json | 2 +- packages/live-preview-react/package.json | 2 +- packages/live-preview-vue/package.json | 2 +- packages/live-preview/package.json | 2 +- packages/next/package.json | 2 +- packages/payload-cloud/package.json | 2 +- packages/payload/package.json | 2 +- packages/plugin-cloud-storage/package.json | 2 +- packages/plugin-form-builder/package.json | 2 +- packages/plugin-import-export/package.json | 2 +- packages/plugin-multi-tenant/package.json | 2 +- packages/plugin-nested-docs/package.json | 2 +- packages/plugin-redirects/package.json | 2 +- packages/plugin-search/package.json | 2 +- packages/plugin-sentry/package.json | 2 +- packages/plugin-seo/package.json | 2 +- packages/plugin-stripe/package.json | 2 +- packages/richtext-lexical/package.json | 2 +- packages/richtext-slate/package.json | 2 +- packages/storage-azure/package.json | 2 +- packages/storage-gcs/package.json | 2 +- packages/storage-s3/package.json | 2 +- packages/storage-uploadthing/package.json | 2 +- packages/storage-vercel-blob/package.json | 2 +- packages/translations/package.json | 2 +- packages/ui/package.json | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index 7bc1096176..28040407d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "payload-monorepo", - "version": "3.26.0", + "version": "3.27.0", "private": true, "type": "module", "scripts": { diff --git a/packages/admin-bar/package.json b/packages/admin-bar/package.json index 8d93001e3d..e3ea141dff 100644 --- a/packages/admin-bar/package.json +++ b/packages/admin-bar/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/admin-bar", - "version": "1.0.7", + "version": "3.27.0", "description": "An admin bar for React apps using Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/create-payload-app/package.json b/packages/create-payload-app/package.json index 9e6203f023..d24a7f6a42 100644 --- a/packages/create-payload-app/package.json +++ b/packages/create-payload-app/package.json @@ -1,6 +1,6 @@ { "name": "create-payload-app", - "version": "3.26.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/db-mongodb/package.json b/packages/db-mongodb/package.json index ac84d04d40..b05f01b73c 100644 --- a/packages/db-mongodb/package.json +++ b/packages/db-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-mongodb", - "version": "3.26.0", + "version": "3.27.0", "description": "The officially supported MongoDB database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-postgres/package.json b/packages/db-postgres/package.json index dd018f2540..de294da261 100644 --- a/packages/db-postgres/package.json +++ b/packages/db-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-postgres", - "version": "3.26.0", + "version": "3.27.0", "description": "The officially supported Postgres database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-sqlite/package.json b/packages/db-sqlite/package.json index b35d8d31dd..c225e02002 100644 --- a/packages/db-sqlite/package.json +++ b/packages/db-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-sqlite", - "version": "3.26.0", + "version": "3.27.0", "description": "The officially supported SQLite database adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/db-vercel-postgres/package.json b/packages/db-vercel-postgres/package.json index ddbf0ae558..f8818df804 100644 --- a/packages/db-vercel-postgres/package.json +++ b/packages/db-vercel-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/db-vercel-postgres", - "version": "3.26.0", + "version": "3.27.0", "description": "Vercel Postgres adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index 7dd4fabfa2..136144257f 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/drizzle", - "version": "3.26.0", + "version": "3.27.0", "description": "A library of shared functions used by different payload database adapters", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-nodemailer/package.json b/packages/email-nodemailer/package.json index 1696bb862f..4a94da5259 100644 --- a/packages/email-nodemailer/package.json +++ b/packages/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-nodemailer", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload Nodemailer Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/email-resend/package.json b/packages/email-resend/package.json index 7028cd5743..d7163d1c78 100644 --- a/packages/email-resend/package.json +++ b/packages/email-resend/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/email-resend", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload Resend Email Adapter", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/graphql/package.json b/packages/graphql/package.json index e8256e888d..ec09ba797e 100644 --- a/packages/graphql/package.json +++ b/packages/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/graphql", - "version": "3.26.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/live-preview-react/package.json b/packages/live-preview-react/package.json index 99ce8d83f5..89cea8d0be 100644 --- a/packages/live-preview-react/package.json +++ b/packages/live-preview-react/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-react", - "version": "3.26.0", + "version": "3.27.0", "description": "The official React SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview-vue/package.json b/packages/live-preview-vue/package.json index 12089445c1..71ea2197bb 100644 --- a/packages/live-preview-vue/package.json +++ b/packages/live-preview-vue/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview-vue", - "version": "3.26.0", + "version": "3.27.0", "description": "The official Vue SDK for Payload Live Preview", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/live-preview/package.json b/packages/live-preview/package.json index 922645c339..82562ea789 100644 --- a/packages/live-preview/package.json +++ b/packages/live-preview/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/live-preview", - "version": "3.26.0", + "version": "3.27.0", "description": "The official live preview JavaScript SDK for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/next/package.json b/packages/next/package.json index 7ebe99590f..12da32cc9f 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/next", - "version": "3.26.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/payload-cloud/package.json b/packages/payload-cloud/package.json index e77d61537c..f28d161f42 100644 --- a/packages/payload-cloud/package.json +++ b/packages/payload-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/payload-cloud", - "version": "3.26.0", + "version": "3.27.0", "description": "The official Payload Cloud plugin", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/payload/package.json b/packages/payload/package.json index c709dd66c6..264e1fbaa1 100644 --- a/packages/payload/package.json +++ b/packages/payload/package.json @@ -1,6 +1,6 @@ { "name": "payload", - "version": "3.26.0", + "version": "3.27.0", "description": "Node, React, Headless CMS and Application Framework built on Next.js", "keywords": [ "admin panel", diff --git a/packages/plugin-cloud-storage/package.json b/packages/plugin-cloud-storage/package.json index 69f4186173..bbff733362 100644 --- a/packages/plugin-cloud-storage/package.json +++ b/packages/plugin-cloud-storage/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-cloud-storage", - "version": "3.26.0", + "version": "3.27.0", "description": "The official cloud storage plugin for Payload CMS", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-form-builder/package.json b/packages/plugin-form-builder/package.json index 4a948f75e3..b398693b83 100644 --- a/packages/plugin-form-builder/package.json +++ b/packages/plugin-form-builder/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-form-builder", - "version": "3.26.0", + "version": "3.27.0", "description": "Form builder plugin for Payload CMS", "keywords": [ "payload", diff --git a/packages/plugin-import-export/package.json b/packages/plugin-import-export/package.json index 4ec2a14d1f..1f60607451 100644 --- a/packages/plugin-import-export/package.json +++ b/packages/plugin-import-export/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-import-export", - "version": "3.26.0", + "version": "3.27.0", "description": "Import-Export plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-multi-tenant/package.json b/packages/plugin-multi-tenant/package.json index 01d831c1d2..71d1bdd737 100644 --- a/packages/plugin-multi-tenant/package.json +++ b/packages/plugin-multi-tenant/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-multi-tenant", - "version": "3.26.0", + "version": "3.27.0", "description": "Multi Tenant plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-nested-docs/package.json b/packages/plugin-nested-docs/package.json index d7b7eee9a8..c86ed391a5 100644 --- a/packages/plugin-nested-docs/package.json +++ b/packages/plugin-nested-docs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-nested-docs", - "version": "3.26.0", + "version": "3.27.0", "description": "The official Nested Docs plugin for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/plugin-redirects/package.json b/packages/plugin-redirects/package.json index 2878954427..608e0f158b 100644 --- a/packages/plugin-redirects/package.json +++ b/packages/plugin-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-redirects", - "version": "3.26.0", + "version": "3.27.0", "description": "Redirects plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-search/package.json b/packages/plugin-search/package.json index 0f7d496680..389e992a5f 100644 --- a/packages/plugin-search/package.json +++ b/packages/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-search", - "version": "3.26.0", + "version": "3.27.0", "description": "Search plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-sentry/package.json b/packages/plugin-sentry/package.json index 6aa1ab4c53..6edb83295a 100644 --- a/packages/plugin-sentry/package.json +++ b/packages/plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-sentry", - "version": "3.26.0", + "version": "3.27.0", "description": "Sentry plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-seo/package.json b/packages/plugin-seo/package.json index 714b69a674..bf7fde355b 100644 --- a/packages/plugin-seo/package.json +++ b/packages/plugin-seo/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-seo", - "version": "3.26.0", + "version": "3.27.0", "description": "SEO plugin for Payload", "keywords": [ "payload", diff --git a/packages/plugin-stripe/package.json b/packages/plugin-stripe/package.json index 5996927be6..01c4acbed0 100644 --- a/packages/plugin-stripe/package.json +++ b/packages/plugin-stripe/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/plugin-stripe", - "version": "3.26.0", + "version": "3.27.0", "description": "Stripe plugin for Payload", "keywords": [ "payload", diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index e1030ebaa1..5974ffccf1 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-lexical", - "version": "3.26.0", + "version": "3.27.0", "description": "The officially supported Lexical richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/richtext-slate/package.json b/packages/richtext-slate/package.json index 01b9b6133f..829d75f194 100644 --- a/packages/richtext-slate/package.json +++ b/packages/richtext-slate/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/richtext-slate", - "version": "3.26.0", + "version": "3.27.0", "description": "The officially supported Slate richtext adapter for Payload", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-azure/package.json b/packages/storage-azure/package.json index 8c063b22d9..4007b888fe 100644 --- a/packages/storage-azure/package.json +++ b/packages/storage-azure/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-azure", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload storage adapter for Azure Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-gcs/package.json b/packages/storage-gcs/package.json index 18f0d0e59b..c732d1f095 100644 --- a/packages/storage-gcs/package.json +++ b/packages/storage-gcs/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-gcs", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload storage adapter for Google Cloud Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-s3/package.json b/packages/storage-s3/package.json index 70ebb53fe5..ca08305a90 100644 --- a/packages/storage-s3/package.json +++ b/packages/storage-s3/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-s3", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload storage adapter for Amazon S3", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-uploadthing/package.json b/packages/storage-uploadthing/package.json index 35f7ca2497..f23092eb18 100644 --- a/packages/storage-uploadthing/package.json +++ b/packages/storage-uploadthing/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-uploadthing", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload storage adapter for uploadthing", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/storage-vercel-blob/package.json b/packages/storage-vercel-blob/package.json index aeed8cd5c3..5cf33bad32 100644 --- a/packages/storage-vercel-blob/package.json +++ b/packages/storage-vercel-blob/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/storage-vercel-blob", - "version": "3.26.0", + "version": "3.27.0", "description": "Payload storage adapter for Vercel Blob Storage", "homepage": "https://payloadcms.com", "repository": { diff --git a/packages/translations/package.json b/packages/translations/package.json index f164f7ff0d..392cb2328d 100644 --- a/packages/translations/package.json +++ b/packages/translations/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/translations", - "version": "3.26.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", diff --git a/packages/ui/package.json b/packages/ui/package.json index 6568ba7683..7263b7b043 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@payloadcms/ui", - "version": "3.26.0", + "version": "3.27.0", "homepage": "https://payloadcms.com", "repository": { "type": "git", From 8f6d2e79a1b5777cb5002382f4602ec1cf1bdf87 Mon Sep 17 00:00:00 2001 From: James Mikrut Date: Wed, 5 Mar 2025 15:56:40 -0600 Subject: [PATCH 110/127] feat: allow specification of which JWT extraction methods are supported, and in which order (#10794) This PR adds a top-level `auth` property to the Payload config, where you can specify a new `jwtOrder` property to dictate, in Payload's local auth strategy, which JWT extraction methods should be leveraged, and in which order. For example, we currently use incoming request headers to retrieve a JWT in the following order: 1. If there is an `Authorization: JWT ${token}` header 2. If there is an `Authorization: Bearer ${token}` header 3. If there is an HTTP-only cookie with a token present Now you can define which of these strategies you'd like to support, and in which order. Todo: - [ ] Docs - [ ] Tests --- packages/payload/src/auth/extractJWT.ts | 68 +++++++++++++++++-------- packages/payload/src/config/defaults.ts | 3 ++ packages/payload/src/config/types.ts | 10 ++++ 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/packages/payload/src/auth/extractJWT.ts b/packages/payload/src/auth/extractJWT.ts index 901368c8e9..85b2ffad9c 100644 --- a/packages/payload/src/auth/extractJWT.ts +++ b/packages/payload/src/auth/extractJWT.ts @@ -1,32 +1,60 @@ +import type { BasePayload } from '../index.js' import type { AuthStrategyFunctionArgs } from './index.js' import { parseCookies } from '../utilities/parseCookies.js' +type ExtractionMethod = (args: { headers: Headers; payload: BasePayload }) => null | string + +const extractionMethods: Record = { + Bearer: ({ headers }) => { + const jwtFromHeader = headers.get('Authorization') + + // allow RFC6750 OAuth 2.0 compliant Bearer tokens + // in addition to the payload default JWT format + if (jwtFromHeader?.startsWith('Bearer ')) { + return jwtFromHeader.replace('Bearer ', '') + } + + return null + }, + cookie: ({ headers, payload }) => { + const origin = headers.get('Origin') + const cookies = parseCookies(headers) + const tokenCookieName = `${payload.config.cookiePrefix}-token` + const cookieToken = cookies.get(tokenCookieName) + + if (!cookieToken) { + return null + } + + if (!origin || payload.config.csrf.length === 0 || payload.config.csrf.indexOf(origin) > -1) { + return cookieToken + } + + return null + }, + JWT: ({ headers }) => { + const jwtFromHeader = headers.get('Authorization') + + if (jwtFromHeader?.startsWith('JWT ')) { + return jwtFromHeader.replace('JWT ', '') + } + + return null + }, +} + export const extractJWT = (args: Omit): null | string => { const { headers, payload } = args - const jwtFromHeader = headers.get('Authorization') - const origin = headers.get('Origin') + const extractionOrder = payload.config.auth.jwtOrder - if (jwtFromHeader?.startsWith('JWT ')) { - return jwtFromHeader.replace('JWT ', '') - } - // allow RFC6750 OAuth 2.0 compliant Bearer tokens - // in addition to the payload default JWT format - if (jwtFromHeader?.startsWith('Bearer ')) { - return jwtFromHeader.replace('Bearer ', '') - } + for (const extractionStrategy of extractionOrder) { + const result = extractionMethods[extractionStrategy]({ headers, payload }) - const cookies = parseCookies(headers) - const tokenCookieName = `${payload.config.cookiePrefix}-token` - const cookieToken = cookies.get(tokenCookieName) - - if (!cookieToken) { - return null - } - - if (!origin || payload.config.csrf.length === 0 || payload.config.csrf.indexOf(origin) > -1) { - return cookieToken + if (result) { + return result + } } return null diff --git a/packages/payload/src/config/defaults.ts b/packages/payload/src/config/defaults.ts index 88e79c3b1f..6986168932 100644 --- a/packages/payload/src/config/defaults.ts +++ b/packages/payload/src/config/defaults.ts @@ -32,6 +32,9 @@ export const defaults: Omit = { }, theme: 'all', }, + auth: { + jwtOrder: ['JWT', 'Bearer', 'cookie'], + }, bin: [], collections: [], cookiePrefix: 'payload', diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 14e4451a8a..20581b8c03 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -946,6 +946,16 @@ export type Config = { /** The slug of a Collection that you want to be used to log in to the Admin dashboard. */ user?: string } + /** + * Configure authentication-related Payload-wide settings. + */ + auth?: { + /** + * Define which JWT identification methods you'd like to support for Payload's local auth strategy, as well as the order that they're retrieved in. + * Defaults to ['JWT', 'Bearer', 'cookie] + */ + jwtOrder: ('Bearer' | 'cookie' | 'JWT')[] + } /** Custom Payload bin scripts can be injected via the config. */ bin?: BinScriptConfig[] blocks?: Block[] From 3af0468062dbc0c67eb988458aa7b82d3b414595 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 5 Mar 2025 16:45:24 -0700 Subject: [PATCH 111/127] fix: add missing auth property to new defaults function (#11561) https://github.com/payloadcms/payload/pull/10794 added new defaults the config - however, these were only added to the deprecated `defaults` object, which caused our CI to fail. This PR adds them to the new `addDefaultsToConfig` function --- packages/payload/src/config/defaults.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/payload/src/config/defaults.ts b/packages/payload/src/config/defaults.ts index 6986168932..12761de1a1 100644 --- a/packages/payload/src/config/defaults.ts +++ b/packages/payload/src/config/defaults.ts @@ -152,5 +152,10 @@ export const addDefaultsToConfig = (config: Config): Config => { } config.upload = config.upload ?? {} + config.auth = { + jwtOrder: ['JWT', 'Bearer', 'cookie'], + ...(config.auth || {}), + } + return config } From 36921bd62b67c1150435d67443b5a06306c2d2d1 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 5 Mar 2025 17:13:56 -0700 Subject: [PATCH 112/127] feat(richtext-lexical): new HTML converter (#11370) Deprecates the old HTML converter and introduces a new one that functions similarly to our Lexical => JSX converter. The old converter had the following limitations: - It imported the entire lexical bundle - It was challenging to implement. The sanitized lexical editor config had to be passed in as an argument, which was difficult to obtain - It only worked on the server This new HTML converter is lightweight, user-friendly, and works on both server and client. Instead of retrieving HTML converters from the editor config, they can be explicitly provided to the converter function. By default, the converter expects populated data to function properly. If you need to use unpopulated data (e.g., when running it from a hook), you also have the option to use the async HTML converter, exported from `@payloadcms/richtext-lexical/html-async`, and provide a `populate` function - this function will then be used to dynamically populate nodes during the conversion process. ## Example 1 - generating HTML in your frontend ```tsx 'use client' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' import { convertLexicalToHTML } from '@payloadcms/richtext-lexical/html' import React from 'react' export const MyComponent = ({ data }: { data: SerializedEditorState }) => { const html = convertLexicalToHTML({ data }) return
} ``` ## Example - converting Lexical Blocks ```tsx 'use client' import type { MyInlineBlock, MyTextBlock } from '@/payload-types' import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode, } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' import { convertLexicalToHTML, type HTMLConvertersFunction, } from '@payloadcms/richtext-lexical/html' import React from 'react' type NodeTypes = | DefaultNodeTypes | SerializedBlockNode | SerializedInlineBlockNode const htmlConverters: HTMLConvertersFunction = ({ defaultConverters }) => ({ ...defaultConverters, blocks: { // Each key should match your block's slug myTextBlock: ({ node, providedCSSString }) => `
${node.fields.text}
`, }, inlineBlocks: { // Each key should match your inline block's slug myInlineBlock: ({ node, providedStyleTag }) => `${node.fields.text}`, }, }) export const MyComponent = ({ data }: { data: SerializedEditorState }) => { const html = convertLexicalToHTML({ converters: htmlConverters, data, }) return
} ``` ## Example 3 - outputting HTML from the collection ```ts import type { HTMLConvertersFunction } from '@payloadcms/richtext-lexical/html' import type { MyTextBlock } from '@/payload-types.js' import type { CollectionConfig } from 'payload' import { BlocksFeature, type DefaultNodeTypes, lexicalEditor, lexicalHTMLField, type SerializedBlockNode, } from '@payloadcms/richtext-lexical' const Pages: CollectionConfig = { slug: 'pages', fields: [ { name: 'nameOfYourRichTextField', type: 'richText', editor: lexicalEditor(), }, lexicalHTMLField({ htmlFieldName: 'nameOfYourRichTextField_html', lexicalFieldName: 'nameOfYourRichTextField', }), { name: 'customRichText', type: 'richText', editor: lexicalEditor({ features: ({ defaultFeatures }) => [ ...defaultFeatures, BlocksFeature({ blocks: [ { interfaceName: 'MyTextBlock', slug: 'myTextBlock', fields: [ { name: 'text', type: 'text', }, ], }, ], }), ], }), }, lexicalHTMLField({ htmlFieldName: 'customRichText_html', lexicalFieldName: 'customRichText', // can pass in additional converters or override default ones converters: (({ defaultConverters }) => ({ ...defaultConverters, blocks: { myTextBlock: ({ node, providedCSSString }) => `
${node.fields.text}
`, }, })) as HTMLConvertersFunction>, }), ], } ``` --- docs/rich-text/converters.mdx | 332 ++++++++++-------- packages/richtext-lexical/package.json | 21 ++ .../src/exports/client/index.ts | 1 + .../src/exports/html-async/index.ts | 25 ++ .../src/exports/html/index.ts | 25 ++ .../RichText/converter/converters/tab.tsx | 9 - .../src/exports/react/index.ts | 33 +- .../src/features/blockquote/server/index.ts | 2 +- .../html/async/converters/blockquote.ts | 14 + .../html/async/converters/heading.ts | 14 + .../html/async/converters/horizontalRule.ts | 5 + .../html/async/converters/linebreak.ts | 6 + .../converters/html/async/converters/link.ts | 56 +++ .../converters/html/async/converters/list.ts | 53 +++ .../html/async/converters/paragraph.ts | 16 + .../converters/html/async/converters/tab.ts | 6 + .../converters/html/async/converters/table.ts | 65 ++++ .../converters/html/async/converters/text.ts | 34 ++ .../html/async/converters/upload.ts | 87 +++++ .../html/async/defaultConverters.ts | 28 ++ .../converters/html/async/field/index.ts | 93 +++++ .../features/converters/html/async/index.ts | 157 +++++++++ .../features/converters/html/async/types.ts | 93 +++++ .../html/shared/findConverterForNode.ts | 101 ++++++ .../features/converters/html/shared/types.ts | 10 + .../html/sync/converters/blockquote.ts | 12 + .../html/sync/converters/heading.ts | 12 + .../html/sync/converters/horizontalRule.ts | 5 + .../html/sync/converters/linebreak.ts | 6 + .../converters/html/sync/converters/link.ts | 47 +++ .../converters/html/sync/converters/list.ts | 47 +++ .../html/sync/converters/paragraph.ts | 16 + .../converters/html/sync/converters/tab.ts | 6 + .../converters/html/sync/converters/table.ts | 59 ++++ .../converters/html/sync/converters/text.ts | 34 ++ .../converters/html/sync/converters/upload.ts | 81 +++++ .../converters/html/sync/defaultConverters.ts | 28 ++ .../features/converters/html/sync/index.ts | 142 ++++++++ .../features/converters/html/sync/types.ts | 81 +++++ .../converter/converters/linebreak.ts | 0 .../converter/converters/paragraph.ts | 0 .../converter/converters/tab.ts | 0 .../converter/converters/text.ts | 0 .../converter/defaultConverters.ts | 3 + .../converter/index.ts | 9 + .../converter/types.ts | 3 + .../{html => html_deprecated}/field/index.ts | 16 +- .../{html => html_deprecated}/index.ts | 3 + .../converters/jsx/Component}/index.tsx | 8 +- .../jsx}/converter/converters/blockquote.tsx | 2 +- .../jsx}/converter/converters/heading.tsx | 2 +- .../converter/converters/horizontalRule.tsx | 6 +- .../jsx}/converter/converters/linebreak.tsx | 6 +- .../jsx}/converter/converters/link.tsx | 2 +- .../jsx}/converter/converters/list.tsx | 2 +- .../jsx}/converter/converters/paragraph.tsx | 2 +- .../jsx/converter/converters/tab.tsx | 6 + .../jsx}/converter/converters/table.tsx | 2 +- .../jsx}/converter/converters/text.tsx | 4 +- .../jsx}/converter/converters/upload.tsx | 10 +- .../jsx}/converter/defaultConverters.ts | 2 +- .../converters/jsx}/converter/index.tsx | 81 ++--- .../converters/jsx}/converter/types.ts | 29 +- .../converters/utilities/payloadPopulateFn.ts | 81 +++++ .../converters/utilities/restPopulateFn.ts | 33 ++ .../experimental_table/server/index.ts | 2 +- .../src/features/heading/server/index.ts | 2 +- .../src/features/link/server/index.ts | 2 +- .../src/features/lists/htmlConverter.ts | 4 +- .../src/features/typesServer.ts | 7 +- packages/richtext-lexical/src/index.ts | 27 +- .../src/populateGraphQL/populate.ts | 13 +- pnpm-lock.yaml | 45 +-- .../collections/Lexical/LexicalRendered.tsx | 82 ++++- .../collections/LexicalMigrate/index.ts | 23 +- test/fields/lexical.int.spec.ts | 18 +- 76 files changed, 2077 insertions(+), 322 deletions(-) create mode 100644 packages/richtext-lexical/src/exports/html-async/index.ts create mode 100644 packages/richtext-lexical/src/exports/html/index.ts delete mode 100644 packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/link.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/list.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/table.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/text.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/field/index.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/index.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/async/types.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/shared/types.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/index.ts create mode 100644 packages/richtext-lexical/src/features/converters/html/sync/types.ts rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/converters/linebreak.ts (100%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/converters/paragraph.ts (100%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/converters/tab.ts (100%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/converters/text.ts (100%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/defaultConverters.ts (90%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/index.ts (96%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/converter/types.ts (93%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/field/index.ts (95%) rename packages/richtext-lexical/src/features/converters/{html => html_deprecated}/index.ts (91%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx/Component}/index.tsx (90%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/blockquote.tsx (79%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/heading.tsx (80%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/horizontalRule.tsx (75%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/linebreak.tsx (51%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/link.tsx (97%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/list.tsx (98%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/paragraph.tsx (82%) create mode 100644 packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/table.tsx (97%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/text.tsx (86%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/converters/upload.tsx (86%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/defaultConverters.ts (94%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/index.tsx (72%) rename packages/richtext-lexical/src/{exports/react/components/RichText => features/converters/jsx}/converter/types.ts (80%) create mode 100644 packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts create mode 100644 packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts diff --git a/docs/rich-text/converters.mdx b/docs/rich-text/converters.mdx index 5c49aa7154..6614b426ef 100644 --- a/docs/rich-text/converters.mdx +++ b/docs/rich-text/converters.mdx @@ -2,8 +2,8 @@ title: Lexical Converters label: Converters order: 20 -desc: Conversion between lexical, markdown and html -keywords: lexical, rich text, editor, headless cms, convert, html, mdx, markdown, md, conversion, export +desc: Conversion between lexical, markdown, jsx and html +keywords: lexical, rich text, editor, headless cms, convert, html, mdx, markdown, md, conversion, export, jsx --- Lexical saves data in JSON - this is great for storage and flexibility and allows you to easily to convert it to other formats like JSX, HTML or Markdown. @@ -74,20 +74,28 @@ To convert Lexical Blocks or Inline Blocks to JSX, pass the converter for your b ```tsx 'use client' -import type { MyInlineBlock, MyTextBlock } from '@/payload-types' -import type { DefaultNodeTypes, SerializedBlockNode } from '@payloadcms/richtext-lexical' +import type { MyInlineBlock, MyNumberBlock, MyTextBlock } from '@/payload-types' +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' import React from 'react' // Extend the default node types with your custom blocks for full type safety -type NodeTypes = DefaultNodeTypes | SerializedBlockNode +type NodeTypes = + | DefaultNodeTypes + | SerializedBlockNode + | SerializedInlineBlockNode const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ ...defaultConverters, blocks: { // Each key should match your block's slug + myNumberBlock: ({ node }) =>
{node.fields.number}
, myTextBlock: ({ node }) =>
{node.fields.text}
, }, inlineBlocks: { @@ -155,19 +163,156 @@ export const MyComponent: React.FC<{ If you don't have a React-based frontend, or if you need to send the content to a third-party service, you can convert lexical to HTML. There are two ways to do this: -1. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend. -2. **Generating HTML on any server** Convert JSON to HTML on-demand on the server. -In both cases, the conversion needs to happen on a server, as the HTML converter will automatically fetch data for nodes that require it (e.g. uploads and internal links). The editor comes with built-in HTML serializers, simplifying the process of converting JSON to HTML. +1. **Generating HTML in your frontend** Convert JSON to HTML on-demand wherever you need it (Recommended). +2. **Outputting HTML from the Collection:** Create a new field in your collection to convert saved JSON content to HTML. Payload generates and outputs the HTML for use in your frontend. This is not recommended, as this approach adds additional overhead to the Payload API and may not work with live preview. + +### Generating HTML in your frontend + +If you wish to convert JSON to HTML ad-hoc, use the `convertLexicalToHTML` function exported from `@payloadcms/richtext-lexical/html`: + +```tsx +'use client' + +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' +import { convertLexicalToHTML } from '@payloadcms/richtext-lexical/html' + +import React from 'react' + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const html = convertLexicalToHTML({ data }) + + return
+} +``` + +### Generating HTML in your frontend with dynamic population + +The default `convertLexicalToHTML` function does not populate data for nodes like uploads or links - it expects you to pass in the fully populated data. If you want the converter to dynamically populate those nodes as they are encountered, you have to use the async version of the converter, imported from `@payloadcms/richtext-lexical/html-async`, and pass in the `populate` function: + +```tsx +'use client' + +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { getRestPopulateFn } from '@payloadcms/richtext-lexical/client' +import { convertLexicalToHTMLAsync } from '@payloadcms/richtext-lexical/html-async' +import React, { useEffect, useState } from 'react' + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const [html, setHTML] = useState(null) + useEffect(() => { + async function convert() { + const html = await convertLexicalToHTMLAsync({ + data, + populate: getRestPopulateFn({ + apiURL: `http://localhost:3000/api`, + }), + }) + setHTML(html) + } + + void convert() + }, [data]) + + return html &&
+} +``` + +Do note that using the REST populate function will result in each node sending a separate request to the REST API, which may be slow for a large amount of nodes. On the server, you can use the payload populate function, which will be more efficient: + +```tsx +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { getPayloadPopulateFn } from '@payloadcms/richtext-lexical' +import { convertLexicalToHTMLAsync } from '@payloadcms/richtext-lexical/html-async' +import { getPayload } from 'payload' +import React from 'react' + +import config from '../../config.js' + +export const MyRSCComponent = async ({ data }: { data: SerializedEditorState }) => { + const payload = await getPayload({ + config, + }) + + const html = await convertLexicalToHTMLAsync({ + data, + populate: await getPayloadPopulateFn({ + currentDepth: 0, + depth: 1, + payload, + }), + }) + + return html &&
+} +``` + +### Converting Lexical Blocks + +```tsx +'use client' + +import type { MyInlineBlock, MyTextBlock } from '@/payload-types' +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '@payloadcms/richtext-lexical' +import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' + +import { + convertLexicalToHTML, + type HTMLConvertersFunction, +} from '@payloadcms/richtext-lexical/html' +import React from 'react' + +type NodeTypes = + | DefaultNodeTypes + | SerializedBlockNode + | SerializedInlineBlockNode + +const htmlConverters: HTMLConvertersFunction = ({ defaultConverters }) => ({ + ...defaultConverters, + blocks: { + // Each key should match your block's slug + myTextBlock: ({ node, providedCSSString }) => + `
${node.fields.text}
`, + }, + inlineBlocks: { + // Each key should match your inline block's slug + myInlineBlock: ({ node, providedStyleTag }) => + `${node.fields.text}`, + }, +}) + +export const MyComponent = ({ data }: { data: SerializedEditorState }) => { + const html = convertLexicalToHTML({ + converters: htmlConverters, + data, + }) + + return
+} +``` ### Outputting HTML from the Collection To add HTML generation directly within the collection, follow the example below: ```ts +import type { HTMLConvertersFunction } from '@payloadcms/richtext-lexical/html' +import type { MyTextBlock } from '@/payload-types.js' import type { CollectionConfig } from 'payload' -import { HTMLConverterFeature, lexicalEditor, lexicalHTML } from '@payloadcms/richtext-lexical' +import { + BlocksFeature, + type DefaultNodeTypes, + lexicalEditor, + lexicalHTMLField, + type SerializedBlockNode, +} from '@payloadcms/richtext-lexical' const Pages: CollectionConfig = { slug: 'pages', @@ -175,71 +320,53 @@ const Pages: CollectionConfig = { { name: 'nameOfYourRichTextField', type: 'richText', + editor: lexicalEditor(), + }, + lexicalHTMLField({ + htmlFieldName: 'nameOfYourRichTextField_html', + lexicalFieldName: 'nameOfYourRichTextField', + }), + { + name: 'customRichText', + type: 'richText', editor: lexicalEditor({ features: ({ defaultFeatures }) => [ ...defaultFeatures, - // The HTMLConverter Feature is the feature which manages the HTML serializers. - // If you do not pass any arguments to it, it will use the default serializers. - HTMLConverterFeature({}), + BlocksFeature({ + blocks: [ + { + interfaceName: 'MyTextBlock', + slug: 'myTextBlock', + fields: [ + { + name: 'text', + type: 'text', + }, + ], + }, + ], + }), ], }), }, - lexicalHTML('nameOfYourRichTextField', { name: 'nameOfYourRichTextField_html' }), + lexicalHTMLField({ + htmlFieldName: 'customRichText_html', + lexicalFieldName: 'customRichText', + // can pass in additional converters or override default ones + converters: (({ defaultConverters }) => ({ + ...defaultConverters, + blocks: { + myTextBlock: ({ node, providedCSSString }) => + `
${node.fields.text}
`, + }, + })) as HTMLConvertersFunction>, + }), ], } ``` The `lexicalHTML()` function creates a new field that automatically converts the referenced lexical richText field into HTML through an afterRead hook. -### Generating HTML anywhere on the server - -If you wish to convert JSON to HTML ad-hoc, use the `convertLexicalToHTML` function: - -```ts -import { consolidateHTMLConverters, convertLexicalToHTML } from '@payloadcms/richtext-lexical' - - -await convertLexicalToHTML({ - converters: consolidateHTMLConverters({ editorConfig }), - data: editorData, - payload, // if you have Payload but no req available, pass it in here to enable server-only functionality (e.g. proper conversion of upload nodes) - req, // if you have req available, pass it in here to enable server-only functionality (e.g. proper conversion of upload nodes). No need to pass in Payload if req is passed in. -}) -``` -This method employs `convertLexicalToHTML` from `@payloadcms/richtext-lexical`, which converts the serialized editor state into HTML. - -Because every `Feature` is able to provide html converters, and because the `htmlFeature` can modify those or provide their own, we need to consolidate them with the default html Converters using the `consolidateHTMLConverters` function. - -#### Example: Generating HTML within an afterRead hook - -```ts -import type { FieldHook } from 'payload' - -import { - HTMLConverterFeature, - consolidateHTMLConverters, - convertLexicalToHTML, - defaultEditorConfig, - defaultEditorFeatures, - sanitizeServerEditorConfig, -} from '@payloadcms/richtext-lexical' - -const hook: FieldHook = async ({ req, siblingData }) => { - const editorConfig = defaultEditorConfig - - editorConfig.features = [...defaultEditorFeatures, HTMLConverterFeature({})] - - const sanitizedEditorConfig = await sanitizeServerEditorConfig(editorConfig, req.payload.config) - - const html = await convertLexicalToHTML({ - converters: consolidateHTMLConverters({ editorConfig: sanitizedEditorConfig }), - data: siblingData.lexicalSimple, - req, - }) - return html -} -``` - ### CSS Payload's lexical HTML converter does not generate CSS for you, but it does add classes to the generated HTML. You can use these classes to style the HTML in your frontend. @@ -253,87 +380,6 @@ Here is some "base" CSS you can use to ensure that nested lists render correctly } ``` -### Creating your own HTML Converter - -HTML Converters are typed as `HTMLConverter`, which contains the node type it should handle, and a function that accepts the serialized node from the lexical editor, and outputs the HTML string. Here's the HTML Converter of the Upload node as an example: - -```ts -import type { HTMLConverter } from '@payloadcms/richtext-lexical' - -const UploadHTMLConverter: HTMLConverter = { - converter: async ({ node, req }) => { - const uploadDocument: { - value?: any - } = {} - if(req) { - await populate({ - id, - collectionSlug: node.relationTo, - currentDepth: 0, - data: uploadDocument, - depth: 1, - draft: false, - key: 'value', - overrideAccess: false, - req, - showHiddenFields: false, - }) - } - - const url = (req?.payload?.config?.serverURL || '') + uploadDocument?.value?.url - - if (!(uploadDocument?.value?.mimeType as string)?.startsWith('image')) { - // Only images can be serialized as HTML - return `` - } - - return `${uploadDocument?.value?.filename}` - }, - nodeTypes: [UploadNode.getType()], // This is the type of the lexical node that this converter can handle. Instead of hardcoding 'upload' we can get the node type directly from the UploadNode, since it's static. -} -``` - -As you can see, we have access to all the information saved in the node (for the Upload node, this is `value`and `relationTo`) and we can use that to generate the HTML. - -The `convertLexicalToHTML` is part of `@payloadcms/richtext-lexical` automatically handles traversing the editor state and calling the correct converter for each node. - -### Embedding the HTML Converter in your Feature - -You can embed your HTML Converter directly within your custom `ServerFeature`, allowing it to be handled automatically by the `consolidateHTMLConverters` function. Here is an example: - -```ts -import { createNode } from '@payloadcms/richtext-lexical' -import type { FeatureProviderProviderServer } from '@payloadcms/richtext-lexical' - -export const UploadFeature: FeatureProviderProviderServer< - UploadFeatureProps, - UploadFeaturePropsClient -> = (props) => { - /*...*/ - return { - feature: () => { - return { - nodes: [ - createNode({ - converters: { - html: yourHTMLConverter, // <= This is where you define your HTML Converter - }, - node: UploadNode, - //... - }), - ], - ClientComponent: UploadFeatureClientComponent, - clientFeatureProps: clientProps, - serverFeatureProps: props, - /*...*/ - } - }, - key: 'upload', - serverFeatureProps: props, - } -} -``` - ## Headless Editor Lexical provides a seamless way to perform conversions between various other formats: diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 5974ffccf1..0a9ed4857d 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -35,6 +35,16 @@ "types": "./src/exports/react/index.ts", "default": "./src/exports/react/index.ts" }, + "./html": { + "import": "./src/exports/html/index.ts", + "types": "./src/exports/html/index.ts", + "default": "./src/exports/html/index.ts" + }, + "./html-async": { + "import": "./src/exports/html-async/index.ts", + "types": "./src/exports/html-async/index.ts", + "default": "./src/exports/html-async/index.ts" + }, "./rsc": { "import": "./src/exports/server/rsc.ts", "types": "./src/exports/server/rsc.ts", @@ -368,6 +378,7 @@ "mdast-util-from-markdown": "2.0.2", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-mdx-jsx": "3.0.1", + "qs-esm": "7.0.2", "react-error-boundary": "4.1.2", "ts-essentials": "10.0.3", "uuid": "10.0.0" @@ -421,6 +432,16 @@ "types": "./dist/exports/react/index.d.ts", "default": "./dist/exports/react/index.js" }, + "./html": { + "import": "./dist/exports/html/index.js", + "types": "./dist/exports/html/index.d.ts", + "default": "./dist/exports/html/index.js" + }, + "./html-async": { + "import": "./dist/exports/html-async/index.js", + "types": "./dist/exports/html-async/index.d.ts", + "default": "./dist/exports/html-async/index.js" + }, "./rsc": { "import": "./dist/exports/server/rsc.js", "types": "./dist/exports/server/rsc.d.ts", diff --git a/packages/richtext-lexical/src/exports/client/index.ts b/packages/richtext-lexical/src/exports/client/index.ts index e7bc38e5be..541de82c28 100644 --- a/packages/richtext-lexical/src/exports/client/index.ts +++ b/packages/richtext-lexical/src/exports/client/index.ts @@ -146,3 +146,4 @@ export { BlockCollapsible } from '../../features/blocks/client/component/compone export { BlockEditButton } from '../../features/blocks/client/component/components/BlockEditButton.js' export { BlockRemoveButton } from '../../features/blocks/client/component/components/BlockRemoveButton.js' export { useBlockComponentContext } from '../../features/blocks/client/component/BlockContent.js' +export { getRestPopulateFn } from '../../features/converters/utilities/restPopulateFn.js' diff --git a/packages/richtext-lexical/src/exports/html-async/index.ts b/packages/richtext-lexical/src/exports/html-async/index.ts new file mode 100644 index 0000000000..aaf296b68e --- /dev/null +++ b/packages/richtext-lexical/src/exports/html-async/index.ts @@ -0,0 +1,25 @@ +export { BlockquoteHTMLConverterAsync } from '../../features/converters/html/async/converters/blockquote.js' +export { HeadingHTMLConverterAsync } from '../../features/converters/html/async/converters/heading.js' +export { HorizontalRuleHTMLConverterAsync } from '../../features/converters/html/async/converters/horizontalRule.js' +export { LinebreakHTMLConverterAsync } from '../../features/converters/html/async/converters/linebreak.js' +export { LinkHTMLConverterAsync } from '../../features/converters/html/async/converters/link.js' +export { ListHTMLConverterAsync } from '../../features/converters/html/async/converters/list.js' +export { ParagraphHTMLConverterAsync } from '../../features/converters/html/async/converters/paragraph.js' +export { TabHTMLConverterAsync } from '../../features/converters/html/async/converters/tab.js' +export { TableHTMLConverterAsync } from '../../features/converters/html/async/converters/table.js' +export { TextHTMLConverterAsync } from '../../features/converters/html/async/converters/text.js' + +export { UploadHTMLConverterAsync } from '../../features/converters/html/async/converters/upload.js' + +export { defaultHTMLConvertersAsync } from '../../features/converters/html/async/defaultConverters.js' +export { convertLexicalToHTMLAsync } from '../../features/converters/html/async/index.js' +export type { + HTMLConverterAsync, + HTMLConvertersAsync, + HTMLConvertersFunctionAsync, +} from '../../features/converters/html/async/types.js' + +export type { + ProvidedCSS, + SerializedLexicalNodeWithParent, +} from '../../features/converters/html/shared/types.js' diff --git a/packages/richtext-lexical/src/exports/html/index.ts b/packages/richtext-lexical/src/exports/html/index.ts new file mode 100644 index 0000000000..614dd33aa1 --- /dev/null +++ b/packages/richtext-lexical/src/exports/html/index.ts @@ -0,0 +1,25 @@ +export type { + ProvidedCSS, + SerializedLexicalNodeWithParent, +} from '../../features/converters/html/shared/types.js' +export { BlockquoteHTMLConverter } from '../../features/converters/html/sync/converters/blockquote.js' +export { HeadingHTMLConverter } from '../../features/converters/html/sync/converters/heading.js' +export { HorizontalRuleHTMLConverter } from '../../features/converters/html/sync/converters/horizontalRule.js' +export { LinebreakHTMLConverter } from '../../features/converters/html/sync/converters/linebreak.js' +export { LinkHTMLConverter } from '../../features/converters/html/sync/converters/link.js' +export { ListHTMLConverter } from '../../features/converters/html/sync/converters/list.js' +export { ParagraphHTMLConverter } from '../../features/converters/html/sync/converters/paragraph.js' +export { TabHTMLConverter } from '../../features/converters/html/sync/converters/tab.js' +export { TableHTMLConverter } from '../../features/converters/html/sync/converters/table.js' + +export { TextHTMLConverter } from '../../features/converters/html/sync/converters/text.js' + +export { UploadHTMLConverter } from '../../features/converters/html/sync/converters/upload.js' +export { defaultHTMLConverters } from '../../features/converters/html/sync/defaultConverters.js' +export { convertLexicalToHTML } from '../../features/converters/html/sync/index.js' + +export type { + HTMLConverter, + HTMLConverters, + HTMLConvertersFunction, +} from '../../features/converters/html/sync/types.js' diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx b/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx deleted file mode 100644 index 63d66a216c..0000000000 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/tab.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import type { SerializedTabNode } from '../../../../../../nodeTypes.js' -import type { JSXConverters } from '../types.js' - -export const TabJSXConverter: JSXConverters = { - tab: ({ node }) => { - // Tab - return node.text - }, -} diff --git a/packages/richtext-lexical/src/exports/react/index.ts b/packages/richtext-lexical/src/exports/react/index.ts index 70de9c5d53..904fdf92cf 100644 --- a/packages/richtext-lexical/src/exports/react/index.ts +++ b/packages/richtext-lexical/src/exports/react/index.ts @@ -1,21 +1,24 @@ -export { BlockquoteJSXConverter } from './components/RichText/converter/converters/blockquote.js' -export { HeadingJSXConverter } from './components/RichText/converter/converters/heading.js' -export { HorizontalRuleJSXConverter } from './components/RichText/converter/converters/horizontalRule.js' -export { LinebreakJSXConverter } from './components/RichText/converter/converters/linebreak.js' -export { LinkJSXConverter } from './components/RichText/converter/converters/link.js' -export { ListJSXConverter } from './components/RichText/converter/converters/list.js' -export { ParagraphJSXConverter } from './components/RichText/converter/converters/paragraph.js' -export { TabJSXConverter } from './components/RichText/converter/converters/tab.js' -export { TableJSXConverter } from './components/RichText/converter/converters/table.js' -export { TextJSXConverter } from './components/RichText/converter/converters/text.js' +export { + type JSXConvertersFunction, + RichText, +} from '../../features/converters/jsx/Component/index.js' +export { BlockquoteJSXConverter } from '../../features/converters/jsx/converter/converters/blockquote.js' +export { HeadingJSXConverter } from '../../features/converters/jsx/converter/converters/heading.js' +export { HorizontalRuleJSXConverter } from '../../features/converters/jsx/converter/converters/horizontalRule.js' +export { LinebreakJSXConverter } from '../../features/converters/jsx/converter/converters/linebreak.js' +export { LinkJSXConverter } from '../../features/converters/jsx/converter/converters/link.js' +export { ListJSXConverter } from '../../features/converters/jsx/converter/converters/list.js' +export { ParagraphJSXConverter } from '../../features/converters/jsx/converter/converters/paragraph.js' +export { TabJSXConverter } from '../../features/converters/jsx/converter/converters/tab.js' +export { TableJSXConverter } from '../../features/converters/jsx/converter/converters/table.js' -export { UploadJSXConverter } from './components/RichText/converter/converters/upload.js' +export { TextJSXConverter } from '../../features/converters/jsx/converter/converters/text.js' -export { defaultJSXConverters } from './components/RichText/converter/defaultConverters.js' -export { convertLexicalNodesToJSX } from './components/RichText/converter/index.js' +export { UploadJSXConverter } from '../../features/converters/jsx/converter/converters/upload.js' +export { defaultJSXConverters } from '../../features/converters/jsx/converter/defaultConverters.js' +export { convertLexicalNodesToJSX } from '../../features/converters/jsx/converter/index.js' export type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent, -} from './components/RichText/converter/types.js' -export { type JSXConvertersFunction, RichText } from './components/RichText/index.js' +} from '../../features/converters/jsx/converter/types.js' diff --git a/packages/richtext-lexical/src/features/blockquote/server/index.ts b/packages/richtext-lexical/src/features/blockquote/server/index.ts index 4f4ccfc1df..be87f77af7 100644 --- a/packages/richtext-lexical/src/features/blockquote/server/index.ts +++ b/packages/richtext-lexical/src/features/blockquote/server/index.ts @@ -4,7 +4,7 @@ import type { Spread } from 'lexical' import { QuoteNode } from '@lexical/rich-text' import { createServerFeature } from '../../../utilities/createServerFeature.js' -import { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../../converters/html_deprecated/converter/index.js' import { createNode } from '../../typeUtilities.js' import { MarkdownTransformer } from '../markdownTransformer.js' import { i18n } from './i18n.js' diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts new file mode 100644 index 0000000000..4c01250410 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/blockquote.ts @@ -0,0 +1,14 @@ +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const BlockquoteHTMLConverterAsync: HTMLConvertersAsync = { + quote: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts new file mode 100644 index 0000000000..26465d1bac --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/heading.ts @@ -0,0 +1,14 @@ +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const HeadingHTMLConverterAsync: HTMLConvertersAsync = { + heading: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `<${node.tag}${providedStyleTag}>${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts new file mode 100644 index 0000000000..5d3c96c34a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/horizontalRule.ts @@ -0,0 +1,5 @@ +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' +export const HorizontalRuleHTMLConverterAsync: HTMLConvertersAsync = { + horizontalrule: '
', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts new file mode 100644 index 0000000000..148b4cbad2 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/linebreak.ts @@ -0,0 +1,6 @@ +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const LinebreakHTMLConverterAsync: HTMLConvertersAsync = { + linebreak: '
', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts new file mode 100644 index 0000000000..0799726015 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/link.ts @@ -0,0 +1,56 @@ +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync, HTMLPopulateFn } from '../types.js' + +export const LinkHTMLConverterAsync: (args: { + internalDocToHref?: (args: { + linkNode: SerializedLinkNode + populate?: HTMLPopulateFn + }) => Promise | string +}) => HTMLConvertersAsync = ({ + internalDocToHref, +}) => ({ + autolink: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + return `( + + ${children} + + )` + }, + link: async ({ node, nodesToHTML, populate, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + let href: string = node.fields.url ?? '' + if (node.fields.linkType === 'internal') { + if (internalDocToHref) { + href = await internalDocToHref({ linkNode: node, populate }) + } else { + console.error( + 'Lexical => HTML converter: Link converter: found internal link, but internalDocToHref is not provided', + ) + href = '#' // fallback + } + } + + return `( + + ${children} + + )` + }, +}) diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts new file mode 100644 index 0000000000..c72689c21c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/list.ts @@ -0,0 +1,53 @@ +import { v4 as uuidv4 } from 'uuid' + +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const ListHTMLConverterAsync: HTMLConvertersAsync< + SerializedListItemNode | SerializedListNode +> = { + list: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return `<${node.tag}${providedStyleTag} class="list-${node.listType}">${children}` + }, + listitem: async ({ node, nodesToHTML, parent, providedCSSString }) => { + const hasSubLists = node.children.some((child) => child.type === 'list') + + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + if ('listType' in parent && parent?.listType === 'check') { + const uuid = uuidv4() + return `` + } else { + return `
  • ${children}
  • ` + } + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts new file mode 100644 index 0000000000..8db85b674b --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/paragraph.ts @@ -0,0 +1,16 @@ +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const ParagraphHTMLConverterAsync: HTMLConvertersAsync = { + paragraph: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = await nodesToHTML({ + nodes: node.children, + }) + + if (!children?.length) { + return `

    ` + } + + return `${children.join('')}

    ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts new file mode 100644 index 0000000000..1c68e9a747 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/tab.ts @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const TabHTMLConverterAsync: HTMLConvertersAsync = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts new file mode 100644 index 0000000000..5a412e44d1 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/table.ts @@ -0,0 +1,65 @@ +import type { + SerializedTableCellNode, + SerializedTableNode, + SerializedTableRowNode, +} from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const TableHTMLConverterAsync: HTMLConvertersAsync< + SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode +> = { + table: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return ` +
    + ${children} +
    +
    ` + }, + + tablecell: async ({ node, nodesToHTML, providedCSSString }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + const TagName = node.headerState > 0 ? 'th' : 'td' + const headerStateClass = `lexical-table-cell-header-${node.headerState}` + + let style = 'border: 1px solid #ccc; padding: 8px;' + providedCSSString + if (node.backgroundColor) { + style += ` background-color: ${node.backgroundColor};` + } + + const colSpanAttr = node.colSpan && node.colSpan > 1 ? ` colspan="${node.colSpan}"` : '' + const rowSpanAttr = node.rowSpan && node.rowSpan > 1 ? ` rowspan="${node.rowSpan}"` : '' + + return `<${TagName} + class="lexical-table-cell ${headerStateClass}" + ${colSpanAttr} + ${rowSpanAttr} + style="${style}" + > + ${children} + + ` + }, + + tablerow: async ({ node, nodesToHTML, providedStyleTag }) => { + const children = ( + await nodesToHTML({ + nodes: node.children, + }) + ).join('') + + return ` + ${children} + ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts new file mode 100644 index 0000000000..1ecfd5a900 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/text.ts @@ -0,0 +1,34 @@ +import type { SerializedTextNode } from '../../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from '../types.js' + +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' + +export const TextHTMLConverterAsync: HTMLConvertersAsync = { + text: ({ node }) => { + let text = node.text + + if (node.format & NodeFormat.IS_BOLD) { + text = `${text}` + } + if (node.format & NodeFormat.IS_ITALIC) { + text = `${text}` + } + if (node.format & NodeFormat.IS_STRIKETHROUGH) { + text = `${text}` + } + if (node.format & NodeFormat.IS_UNDERLINE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_CODE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUBSCRIPT) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUPERSCRIPT) { + text = `${text}` + } + + return text + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts b/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts new file mode 100644 index 0000000000..7ff32453fd --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/converters/upload.ts @@ -0,0 +1,87 @@ +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' + +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' +import type { HTMLConvertersAsync } from '../types.js' + +export const UploadHTMLConverterAsync: HTMLConvertersAsync = { + upload: async ({ node, populate, providedStyleTag }) => { + const uploadNode = node as UploadDataImproved + + let uploadDoc: (FileData & TypeWithID) | undefined = undefined + + // If there's no valid upload data, populate return an empty string + if (typeof uploadNode.value !== 'object') { + if (!populate) { + return '' + } + uploadDoc = await populate({ + id: uploadNode.value, + collectionSlug: uploadNode.relationTo, + }) + } else { + uploadDoc = uploadNode.value as unknown as FileData & TypeWithID + } + + if (!uploadDoc) { + return '' + } + + const url = uploadDoc.url + + // 1) If upload is NOT an image, return a link + if (!uploadDoc.mimeType.startsWith('image')) { + return `${uploadDoc.filename}` + } + + // 2) If image has no different sizes, return a simple + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { + return ` + + ` + } + + // 3) If image has different sizes, build a element with tags + let pictureHTML = '' + + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved + + if ( + !imageSize || + !imageSize.width || + !imageSize.height || + !imageSize.mimeType || + !imageSize.filesize || + !imageSize.filename || + !imageSize.url + ) { + continue + } + + pictureHTML += ` + + ` + } + + pictureHTML += ` + ${uploadDoc.filename} + ` + + return `${pictureHTML}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts new file mode 100644 index 0000000000..2ff3650dcb --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/defaultConverters.ts @@ -0,0 +1,28 @@ +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' +import type { HTMLConvertersAsync } from './types.js' + +import { BlockquoteHTMLConverterAsync } from './converters/blockquote.js' +import { HeadingHTMLConverterAsync } from './converters/heading.js' +import { HorizontalRuleHTMLConverterAsync } from './converters/horizontalRule.js' +import { LinebreakHTMLConverterAsync } from './converters/linebreak.js' +import { LinkHTMLConverterAsync } from './converters/link.js' +import { ListHTMLConverterAsync } from './converters/list.js' +import { ParagraphHTMLConverterAsync } from './converters/paragraph.js' +import { TabHTMLConverterAsync } from './converters/tab.js' +import { TableHTMLConverterAsync } from './converters/table.js' +import { TextHTMLConverterAsync } from './converters/text.js' +import { UploadHTMLConverterAsync } from './converters/upload.js' + +export const defaultHTMLConvertersAsync: HTMLConvertersAsync = { + ...ParagraphHTMLConverterAsync, + ...TextHTMLConverterAsync, + ...LinebreakHTMLConverterAsync, + ...BlockquoteHTMLConverterAsync, + ...TableHTMLConverterAsync, + ...HeadingHTMLConverterAsync, + ...HorizontalRuleHTMLConverterAsync, + ...ListHTMLConverterAsync, + ...LinkHTMLConverterAsync({}), + ...UploadHTMLConverterAsync, + ...TabHTMLConverterAsync, +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/field/index.ts b/packages/richtext-lexical/src/features/converters/html/async/field/index.ts new file mode 100644 index 0000000000..28f7d87f44 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/field/index.ts @@ -0,0 +1,93 @@ +import type { SerializedEditorState } from 'lexical' +import type { Field } from 'payload' + +import type { HTMLConvertersAsync, HTMLConvertersFunctionAsync } from '../types.js' + +import { getPayloadPopulateFn } from '../../../utilities/payloadPopulateFn.js' +import { convertLexicalToHTMLAsync } from '../index.js' + +type Args = { + converters?: HTMLConvertersAsync | HTMLConvertersFunctionAsync + /** + * Whether the lexicalHTML field should be hidden in the admin panel + * + * @default true + */ + hidden?: boolean + htmlFieldName: string + /** + * A string which matches the lexical field name you want to convert to HTML. + * + * This has to be a sibling field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. + **/ + lexicalFieldName: string + /** + * Whether the HTML should be stored in the database + * + * @default false + */ + storeInDB?: boolean +} + +/** + * + * Field that converts a sibling lexical field to HTML + * + * @todo will be renamed to lexicalHTML in 4.0, replacing the deprecated `lexicalHTML` converter + */ +export const lexicalHTMLField: (args: Args) => Field = (args) => { + const { converters, hidden = true, htmlFieldName, lexicalFieldName, storeInDB = false } = args + return { + name: htmlFieldName, + type: 'code', + admin: { + editorOptions: { + language: 'html', + }, + hidden, + }, + hooks: { + afterRead: [ + async ({ + currentDepth, + depth, + draft, + overrideAccess, + req, + showHiddenFields, + siblingData, + }) => { + const lexicalFieldData: SerializedEditorState = siblingData[lexicalFieldName] + + if (!lexicalFieldData) { + return '' + } + + const htmlPopulateFn = await getPayloadPopulateFn({ + currentDepth: currentDepth ?? 0, + depth: depth ?? req.payload.config.defaultDepth, + draft: draft ?? false, + overrideAccess: overrideAccess ?? false, + req, + showHiddenFields: showHiddenFields ?? false, + }) + + return await convertLexicalToHTMLAsync({ + converters, + data: lexicalFieldData, + populate: htmlPopulateFn, + }) + }, + ], + beforeChange: [ + ({ siblingData, value }) => { + if (storeInDB) { + return value + } + delete siblingData[htmlFieldName] + return null + }, + ], + }, + } +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/index.ts b/packages/richtext-lexical/src/features/converters/html/async/index.ts new file mode 100644 index 0000000000..9ca4a7f018 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/index.ts @@ -0,0 +1,157 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ +import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' + +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +import type { + HTMLConverterAsync, + HTMLConvertersAsync, + HTMLConvertersFunctionAsync, + HTMLPopulateFn, +} from './types.js' + +import { hasText } from '../../../../validate/hasText.js' +import { findConverterForNode } from '../shared/findConverterForNode.js' +import { defaultHTMLConvertersAsync } from './defaultConverters.js' + +export type ConvertLexicalToHTMLAsyncArgs = { + /** + * Override class names for the container. + */ + className?: string + converters?: HTMLConvertersAsync | HTMLConvertersFunctionAsync + data: SerializedEditorState + /** + * If true, removes the container div wrapper. + */ + disableContainer?: boolean + /** + * If true, disables indentation globally. If an array, disables for specific node `type` values. + */ + disableIndent?: boolean | string[] + /** + * If true, disables text alignment globally. If an array, disables for specific node `type` values. + */ + disableTextAlign?: boolean | string[] + populate?: HTMLPopulateFn +} + +export async function convertLexicalToHTMLAsync({ + className, + converters, + data, + disableContainer, + disableIndent, + disableTextAlign, + populate, +}: ConvertLexicalToHTMLAsyncArgs): Promise { + if (hasText(data)) { + let finalConverters: HTMLConvertersAsync = {} + if (converters) { + if (typeof converters === 'function') { + finalConverters = converters({ defaultConverters: defaultHTMLConvertersAsync }) + } else { + finalConverters = converters + } + } else { + finalConverters = defaultHTMLConvertersAsync + } + + const html = ( + await convertLexicalNodesToHTMLAsync({ + converters: finalConverters, + disableIndent, + disableTextAlign, + nodes: data?.root?.children, + parent: data?.root, + populate, + }) + ).join('') + + if (disableContainer) { + return html + } else { + return `
    ${html}
    ` + } + } + if (disableContainer) { + return '' + } else { + return `
    ` + } +} + +export async function convertLexicalNodesToHTMLAsync({ + converters, + disableIndent, + disableTextAlign, + nodes, + parent, + populate, +}: { + converters: HTMLConvertersAsync + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent: SerializedLexicalNodeWithParent + populate?: HTMLPopulateFn +}): Promise { + const unknownConverter: HTMLConverterAsync = converters.unknown as HTMLConverterAsync + + const htmlArray: string[] = [] + + let i = -1 + for (const node of nodes) { + i++ + const { converterForNode, providedCSSString, providedStyleTag } = findConverterForNode({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, + }) + + try { + let nodeHTML: string + + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? await converterForNode({ + childIndex: i, + converters, + node, + populate, + + nodesToHTML: async (args) => { + return await convertLexicalNodesToHTMLAsync({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + populate, + }) + }, + parent, + providedCSSString, + providedStyleTag, + }) + : converterForNode + nodeHTML = converted + } else { + nodeHTML = 'unknown node' + } + + htmlArray.push(nodeHTML) + } catch (error) { + console.error('Error converting lexical node to HTML:', error, 'node:', node) + htmlArray.push('') + } + } + + return htmlArray.filter(Boolean) +} diff --git a/packages/richtext-lexical/src/features/converters/html/async/types.ts b/packages/richtext-lexical/src/features/converters/html/async/types.ts new file mode 100644 index 0000000000..04e5115a86 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/async/types.ts @@ -0,0 +1,93 @@ +import type { SerializedLexicalNode } from 'lexical' +import type { SelectType, TypeWithID } from 'payload' + +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '../../../../nodeTypes.js' +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +export type HTMLPopulateArguments = { + collectionSlug: string + id: number | string + select?: SelectType +} + +export type HTMLPopulateFn = ( + args: HTMLPopulateArguments, +) => Promise + +export type HTMLConverterAsync< + T extends { [key: string]: any; type?: string } = SerializedLexicalNode, +> = + | ((args: { + childIndex: number + converters: HTMLConvertersAsync + node: T + nodesToHTML: (args: { + converters?: HTMLConvertersAsync + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => Promise + parent: SerializedLexicalNodeWithParent + populate?: HTMLPopulateFn + providedCSSString: string + providedStyleTag: string + }) => Promise | string) + | string + +export type HTMLConvertersAsync< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided +> = { + [key: string]: + | { + [blockSlug: string]: HTMLConverterAsync + } + | HTMLConverterAsync + | undefined +} & { + [nodeType in Exclude, 'block' | 'inlineBlock'>]?: HTMLConverterAsync< + Extract + > +} & { + blocks?: { + [K in Extract< + Extract extends SerializedBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverterAsync< + Extract extends SerializedBlockNode + ? SerializedBlockNode> + : SerializedBlockNode + > + } + inlineBlocks?: { + [K in Extract< + Extract extends SerializedInlineBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverterAsync< + Extract extends SerializedInlineBlockNode + ? SerializedInlineBlockNode> + : SerializedInlineBlockNode + > + } +} + +export type HTMLConvertersFunctionAsync< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string }> + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, +> = (args: { defaultConverters: HTMLConvertersAsync }) => HTMLConvertersAsync diff --git a/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts b/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts new file mode 100644 index 0000000000..0b1b96c74a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/shared/findConverterForNode.ts @@ -0,0 +1,101 @@ +import type { SerializedLexicalNode } from 'lexical' + +import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js' +import type { HTMLConverterAsync, HTMLConvertersAsync } from '../async/types.js' +import type { HTMLConverter, HTMLConverters } from '../sync/types.js' +import type { ProvidedCSS } from './types.js' + +export function findConverterForNode< + TConverters extends HTMLConverters | HTMLConvertersAsync, + TConverter extends HTMLConverter | HTMLConverterAsync, +>({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, +}: { + converters: TConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + node: SerializedLexicalNode + unknownConverter: TConverter +}): { + converterForNode: TConverter | undefined + providedCSSString: string + providedStyleTag: string +} { + let converterForNode: TConverter | undefined + if (node.type === 'block') { + converterForNode = converters?.blocks?.[ + (node as SerializedBlockNode)?.fields?.blockType + ] as TConverter + if (!converterForNode) { + console.error( + `Lexical => HTML converter: Blocks converter: found ${(node as SerializedBlockNode)?.fields?.blockType} block, but no converter is provided`, + ) + } + } else if (node.type === 'inlineBlock') { + converterForNode = converters?.inlineBlocks?.[ + (node as SerializedInlineBlockNode)?.fields?.blockType + ] as TConverter + if (!converterForNode) { + console.error( + `Lexical => HTML converter: Inline Blocks converter: found ${(node as SerializedInlineBlockNode)?.fields?.blockType} inline block, but no converter is provided`, + ) + } + } else { + converterForNode = converters[node.type] as TConverter + } + + const style: ProvidedCSS = {} + + // Check if disableTextAlign is not true and does not include node type + if ( + !disableTextAlign && + (!Array.isArray(disableTextAlign) || !disableTextAlign?.includes(node.type)) + ) { + if ('format' in node && node.format) { + switch (node.format) { + case 'center': + style['text-align'] = 'center' + break + case 'end': + style['text-align'] = 'right' + break + case 'justify': + style['text-align'] = 'justify' + break + case 'left': + //style['text-align'] = 'left' + // Do nothing, as left is the default + break + case 'right': + style['text-align'] = 'right' + break + case 'start': + style['text-align'] = 'left' + break + } + } + } + + if (!disableIndent && (!Array.isArray(disableIndent) || !disableIndent?.includes(node.type))) { + if ('indent' in node && node.indent && node.type !== 'listitem') { + style['padding-inline-start'] = `${Number(node.indent) * 2}em` + } + } + + let providedCSSString: string = '' + for (const key of Object.keys(style)) { + // @ts-expect-error we're iterating over the keys of the object + providedCSSString += `${key}: ${style[key]};` + } + const providedStyleTag = providedCSSString?.length ? ` style="${providedCSSString}"` : '' + + return { + converterForNode: converterForNode ?? unknownConverter, + providedCSSString, + providedStyleTag, + } +} diff --git a/packages/richtext-lexical/src/features/converters/html/shared/types.ts b/packages/richtext-lexical/src/features/converters/html/shared/types.ts new file mode 100644 index 0000000000..d82e65164c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/shared/types.ts @@ -0,0 +1,10 @@ +import type { SerializedLexicalNode } from 'lexical' + +export type ProvidedCSS = { + 'padding-inline-start'?: string + 'text-align'?: string +} + +export type SerializedLexicalNodeWithParent = { + parent?: SerializedLexicalNode +} & SerializedLexicalNode diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts new file mode 100644 index 0000000000..56b69844d9 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/blockquote.ts @@ -0,0 +1,12 @@ +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const BlockquoteHTMLConverter: HTMLConverters = { + quote: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts new file mode 100644 index 0000000000..11ccd154e5 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/heading.ts @@ -0,0 +1,12 @@ +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const HeadingHTMLConverter: HTMLConverters = { + heading: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `<${node.tag}${providedStyleTag}>${children}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts new file mode 100644 index 0000000000..eb0c3788b2 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/horizontalRule.ts @@ -0,0 +1,5 @@ +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' +export const HorizontalRuleHTMLConverter: HTMLConverters = { + horizontalrule: '
    ', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts new file mode 100644 index 0000000000..76dc5b80fe --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/linebreak.ts @@ -0,0 +1,6 @@ +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const LinebreakHTMLConverter: HTMLConverters = { + linebreak: '
    ', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts new file mode 100644 index 0000000000..e69a461d9a --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/link.ts @@ -0,0 +1,47 @@ +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const LinkHTMLConverter: (args: { + internalDocToHref?: (args: { linkNode: SerializedLinkNode }) => string +}) => HTMLConverters = ({ internalDocToHref }) => ({ + autolink: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + return `( + + ${children} + + )` + }, + link: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const rel: string | undefined = node.fields.newTab ? 'noopener noreferrer' : undefined + const target: string | undefined = node.fields.newTab ? '_blank' : undefined + + let href: string = node.fields.url ?? '' + if (node.fields.linkType === 'internal') { + if (internalDocToHref) { + href = internalDocToHref({ linkNode: node }) + } else { + console.error( + 'Lexical => HTML converter: Link converter: found internal link, but internalDocToHref is not provided', + ) + href = '#' // fallback + } + } + + return `( + + ${children} + + )` + }, +}) diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts new file mode 100644 index 0000000000..57a6de62e9 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/list.ts @@ -0,0 +1,47 @@ +import { v4 as uuidv4 } from 'uuid' + +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const ListHTMLConverter: HTMLConverters = { + list: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return `<${node.tag}${providedStyleTag} class="list-${node.listType}">${children}` + }, + listitem: ({ node, nodesToHTML, parent, providedCSSString }) => { + const hasSubLists = node.children.some((child) => child.type === 'list') + + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + if ('listType' in parent && parent?.listType === 'check') { + const uuid = uuidv4() + return `` + } else { + return `
  • ${children}
  • ` + } + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts new file mode 100644 index 0000000000..1065e69204 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/paragraph.ts @@ -0,0 +1,16 @@ +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const ParagraphHTMLConverter: HTMLConverters = { + paragraph: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }) + + if (!children?.length) { + return `

    ` + } + + return `${children.join('')}

    ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts new file mode 100644 index 0000000000..da70ac9419 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/tab.ts @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const TabHTMLConverter: HTMLConverters = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts new file mode 100644 index 0000000000..40bfdfdc7c --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/table.ts @@ -0,0 +1,59 @@ +import type { + SerializedTableCellNode, + SerializedTableNode, + SerializedTableRowNode, +} from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +export const TableHTMLConverter: HTMLConverters< + SerializedTableCellNode | SerializedTableNode | SerializedTableRowNode +> = { + table: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return ` + + ${children} +
    +
    ` + }, + + tablecell: ({ node, nodesToHTML, providedCSSString }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + const TagName = node.headerState > 0 ? 'th' : 'td' + const headerStateClass = `lexical-table-cell-header-${node.headerState}` + + let style = 'border: 1px solid #ccc; padding: 8px;' + providedCSSString + if (node.backgroundColor) { + style += ` background-color: ${node.backgroundColor};` + } + + const colSpanAttr = node.colSpan && node.colSpan > 1 ? ` colspan="${node.colSpan}"` : '' + const rowSpanAttr = node.rowSpan && node.rowSpan > 1 ? ` rowspan="${node.rowSpan}"` : '' + + return `<${TagName} + class="lexical-table-cell ${headerStateClass}" + ${colSpanAttr} + ${rowSpanAttr} + style="${style}" + > + ${children} + + ` + }, + + tablerow: ({ node, nodesToHTML, providedStyleTag }) => { + const children = nodesToHTML({ + nodes: node.children, + }).join('') + + return ` + ${children} + ` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts new file mode 100644 index 0000000000..b78955e734 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/text.ts @@ -0,0 +1,34 @@ +import type { SerializedTextNode } from '../../../../../nodeTypes.js' +import type { HTMLConverters } from '../types.js' + +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' + +export const TextHTMLConverter: HTMLConverters = { + text: ({ node }) => { + let text = node.text + + if (node.format & NodeFormat.IS_BOLD) { + text = `${text}` + } + if (node.format & NodeFormat.IS_ITALIC) { + text = `${text}` + } + if (node.format & NodeFormat.IS_STRIKETHROUGH) { + text = `${text}` + } + if (node.format & NodeFormat.IS_UNDERLINE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_CODE) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUBSCRIPT) { + text = `${text}` + } + if (node.format & NodeFormat.IS_SUPERSCRIPT) { + text = `${text}` + } + + return text + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts b/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts new file mode 100644 index 0000000000..fbd15863eb --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/converters/upload.ts @@ -0,0 +1,81 @@ +import type { FileData, FileSizeImproved, TypeWithID } from 'payload' + +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' +import type { HTMLConverters } from '../types.js' + +export const UploadHTMLConverter: HTMLConverters = { + upload: ({ node, providedStyleTag }) => { + const uploadNode = node as UploadDataImproved + + let uploadDoc: (FileData & TypeWithID) | undefined = undefined + + // If there's no valid upload data, populate return an empty string + if (typeof uploadNode.value !== 'object') { + return '' + } else { + uploadDoc = uploadNode.value as unknown as FileData & TypeWithID + } + + if (!uploadDoc) { + return '' + } + + const url = uploadDoc.url + + // 1) If upload is NOT an image, return a link + if (!uploadDoc.mimeType.startsWith('image')) { + return `${uploadDoc.filename}` + } + + // 2) If image has no different sizes, return a simple + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { + return ` + + ` + } + + // 3) If image has different sizes, build a element with tags + let pictureHTML = '' + + for (const size in uploadDoc.sizes) { + const imageSize = uploadDoc.sizes[size] as FileSizeImproved + + if ( + !imageSize || + !imageSize.width || + !imageSize.height || + !imageSize.mimeType || + !imageSize.filesize || + !imageSize.filename || + !imageSize.url + ) { + continue + } + + pictureHTML += ` + + ` + } + + pictureHTML += ` + ${uploadDoc.filename} + ` + + return `${pictureHTML}` + }, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts new file mode 100644 index 0000000000..d9f1913ea3 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/defaultConverters.ts @@ -0,0 +1,28 @@ +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' +import type { HTMLConverters } from './types.js' + +import { BlockquoteHTMLConverter } from './converters/blockquote.js' +import { HeadingHTMLConverter } from './converters/heading.js' +import { HorizontalRuleHTMLConverter } from './converters/horizontalRule.js' +import { LinebreakHTMLConverter } from './converters/linebreak.js' +import { LinkHTMLConverter } from './converters/link.js' +import { ListHTMLConverter } from './converters/list.js' +import { ParagraphHTMLConverter } from './converters/paragraph.js' +import { TabHTMLConverter } from './converters/tab.js' +import { TableHTMLConverter } from './converters/table.js' +import { TextHTMLConverter } from './converters/text.js' +import { UploadHTMLConverter } from './converters/upload.js' + +export const defaultHTMLConverters: HTMLConverters = { + ...ParagraphHTMLConverter, + ...TextHTMLConverter, + ...LinebreakHTMLConverter, + ...BlockquoteHTMLConverter, + ...TableHTMLConverter, + ...HeadingHTMLConverter, + ...HorizontalRuleHTMLConverter, + ...ListHTMLConverter, + ...LinkHTMLConverter({}), + ...UploadHTMLConverter, + ...TabHTMLConverter, +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/index.ts b/packages/richtext-lexical/src/features/converters/html/sync/index.ts new file mode 100644 index 0000000000..08ba5a1483 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/index.ts @@ -0,0 +1,142 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ +import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' + +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' +import type { HTMLConverter, HTMLConverters, HTMLConvertersFunction } from './types.js' + +import { hasText } from '../../../../validate/hasText.js' +import { findConverterForNode } from '../shared/findConverterForNode.js' +import { defaultHTMLConverters } from './defaultConverters.js' + +export type ConvertLexicalToHTMLArgs = { + /** + * Override class names for the container. + */ + className?: string + converters?: HTMLConverters | HTMLConvertersFunction + data: SerializedEditorState + /** + * If true, removes the container div wrapper. + */ + disableContainer?: boolean + /** + * If true, disables indentation globally. If an array, disables for specific node `type` values. + */ + disableIndent?: boolean | string[] + /** + * If true, disables text alignment globally. If an array, disables for specific node `type` values. + */ + disableTextAlign?: boolean | string[] +} + +export function convertLexicalToHTML({ + className, + converters, + data, + disableContainer, + disableIndent, + disableTextAlign, +}: ConvertLexicalToHTMLArgs): string { + if (hasText(data)) { + let finalConverters: HTMLConverters = {} + if (converters) { + if (typeof converters === 'function') { + finalConverters = converters({ defaultConverters: defaultHTMLConverters }) + } else { + finalConverters = converters + } + } else { + finalConverters = defaultHTMLConverters + } + + const html = convertLexicalNodesToHTML({ + converters: finalConverters, + disableIndent, + disableTextAlign, + nodes: data?.root?.children, + parent: data?.root, + }).join('') + + if (disableContainer) { + return html + } else { + return `
    ${html}
    ` + } + } + if (disableContainer) { + return '' + } else { + return `
    ` + } +} + +export function convertLexicalNodesToHTML({ + converters, + disableIndent, + disableTextAlign, + nodes, + parent, +}: { + converters: HTMLConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent: SerializedLexicalNodeWithParent +}): string[] { + const unknownConverter: HTMLConverter = converters.unknown as HTMLConverter + + const htmlArray: string[] = [] + + let i = -1 + for (const node of nodes) { + i++ + const { converterForNode, providedCSSString, providedStyleTag } = findConverterForNode({ + converters, + disableIndent, + disableTextAlign, + node, + unknownConverter, + }) + + try { + let nodeHTML: string + + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? converterForNode({ + childIndex: i, + converters, + node, + nodesToHTML: (args) => { + return convertLexicalNodesToHTML({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + }) + }, + parent, + providedCSSString, + providedStyleTag, + }) + : converterForNode + nodeHTML = converted + } else { + nodeHTML = 'unknown node' + } + + htmlArray.push(nodeHTML) + } catch (error) { + console.error('Error converting lexical node to HTML:', error, 'node:', node) + htmlArray.push('') + } + } + + return htmlArray.filter(Boolean) +} diff --git a/packages/richtext-lexical/src/features/converters/html/sync/types.ts b/packages/richtext-lexical/src/features/converters/html/sync/types.ts new file mode 100644 index 0000000000..fa03dc7522 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/html/sync/types.ts @@ -0,0 +1,81 @@ +import type { SerializedLexicalNode } from 'lexical' + +import type { + DefaultNodeTypes, + SerializedBlockNode, + SerializedInlineBlockNode, +} from '../../../../nodeTypes.js' +import type { SerializedLexicalNodeWithParent } from '../shared/types.js' + +export type HTMLConverter = + + | ((args: { + childIndex: number + converters: HTMLConverters + node: T + nodesToHTML: (args: { + converters?: HTMLConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => string[] + parent: SerializedLexicalNodeWithParent + providedCSSString: string + providedStyleTag: string + }) => string) + | string + +export type HTMLConverters< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string; blockType: string }> // need these to ensure types for blocks and inlineBlocks work if no generics are provided + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, // need these to ensure types for blocks and inlineBlocks work if no generics are provided +> = { + [key: string]: + | { + [blockSlug: string]: HTMLConverter + } + | HTMLConverter + | undefined +} & { + [nodeType in Exclude, 'block' | 'inlineBlock'>]?: HTMLConverter< + Extract + > +} & { + blocks?: { + [K in Extract< + Extract extends SerializedBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverter< + Extract extends SerializedBlockNode + ? SerializedBlockNode> + : SerializedBlockNode + > + } + inlineBlocks?: { + [K in Extract< + Extract extends SerializedInlineBlockNode + ? B extends { blockType: string } + ? B['blockType'] + : never + : never, + string + >]?: HTMLConverter< + Extract extends SerializedInlineBlockNode + ? SerializedInlineBlockNode> + : SerializedInlineBlockNode + > + } +} + +export type HTMLConvertersFunction< + T extends { [key: string]: any; type?: string } = + | DefaultNodeTypes + | SerializedBlockNode<{ blockName?: null | string }> + | SerializedInlineBlockNode<{ blockName?: null | string; blockType: string }>, +> = (args: { defaultConverters: HTMLConverters }) => HTMLConverters diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/linebreak.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/linebreak.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/linebreak.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/linebreak.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/paragraph.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/paragraph.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/paragraph.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/paragraph.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/tab.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/tab.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/tab.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/tab.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/converters/text.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/text.ts similarity index 100% rename from packages/richtext-lexical/src/features/converters/html/converter/converters/text.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/converters/text.ts diff --git a/packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts similarity index 90% rename from packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts index b4ca3d6093..2b324514e2 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/defaultConverters.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/defaultConverters.ts @@ -5,6 +5,9 @@ import { ParagraphHTMLConverter } from './converters/paragraph.js' import { TabHTMLConverter } from './converters/tab.js' import { TextHTMLConverter } from './converters/text.js' +/** + * @deprecated - will be removed in 4.0 + */ export const defaultHTMLConverters: HTMLConverter[] = [ ParagraphHTMLConverter, TextHTMLConverter, diff --git a/packages/richtext-lexical/src/features/converters/html/converter/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts similarity index 96% rename from packages/richtext-lexical/src/features/converters/html/converter/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts index 2de7b5769d..d81f6b6775 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/index.ts @@ -7,6 +7,9 @@ import type { HTMLConverter, SerializedLexicalNodeWithParent } from './types.js' import { hasText } from '../../../../validate/hasText.js' +/** + * @deprecated - will be removed in 4.0 + */ export type ConvertLexicalToHTMLArgs = { converters: HTMLConverter[] currentDepth?: number @@ -44,6 +47,9 @@ export type ConvertLexicalToHTMLArgs = { } ) +/** + * @deprecated - will be removed in 4.0 + */ export async function convertLexicalToHTML({ converters, currentDepth, @@ -83,6 +89,9 @@ export async function convertLexicalToHTML({ return '' } +/** + * @deprecated - will be removed in 4.0 + */ export async function convertLexicalNodesToHTML({ converters, currentDepth, diff --git a/packages/richtext-lexical/src/features/converters/html/converter/types.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts similarity index 93% rename from packages/richtext-lexical/src/features/converters/html/converter/types.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts index de487c34c4..238873909d 100644 --- a/packages/richtext-lexical/src/features/converters/html/converter/types.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/converter/types.ts @@ -1,6 +1,9 @@ import type { SerializedLexicalNode } from 'lexical' import type { PayloadRequest } from 'payload' +/** + * @deprecated - will be removed in 4.0 + */ export type HTMLConverter = { converter: (args: { childIndex: number diff --git a/packages/richtext-lexical/src/features/converters/html/field/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts similarity index 95% rename from packages/richtext-lexical/src/features/converters/html/field/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts index 800e91a93f..6cc2d3ff5b 100644 --- a/packages/richtext-lexical/src/features/converters/html/field/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/field/index.ts @@ -1,5 +1,5 @@ import type { SerializedEditorState } from 'lexical' -import type { Field, FieldAffectingData, PayloadRequest, RichTextField } from 'payload' +import type { Field, RichTextField } from 'payload' import type { SanitizedServerEditorConfig } from '../../../../lexical/config/types.js' import type { AdapterProps, LexicalRichTextAdapter } from '../../../../types.js' @@ -9,7 +9,7 @@ import type { HTMLConverterFeatureProps } from '../index.js' import { defaultHTMLConverters } from '../converter/defaultConverters.js' import { convertLexicalToHTML } from '../converter/index.js' -type Props = { +type Args = { /** * Whether the lexicalHTML field should be hidden in the admin panel * @@ -28,6 +28,7 @@ type Props = { /** * Combines the default HTML converters with HTML converters found in the features, and with HTML converters configured in the htmlConverter feature. * + * @deprecated - will be removed in 4.0 * @param editorConfig */ export const consolidateHTMLConverters = ({ @@ -83,16 +84,19 @@ export const consolidateHTMLConverters = ({ return filteredConverters } +/** + * @deprecated - will be removed in 4.0 + */ export const lexicalHTML: ( /** * A string which matches the lexical field name you want to convert to HTML. * - * This has to be a SIBLING field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. + * This has to be a sibling field of this lexicalHTML field - otherwise, it won't be able to find the lexical field. **/ lexicalFieldName: string, - props: Props, -) => Field = (lexicalFieldName, props) => { - const { name = 'lexicalHTML', hidden = true, storeInDB = false } = props + args: Args, +) => Field = (lexicalFieldName, args) => { + const { name = 'lexicalHTML', hidden = true, storeInDB = false } = args return { name, type: 'code', diff --git a/packages/richtext-lexical/src/features/converters/html/index.ts b/packages/richtext-lexical/src/features/converters/html_deprecated/index.ts similarity index 91% rename from packages/richtext-lexical/src/features/converters/html/index.ts rename to packages/richtext-lexical/src/features/converters/html_deprecated/index.ts index 6696844e7f..26db8e0561 100644 --- a/packages/richtext-lexical/src/features/converters/html/index.ts +++ b/packages/richtext-lexical/src/features/converters/html_deprecated/index.ts @@ -9,6 +9,9 @@ export type HTMLConverterFeatureProps = { } // This is just used to save the props on the richText field +/** + * @deprecated - will be removed in 4.0 + */ export const HTMLConverterFeature = createServerFeature({ feature: {}, key: 'htmlConverter', diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/index.tsx b/packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx similarity index 90% rename from packages/richtext-lexical/src/exports/react/components/RichText/index.tsx rename to packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx index 8267773c46..2d561950fa 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/index.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/Component/index.tsx @@ -7,10 +7,10 @@ import type { SerializedBlockNode, SerializedInlineBlockNode, } from '../../../../nodeTypes.js' -import type { JSXConverters } from './converter/types.js' +import type { JSXConverters } from '../converter/types.js' -import { defaultJSXConverters } from './converter/defaultConverters.js' -import { convertLexicalToJSX } from './converter/index.js' +import { defaultJSXConverters } from '../converter/defaultConverters.js' +import { convertLexicalToJSX } from '../converter/index.js' export type JSXConvertersFunction< T extends { [key: string]: any; type?: string } = @@ -21,7 +21,7 @@ export type JSXConvertersFunction< type RichTextProps = { /** - * Additional class names for the container. + * Override class names for the container. */ className?: string /** diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx similarity index 79% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx index ad40b06485..2440195c62 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/blockquote.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/blockquote.tsx @@ -1,4 +1,4 @@ -import type { SerializedQuoteNode } from '../../../../../../nodeTypes.js' +import type { SerializedQuoteNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const BlockquoteJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx similarity index 80% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx index 0c10b2cd1f..a9f6289234 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/heading.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/heading.tsx @@ -1,4 +1,4 @@ -import type { SerializedHeadingNode } from '../../../../../../nodeTypes.js' +import type { SerializedHeadingNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const HeadingJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx similarity index 75% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx index fc25a9fe99..7370a08ac3 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/horizontalRule.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/horizontalRule.tsx @@ -1,7 +1,5 @@ -import type { SerializedHorizontalRuleNode } from '../../../../../../nodeTypes.js' +import type { SerializedHorizontalRuleNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const HorizontalRuleJSXConverter: JSXConverters = { - horizontalrule: () => { - return
    - }, + horizontalrule:
    , } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx similarity index 51% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx index 9b769b4170..1261ca5bff 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/linebreak.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/linebreak.tsx @@ -1,8 +1,6 @@ -import type { SerializedLineBreakNode } from '../../../../../../nodeTypes.js' +import type { SerializedLineBreakNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const LinebreakJSXConverter: JSXConverters = { - linebreak: () => { - return
    - }, + linebreak:
    , } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx similarity index 97% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx index 810f47a01d..6c8fe65530 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/link.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/link.tsx @@ -1,4 +1,4 @@ -import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../../nodeTypes.js' +import type { SerializedAutoLinkNode, SerializedLinkNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const LinkJSXConverter: (args: { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx similarity index 98% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx index ad3a8115cb..7c538a959c 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/list.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/list.tsx @@ -1,6 +1,6 @@ import { v4 as uuidv4 } from 'uuid' -import type { SerializedListItemNode, SerializedListNode } from '../../../../../../nodeTypes.js' +import type { SerializedListItemNode, SerializedListNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const ListJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx similarity index 82% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx index 751b4144ba..1b7814cd56 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/paragraph.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/paragraph.tsx @@ -1,4 +1,4 @@ -import type { SerializedParagraphNode } from '../../../../../../nodeTypes.js' +import type { SerializedParagraphNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const ParagraphJSXConverter: JSXConverters = { diff --git a/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx new file mode 100644 index 0000000000..ccc70b4824 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/tab.tsx @@ -0,0 +1,6 @@ +import type { SerializedTabNode } from '../../../../../nodeTypes.js' +import type { JSXConverters } from '../types.js' + +export const TabJSXConverter: JSXConverters = { + tab: '\t', +} diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx similarity index 97% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx index 561a9ebd0f..6c3ebc50b3 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/table.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/table.tsx @@ -2,7 +2,7 @@ import type { SerializedTableCellNode, SerializedTableNode, SerializedTableRowNode, -} from '../../../../../../nodeTypes.js' +} from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' export const TableJSXConverter: JSXConverters< diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx similarity index 86% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx index 28c41d9d10..4dfe7a2a4e 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/text.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/text.tsx @@ -1,9 +1,9 @@ import React from 'react' -import type { SerializedTextNode } from '../../../../../../nodeTypes.js' +import type { SerializedTextNode } from '../../../../../nodeTypes.js' import type { JSXConverters } from '../types.js' -import { NodeFormat } from '../../../../../../lexical/utils/nodeFormat.js' +import { NodeFormat } from '../../../../../lexical/utils/nodeFormat.js' export const TextJSXConverter: JSXConverters = { text: ({ node }) => { diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx similarity index 86% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx index bf9ad0c08c..16664bc1f9 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/converters/upload.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/converters/upload.tsx @@ -1,7 +1,7 @@ import type { FileData, FileSizeImproved, TypeWithID } from 'payload' -import type { UploadDataImproved } from '../../../../../../features/upload/server/nodes/UploadNode.js' -import type { SerializedUploadNode } from '../../../../../../nodeTypes.js' +import type { SerializedUploadNode } from '../../../../../nodeTypes.js' +import type { UploadDataImproved } from '../../../../upload/server/nodes/UploadNode.js' import type { JSXConverters } from '../types.js' export const UploadJSXConverter: JSXConverters = { @@ -12,7 +12,9 @@ export const UploadJSXConverter: JSXConverters = { return null } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion const uploadDoc = uploadNode.value as FileData & TypeWithID + const url = uploadDoc.url /** @@ -29,7 +31,7 @@ export const UploadJSXConverter: JSXConverters = { /** * If the upload is a simple image with no different sizes, return a simple img tag */ - if (!Object.keys(uploadDoc.sizes).length) { + if (!uploadDoc.sizes || !Object.keys(uploadDoc.sizes).length) { return ( {uploadDoc.filename} ) @@ -64,7 +66,7 @@ export const UploadJSXConverter: JSXConverters = { media={`(max-width: ${imageSize.width}px)`} srcSet={imageSizeURL} type={imageSize.mimeType} - >, + />, ) } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts b/packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts similarity index 94% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts rename to packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts index 5e59c80941..f00439be97 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/defaultConverters.ts +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/defaultConverters.ts @@ -1,4 +1,4 @@ -import type { DefaultNodeTypes } from '../../../../../nodeTypes.js' +import type { DefaultNodeTypes } from '../../../../nodeTypes.js' import type { JSXConverters } from './types.js' import { BlockquoteJSXConverter } from './converters/blockquote.js' diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx b/packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx similarity index 72% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx rename to packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx index 7923f4caaf..5e21da2d6a 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/index.tsx +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/index.tsx @@ -2,12 +2,12 @@ import type { SerializedEditorState, SerializedLexicalNode } from 'lexical' import React from 'react' -import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../../nodeTypes.js' +import type { SerializedBlockNode, SerializedInlineBlockNode } from '../../../../nodeTypes.js' import type { JSXConverter, JSXConverters, SerializedLexicalNodeWithParent } from './types.js' -import { hasText } from '../../../../../validate/hasText.js' +import { hasText } from '../../../../validate/hasText.js' -export type ConvertLexicalToHTMLArgs = { +export type ConvertLexicalToJSXArgs = { converters: JSXConverters data: SerializedEditorState disableIndent?: boolean | string[] @@ -19,7 +19,7 @@ export function convertLexicalToJSX({ data, disableIndent, disableTextAlign, -}: ConvertLexicalToHTMLArgs): React.ReactNode { +}: ConvertLexicalToJSXArgs): React.ReactNode { if (hasText(data)) { return convertLexicalNodesToJSX({ converters, @@ -69,48 +69,37 @@ export function convertLexicalNodesToJSX({ } try { - if (!converterForNode) { - if (unknownConverter) { - return unknownConverter({ - childIndex: i, - converters, - node, - nodesToJSX: (args) => { - return convertLexicalNodesToJSX({ - converters: args.converters ?? converters, - disableIndent: args.disableIndent ?? disableIndent, - disableTextAlign: args.disableTextAlign ?? disableTextAlign, - nodes: args.nodes, - parent: args.parent ?? { - ...node, - parent, - }, - }) - }, - parent, - }) - } - return unknown node + if (!converterForNode && unknownConverter) { + converterForNode = unknownConverter } - const reactNode = converterForNode({ - childIndex: i, - converters, - node, - nodesToJSX: (args) => { - return convertLexicalNodesToJSX({ - converters: args.converters ?? converters, - disableIndent: args.disableIndent ?? disableIndent, - disableTextAlign: args.disableTextAlign ?? disableTextAlign, - nodes: args.nodes, - parent: args.parent ?? { - ...node, - parent, - }, - }) - }, - parent, - }) + let reactNode: React.ReactNode + if (converterForNode) { + const converted = + typeof converterForNode === 'function' + ? converterForNode({ + childIndex: i, + converters, + node, + nodesToJSX: (args) => { + return convertLexicalNodesToJSX({ + converters: args.converters ?? converters, + disableIndent: args.disableIndent ?? disableIndent, + disableTextAlign: args.disableTextAlign ?? disableTextAlign, + nodes: args.nodes, + parent: args.parent ?? { + ...node, + parent, + }, + }) + }, + parent, + }) + : converterForNode + reactNode = converted + } else { + reactNode = unknown node + } const style: React.CSSProperties = {} @@ -176,10 +165,10 @@ export function convertLexicalNodesToJSX({ return reactNode } catch (error) { - console.error('Error converting lexical node to HTML:', error, 'node:', node) + console.error('Error converting lexical node to JSX:', error, 'node:', node) return null } }) - return jsxArray.filter(Boolean).map((jsx) => jsx) + return jsxArray.filter(Boolean) } diff --git a/packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts b/packages/richtext-lexical/src/features/converters/jsx/converter/types.ts similarity index 80% rename from packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts rename to packages/richtext-lexical/src/features/converters/jsx/converter/types.ts index c43400b4b9..61205f5d7e 100644 --- a/packages/richtext-lexical/src/exports/react/components/RichText/converter/types.ts +++ b/packages/richtext-lexical/src/features/converters/jsx/converter/types.ts @@ -4,21 +4,22 @@ import type { DefaultNodeTypes, SerializedBlockNode, SerializedInlineBlockNode, -} from '../../../../../nodeTypes.js' +} from '../../../../nodeTypes.js' export type JSXConverter = - (args: { - childIndex: number - converters: JSXConverters - node: T - nodesToJSX: (args: { - converters?: JSXConverters - disableIndent?: boolean | string[] - disableTextAlign?: boolean | string[] - nodes: SerializedLexicalNode[] - parent?: SerializedLexicalNodeWithParent - }) => React.ReactNode[] - parent: SerializedLexicalNodeWithParent - }) => React.ReactNode + | ((args: { + childIndex: number + converters: JSXConverters + node: T + nodesToJSX: (args: { + converters?: JSXConverters + disableIndent?: boolean | string[] + disableTextAlign?: boolean | string[] + nodes: SerializedLexicalNode[] + parent?: SerializedLexicalNodeWithParent + }) => React.ReactNode[] + parent: SerializedLexicalNodeWithParent + }) => React.ReactNode) + | React.ReactNode export type JSXConverters< T extends { [key: string]: any; type?: string } = diff --git a/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts b/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts new file mode 100644 index 0000000000..f567b1d371 --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/utilities/payloadPopulateFn.ts @@ -0,0 +1,81 @@ +import { createLocalReq, type Payload, type PayloadRequest, type TypedLocale } from 'payload' + +import type { HTMLPopulateFn } from '../html/async/types.js' + +import { populate } from '../../../populateGraphQL/populate.js' + +export const getPayloadPopulateFn: ( + args: { + currentDepth: number + depth: number + draft?: boolean + locale?: TypedLocale + + overrideAccess?: boolean + showHiddenFields?: boolean + } & ( + | { + /** + * This payload property will only be used if req is undefined. If localization is enabled, you must pass `req` instead. + */ + payload: Payload + /** + * When the converter is called, req CAN be passed in depending on where it's run. + * If this is undefined and config is passed through, lexical will create a new req object for you. + */ + req?: never + } + | { + /** + * This payload property will only be used if req is undefined. If localization is enabled, you must pass `req` instead. + */ + payload?: never + /** + * When the converter is called, req CAN be passed in depending on where it's run. + * If this is undefined and config is passed through, lexical will create a new req object for you. + */ + req: PayloadRequest + } + ), +) => Promise = async ({ + currentDepth, + depth, + draft, + overrideAccess, + payload, + req, + showHiddenFields, +}) => { + let reqToUse: PayloadRequest | undefined = req + if (req === undefined && payload) { + reqToUse = await createLocalReq({}, payload) + } + + if (!reqToUse) { + throw new Error('No req or payload provided') + } + + const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => { + const dataContainer: { + value?: any + } = {} + + await populate({ + id, + collectionSlug, + currentDepth, + data: dataContainer, + depth, + draft: draft ?? false, + key: 'value', + overrideAccess: overrideAccess ?? true, + req: reqToUse, + select, + showHiddenFields: showHiddenFields ?? false, + }) + + return dataContainer.value + } + + return populateFn +} diff --git a/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts b/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts new file mode 100644 index 0000000000..efe5f83baf --- /dev/null +++ b/packages/richtext-lexical/src/features/converters/utilities/restPopulateFn.ts @@ -0,0 +1,33 @@ +import { stringify } from 'qs-esm' + +import type { HTMLPopulateFn } from '../html/async/types.js' + +export const getRestPopulateFn: (args: { + /** + * E.g. `http://localhost:3000/api` + */ + apiURL: string + depth?: number + draft?: boolean + locale?: string +}) => HTMLPopulateFn = ({ apiURL, depth, draft, locale }) => { + const populateFn: HTMLPopulateFn = async ({ id, collectionSlug, select }) => { + const query = stringify( + { depth: depth ?? 0, draft: draft ?? false, locale, select }, + { addQueryPrefix: true }, + ) + + const res = await fetch(`${apiURL}/${collectionSlug}/${id}${query}`, { + credentials: 'include', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + method: 'GET', + }).then((res) => res.json()) + + return res + } + + return populateFn +} diff --git a/packages/richtext-lexical/src/features/experimental_table/server/index.ts b/packages/richtext-lexical/src/features/experimental_table/server/index.ts index 257483a6a5..8e257b77b8 100644 --- a/packages/richtext-lexical/src/features/experimental_table/server/index.ts +++ b/packages/richtext-lexical/src/features/experimental_table/server/index.ts @@ -10,7 +10,7 @@ import { TableCellNode, TableNode, TableRowNode } from '@lexical/table' import { sanitizeFields } from 'payload' import { createServerFeature } from '../../../utilities/createServerFeature.js' -import { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../../converters/html_deprecated/converter/index.js' import { createNode } from '../../typeUtilities.js' import { TableMarkdownTransformer } from '../markdownTransformer.js' diff --git a/packages/richtext-lexical/src/features/heading/server/index.ts b/packages/richtext-lexical/src/features/heading/server/index.ts index 35ed46ada8..82093a91ab 100644 --- a/packages/richtext-lexical/src/features/heading/server/index.ts +++ b/packages/richtext-lexical/src/features/heading/server/index.ts @@ -7,7 +7,7 @@ import type { Spread } from 'lexical' import { HeadingNode } from '@lexical/rich-text' import { createServerFeature } from '../../../utilities/createServerFeature.js' -import { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../../converters/html_deprecated/converter/index.js' import { createNode } from '../../typeUtilities.js' import { MarkdownTransformer } from '../markdownTransformer.js' import { i18n } from './i18n.js' diff --git a/packages/richtext-lexical/src/features/link/server/index.ts b/packages/richtext-lexical/src/features/link/server/index.ts index 7691b5cffd..192dea7749 100644 --- a/packages/richtext-lexical/src/features/link/server/index.ts +++ b/packages/richtext-lexical/src/features/link/server/index.ts @@ -13,7 +13,7 @@ import { sanitizeFields } from 'payload' import type { ClientProps } from '../client/index.js' import { createServerFeature } from '../../../utilities/createServerFeature.js' -import { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../../converters/html_deprecated/converter/index.js' import { createNode } from '../../typeUtilities.js' import { LinkMarkdownTransformer } from '../markdownTransformer.js' import { AutoLinkNode } from '../nodes/AutoLinkNode.js' diff --git a/packages/richtext-lexical/src/features/lists/htmlConverter.ts b/packages/richtext-lexical/src/features/lists/htmlConverter.ts index 882410fb5c..43e610b093 100644 --- a/packages/richtext-lexical/src/features/lists/htmlConverter.ts +++ b/packages/richtext-lexical/src/features/lists/htmlConverter.ts @@ -1,10 +1,10 @@ import { ListItemNode, ListNode } from '@lexical/list' import { v4 as uuidv4 } from 'uuid' -import type { HTMLConverter } from '../converters/html/converter/types.js' +import type { HTMLConverter } from '../converters/html_deprecated/converter/types.js' import type { SerializedListItemNode, SerializedListNode } from './plugin/index.js' -import { convertLexicalNodesToHTML } from '../converters/html/converter/index.js' +import { convertLexicalNodesToHTML } from '../converters/html_deprecated/converter/index.js' export const ListHTMLConverter: HTMLConverter = { converter: async ({ diff --git a/packages/richtext-lexical/src/features/typesServer.ts b/packages/richtext-lexical/src/features/typesServer.ts index 969da3ff30..10c576d062 100644 --- a/packages/richtext-lexical/src/features/typesServer.ts +++ b/packages/richtext-lexical/src/features/typesServer.ts @@ -27,7 +27,7 @@ import type { import type { ServerEditorConfig } from '../lexical/config/types.js' import type { Transformer } from '../packages/@lexical/markdown/index.js' import type { AdapterProps } from '../types.js' -import type { HTMLConverter } from './converters/html/converter/types.js' +import type { HTMLConverter } from './converters/html_deprecated/converter/types.js' import type { BaseClientFeatureProps } from './typesClient.js' export type PopulationPromise = (args: { @@ -221,8 +221,13 @@ export type NodeWithHooks = { /** * Allows you to define how a node can be serialized into different formats. Currently, only supports html. * Markdown converters are defined in `markdownTransformers` and not here. + * + * @deprecated - will be removed in 4.0 */ converters?: { + /** + * @deprecated - will be removed in 4.0 + */ html?: HTMLConverter['exportJSON']>> } /** diff --git a/packages/richtext-lexical/src/index.ts b/packages/richtext-lexical/src/index.ts index b6c2b14a11..cba43bec38 100644 --- a/packages/richtext-lexical/src/index.ts +++ b/packages/richtext-lexical/src/index.ts @@ -870,25 +870,32 @@ export { ServerBlockNode, } from './features/blocks/server/nodes/BlocksNode.js' -export { LinebreakHTMLConverter } from './features/converters/html/converter/converters/linebreak.js' -export { ParagraphHTMLConverter } from './features/converters/html/converter/converters/paragraph.js' +export { lexicalHTMLField } from './features/converters/html/async/field/index.js' -export { TabHTMLConverter } from './features/converters/html/converter/converters/tab.js' +export { LinebreakHTMLConverter } from './features/converters/html_deprecated/converter/converters/linebreak.js' +export { ParagraphHTMLConverter } from './features/converters/html_deprecated/converter/converters/paragraph.js' -export { TextHTMLConverter } from './features/converters/html/converter/converters/text.js' -export { defaultHTMLConverters } from './features/converters/html/converter/defaultConverters.js' +export { TabHTMLConverter } from './features/converters/html_deprecated/converter/converters/tab.js' + +export { TextHTMLConverter } from './features/converters/html_deprecated/converter/converters/text.js' +export { defaultHTMLConverters } from './features/converters/html_deprecated/converter/defaultConverters.js' export { convertLexicalNodesToHTML, convertLexicalToHTML, -} from './features/converters/html/converter/index.js' +} from './features/converters/html_deprecated/converter/index.js' -export type { HTMLConverter } from './features/converters/html/converter/types.js' -export { consolidateHTMLConverters, lexicalHTML } from './features/converters/html/field/index.js' +export type { HTMLConverter } from './features/converters/html_deprecated/converter/types.js' +export { + consolidateHTMLConverters, + lexicalHTML, +} from './features/converters/html_deprecated/field/index.js' export { HTMLConverterFeature, type HTMLConverterFeatureProps, -} from './features/converters/html/index.js' +} from './features/converters/html_deprecated/index.js' export { convertHTMLToLexical } from './features/converters/htmlToLexical/index.js' +export { getPayloadPopulateFn } from './features/converters/utilities/payloadPopulateFn.js' +export { getRestPopulateFn } from './features/converters/utilities/restPopulateFn.js' export { TestRecorderFeature } from './features/debug/testRecorder/server/index.js' export { TreeViewFeature } from './features/debug/treeView/server/index.js' export { EXPERIMENTAL_TableFeature } from './features/experimental_table/server/index.js' @@ -1028,6 +1035,7 @@ export type { LexicalEditorProps, LexicalFieldAdminProps, LexicalRichTextAdapter export { createServerFeature } from './utilities/createServerFeature.js' export { editorConfigFactory } from './utilities/editorConfigFactory.js' + export type { FieldsDrawerProps } from './utilities/fieldsDrawer/Drawer.js' export { extractPropsFromJSXPropsString } from './utilities/jsx/extractPropsFromJSXPropsString.js' @@ -1037,4 +1045,5 @@ export { objectToFrontmatter, propsToJSXString, } from './utilities/jsx/jsx.js' + export { upgradeLexicalData } from './utilities/upgradeLexicalData/index.js' diff --git a/packages/richtext-lexical/src/populateGraphQL/populate.ts b/packages/richtext-lexical/src/populateGraphQL/populate.ts index 555fa5672f..ff99d1d16a 100644 --- a/packages/richtext-lexical/src/populateGraphQL/populate.ts +++ b/packages/richtext-lexical/src/populateGraphQL/populate.ts @@ -2,11 +2,13 @@ import type { PayloadRequest, SelectType } from 'payload' import { createDataloaderCacheKey } from 'payload' -type Arguments = { +type PopulateArguments = { + collectionSlug: string currentDepth?: number data: unknown depth: number draft: boolean + id: number | string key: number | string overrideAccess: boolean req: PayloadRequest @@ -14,7 +16,9 @@ type Arguments = { showHiddenFields: boolean } -export const populate = async ({ +type PopulateFn = (args: PopulateArguments) => Promise + +export const populate: PopulateFn = async ({ id, collectionSlug, currentDepth, @@ -26,10 +30,7 @@ export const populate = async ({ req, select, showHiddenFields, -}: { - collectionSlug: string - id: number | string -} & Arguments): Promise => { +}) => { const shouldPopulate = depth && currentDepth! <= depth // usually depth is checked within recursivelyPopulateFieldsForGraphQL. But since this populate function can be called outside of that (in rest afterRead node hooks) we need to check here too if (!shouldPopulate) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 159e22fb07..bcba06d3fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,7 +45,7 @@ importers: version: 1.50.0 '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)) '@sentry/node': specifier: ^8.33.1 version: 8.37.1 @@ -135,7 +135,7 @@ importers: version: 10.1.3(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: specifier: 15.2.0 - version: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) open: specifier: ^10.1.0 version: 10.1.0 @@ -1079,7 +1079,7 @@ importers: dependencies: next: specifier: ^15.0.3 - version: 15.1.3(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.1.3(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) devDependencies: '@payloadcms/eslint-config': specifier: workspace:* @@ -1144,7 +1144,7 @@ importers: dependencies: '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)) '@sentry/types': specifier: ^8.33.1 version: 8.37.1 @@ -1316,6 +1316,9 @@ importers: micromark-extension-mdx-jsx: specifier: 3.0.1 version: 3.0.1 + qs-esm: + specifier: 7.0.2 + version: 7.0.2 react: specifier: 19.0.0 version: 19.0.0 @@ -1497,7 +1500,7 @@ importers: version: link:../plugin-cloud-storage uploadthing: specifier: 7.3.0 - version: 7.3.0(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) + version: 7.3.0(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)) devDependencies: payload: specifier: workspace:* @@ -1783,7 +1786,7 @@ importers: version: link:../packages/ui '@sentry/nextjs': specifier: ^8.33.1 - version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)) '@sentry/react': specifier: ^7.77.0 version: 7.119.2(react@19.0.0) @@ -1840,7 +1843,7 @@ importers: version: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) next: specifier: 15.2.0 - version: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + version: 15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) nodemailer: specifier: 6.9.16 version: 6.9.16 @@ -8069,6 +8072,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.1.1: @@ -13967,7 +13971,7 @@ snapshots: '@sentry/utils': 7.119.2 localforage: 1.10.0 - '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': + '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) @@ -13981,9 +13985,9 @@ snapshots: '@sentry/types': 8.37.1 '@sentry/utils': 8.37.1 '@sentry/vercel-edge': 8.37.1 - '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)) chalk: 3.0.0 - next: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.10 @@ -14091,12 +14095,12 @@ snapshots: '@sentry/types': 8.37.1 '@sentry/utils': 8.37.1 - '@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': + '@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))': dependencies: '@sentry/bundler-plugin-core': 2.22.6 unplugin: 1.0.1 uuid: 9.0.0 - webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)) + webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12) transitivePeerDependencies: - encoding - supports-color @@ -18646,7 +18650,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.1.3(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.1.3(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: '@next/env': 15.1.3 '@swc/counter': 0.1.3 @@ -18674,7 +18678,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): + next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): dependencies: '@next/env': 15.2.0 '@swc/counter': 0.1.3 @@ -20075,16 +20079,17 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))): + terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)) + webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12) optionalDependencies: '@swc/core': 1.10.12(@swc/helpers@0.5.15) + esbuild: 0.19.12 terser@5.36.0: dependencies: @@ -20365,14 +20370,14 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uploadthing@7.3.0(next@15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): + uploadthing@7.3.0(next@15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)): dependencies: '@effect/platform': 0.69.8(effect@3.10.3) '@uploadthing/mime-types': 0.3.2 '@uploadthing/shared': 7.1.1 effect: 3.10.3 optionalDependencies: - next: 15.2.0(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) + next: 15.2.0(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) uri-js@4.4.1: dependencies: @@ -20470,7 +20475,7 @@ snapshots: webpack-virtual-modules@0.5.0: {} - webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)): + webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -20492,7 +20497,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) + terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/test/fields/collections/Lexical/LexicalRendered.tsx b/test/fields/collections/Lexical/LexicalRendered.tsx index 838a0ea01a..4d49066e56 100644 --- a/test/fields/collections/Lexical/LexicalRendered.tsx +++ b/test/fields/collections/Lexical/LexicalRendered.tsx @@ -1,11 +1,23 @@ 'use client' +import type { DefaultNodeTypes, SerializedBlockNode } from '@payloadcms/richtext-lexical' import type { SerializedEditorState } from '@payloadcms/richtext-lexical/lexical' +import { getRestPopulateFn } from '@payloadcms/richtext-lexical/client' +import { + convertLexicalToHTML, + type HTMLConvertersFunction, +} from '@payloadcms/richtext-lexical/html' +import { + convertLexicalToHTMLAsync, + type HTMLConvertersFunctionAsync, +} from '@payloadcms/richtext-lexical/html-async' import { type JSXConvertersFunction, RichText } from '@payloadcms/richtext-lexical/react' import { useConfig, useDocumentInfo, usePayloadAPI } from '@payloadcms/ui' -import React from 'react' +import React, { useEffect, useMemo, useState } from 'react' -const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ +const jsxConverters: JSXConvertersFunction> = ({ + defaultConverters, +}) => ({ ...defaultConverters, blocks: { myTextBlock: ({ node }) =>
    {node.fields.text}
    , @@ -15,6 +27,30 @@ const jsxConverters: JSXConvertersFunction = ({ defaultConverters }) => ({ }, }) +const htmlConverters: HTMLConvertersFunction> = ({ + defaultConverters, +}) => ({ + ...defaultConverters, + blocks: { + myTextBlock: ({ node }) => `
    ${node.fields.text}
    `, + relationshipBlock: () => { + return `

    Test

    ` + }, + }, +}) + +const htmlConvertersAsync: HTMLConvertersFunctionAsync< + DefaultNodeTypes | SerializedBlockNode +> = ({ defaultConverters }) => ({ + ...defaultConverters, + blocks: { + myTextBlock: ({ node }) => `
    ${node.fields.text}
    `, + relationshipBlock: () => { + return `

    Test

    ` + }, + }, +}) + export const LexicalRendered: React.FC = () => { const { id, collectionSlug } = useDocumentInfo() @@ -31,14 +67,54 @@ export const LexicalRendered: React.FC = () => { }, }) + const [{ data: unpopulatedData }] = usePayloadAPI(`${serverURL}${api}/${collectionSlug}/${id}`, { + initialParams: { + depth: 0, + }, + }) + + const html: null | string = useMemo(() => { + if (!data.lexicalWithBlocks) { + return null + } + + return convertLexicalToHTML({ + converters: htmlConverters, + data: data.lexicalWithBlocks as SerializedEditorState, + }) + }, [data.lexicalWithBlocks]) + + const [htmlFromUnpopulatedData, setHtmlFromUnpopulatedData] = useState(null) + + useEffect(() => { + async function convert() { + const html = await convertLexicalToHTMLAsync({ + converters: htmlConvertersAsync, + data: unpopulatedData.lexicalWithBlocks as SerializedEditorState, + populate: getRestPopulateFn({ + apiURL: `${serverURL}${api}`, + }), + }) + + setHtmlFromUnpopulatedData(html) + } + void convert() + }, [unpopulatedData.lexicalWithBlocks, api, serverURL]) + if (!data.lexicalWithBlocks) { return null } return (
    -

    Rendered:

    +

    Rendered JSX:

    +

    Rendered HTML:

    + {html &&
    } +

    Rendered HTML 2:

    + {htmlFromUnpopulatedData && ( +
    + )}

    Raw JSON:

    {JSON.stringify(data.lexicalWithBlocks, null, 2)}
    diff --git a/test/fields/collections/LexicalMigrate/index.ts b/test/fields/collections/LexicalMigrate/index.ts index 19403825f4..adc152748b 100644 --- a/test/fields/collections/LexicalMigrate/index.ts +++ b/test/fields/collections/LexicalMigrate/index.ts @@ -1,9 +1,8 @@ import type { CollectionConfig } from 'payload' import { - HTMLConverterFeature, lexicalEditor, - lexicalHTML, + lexicalHTMLField, LinkFeature, TreeViewFeature, UploadFeature, @@ -39,7 +38,6 @@ export const LexicalMigrateFields: CollectionConfig = { ...defaultFeatures, LexicalPluginToLexicalFeature({ quiet: true }), TreeViewFeature(), - HTMLConverterFeature(), LinkFeature({ fields: ({ defaultFields }) => [ ...defaultFields, @@ -80,7 +78,6 @@ export const LexicalMigrateFields: CollectionConfig = { ...defaultFeatures, SlateToLexicalFeature(), TreeViewFeature(), - HTMLConverterFeature(), LinkFeature({ fields: ({ defaultFields }) => [ ...defaultFields, @@ -117,11 +114,11 @@ export const LexicalMigrateFields: CollectionConfig = { name: 'lexicalSimple', type: 'richText', editor: lexicalEditor({ - features: ({ defaultFeatures }) => [...defaultFeatures, HTMLConverterFeature()], + features: ({ defaultFeatures }) => [...defaultFeatures], }), defaultValue: getSimpleLexicalData('simple'), }, - lexicalHTML('lexicalSimple', { name: 'lexicalSimple_html' }), + lexicalHTMLField({ htmlFieldName: 'lexicalSimple_html', lexicalFieldName: 'lexicalSimple' }), { name: 'groupWithLexicalField', type: 'group', @@ -130,11 +127,14 @@ export const LexicalMigrateFields: CollectionConfig = { name: 'lexicalInGroupField', type: 'richText', editor: lexicalEditor({ - features: ({ defaultFeatures }) => [...defaultFeatures, HTMLConverterFeature()], + features: ({ defaultFeatures }) => [...defaultFeatures], }), defaultValue: getSimpleLexicalData('group'), }, - lexicalHTML('lexicalInGroupField', { name: 'lexicalInGroupField_html' }), + lexicalHTMLField({ + htmlFieldName: 'lexicalInGroupField_html', + lexicalFieldName: 'lexicalInGroupField', + }), ], }, { @@ -145,10 +145,13 @@ export const LexicalMigrateFields: CollectionConfig = { name: 'lexicalInArrayField', type: 'richText', editor: lexicalEditor({ - features: ({ defaultFeatures }) => [...defaultFeatures, HTMLConverterFeature()], + features: ({ defaultFeatures }) => [...defaultFeatures], }), }, - lexicalHTML('lexicalInArrayField', { name: 'lexicalInArrayField_html' }), + lexicalHTMLField({ + htmlFieldName: 'lexicalInArrayField_html', + lexicalFieldName: 'lexicalInArrayField', + }), ], }, ], diff --git a/test/fields/lexical.int.spec.ts b/test/fields/lexical.int.spec.ts index e8a6efecd9..865be617f1 100644 --- a/test/fields/lexical.int.spec.ts +++ b/test/fields/lexical.int.spec.ts @@ -304,8 +304,8 @@ describe('Lexical', () => { }) ).docs[0] as never - const htmlField: string = lexicalDoc?.lexicalSimple_html - expect(htmlField).toStrictEqual('

    simple

    ') + const htmlField = lexicalDoc?.lexicalSimple_html + expect(htmlField).toStrictEqual('

    simple

    ') }) it('htmlConverter: should output correct HTML for lexical field nested in group', async () => { const lexicalDoc: LexicalMigrateField = ( @@ -320,8 +320,8 @@ describe('Lexical', () => { }) ).docs[0] as never - const htmlField: string = lexicalDoc?.groupWithLexicalField?.lexicalInGroupField_html - expect(htmlField).toStrictEqual('

    group

    ') + const htmlField = lexicalDoc?.groupWithLexicalField?.lexicalInGroupField_html + expect(htmlField).toStrictEqual('

    group

    ') }) it('htmlConverter: should output correct HTML for lexical field nested in array', async () => { const lexicalDoc: LexicalMigrateField = ( @@ -336,11 +336,11 @@ describe('Lexical', () => { }) ).docs[0] as never - const htmlField1: string = lexicalDoc?.arrayWithLexicalField[0].lexicalInArrayField_html - const htmlField2: string = lexicalDoc?.arrayWithLexicalField[1].lexicalInArrayField_html + const htmlField1 = lexicalDoc?.arrayWithLexicalField?.[0]?.lexicalInArrayField_html + const htmlField2 = lexicalDoc?.arrayWithLexicalField?.[1]?.lexicalInArrayField_html - expect(htmlField1).toStrictEqual('

    array 1

    ') - expect(htmlField2).toStrictEqual('

    array 2

    ') + expect(htmlField1).toStrictEqual('

    array 1

    ') + expect(htmlField2).toStrictEqual('

    array 2

    ') }) }) describe('advanced - blocks', () => { @@ -654,7 +654,7 @@ describe('Lexical', () => { locale: 'en', data: { title: 'Localized Lexical hooks', - lexicalBlocksLocalized: textToLexicalJSON({ text: 'some text' }) as any, + lexicalBlocksLocalized: textToLexicalJSON({ text: 'some text' }), lexicalBlocksSubLocalized: generateLexicalLocalizedRichText( 'Shared text', 'English text in block', From 1e708bdd126c5124c3c5c2ce7a62cdb48507dcba Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Wed, 5 Mar 2025 18:25:16 -0700 Subject: [PATCH 113/127] feat(richtext-lexical): adds ability to disable auto link creation (#11563) This adds a new `disableAutoLinks` property to the `LinkFeature` that lets you disable the automatic creation of links while typing them in the editor or pasting them. --- .../src/features/link/client/index.tsx | 25 ++-- .../src/features/link/server/index.ts | 108 ++++++++++-------- 2 files changed, 77 insertions(+), 56 deletions(-) diff --git a/packages/richtext-lexical/src/features/link/client/index.tsx b/packages/richtext-lexical/src/features/link/client/index.tsx index d97c1db489..c8600e309d 100644 --- a/packages/richtext-lexical/src/features/link/client/index.tsx +++ b/packages/richtext-lexical/src/features/link/client/index.tsx @@ -1,11 +1,12 @@ 'use client' -import type { LexicalNode } from 'lexical' +import type { Klass, LexicalNode } from 'lexical' import { $findMatchingParent } from '@lexical/utils' import { $getSelection, $isRangeSelection } from 'lexical' import type { ToolbarGroup } from '../../toolbars/types.js' +import type { ClientFeature } from '../../typesClient.js' import type { LinkFields } from '../nodes/types.js' import type { ExclusiveLinkCollectionsProps } from '../server/index.js' @@ -25,6 +26,7 @@ import { LinkPlugin } from './plugins/link/index.js' export type ClientProps = { defaultLinkType?: string defaultLinkURL?: string + disableAutoLinks?: 'creationOnly' | true } & ExclusiveLinkCollectionsProps const toolbarGroups: ToolbarGroup[] = [ @@ -80,18 +82,22 @@ const toolbarGroups: ToolbarGroup[] = [ ]), ] -export const LinkFeatureClient = createClientFeature({ +export const LinkFeatureClient = createClientFeature(({ props }) => ({ markdownTransformers: [LinkMarkdownTransformer], - nodes: [LinkNode, AutoLinkNode], + nodes: [LinkNode, props?.disableAutoLinks === true ? null : AutoLinkNode].filter( + Boolean, + ) as Array>, plugins: [ { Component: LinkPlugin, position: 'normal', }, - { - Component: AutoLinkPlugin, - position: 'normal', - }, + props?.disableAutoLinks === true || props?.disableAutoLinks === 'creationOnly' + ? null + : { + Component: AutoLinkPlugin, + position: 'normal', + }, { Component: ClickableLinkPlugin, position: 'normal', @@ -100,11 +106,12 @@ export const LinkFeatureClient = createClientFeature({ Component: FloatingLinkEditorPlugin, position: 'floatingAnchorElem', }, - ], + ].filter(Boolean) as ClientFeature['plugins'], + sanitizedClientFeatureProps: props, toolbarFixed: { groups: toolbarGroups, }, toolbarInline: { groups: toolbarGroups, }, -}) +})) diff --git a/packages/richtext-lexical/src/features/link/server/index.ts b/packages/richtext-lexical/src/features/link/server/index.ts index 192dea7749..96062fd9b0 100644 --- a/packages/richtext-lexical/src/features/link/server/index.ts +++ b/packages/richtext-lexical/src/features/link/server/index.ts @@ -10,6 +10,7 @@ import type { import escapeHTML from 'escape-html' import { sanitizeFields } from 'payload' +import type { NodeWithHooks } from '../../typesServer.js' import type { ClientProps } from '../client/index.js' import { createServerFeature } from '../../../utilities/createServerFeature.js' @@ -46,6 +47,16 @@ export type ExclusiveLinkCollectionsProps = } export type LinkFeatureServerProps = { + /** + * Disables the automatic creation of links from URLs pasted into the editor, as well + * as auto link nodes. + * + * If set to 'creationOnly', only the creation of new auto link nodes will be disabled. + * Existing auto link nodes will still be editable. + * + * @default false + */ + disableAutoLinks?: 'creationOnly' | true /** * A function or array defining additional fields for the link feature. These will be * displayed in the link editor drawer. @@ -130,6 +141,7 @@ export const LinkFeature = createServerFeature< clientFeatureProps: { defaultLinkType, defaultLinkURL, + disableAutoLinks: props.disableAutoLinks, disabledCollections: props.disabledCollections, enabledCollections: props.enabledCollections, } as ClientProps, @@ -148,55 +160,57 @@ export const LinkFeature = createServerFeature< i18n, markdownTransformers: [LinkMarkdownTransformer], nodes: [ - createNode({ - converters: { - html: { - converter: async ({ - converters, - currentDepth, - depth, - draft, - node, - overrideAccess, - parent, - req, - showHiddenFields, - }) => { - const childrenText = await convertLexicalNodesToHTML({ - converters, - currentDepth, - depth, - draft, - lexicalNodes: node.children, - overrideAccess, - parent: { - ...node, + props?.disableAutoLinks === true + ? null + : createNode({ + converters: { + html: { + converter: async ({ + converters, + currentDepth, + depth, + draft, + node, + overrideAccess, parent, + req, + showHiddenFields, + }) => { + const childrenText = await convertLexicalNodesToHTML({ + converters, + currentDepth, + depth, + draft, + lexicalNodes: node.children, + overrideAccess, + parent: { + ...node, + parent, + }, + req, + showHiddenFields, + }) + + const rel: string = node.fields.newTab ? ' rel="noopener noreferrer"' : '' + const target: string = node.fields.newTab ? ' target="_blank"' : '' + + let href: string = node.fields.url ?? '' + if (node.fields.linkType === 'internal') { + href = + typeof node.fields.doc?.value !== 'object' + ? String(node.fields.doc?.value) + : String(node.fields.doc?.value?.id) + } + + return `${childrenText}` }, - req, - showHiddenFields, - }) - - const rel: string = node.fields.newTab ? ' rel="noopener noreferrer"' : '' - const target: string = node.fields.newTab ? ' target="_blank"' : '' - - let href: string = node.fields.url ?? '' - if (node.fields.linkType === 'internal') { - href = - typeof node.fields.doc?.value !== 'object' - ? String(node.fields.doc?.value) - : String(node.fields.doc?.value?.id) - } - - return `${childrenText}` + nodeTypes: [AutoLinkNode.getType()], + }, }, - nodeTypes: [AutoLinkNode.getType()], - }, - }, - node: AutoLinkNode, - // Since AutoLinkNodes are just internal links, they need no hooks or graphQL population promises - validations: [linkValidation(props, sanitizedFieldsWithoutText)], - }), + node: AutoLinkNode, + // Since AutoLinkNodes are just internal links, they need no hooks or graphQL population promises + validations: [linkValidation(props, sanitizedFieldsWithoutText)], + }), createNode({ converters: { html: { @@ -249,7 +263,7 @@ export const LinkFeature = createServerFeature< node: LinkNode, validations: [linkValidation(props, sanitizedFieldsWithoutText)], }), - ], + ].filter(Boolean) as Array, sanitizedServerFeatureProps: props, } }, From 179778223f3d6cd6bac62c999d9cf6795802f2c5 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 5 Mar 2025 23:19:01 -0500 Subject: [PATCH 114/127] ci: canary and internal releases [skip ci] (#11565) - Adds support for numeric canary versions ie. `3.28.0-canary.0`, subsequent prereleases will increment accordingly (like Next.js) - _Our old way of doing canary releases_ is still available but will now be tagged as `internal` ex. `3.28.0-internal.shorthash` - Releases are triggered via workflow dispatch in Actions. Triggers off of main will be released as `canary`, all others will be `internal`. --- ...ease-canary.yml => publish-prerelease.yml} | 19 +++++++-- package.json | 3 +- tools/releaser/package.json | 2 +- tools/releaser/src/lib/getWorkspace.ts | 39 +++++++++++++++++-- ...ublish-canary.ts => publish-prerelease.ts} | 17 +++++++- 5 files changed, 67 insertions(+), 13 deletions(-) rename .github/workflows/{release-canary.yml => publish-prerelease.yml} (57%) rename tools/releaser/src/{publish-canary.ts => publish-prerelease.ts} (54%) diff --git a/.github/workflows/release-canary.yml b/.github/workflows/publish-prerelease.yml similarity index 57% rename from .github/workflows/release-canary.yml rename to .github/workflows/publish-prerelease.yml index 0f4d9ca276..c346007868 100644 --- a/.github/workflows/release-canary.yml +++ b/.github/workflows/publish-prerelease.yml @@ -1,4 +1,4 @@ -name: release-canary +name: publish-prerelease on: workflow_dispatch: @@ -11,7 +11,7 @@ env: jobs: release: - name: release-canary-${{ github.ref_name }}-${{ github.sha }} + name: publish-prerelease-${{ github.ref_name }}-${{ github.sha }} permissions: id-token: write runs-on: ubuntu-24.04 @@ -27,8 +27,19 @@ jobs: run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Canary release script - run: pnpm release:canary + + - name: Determine release type + id: determine_release_type + # Use 'canary' for main branch, 'internal' for others + run: | + if [[ ${{ github.ref_name }} == "main" ]]; then + echo "::set-output name=release_type::canary" + else + echo "::set-output name=release_type::internal" + fi + + - name: Release + run: pnpm publish-prerelease --tag ${{ steps.determine_release_type.outputs.release_type }} env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/package.json b/package.json index 28040407d3..8504b54953 100644 --- a/package.json +++ b/package.json @@ -81,10 +81,9 @@ "prepare": "husky", "prepare-run-test-against-prod": "pnpm bf && rm -rf test/packed && rm -rf test/node_modules && rm -rf app && rm -f test/pnpm-lock.yaml && pnpm run script:pack --all --no-build --dest test/packed && pnpm runts test/setupProd.ts && cd test && pnpm i --ignore-workspace && cd ..", "prepare-run-test-against-prod:ci": "rm -rf test/node_modules && rm -rf app && rm -f test/pnpm-lock.yaml && pnpm run script:pack --all --no-build --dest test/packed && pnpm runts test/setupProd.ts && cd test && pnpm i --ignore-workspace && cd ..", + "publish-prerelease": "pnpm --filter releaser publish-prerelease", "reinstall": "pnpm clean:all && pnpm install", "release": "pnpm --filter releaser release --tag latest", - "release:beta": "pnpm runts ./scripts/release.ts --bump prerelease --tag beta", - "release:canary": "pnpm --filter releaser release:canary", "runts": "cross-env NODE_OPTIONS=--no-deprecation node --no-deprecation --import @swc-node/register/esm-register", "script:build-template-with-local-pkgs": "pnpm --filter scripts build-template-with-local-pkgs", "script:gen-templates": "pnpm --filter scripts gen-templates", diff --git a/tools/releaser/package.json b/tools/releaser/package.json index 918b3e429b..bc9c3927ba 100644 --- a/tools/releaser/package.json +++ b/tools/releaser/package.json @@ -29,8 +29,8 @@ "lint": "eslint .", "lint:fix": "eslint . --fix", "list-published": "tsx src/lib/getPackageRegistryVersions.ts", + "publish-prerelease": "tsx src/publish-prerelease.ts", "release": "tsx src/release.ts", - "release:canary": "tsx src/publish-canary.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/tools/releaser/src/lib/getWorkspace.ts b/tools/releaser/src/lib/getWorkspace.ts index 05eed84a99..0596dbc25c 100644 --- a/tools/releaser/src/lib/getWorkspace.ts +++ b/tools/releaser/src/lib/getWorkspace.ts @@ -27,7 +27,7 @@ type PackageDetails = { version: string } -type PackageReleaseType = 'canary' | ReleaseType +type PackageReleaseType = 'canary' | 'internal' | ReleaseType type PublishResult = { name: string @@ -140,11 +140,42 @@ export const getWorkspace = async () => { const { version: monorepoVersion, packages: packageDetails } = await getCurrentPackageState() let nextReleaseVersion - if (bumpType === 'canary') { + if (bumpType === 'internal') { const hash = execSync('git rev-parse --short HEAD', { encoding: 'utf8' }).trim().slice(0, 7) - nextReleaseVersion = semver.inc(monorepoVersion, 'minor') + `-canary.${hash}` + nextReleaseVersion = semver.inc(monorepoVersion, 'minor') + `-internal.${hash}` + } else if (bumpType === 'canary') { + const minorCandidateBaseVersion = semver.inc(monorepoVersion, 'minor') + + if (!minorCandidateBaseVersion) { + throw new Error(`Could not determine minor candidate version from ${monorepoVersion}`) + } + + // Get latest canary version from registry + const json = await fetch(`https://registry.npmjs.org/payload`).then((res) => res.json()) + const { canary: latestCanaryVersion } = (json['dist-tags'] ?? {}) as { + canary?: string | undefined + } + + console.log(`Latest canary version: ${latestCanaryVersion}`) + + if ( + latestCanaryVersion?.startsWith(minorCandidateBaseVersion) && + latestCanaryVersion.includes('-canary.') + ) { + const canaryIteration = Number(latestCanaryVersion.split('-canary.')[1]) + if (isNaN(canaryIteration)) { + console.log(`Latest canary version is not a valid canary version, starting from 0`) + nextReleaseVersion = semver.inc(monorepoVersion, 'minor') + '-canary.0' + } else { + console.log(`Incrementing canary version from ${latestCanaryVersion}`) + nextReleaseVersion = `${minorCandidateBaseVersion}-canary.${canaryIteration + 1}` + } + } else { + console.log(`Latest canary does not match minor candidate, incrementing minor`) + nextReleaseVersion = semver.inc(monorepoVersion, 'minor') + '-canary.0' + } } else { - nextReleaseVersion = semver.inc(monorepoVersion, bumpType) + throw new Error(`Invalid bump type: ${bumpType}. Only 'internal' and 'canary' are supported.`) } if (!nextReleaseVersion) { diff --git a/tools/releaser/src/publish-canary.ts b/tools/releaser/src/publish-prerelease.ts similarity index 54% rename from tools/releaser/src/publish-canary.ts rename to tools/releaser/src/publish-prerelease.ts index 108b4809a0..3a97d1ed44 100755 --- a/tools/releaser/src/publish-canary.ts +++ b/tools/releaser/src/publish-prerelease.ts @@ -1,12 +1,25 @@ import chalk from 'chalk' +import minimist from 'minimist' import { getWorkspace } from './lib/getWorkspace.js' async function main() { + const args = minimist(process.argv.slice(2)) + + const { bump = 'minor', 'dry-run': dryRun, tag } = args + + if (!tag || !['canary', 'internal'].includes(tag)) { + abort('Tag is required. Use --tag ') + } + + console.log(`\n Bump: ${bump}`) + console.log(` Tag: ${tag}`) + console.log(` Dry Run: ${dryRun ? 'Enabled' : 'Disabled'}`) + const workspace = await getWorkspace() - await workspace.bumpVersion('canary') + await workspace.bumpVersion(tag) await workspace.build() - await workspace.publishSync({ dryRun: false, tag: 'canary' }) + await workspace.publishSync({ dryRun: dryRun ?? false, tag }) header('🎉 Done!') } From 1ad1de7a0df33b45ee2ebf16c8014fe7d84c4427 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Wed, 5 Mar 2025 23:34:22 -0500 Subject: [PATCH 115/127] ci: use GITHUB_OUTPUT instead of set-output [skip ci] --- .github/workflows/publish-prerelease.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-prerelease.yml b/.github/workflows/publish-prerelease.yml index c346007868..4e5b551761 100644 --- a/.github/workflows/publish-prerelease.yml +++ b/.github/workflows/publish-prerelease.yml @@ -33,9 +33,9 @@ jobs: # Use 'canary' for main branch, 'internal' for others run: | if [[ ${{ github.ref_name }} == "main" ]]; then - echo "::set-output name=release_type::canary" + echo "release_type=canary" >> $GITHUB_OUTPUT else - echo "::set-output name=release_type::internal" + echo "release_type=internal" >> $GITHUB_OUTPUT fi - name: Release From 2ad035fb7b131e27587f3d3ec04cf5fe6fa750e1 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Thu, 6 Mar 2025 16:31:38 +0200 Subject: [PATCH 116/127] feat(db-mongodb): strip keys from the data that don't exist in the schema from read results (#11558) This change makes so that data that exists in MongoDB but isn't defined in the Payload config won't be included to `payload.find` / `payload.db.find` calls. Now we strip all the additional keys. Consider you have a field named `secretField` that's also `hidden: true` (or `read: () => false`) that contains some sensitive data. Then you removed this field from the database and as for now with the MongoDB adapter this field will be included to the Local API / REST API results without any consideration, as Payload doesn't know about it anymore. This also fixes https://github.com/payloadcms/payload/issues/11542 if you removed / renamed a relationship field from the schema, Payload won't sanitize ObjectIDs back to strings anymore. Ideally you should create a migration script that completely removes the deleted field from the database with `$unset`, but people rarely do this. If you still need to keep those fields to the result, this PR allows you to do this with the new `allowAdditionalKeys: true` flag. --- docs/database/mongodb.mdx | 3 +- packages/db-mongodb/src/index.ts | 10 ++ .../db-mongodb/src/utilities/transform.ts | 148 +++++++++++++++++- .../payload/src/utilities/flattenAllFields.ts | 20 ++- test/database/int.spec.ts | 45 ++++++ 5 files changed, 223 insertions(+), 3 deletions(-) diff --git a/docs/database/mongodb.mdx b/docs/database/mongodb.mdx index c6fcdd45c3..18172e1aad 100644 --- a/docs/database/mongodb.mdx +++ b/docs/database/mongodb.mdx @@ -34,11 +34,12 @@ export default buildConfig({ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `autoPluralization` | Tell Mongoose to auto-pluralize any collection names if it encounters any singular words used as collection `slug`s. | | `connectOptions` | Customize MongoDB connection options. Payload will connect to your MongoDB database using default options which you can override and extend to include all the [options](https://mongoosejs.com/docs/connections.html#options) available to mongoose. | -| `collectionsSchemaOptions` | Customize Mongoose schema options for collections. | +| `collectionsSchemaOptions` | Customize Mongoose schema options for collections. | | `disableIndexHints` | Set to true to disable hinting to MongoDB to use 'id' as index. This is currently done when counting documents for pagination, as it increases the speed of the count function used in that query. Disabling this optimization might fix some problems with AWS DocumentDB. Defaults to false | | `migrationDir` | Customize the directory that migrations are stored. | | `transactionOptions` | An object with configuration properties used in [transactions](https://www.mongodb.com/docs/manual/core/transactions/) or `false` which will disable the use of transactions. | | `collation` | Enable language-specific string comparison with customizable options. Available on MongoDB 3.4+. Defaults locale to "en". Example: `{ strength: 3 }`. For a full list of collation options and their definitions, see the [MongoDB documentation](https://www.mongodb.com/docs/manual/reference/collation/). | +| `allowAdditionalKeys` | By default, Payload strips all additional keys from MongoDB data that don't exist in the Payload schema. If you have some data that you want to include to the result but it doesn't exist in Payload, you can set this to `true`. Be careful as Payload access control _won't_ work for this data. | ## Access to Mongoose models diff --git a/packages/db-mongodb/src/index.ts b/packages/db-mongodb/src/index.ts index ea7dbd90f8..6b0cfe4447 100644 --- a/packages/db-mongodb/src/index.ts +++ b/packages/db-mongodb/src/index.ts @@ -63,6 +63,13 @@ import { upsert } from './upsert.js' export type { MigrateDownArgs, MigrateUpArgs } from './types.js' export interface Args { + /** + * By default, Payload strips all additional keys from MongoDB data that don't exist + * in the Payload schema. If you have some data that you want to include to the result + * but it doesn't exist in Payload, you can enable this flag + * @default false + */ + allowAdditionalKeys?: boolean /** Set to false to disable auto-pluralization of collection names, Defaults to true */ autoPluralization?: boolean /** @@ -89,6 +96,7 @@ export interface Args { * Defaults to disabled. */ collation?: Omit + collectionsSchemaOptions?: Partial> /** Extra configuration options */ @@ -174,6 +182,7 @@ declare module 'payload' { } export function mongooseAdapter({ + allowAdditionalKeys = false, autoPluralization = true, collectionsSchemaOptions = {}, connectOptions, @@ -210,6 +219,7 @@ export function mongooseAdapter({ url, versions: {}, // DatabaseAdapter + allowAdditionalKeys, beginTransaction: transactionOptions === false ? defaultBeginTransaction() : beginTransaction, collectionsSchemaOptions, commitTransaction, diff --git a/packages/db-mongodb/src/utilities/transform.ts b/packages/db-mongodb/src/utilities/transform.ts index 2f1d2753a1..7f1dae84a7 100644 --- a/packages/db-mongodb/src/utilities/transform.ts +++ b/packages/db-mongodb/src/utilities/transform.ts @@ -2,6 +2,8 @@ import type { CollectionConfig, DateField, Field, + FlattenedBlock, + FlattenedField, JoinField, RelationshipField, SanitizedConfig, @@ -10,7 +12,7 @@ import type { } from 'payload' import { Types } from 'mongoose' -import { traverseFields } from 'payload' +import { flattenAllFields, traverseFields } from 'payload' import { fieldAffectsData, fieldShouldBeLocalized } from 'payload/shared' import type { MongooseAdapter } from '../index.js' @@ -228,6 +230,141 @@ type Args = { validateRelationships?: boolean } +const stripFields = ({ + config, + data, + fields, + reservedKeys = [], +}: { + config: SanitizedConfig + data: any + fields: FlattenedField[] + reservedKeys?: string[] +}) => { + for (const k in data) { + if (!fields.some((field) => field.name === k) && !reservedKeys.includes(k)) { + delete data[k] + } + } + + for (const field of fields) { + reservedKeys = [] + const fieldData = data[field.name] + if (!fieldData || typeof fieldData !== 'object') { + continue + } + + if (field.type === 'blocks') { + reservedKeys.push('blockType') + } + + if ('flattenedFields' in field || 'blocks' in field) { + if (field.localized && config.localization) { + for (const localeKey in fieldData) { + if (!config.localization.localeCodes.some((code) => code === localeKey)) { + delete fieldData[localeKey] + continue + } + + const localeData = fieldData[localeKey] + + if (!localeData || typeof localeData !== 'object') { + continue + } + + if (field.type === 'array' || field.type === 'blocks') { + if (!Array.isArray(localeData)) { + continue + } + + for (const data of localeData) { + let fields: FlattenedField[] | null = null + + if (field.type === 'array') { + fields = field.flattenedFields + } else { + let maybeBlock: FlattenedBlock | undefined = undefined + + if (field.blockReferences) { + const maybeBlockReference = field.blockReferences.find( + (each) => typeof each === 'object' && each.slug === data.blockType, + ) + if (maybeBlockReference && typeof maybeBlockReference === 'object') { + maybeBlock = maybeBlockReference + } + } + + if (!maybeBlock) { + maybeBlock = field.blocks.find((each) => each.slug === data.blockType) + } + + if (maybeBlock) { + fields = maybeBlock.flattenedFields + } + } + + if (!fields) { + continue + } + + stripFields({ config, data, fields, reservedKeys }) + } + + continue + } else { + stripFields({ config, data: localeData, fields: field.flattenedFields, reservedKeys }) + } + } + continue + } + + if (field.type === 'array' || field.type === 'blocks') { + if (!Array.isArray(fieldData)) { + continue + } + + for (const data of fieldData) { + let fields: FlattenedField[] | null = null + + if (field.type === 'array') { + fields = field.flattenedFields + } else { + let maybeBlock: FlattenedBlock | undefined = undefined + + if (field.blockReferences) { + const maybeBlockReference = field.blockReferences.find( + (each) => typeof each === 'object' && each.slug === data.blockType, + ) + + if (maybeBlockReference && typeof maybeBlockReference === 'object') { + maybeBlock = maybeBlockReference + } + } + + if (!maybeBlock) { + maybeBlock = field.blocks.find((each) => each.slug === data.blockType) + } + + if (maybeBlock) { + fields = maybeBlock.flattenedFields + } + } + + if (!fields) { + continue + } + + stripFields({ config, data, fields, reservedKeys }) + } + + continue + } else { + stripFields({ config, data: fieldData, fields: field.flattenedFields, reservedKeys }) + } + } + } +} + export const transform = ({ adapter, data, @@ -256,6 +393,15 @@ export const transform = ({ if (data.id instanceof Types.ObjectId) { data.id = data.id.toHexString() } + + if (!adapter.allowAdditionalKeys) { + stripFields({ + config, + data, + fields: flattenAllFields({ cache: true, fields }), + reservedKeys: ['id', 'globalType'], + }) + } } if (operation === 'write' && globalSlug) { diff --git a/packages/payload/src/utilities/flattenAllFields.ts b/packages/payload/src/utilities/flattenAllFields.ts index e2b0c4ebfb..f1a09c4d2d 100644 --- a/packages/payload/src/utilities/flattenAllFields.ts +++ b/packages/payload/src/utilities/flattenAllFields.ts @@ -16,7 +16,23 @@ export const flattenBlock = ({ block }: { block: Block }): FlattenedBlock => { } } -export const flattenAllFields = ({ fields }: { fields: Field[] }): FlattenedField[] => { +const flattenedFieldsCache = new Map() + +export const flattenAllFields = ({ + cache, + fields, +}: { + /** Allows you to get FlattenedField[] from Field[] anywhere without performance overhead by caching. */ + cache?: boolean + fields: Field[] +}): FlattenedField[] => { + if (cache) { + const maybeFields = flattenedFieldsCache.get(fields) + if (maybeFields) { + return maybeFields + } + } + const result: FlattenedField[] = [] for (const field of fields) { @@ -97,5 +113,7 @@ export const flattenAllFields = ({ fields }: { fields: Field[] }): FlattenedFiel } } + flattenedFieldsCache.set(fields, result) + return result } diff --git a/test/database/int.spec.ts b/test/database/int.spec.ts index 1509b5f980..c94b9ebcee 100644 --- a/test/database/int.spec.ts +++ b/test/database/int.spec.ts @@ -1790,4 +1790,49 @@ describe('database', () => { expect(query2.totalDocs).toEqual(1) expect(query3.totalDocs).toEqual(1) }) + + it('mongodb additional keys stripping', async () => { + // eslint-disable-next-line jest/no-conditional-in-test + if (payload.db.name !== 'mognoose') { + return + } + + const arrItemID = randomUUID() + const res = await payload.db.collections[postsSlug]?.collection.insertOne({ + SECRET_FIELD: 'secret data', + arrayWithIDs: [ + { + id: arrItemID, + additionalKeyInArray: 'true', + text: 'existing key', + }, + ], + }) + + let payloadRes: any = await payload.findByID({ + collection: postsSlug, + id: res!.insertedId.toHexString(), + }) + + expect(payloadRes.id).toBe(res!.insertedId.toHexString()) + expect(payloadRes['SECRET_FIELD']).toBeUndefined() + expect(payloadRes.arrayWithIDs).toBeDefined() + expect(payloadRes.arrayWithIDs[0].id).toBe(arrItemID) + expect(payloadRes.arrayWithIDs[0].text).toBe('existing key') + expect(payloadRes.arrayWithIDs[0].additionalKeyInArray).toBeUndefined() + + // But allows when allowAdditionaKeys is true + payload.db.allowAdditionalKeys = true + + payloadRes = await payload.findByID({ + collection: postsSlug, + id: res!.insertedId.toHexString(), + }) + + expect(payloadRes.id).toBe(res!.insertedId.toHexString()) + expect(payloadRes['SECRET_FIELD']).toBe('secret data') + expect(payloadRes.arrayWithIDs[0].additionalKeyInArray).toBe('true') + + payload.db.allowAdditionalKeys = false + }) }) From 259ea6ab64e14b8b9b155b02f39334f74b13d61d Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 6 Mar 2025 09:49:56 -0500 Subject: [PATCH 117/127] ci: add canary nightly cron, adjust lock and stale crons --- .github/workflows/lock-issues.yml | 4 ++-- .github/workflows/publish-prerelease.yml | 3 +++ .github/workflows/stale.yml | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lock-issues.yml b/.github/workflows/lock-issues.yml index f010e78dc1..5546a3b252 100644 --- a/.github/workflows/lock-issues.yml +++ b/.github/workflows/lock-issues.yml @@ -2,8 +2,8 @@ name: lock-issues on: schedule: - # Run nightly at 12am EST - - cron: '0 4 * * *' + # Run nightly at 12am EST, staggered with stale workflow + - cron: '0 5 * * *' workflow_dispatch: permissions: diff --git a/.github/workflows/publish-prerelease.yml b/.github/workflows/publish-prerelease.yml index 4e5b551761..b8575800fb 100644 --- a/.github/workflows/publish-prerelease.yml +++ b/.github/workflows/publish-prerelease.yml @@ -1,6 +1,9 @@ name: publish-prerelease on: + schedule: + # Run nightly at 10pm EST + - cron: '0 3 * * *' workflow_dispatch: env: diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 7ebdce2b59..d23d6b8869 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -2,8 +2,8 @@ name: stale on: schedule: - # Run nightly at 1am EST - - cron: '0 5 * * *' + # Run nightly at 1am EST, staggered with lock-issues workflow + - cron: '0 6 * * *' workflow_dispatch: inputs: From 9f7e8f47d2338e72797e0974bc39df2f762c1ca7 Mon Sep 17 00:00:00 2001 From: Elliot DeNolf Date: Thu, 6 Mar 2025 10:16:57 -0500 Subject: [PATCH 118/127] ci: adjust paths filter for workflows, only look at main.yml (#11572) Refine the paths filter for workflows from `.github/workflows/**` to `.github/workflows/main.yml`. This is the only workflow that affects the build. --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f46c5e9aee..e3da5ddd0d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,14 +41,14 @@ jobs: with: filters: | needs_build: - - '.github/workflows/**' + - '.github/workflows/main.yml' - 'packages/**' - 'test/**' - 'pnpm-lock.yaml' - 'package.json' - 'templates/**' needs_tests: - - '.github/workflows/**' + - '.github/workflows/main.yml' - 'packages/**' - 'test/**' - 'pnpm-lock.yaml' From 557ac9931a9a1e281a1ecd44092622d7d084a759 Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 6 Mar 2025 10:06:39 -0700 Subject: [PATCH 119/127] feat(richtext-lexical): upgrade lexical from 0.21.0 to 0.27.1 (#11564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/payloadcms/payload/issues/10628 This upgrades lexical from 0.21.0 to 0.27.1. This will allow us to use the new node state API to implement custom text formats (e.g. text colors), [thanks to Germán](https://x.com/GermanJablo/status/1897345631821222292). ## Notable changes ported over from lexical playground: ### Table column freezing https://github.com/user-attachments/assets/febdd7dd-6fa0-40d7-811c-9a38de04bfa7 ### Block cursors We now render a block cursor, which is a custom cursor that gets rendered when the browser doesn't render the native one. An example would be this this horizontal cursor above block nodes, if there is no space above: ![CleanShot 2025-03-05 at 18 48 08@2x](https://github.com/user-attachments/assets/f61ce280-599c-4123-bdf7-25507078fcd7) Previously, those cursors were unstyled and not visible ### Table Alignment Tables can now be aligned ![CleanShot 2025-03-05 at 19 48 32@2x](https://github.com/user-attachments/assets/3fe263db-a98e-4a5d-92fd-a0388e547e5b) --- packages/richtext-lexical/package.json | 34 +- .../blockquote/markdownTransformer.ts | 6 +- .../blocks/server/nodes/BlocksNode.tsx | 4 +- .../plugins/TableActionMenuPlugin/index.scss | 1 + .../plugins/TableActionMenuPlugin/index.tsx | 230 +++- .../plugins/TableCellResizerPlugin/index.tsx | 57 +- .../plugins/TableHoverActionsPlugin/index.tsx | 24 +- .../client/plugins/TablePlugin/index.scss | 46 +- .../client/plugins/TablePlugin/index.tsx | 8 +- .../experimental_table/markdownTransformer.ts | 5 +- .../horizontalRule/client/plugin/index.scss | 2 +- .../src/features/indent/client/index.tsx | 3 +- .../src/features/link/nodes/AutoLinkNode.ts | 18 +- .../src/features/link/nodes/LinkNode.ts | 36 +- .../src/features/link/nodes/types.ts | 3 + .../nodes/unknownConvertedNode/index.tsx | 2 +- .../nodes/unknownConvertedNode/index.tsx | 2 +- .../server/nodes/RelationshipNode.tsx | 4 +- .../shared/ToolbarDropdown/DropDown.tsx | 13 +- packages/richtext-lexical/src/index.ts | 2 +- .../@lexical-react/LexicalTableOfContents.tsx | 1 - .../LexicalMenu.tsx | 21 +- .../handles/AddBlockHandlePlugin/index.tsx | 3 +- .../handles/DraggableBlockPlugin/index.tsx | 3 +- .../src/lexical/theme/EditorTheme.scss | 62 + .../src/lexical/theme/EditorTheme.tsx | 7 + .../src/lexical/utils/guard.ts | 4 + pnpm-lock.yaml | 1129 +++++------------ 28 files changed, 752 insertions(+), 978 deletions(-) delete mode 100644 packages/richtext-lexical/src/lexical-proxy/@lexical-react/LexicalTableOfContents.tsx diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 0a9ed4857d..c53f85af20 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -265,11 +265,6 @@ "types": "./src/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.ts", "default": "./src/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.ts" }, - "./lexical/react/LexicalTableOfContents": { - "import": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts", - "types": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts", - "default": "./src/lexical-proxy/@lexical-react/LexicalTableOfContents.ts" - }, "./lexical/react/LexicalTableOfContentsPlugin": { "import": "./src/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.ts", "types": "./src/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.ts", @@ -356,16 +351,16 @@ ] }, "dependencies": { - "@lexical/headless": "0.21.0", - "@lexical/html": "0.21.0", - "@lexical/link": "0.21.0", - "@lexical/list": "0.21.0", - "@lexical/mark": "0.21.0", - "@lexical/react": "0.21.0", - "@lexical/rich-text": "0.21.0", - "@lexical/selection": "0.21.0", - "@lexical/table": "0.21.0", - "@lexical/utils": "0.21.0", + "@lexical/headless": "0.27.1", + "@lexical/html": "0.27.1", + "@lexical/link": "0.27.1", + "@lexical/list": "0.27.1", + "@lexical/mark": "0.27.1", + "@lexical/react": "0.27.1", + "@lexical/rich-text": "0.27.1", + "@lexical/selection": "0.27.1", + "@lexical/table": "0.27.1", + "@lexical/utils": "0.27.1", "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", "@types/uuid": "10.0.0", @@ -374,7 +369,7 @@ "dequal": "2.0.3", "escape-html": "1.0.3", "jsox": "1.2.121", - "lexical": "0.21.0", + "lexical": "0.27.1", "mdast-util-from-markdown": "2.0.2", "mdast-util-mdx-jsx": "3.1.3", "micromark-extension-mdx-jsx": "3.0.1", @@ -389,7 +384,7 @@ "@babel/preset-env": "7.26.7", "@babel/preset-react": "7.26.3", "@babel/preset-typescript": "7.26.0", - "@lexical/eslint-plugin": "0.21.0", + "@lexical/eslint-plugin": "0.27.1", "@payloadcms/eslint-config": "workspace:*", "@types/escape-html": "1.0.4", "@types/json-schema": "7.0.15", @@ -662,11 +657,6 @@ "types": "./dist/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.d.ts", "default": "./dist/lexical-proxy/@lexical-react/LexicalTabIndentationPlugin.js" }, - "./lexical/react/LexicalTableOfContents": { - "import": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.js", - "types": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.d.ts", - "default": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContents.js" - }, "./lexical/react/LexicalTableOfContentsPlugin": { "import": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.js", "types": "./dist/lexical-proxy/@lexical-react/LexicalTableOfContentsPlugin.d.ts", diff --git a/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts b/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts index 262f0da045..394e3c1b34 100644 --- a/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts +++ b/packages/richtext-lexical/src/features/blockquote/markdownTransformer.ts @@ -1,5 +1,4 @@ import { $createQuoteNode, $isQuoteNode, QuoteNode } from '@lexical/rich-text' -import { $createLineBreakNode } from 'lexical' import type { ElementTransformer } from '../../packages/@lexical/markdown/index.js' @@ -23,10 +22,7 @@ export const MarkdownTransformer: ElementTransformer = { if (isImport) { const previousNode = parentNode.getPreviousSibling() if ($isQuoteNode(previousNode)) { - previousNode.splice(previousNode.getChildrenSize(), 0, [ - $createLineBreakNode(), - ...children, - ]) + previousNode.splice(previousNode.getChildrenSize(), 0, [...children]) previousNode.select(0, 0) parentNode.remove() return diff --git a/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx b/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx index 9f9c9bc384..37da8ec51a 100644 --- a/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx +++ b/packages/richtext-lexical/src/features/blocks/server/nodes/BlocksNode.tsx @@ -95,8 +95,8 @@ export class ServerBlockNode extends DecoratorBlockNode { return false } - override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element | null { - return null + override decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element { + return null as unknown as JSX.Element } override exportDOM(): DOMExportOutput { diff --git a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss index 5ff0539b12..804ad5ede6 100644 --- a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss +++ b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.scss @@ -3,6 +3,7 @@ @layer payload-default { .table-cell-action-button-container { position: absolute; + z-index: 3; top: 0; left: 0; will-change: transform; diff --git a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx index 93c1825962..abd094628a 100644 --- a/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx +++ b/packages/richtext-lexical/src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx @@ -1,12 +1,13 @@ 'use client' -import type { TableObserver, TableRowNode, TableSelection } from '@lexical/table' +import type { TableObserver, TableSelection } from '@lexical/table' import type { ElementNode } from 'lexical' import type { JSX } from 'react' import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext' import { useLexicalEditable } from '@lexical/react/useLexicalEditable' import { + $computeTableMapSkipCellCheck, $deleteTableColumn__EXPERIMENTAL, $deleteTableRow__EXPERIMENTAL, $getNodeTriplet, @@ -17,7 +18,6 @@ import { $insertTableColumn__EXPERIMENTAL, $insertTableRow__EXPERIMENTAL, $isTableCellNode, - $isTableRowNode, $isTableSelection, $unmergeCell, getTableElement, @@ -37,6 +37,7 @@ import { $isTextNode, COMMAND_PRIORITY_CRITICAL, getDOMSelection, + isDOMNode, SELECTION_CHANGE_COMMAND, } from 'lexical' import * as React from 'react' @@ -186,8 +187,9 @@ function TableActionMenu({ if ( dropDownRef.current != null && contextRef.current != null && - !dropDownRef.current.contains(event.target as Node) && - !contextRef.current.contains(event.target as Node) + isDOMNode(event.target) && + !dropDownRef.current.contains(event.target) && + !contextRef.current.contains(event.target) ) { setIsMenuOpen(false) } @@ -226,35 +228,105 @@ function TableActionMenu({ editor.update(() => { const selection = $getSelection() if ($isTableSelection(selection)) { - const { columns, rows } = computeSelectionCount(selection) + // Get all selected cells and compute the total area const nodes = selection.getNodes() - let firstCell: null | TableCellNode = null - for (let i = 0; i < nodes.length; i++) { - const node = nodes[i] - if ($isTableCellNode(node)) { - if (firstCell === null) { - node.setColSpan(columns).setRowSpan(rows) - firstCell = node - const isEmpty = $cellContainsEmptyParagraph(node) - let firstChild - if (isEmpty && $isParagraphNode((firstChild = node.getFirstChild()))) { - firstChild.remove() - } - } else if ($isTableCellNode(firstCell)) { - const isEmpty = $cellContainsEmptyParagraph(node) - if (!isEmpty) { - firstCell.append(...node.getChildren()) - } - node.remove() + const tableCells = nodes.filter($isTableCellNode) + + if (tableCells.length === 0) { + return + } + + // Find the table node + const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCells[0] as TableCellNode) + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) + + // Find the boundaries of the selection including merged cells + let minRow = Infinity + let maxRow = -Infinity + let minCol = Infinity + let maxCol = -Infinity + + // First pass: find the actual boundaries considering merged cells + const processedCells = new Set() + for (const row of gridMap) { + for (const mapCell of row) { + if (!mapCell || !mapCell.cell) { + continue + } + + const cellKey = mapCell.cell.getKey() + if (processedCells.has(cellKey)) { + continue + } + + if (tableCells.some((cell) => cell.is(mapCell.cell))) { + processedCells.add(cellKey) + // Get the actual position of this cell in the grid + const cellStartRow = mapCell.startRow + const cellStartCol = mapCell.startColumn + const cellRowSpan = mapCell.cell.__rowSpan || 1 + const cellColSpan = mapCell.cell.__colSpan || 1 + + // Update boundaries considering the cell's actual position and span + minRow = Math.min(minRow, cellStartRow) + maxRow = Math.max(maxRow, cellStartRow + cellRowSpan - 1) + minCol = Math.min(minCol, cellStartCol) + maxCol = Math.max(maxCol, cellStartCol + cellColSpan - 1) } } } - if (firstCell !== null) { - if (firstCell.getChildrenSize() === 0) { - firstCell.append($createParagraphNode()) - } - $selectLastDescendant(firstCell) + + // Validate boundaries + if (minRow === Infinity || minCol === Infinity) { + return } + + // The total span of the merged cell + const totalRowSpan = maxRow - minRow + 1 + const totalColSpan = maxCol - minCol + 1 + + // Use the top-left cell as the target cell + const targetCellMap = gridMap?.[minRow]?.[minCol] + if (!targetCellMap?.cell) { + return + } + const targetCell = targetCellMap.cell + + // Set the spans for the target cell + targetCell.setColSpan(totalColSpan) + targetCell.setRowSpan(totalRowSpan) + + // Move content from other cells to the target cell + const seenCells = new Set([targetCell.getKey()]) + + // Second pass: merge content and remove other cells + for (let row = minRow; row <= maxRow; row++) { + for (let col = minCol; col <= maxCol; col++) { + const mapCell = gridMap?.[row]?.[col] + if (!mapCell?.cell) { + continue + } + + const currentCell = mapCell.cell + const key = currentCell.getKey() + + if (!seenCells.has(key)) { + seenCells.add(key) + const isEmpty = $cellContainsEmptyParagraph(currentCell) + if (!isEmpty) { + targetCell.append(...currentCell.getChildren()) + } + currentCell.remove() + } + } + } + + // Ensure target cell has content + if (targetCell.getChildrenSize() === 0) { + targetCell.append($createParagraphNode()) + } + + $selectLastDescendant(targetCell) onClose() } }) @@ -269,11 +341,13 @@ function TableActionMenu({ const insertTableRowAtSelection = useCallback( (shouldInsertAfter: boolean) => { editor.update(() => { - $insertTableRow__EXPERIMENTAL(shouldInsertAfter) + for (let i = 0; i < selectionCounts.rows; i++) { + $insertTableRow__EXPERIMENTAL(shouldInsertAfter) + } onClose() }) }, - [editor, onClose], + [editor, onClose, selectionCounts.rows], ) const insertTableColumnAtSelection = useCallback( @@ -318,26 +392,25 @@ function TableActionMenu({ const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode) - const tableRows = tableNode.getChildren() + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) - if (tableRowIndex >= tableRows.length || tableRowIndex < 0) { - throw new Error('Expected table cell to be inside of table row.') - } - - const tableRow = tableRows[tableRowIndex] - - if (!$isTableRowNode(tableRow)) { - throw new Error('Expected table row') - } + const rowCells = new Set() const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW - tableRow.getChildren().forEach((tableCell) => { - if (!$isTableCellNode(tableCell)) { - throw new Error('Expected table cell') - } + if (gridMap[tableRowIndex]) { + for (let col = 0; col < gridMap[tableRowIndex].length; col++) { + const mapCell = gridMap[tableRowIndex][col] - tableCell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW) - }) + if (!mapCell?.cell) { + continue + } + + if (!rowCells.has(mapCell.cell)) { + rowCells.add(mapCell.cell) + mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW) + } + } + } clearTableSelection() onClose() @@ -350,35 +423,26 @@ function TableActionMenu({ const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode) - const tableRows = tableNode.getChildren() - const maxRowsLength = Math.max(...tableRows.map((row) => row.getChildren().length)) + const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null) - if (tableColumnIndex >= maxRowsLength || tableColumnIndex < 0) { - throw new Error('Expected table cell to be inside of table row.') - } + const columnCells = new Set() const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN - for (let r = 0; r < tableRows.length; r++) { - const tableRow = tableRows[r] + if (gridMap) { + for (let row = 0; row < gridMap.length; row++) { + const mapCell = gridMap?.[row]?.[tableColumnIndex] - if (!$isTableRowNode(tableRow)) { - throw new Error('Expected table row') + if (!mapCell?.cell) { + continue + } + + if (!columnCells.has(mapCell.cell)) { + columnCells.add(mapCell.cell) + mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN) + } } - - const tableCells = tableRow.getChildren() - if (tableColumnIndex >= tableCells.length) { - // if cell is outside of bounds for the current row (for example various merge cell cases) we shouldn't highlight it - continue - } - - const tableCell = tableCells[tableColumnIndex] - - if (!$isTableCellNode(tableCell)) { - throw new Error('Expected table cell') - } - - tableCell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN) } + clearTableSelection() onClose() }) @@ -398,6 +462,19 @@ function TableActionMenu({ }) }, [editor, tableCellNode, clearTableSelection, onClose]) + const toggleFirstColumnFreeze = useCallback(() => { + editor.update(() => { + if (tableCellNode.isAttached()) { + const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode) + if (tableNode) { + tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0) + } + } + clearTableSelection() + onClose() + }) + }, [editor, tableCellNode, clearTableSelection, onClose]) + let mergeCellButton: JSX.Element | null = null if (cellMerge) { if (canMergeCells) { @@ -449,6 +526,14 @@ function TableActionMenu({ > Toggle Row Striping +
    -

    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 (L95~cmQooL#=#dnu7`L`(G0++_-LJ{RlJ(os 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 z