From 29b70f60840bc232d2ad78342b3c466d1e96b87e Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Mon, 23 Dec 2024 14:04:00 +0800 Subject: [PATCH 01/56] Smol update to api keys notice (#31298) --- apps/studio/components/interfaces/Connect/Connect.tsx | 2 +- .../studio/components/ui/ProjectSettings/DisplayApiSettings.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/Connect/Connect.tsx b/apps/studio/components/interfaces/Connect/Connect.tsx index 9a107bf7c3c..62951d6c126 100644 --- a/apps/studio/components/interfaces/Connect/Connect.tsx +++ b/apps/studio/components/interfaces/Connect/Connect.tsx @@ -268,7 +268,7 @@ const Connect = () => { /> { )} Date: Mon, 23 Dec 2024 14:29:18 +0800 Subject: [PATCH 02/56] Support bulk deletes in auth users (#31271) * Support bulk deletes in auth users * Close overview panel if user was deleted * Add max select up to 20 users limit, and add cancel selection button --- .../interfaces/Auth/Users/InviteUserModal.tsx | 85 ++- .../interfaces/Auth/Users/Users.constants.ts | 3 + .../interfaces/Auth/Users/Users.utils.tsx | 28 +- .../Auth/Users/UsersGridComponents.tsx | 35 + .../interfaces/Auth/Users/UsersV2.tsx | 643 ++++++++++-------- apps/studio/data/auth/user-delete-mutation.ts | 13 +- 6 files changed, 487 insertions(+), 320 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx b/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx index 32b3beef3d4..59f7d064d3b 100644 --- a/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx +++ b/apps/studio/components/interfaces/Auth/Users/InviteUserModal.tsx @@ -44,52 +44,49 @@ const InviteUserModal = ({ visible, setVisible }: InviteUserModalProps) => { } return ( -
- +
- - {() => ( - <> - - } - type="email" - name="email" - placeholder="User email" - /> - + {() => ( + <> + + } + type="email" + name="email" + placeholder="User email" + /> + - - - - - )} -
-
-
+ + + + + )} + + ) } diff --git a/apps/studio/components/interfaces/Auth/Users/Users.constants.ts b/apps/studio/components/interfaces/Auth/Users/Users.constants.ts index 97b20ae76c6..6d53666ea4d 100644 --- a/apps/studio/components/interfaces/Auth/Users/Users.constants.ts +++ b/apps/studio/components/interfaces/Auth/Users/Users.constants.ts @@ -1,6 +1,9 @@ import { BASE_PATH } from 'lib/constants' import { PROVIDER_PHONE, PROVIDERS_SCHEMAS } from '../AuthProvidersFormValidation' +// [Joshen] Temporary fix as bulk delete will fire n requests since Auth + API do not have a bulk delete endpoint yet +export const MAX_BULK_DELETE = 20 + export const PROVIDER_FILTER_OPTIONS = PROVIDERS_SCHEMAS.map((provider) => ({ name: provider.title, value: diff --git a/apps/studio/components/interfaces/Auth/Users/Users.utils.tsx b/apps/studio/components/interfaces/Auth/Users/Users.utils.tsx index d0d1633454d..0e101574dd7 100644 --- a/apps/studio/components/interfaces/Auth/Users/Users.utils.tsx +++ b/apps/studio/components/interfaces/Auth/Users/Users.utils.tsx @@ -1,12 +1,12 @@ import dayjs from 'dayjs' import { UserIcon } from 'lucide-react' import { UIEvent } from 'react' -import { Column } from 'react-data-grid' +import { Column, useRowSelection } from 'react-data-grid' import { User } from 'data/auth/users-infinite-query' import { BASE_PATH } from 'lib/constants' -import { cn } from 'ui' -import { HeaderCell } from './UsersGridComponents' +import { Checkbox_Shadcn_, cn } from 'ui' +import { HeaderCell, SelectHeaderCell } from './UsersGridComponents' import { ColumnConfiguration, USERS_TABLE_COLUMNS } from './UsersV2' const SUPPORTED_CSP_AVATAR_URLS = [ @@ -262,10 +262,18 @@ export const formatUserColumns = ({ minWidth: col.minWidth ?? 120, headerCellClass: 'z-50 outline-none !shadow-none', renderHeaderCell: () => { + // [Joshen] I'm on the fence to support "Select all" for users, as the results are infinitely paginated + // "Select all" wouldn't be an accurate representation if not all the pages have been fetched, but if decide + // to support - the component is ready as such: Just pass selectedUsers and allRowsSelected as props from parent + // if (col.id === 'img') return undefined return }, renderCell: ({ row }) => { + // This is actually a valid React component, so we can use hooks here + // eslint-disable-next-line react-hooks/rules-of-hooks + const [isRowSelected, onRowSelectionChange] = useRowSelection() + const value = row?.[col.id] const user = users?.find((u) => u.id === row.id) const formattedValue = @@ -278,7 +286,19 @@ export const formatUserColumns = ({ if (col.id === 'img') { return ( -
+
+ { + e.stopPropagation() + onRowSelectionChange({ + row, + type: 'ROW', + checked: !isRowSelected, + isShiftClick: e.shiftKey, + }) + }} + />
formatUserColumns for more info +export const SelectHeaderCell = ({ + selectedUsers, + allRowsSelected, +}: { + selectedUsers: Set + allRowsSelected: boolean +}) => { + const inputRef = useRef(null) + const [isRowSelected, onRowSelectionChange] = useRowSelection() + + const isIndeterminate = selectedUsers.size > 0 && !allRowsSelected + + useEffect(() => { + if (inputRef.current) inputRef.current.indeterminate = isIndeterminate + }, [isIndeterminate]) + + return ( +
+
+ onRowSelectionChange({ type: 'HEADER', checked: e.target.checked })} + /> +
+
+ ) +} + export const HeaderCell = ({ col, setSortByValue, diff --git a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx index a2351632139..51dff52526f 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx @@ -1,7 +1,9 @@ +import { useQueryClient } from '@tanstack/react-query' import AwesomeDebouncePromise from 'awesome-debounce-promise' -import { ArrowDown, ArrowUp, Loader2, RefreshCw, Search, Users, X } from 'lucide-react' +import { ArrowDown, ArrowUp, Loader2, RefreshCw, Search, Trash, Users, X } from 'lucide-react' import { UIEvent, useEffect, useMemo, useRef, useState } from 'react' import DataGrid, { Column, DataGridHandle, Row } from 'react-data-grid' +import { toast } from 'sonner' import { useParams } from 'common' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' @@ -10,6 +12,8 @@ import AlertError from 'components/ui/AlertError' import APIDocsButton from 'components/ui/APIDocsButton' import { FilterPopover } from 'components/ui/FilterPopover' import { FormHeader } from 'components/ui/Forms/FormHeader' +import { authKeys } from 'data/auth/keys' +import { useUserDeleteMutation } from 'data/auth/user-delete-mutation' import { useUsersCountQuery } from 'data/auth/users-count-query' import { useUsersInfiniteQuery } from 'data/auth/users-infinite-query' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' @@ -36,13 +40,15 @@ import { SelectValue_Shadcn_, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import AddUserDropdown from './AddUserDropdown' import { UserPanel } from './UserPanel' -import { PROVIDER_FILTER_OPTIONS } from './Users.constants' +import { MAX_BULK_DELETE, PROVIDER_FILTER_OPTIONS } from './Users.constants' import { formatUserColumns, formatUsersData, isAtBottom } from './Users.utils' +import { ButtonTooltip } from 'components/ui/ButtonTooltip' -type Filter = 'all' | 'verified' | 'unverified' | 'anonymous' +export type Filter = 'all' | 'verified' | 'unverified' | 'anonymous' export type UsersTableColumn = { id: string name: string @@ -52,7 +58,7 @@ export type UsersTableColumn = { } export type ColumnConfiguration = { id: string; width?: number } export const USERS_TABLE_COLUMNS: UsersTableColumn[] = [ - { id: 'img', name: '', minWidth: 65, width: 65, resizable: false }, + { id: 'img', name: '', minWidth: 95, width: 95, resizable: false }, { id: 'id', name: 'UID', width: 280 }, { id: 'name', name: 'Display name', minWidth: 0, width: 150 }, { id: 'email', name: 'Email', width: 300 }, @@ -66,6 +72,7 @@ export const USERS_TABLE_COLUMNS: UsersTableColumn[] = [ // [Joshen] Just naming it as V2 as its a rewrite of the old one, to make it easier for reviews // Can change it to remove V2 thereafter export const UsersV2 = () => { + const queryClient = useQueryClient() const { ref: projectRef } = useParams() const { project } = useProjectContext() const gridRef = useRef(null) @@ -75,10 +82,13 @@ export const UsersV2 = () => { const [search, setSearch] = useState('') const [filter, setFilter] = useState('all') const [filterKeywords, setFilterKeywords] = useState('') + const [selectedUsers, setSelectedUsers] = useState>(new Set([])) const [selectedColumns, setSelectedColumns] = useState([]) const [selectedProviders, setSelectedProviders] = useState([]) - const [selectedRow, setSelectedRow] = useState() + const [selectedUser, setSelectedUser] = useState() const [sortByValue, setSortByValue] = useState('created_at:desc') + const [showDeleteModal, setShowDeleteModal] = useState(false) + const [isDeletingUsers, setIsDeletingUsers] = useState(false) const [ columnConfiguration, setColumnConfiguration, @@ -123,8 +133,12 @@ export const UsersV2 = () => { providers: selectedProviders, }) + const { mutateAsync: deleteUser } = useUserDeleteMutation() + const totalUsers = countData ?? 0 const users = useMemo(() => data?.pages.flatMap((page) => page.result) ?? [], [data?.pages]) + // [Joshen] Only relevant for when selecting one user only + const selectedUserToDelete = users.find((u) => u.id === [...selectedUsers][0]) const handleScroll = (event: UIEvent) => { if (isLoading || !isAtBottom(event)) return @@ -169,6 +183,33 @@ export const UsersV2 = () => { 500 ) + const handleDeleteUsers = async () => { + if (!projectRef) return console.error('Project ref is required') + const userIds = [...selectedUsers] + + setIsDeletingUsers(true) + try { + await Promise.all( + userIds.map((id) => deleteUser({ projectRef, userId: id, skipInvalidation: true })) + ) + // [Joshen] Skip invalidation within RQ to prevent multiple requests, then invalidate once at the end + await Promise.all([ + queryClient.invalidateQueries(authKeys.usersInfinite(projectRef)), + queryClient.invalidateQueries(authKeys.usersCount(projectRef)), + ]) + toast.success( + `Successfully deleted the selected ${selectedUsers.size} user${selectedUsers.size > 1 ? 's' : ''}` + ) + setShowDeleteModal(false) + setSelectedUsers(new Set([])) + + if (userIds.includes(selectedUser)) setSelectedUser(undefined) + } catch (error: any) { + toast.error(`Failed to delete selected users: ${error.message}`) + setIsDeletingUsers(false) + } + } + useEffect(() => { if ( !isRefetching && @@ -187,278 +228,346 @@ export const UsersV2 = () => { } } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isSuccess, isRefetching, isSuccessStorage, isErrorStorage, errorStorage, users]) + }, [ + isSuccess, + isRefetching, + isSuccessStorage, + isErrorStorage, + errorStorage, + users, + selectedUsers, + ]) return ( -
- -
-
- } - placeholder="Search email, phone or UID" - value={search} - onChange={(e) => setSearch(e.target.value)} - onKeyDown={(e) => { - if (e.code === 'Enter') { - setSearch(search.trim()) - setFilterKeywords(search.trim().toLocaleLowerCase()) - } - }} - actions={[ - search && ( + <> +
+ +
+ {selectedUsers.size > 0 ? ( +
+ + } + className="px-1.5" + onClick={() => setSelectedUsers(new Set([]))} + tooltip={{ content: { side: 'bottom', text: 'Cancel selection' } }} + /> +
+ ) : ( + <> +
+ } + placeholder="Search email, phone or UID" + value={search} + onChange={(e) => setSearch(e.target.value)} + onKeyDown={(e) => { + if (e.code === 'Enter') { + setSearch(search.trim()) + setFilterKeywords(search.trim().toLocaleLowerCase()) + } + }} + actions={[ + search && ( + + + + + + Sort by created at + + + Ascending + + + Descending + + + + + Sort by last sign in at + + + Ascending + + + Descending + + + + + Sort by email + + Ascending + + Descending + + + + + Sort by phone + + Ascending + + Descending + + + + + + +
+ +
+ {isNewAPIDocsEnabled && } - - - - - Sort by created at - - Ascending - - Descending - - - - - Sort by last sign in at - - - Ascending - - - Descending - - - - - Sort by email - - Ascending - Descending - - - - Sort by phone - - Ascending - Descending - - - - - + icon={} + type="default" + loading={isRefetching && !isFetchingNextPage} + onClick={() => refetch()} + > + Refresh + + +
+ + )}
+ + + +
+ { + const isSelected = row.id === selectedUser + return [ + `${isSelected ? 'bg-surface-300 dark:bg-surface-300' : 'bg-200'} cursor-pointer`, + '[&>.rdg-cell]:border-box [&>.rdg-cell]:outline-none [&>.rdg-cell]:shadow-none', + '[&>.rdg-cell:first-child>div]:ml-4', + ].join(' ') + }} + rowKeyGetter={(row) => row.id} + selectedRows={selectedUsers} + onScroll={handleScroll} + onSelectedRowsChange={(rows) => { + if (rows.size > MAX_BULK_DELETE) { + toast(`Only up to ${MAX_BULK_DELETE} users can be selected at a time`) + } else setSelectedUsers(rows) + }} + onColumnResize={(idx, width) => saveColumnConfiguration('resize', { idx, width })} + onColumnsReorder={(source, target) => { + const sourceIdx = columns.findIndex((col) => col.key === source) + const targetIdx = columns.findIndex((col) => col.key === target) -
- {isNewAPIDocsEnabled && } - - -
-
- - - -
- { - const isSelected = idx === selectedRow - return [ - `${isSelected ? 'bg-surface-300 dark:bg-surface-300' : 'bg-200'} cursor-pointer`, - '[&>.rdg-cell]:border-box [&>.rdg-cell]:outline-none [&>.rdg-cell]:shadow-none', - '[&>.rdg-cell:first-child>div]:ml-4', - ].join(' ') - }} - onScroll={handleScroll} - onColumnResize={(idx, width) => saveColumnConfiguration('resize', { idx, width })} - onColumnsReorder={(source, target) => { - const sourceIdx = columns.findIndex((col) => col.key === source) - const targetIdx = columns.findIndex((col) => col.key === target) + const updatedColumns = swapColumns(columns, sourceIdx, targetIdx) + setColumns(updatedColumns) - const updatedColumns = swapColumns(columns, sourceIdx, targetIdx) - setColumns(updatedColumns) - - saveColumnConfiguration('reorder', { columns: updatedColumns }) - }} - renderers={{ - renderRow(idx, props) { - return ( - { - if (typeof idx === 'number' && idx >= 0) { - setSelectedRow(idx) - gridRef.current?.scrollToCell({ idx: 0, rowIdx: idx }) - } - }} - /> - ) - }, - noRowsFallback: isLoading ? ( -
- -
- ) : isError ? ( -
- -
- ) : ( -
- -
-

- {filter !== 'all' || filterKeywords.length > 0 - ? 'No users found' - : 'No users in your project'} -

-

- {filter !== 'all' || filterKeywords.length > 0 - ? 'There are currently no users based on the filters applied' - : 'There are currently no users who signed up to your project'} -

+ saveColumnConfiguration('reorder', { columns: updatedColumns }) + }} + renderers={{ + renderRow(id, props) { + return ( + { + const idx = users.indexOf(users.find((u) => u.id === id) ?? {}) + if (props.row.id) { + setSelectedUser(props.row.id) + gridRef.current?.scrollToCell({ idx: 0, rowIdx: idx }) + } + }} + /> + ) + }, + noRowsFallback: isLoading ? ( +
+
-
- ), - }} + ) : isError ? ( +
+ +
+ ) : ( +
+ +
+

+ {filter !== 'all' || filterKeywords.length > 0 + ? 'No users found' + : 'No users in your project'} +

+

+ {filter !== 'all' || filterKeywords.length > 0 + ? 'There are currently no users based on the filters applied' + : 'There are currently no users who signed up to your project'} +

+
+
+ ), + }} + /> +
+ + {selectedUser !== undefined && ( + u.id === selectedUser)} + onClose={() => setSelectedUser(undefined)} /> -
-
- {selectedRow !== undefined && ( - setSelectedRow(undefined)} - /> - )} -
+ )} +
-
- {isLoading || isRefetching ? 'Loading users...' : `Total: ${totalUsers} users`} - {(isLoading || isRefetching || isFetchingNextPage) && ( - - Loading... - - )} +
+ {isLoading || isRefetching ? 'Loading users...' : `Total: ${totalUsers} users`} + {(isLoading || isRefetching || isFetchingNextPage) && ( + + Loading... + + )} +
-
+ + 1 ? 's' : ''}`} + loading={isDeletingUsers} + confirmLabel="Delete" + onCancel={() => setShowDeleteModal(false)} + onConfirm={() => handleDeleteUsers()} + alert={{ + title: `Deleting ${selectedUsers.size === 1 ? 'a user' : 'users'} is irreversible`, + description: `This will remove the selected ${selectedUsers.size === 1 ? '' : `${selectedUsers.size} `}user${selectedUsers.size > 1 ? 's' : ''} from the project and all associated data.`, + }} + > +

+ This is permanent! Are you sure you want to delete the{' '} + {selectedUsers.size === 1 ? '' : `selected ${selectedUsers.size} `}user + {selectedUsers.size > 1 ? 's' : ''} + {selectedUsers.size === 1 ? ( + + {' '} + {selectedUserToDelete?.email ?? selectedUserToDelete?.phone ?? 'this user'} + + ) : null} + ? +

+
+ ) } diff --git a/apps/studio/data/auth/user-delete-mutation.ts b/apps/studio/data/auth/user-delete-mutation.ts index 5148f59147d..819235982d6 100644 --- a/apps/studio/data/auth/user-delete-mutation.ts +++ b/apps/studio/data/auth/user-delete-mutation.ts @@ -8,6 +8,7 @@ import { authKeys } from './keys' export type UserDeleteVariables = { projectRef: string userId: string + skipInvalidation?: boolean } export async function deleteUser({ projectRef, userId }: UserDeleteVariables) { @@ -34,12 +35,14 @@ export const useUserDeleteMutation = ({ (vars) => deleteUser(vars), { async onSuccess(data, variables, context) { - const { projectRef } = variables + const { projectRef, skipInvalidation = false } = variables - await Promise.all([ - queryClient.invalidateQueries(authKeys.usersInfinite(projectRef)), - queryClient.invalidateQueries(authKeys.usersCount(projectRef)), - ]) + if (!skipInvalidation) { + await Promise.all([ + queryClient.invalidateQueries(authKeys.usersInfinite(projectRef)), + queryClient.invalidateQueries(authKeys.usersCount(projectRef)), + ]) + } await onSuccess?.(data, variables, context) }, From 80bdd361c107fff763bccde2b74493ec7091af92 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Mon, 23 Dec 2024 20:11:51 +0800 Subject: [PATCH 03/56] Fix API docs introction (#31306) --- .../interfaces/Docs/Authentication.tsx | 4 +-- .../interfaces/Docs/Introduction.tsx | 29 ++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/apps/studio/components/interfaces/Docs/Authentication.tsx b/apps/studio/components/interfaces/Docs/Authentication.tsx index 418e8f8025e..f6d24271122 100644 --- a/apps/studio/components/interfaces/Docs/Authentication.tsx +++ b/apps/studio/components/interfaces/Docs/Authentication.tsx @@ -48,7 +48,7 @@ const Authentication = ({ selectedLang, showApiKey }: AuthenticationProps) => {

Client API Keys

-
+

Client keys allow "anonymous access" to your database, until the user has logged in. @@ -79,7 +79,7 @@ const Authentication = ({ selectedLang, showApiKey }: AuthenticationProps) => {

Service Keys

-
+

Service keys have FULL access to your data, bypassing any security policies. Be VERY diff --git a/apps/studio/components/interfaces/Docs/Introduction.tsx b/apps/studio/components/interfaces/Docs/Introduction.tsx index e102f008de5..ae8dd1b4f9d 100644 --- a/apps/studio/components/interfaces/Docs/Introduction.tsx +++ b/apps/studio/components/interfaces/Docs/Introduction.tsx @@ -2,6 +2,7 @@ import { useParams } from 'common' import Snippets from 'components/interfaces/Docs/Snippets' import { useProjectPostgrestConfigQuery } from 'data/config/project-postgrest-config-query' +import { InlineLink } from 'components/ui/InlineLink' import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' import CodeSnippet from './CodeSnippet' import PublicSchemaNotEnabledAlert from './PublicSchemaNotEnabledAlert' @@ -26,12 +27,26 @@ export default function Introduction({ selectedLang }: Props) { .includes('public') return ( -

-
- - - {!isPublicSchemaEnabled && } -
-
+ <> +

Connect to your project

+
+
+

+ All projects have a RESTful endpoint that you can use with your project's API key to + query and manage your database. These can be obtained from the{' '} + API settings. +

+

+ You can initialize a new Supabase client using the createClient() method. + The Supabase client is your entrypoint to the rest of the Supabase functionality and is + the easiest way to interact with everything we offer within the Supabase ecosystem. +

+
+
+ + {!isPublicSchemaEnabled && } +
+
+ ) } From 1ac639845ca7ce5fee4e5765b8bbf31940917e98 Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:44:15 +0000 Subject: [PATCH 04/56] deprecated: alert - delete payment method modal (#31007) switch to admonition --- .../PaymentMethods/DeletePaymentMethodModal.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/DeletePaymentMethodModal.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/DeletePaymentMethodModal.tsx index 62b27c9d2a2..e05ff07ce4b 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/DeletePaymentMethodModal.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/PaymentMethods/DeletePaymentMethodModal.tsx @@ -1,9 +1,10 @@ import { useParams } from 'common' import { toast } from 'sonner' -import { Alert, Button, Modal } from 'ui' +import { Button, Modal } from 'ui' import { useOrganizationPaymentMethodDeleteMutation } from 'data/organizations/organization-payment-method-delete-mutation' import type { OrganizationPaymentMethod } from 'data/organizations/organization-payment-methods-query' +import { Admonition } from 'ui-patterns' export interface DeletePaymentMethodModalProps { selectedPaymentMethod?: OrganizationPaymentMethod @@ -55,9 +56,11 @@ const DeletePaymentMethodModal = ({ } > - -

You can re-add the payment method any time.

-
+
) From ef6832b147ad6569bd0c4a3913ef69d725c9bfe9 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 23 Dec 2024 09:30:12 -0500 Subject: [PATCH 05/56] fix - logout in nextJS bootstrap auth example (#30629) The createClient call in AuthButton.tsx for the logout was missing the await to prevent errors when logging out. From ae38375b6bf0e129a2e88afa5fccd472a3b1f243 Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:32:43 +0000 Subject: [PATCH 06/56] deprecated: alert - encryption-keys-management (#30726) * changed to use shadcn alert * switched to admonition --- .../Vault/Keys/EncryptionKeysManagement.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/studio/components/interfaces/Integrations/Vault/Keys/EncryptionKeysManagement.tsx b/apps/studio/components/interfaces/Integrations/Vault/Keys/EncryptionKeysManagement.tsx index 5d427bcac86..4e65964934c 100644 --- a/apps/studio/components/interfaces/Integrations/Vault/Keys/EncryptionKeysManagement.tsx +++ b/apps/studio/components/interfaces/Integrations/Vault/Keys/EncryptionKeysManagement.tsx @@ -14,7 +14,8 @@ import { usePgSodiumKeyDeleteMutation } from 'data/pg-sodium-keys/pg-sodium-key- import { usePgSodiumKeysQuery } from 'data/pg-sodium-keys/pg-sodium-keys-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { Key, Loader, Search, Trash, X } from 'lucide-react' -import { Alert, Button, Form, Input, Listbox, Modal, Separator } from 'ui' +import { Button, Form, Input, Listbox, Modal, Separator } from 'ui' +import { Admonition } from 'ui-patterns' const DEFAULT_KEY_NAME = 'No description provided' @@ -256,13 +257,12 @@ export const EncryptionKeysManagement = () => { header="Confirm to delete key" > - - Do ensure that the key is not currently in use to prevent any issues. - +

The following key will be permanently removed and cannot be recovered.

From 0cbc3d01343e8ff67d1ef33dca2d27c5484006ec Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Mon, 23 Dec 2024 16:45:40 +0000 Subject: [PATCH 07/56] deprecated: alert - migrations (#30725) * changed to use shadcn alert * switch to admonition * deleted unused imports --- .../Database/Migrations/Migrations.tsx | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx index 3119bada864..7a3285b3045 100644 --- a/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx +++ b/apps/studio/components/interfaces/Database/Migrations/Migrations.tsx @@ -7,9 +7,10 @@ import Table from 'components/to-be-cleaned/Table' import CodeEditor from 'components/ui/CodeEditor/CodeEditor' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { DatabaseMigration, useMigrationsQuery } from 'data/database/migrations-query' -import { Alert, Button, Input, SidePanel } from 'ui' +import { Button, Input, SidePanel } from 'ui' import MigrationsEmptyState from './MigrationsEmptyState' import { Search } from 'lucide-react' +import { Admonition } from 'ui-patterns' const Migrations = () => { const [search, setSearch] = useState('') @@ -39,26 +40,27 @@ const Migrations = () => {
{isError && ( - - - Contact support - - , - ]} + description={ + <> +

+ Try refreshing your browser, but if the issue persists, please reach out to us via + support. +

+

Error: {(error as any)?.message ?? 'Unknown'}

+ + } > -

- Try refreshing your browser, but if the issue persists, please reach out to us via - support. -

-

Error: {(error as any)?.message ?? 'Unknown'}

-
+ + )} {isSuccess && (
From 61ed78e61eec1a929cc6836069e93ffcb6028cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20Caba=C3=A7o?= Date: Mon, 23 Dec 2024 16:57:15 +0000 Subject: [PATCH 08/56] realtime: Fix broken link (#31310) --- apps/docs/content/guides/realtime/broadcast.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/content/guides/realtime/broadcast.mdx b/apps/docs/content/guides/realtime/broadcast.mdx index 6fa1482f7df..09291a4e6ea 100644 --- a/apps/docs/content/guides/realtime/broadcast.mdx +++ b/apps/docs/content/guides/realtime/broadcast.mdx @@ -652,7 +652,7 @@ Broadcast Changes allows you to trigger messages from your database. To achieve It uses partitioned tables per day which allows the deletion your previous images in a performant way by dropping the physical tables of this partitioned table. Tables older than 3 days old are deleted. -Broadcasting from the database works like a client-side broadcast, using WebSockets to send JSON packages. [Realtime Authorization]/docs/guides/realtime/authorization) is required and enabled by default to protect your data. +Broadcasting from the database works like a client-side broadcast, using WebSockets to send JSON packages. [Realtime Authorization](/docs/guides/realtime/authorization) is required and enabled by default to protect your data. The database broadcast feature provides two functions to help you send messages: From 9c31325d0fc6e8b94903682deeeb318c77f26214 Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Mon, 23 Dec 2024 16:57:25 +0000 Subject: [PATCH 09/56] deprecated: alert - provider form (#30532) * provider form alert switch * changed to admonition --- .../Auth/AuthProvidersForm/ProviderForm.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx index dd66b17e3be..0d35ca6f79a 100644 --- a/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx +++ b/apps/studio/components/interfaces/Auth/AuthProvidersForm/ProviderForm.tsx @@ -15,7 +15,6 @@ import { useCustomDomainsQuery } from 'data/custom-domains/custom-domains-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { BASE_PATH } from 'lib/constants' import { - Alert, Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, @@ -29,6 +28,7 @@ import { ProviderCollapsibleClasses } from './AuthProvidersForm.constants' import type { Provider } from './AuthProvidersForm.types' import FormField from './FormField' import { Markdown } from 'components/interfaces/Markdown' +import { Admonition } from 'ui-patterns' export interface ProviderFormProps { config: components['schemas']['GoTrueConfigResponse'] @@ -264,9 +264,15 @@ const ProviderForm = ({ config, provider }: ProviderFormProps) => { ))} {provider?.misc?.alert && ( - - {provider.misc.alert.description} - + + {provider.misc.alert.description} + + } + /> )} {provider.misc.requiresRedirect && ( From a8d3479f175ba2b815a6c9fdb064e9bcda3a1f84 Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Mon, 23 Dec 2024 17:11:08 +0000 Subject: [PATCH 10/56] deprecated: alert - new access token (#30531) * switch to shadcn alert * removed Alert import * changed to admonition --- .../Account/NewAccessTokenButton.tsx | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx index e82b691d082..a9e90325b41 100644 --- a/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx +++ b/apps/studio/components/interfaces/Account/NewAccessTokenButton.tsx @@ -4,7 +4,6 @@ import { useState } from 'react' import { useAccessTokenCreateMutation } from 'data/access-tokens/access-tokens-create-mutation' import { - Alert, Button, DialogFooter, DropdownMenu, @@ -15,6 +14,7 @@ import { Input, Modal, } from 'ui' +import { Admonition } from 'ui-patterns' export interface NewAccessTokenButtonProps { onCreateToken: (token: any) => void @@ -105,27 +105,30 @@ const NewAccessTokenButton = ({ onCreateToken }: NewAccessTokenButtonProps) => { <> {tokenScope === 'V0' && ( - -

- These include deleting organizations and projects which cannot be undone. As - such, be very careful when using this API. -

-
- -
-
+ +

+ These include deleting organizations and projects which cannot be undone. + As such, be very careful when using this API. +

+
+ +
+ + } + />
)} From 4e5d4b2cbb13f7dda021d1b1bcd3920cbeabf52c Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 24 Dec 2024 10:31:28 +0800 Subject: [PATCH 11/56] Add last and next run in CronJobCard (#31305) * Add last and next run in CronJobCard * Remove unnecessary query * Refactor * Remove unused file * Refactor --- .../Integrations/CronJobs/CronJobCard.tsx | 82 +++++++++++++++---- .../Integrations/CronJobs/CronJobs.utils.ts | 40 +++++++++ .../database-cron-jobs-run-query.ts | 53 ++++++++++++ apps/studio/data/database-cron-jobs/keys.ts | 7 ++ 4 files changed, 166 insertions(+), 16 deletions(-) create mode 100644 apps/studio/data/database-cron-jobs/database-cron-jobs-run-query.ts diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx index 02539377fcd..a1c980eb923 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx @@ -1,4 +1,4 @@ -import { toString as CronToString } from 'cronstrue' +import dayjs from 'dayjs' import { Clock, History, Loader2, MoreVertical } from 'lucide-react' import Link from 'next/link' import { useState } from 'react' @@ -7,21 +7,26 @@ import { useParams } from 'common' import { SQLCodeBlock } from 'components/interfaces/Auth/ThirdPartyAuthForm/SqlCodeBlock' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-query' +import { useCronJobRunQuery } from 'data/database-cron-jobs/database-cron-jobs-run-query' import { useDatabaseCronJobToggleMutation } from 'data/database-cron-jobs/database-cron-jobs-toggle-mutation' import { useSendEventMutation } from 'data/telemetry/send-event-mutation' import { TelemetryActions } from 'lib/constants/telemetry' import { + Badge, Button, + cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, - Input, Label_Shadcn_, Switch, } from 'ui' +import { TimestampInfo } from 'ui-patterns' +import { Input } from 'ui-patterns/DataInputs/Input' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' +import { convertCronToString, getNextRun } from './CronJobs.utils' interface CronJobCardProps { job: CronJob @@ -35,17 +40,18 @@ export const CronJobCard = ({ job, onEditCronJob, onDeleteCronJob }: CronJobCard const [toggleConfirmationModalShown, showToggleConfirmationModal] = useState(false) + const { data } = useCronJobRunQuery({ + projectRef: ref, + connectionString: selectedProject?.connectionString, + jobId: job.jobid, + }) + const lastRun = data?.start_time ? dayjs(data.start_time).valueOf() : undefined + const nextRun = getNextRun(job.schedule, data?.start_time) + const schedule = convertCronToString(job.schedule) + const { mutate: sendEvent } = useSendEventMutation() const { mutate: toggleDatabaseCronJob, isLoading } = useDatabaseCronJobToggleMutation() - // pg_cron can also use "30 seconds" format for schedule. Cronstrue doesn't understand that format so just use the - // original schedule when cronstrue throws - let schedule = job.schedule - try { - const scheduleString = CronToString(job.schedule) - schedule = scheduleString - } catch {} - return ( <>
@@ -120,12 +126,56 @@ export const CronJobCard = ({ job, onEditCronJob, onDeleteCronJob }: CronJobCard
Schedule
- + +
+
+
+ Last run +
+
+ {lastRun ? ( + <> + + {data?.status && ( + + {data.status} + + )} + + ) : ( + 'Job has not been run yet' + )} +
+
+
+
+ Next run +
+
+ {nextRun ? ( + + ) : ( + 'Unable to parse next run for job' + )} +
diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts index 07210781d20..41fe71637d2 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts @@ -1,4 +1,6 @@ +import parser from 'cron-parser' import { toString as CronToString } from 'cronstrue' +import dayjs from 'dayjs' import { CronJobType } from './CreateCronJobSheet' import { HTTPHeader } from './CronJobs.constants' @@ -190,3 +192,41 @@ export const formatScheduleString = (value: string) => { return '' } } + +export const convertCronToString = (schedule: string) => { + // pg_cron can also use "30 seconds" format for schedule. Cronstrue doesn't understand that format so just use the + // original schedule when cronstrue throws + try { + return CronToString(schedule) + } catch (error) { + return schedule + } +} + +export const getNextRun = (schedule: string, lastRun?: string) => { + // cron-parser can only deal with the traditional cron syntax but technically users can also + // use strings like "30 seconds" now, For the latter case, we try our best to parse the next run + // (can't guarantee as scope is quite big) + if (schedule.includes('*')) { + try { + const interval = parser.parseExpression(schedule) + return interval.next().getTime() + } catch (error) { + return undefined + } + } else { + // [Joshen] Only going to attempt to parse if the schedule is as simple as "n seconds", "n minutes", or "n days" + // Returned undefined otherwise - we can revisit this perhaps if we get feedback about this + const [value, unit] = schedule.split(' ') + if ( + ['seconds', 'minutes', 'days'].includes(unit) && + !Number.isNaN(Number(value)) && + lastRun !== undefined + ) { + const parsedLastRun = dayjs(lastRun).add(Number(value), unit as dayjs.ManipulateType) + return parsedLastRun.valueOf() + } else { + return undefined + } + } +} diff --git a/apps/studio/data/database-cron-jobs/database-cron-jobs-run-query.ts b/apps/studio/data/database-cron-jobs/database-cron-jobs-run-query.ts new file mode 100644 index 00000000000..aaa92df92e2 --- /dev/null +++ b/apps/studio/data/database-cron-jobs/database-cron-jobs-run-query.ts @@ -0,0 +1,53 @@ +import { useQuery, UseQueryOptions } from '@tanstack/react-query' + +import { executeSql } from 'data/sql/execute-sql-query' +import { ResponseError } from 'types' +import { CronJobRun } from './database-cron-jobs-runs-infinite-query' +import { databaseCronJobsKeys } from './keys' + +export type DatabaseCronJobRunVariables = { + projectRef?: string + connectionString?: string + jobId: number +} + +export async function getDatabaseCronJobRun({ + projectRef, + connectionString, + jobId, +}: DatabaseCronJobRunVariables) { + if (!projectRef) throw new Error('Project ref is required') + + const query = ` + SELECT * FROM cron.job_run_details + WHERE jobid = '${jobId}' + ORDER BY start_time DESC + LIMIT 1` + + const { result } = await executeSql({ + projectRef, + connectionString, + sql: query, + }) + + return result[0] +} + +export type DatabaseCronJobRunData = CronJobRun +export type DatabaseCronJobRunError = ResponseError + +export const useCronJobRunQuery = ( + { projectRef, connectionString, jobId }: DatabaseCronJobRunVariables, + { + enabled = true, + ...options + }: UseQueryOptions = {} +) => + useQuery( + databaseCronJobsKeys.run(projectRef, jobId), + () => getDatabaseCronJobRun({ projectRef, connectionString, jobId }), + { + enabled: enabled && typeof projectRef !== 'undefined', + ...options, + } + ) diff --git a/apps/studio/data/database-cron-jobs/keys.ts b/apps/studio/data/database-cron-jobs/keys.ts index f132226a3d8..60f75b20a65 100644 --- a/apps/studio/data/database-cron-jobs/keys.ts +++ b/apps/studio/data/database-cron-jobs/keys.ts @@ -3,6 +3,13 @@ export const databaseCronJobsKeys = { delete: () => ['cron-jobs', 'delete'] as const, alter: () => ['cronjobs', 'alter'] as const, list: (projectRef: string | undefined) => ['projects', projectRef, 'cron-jobs'] as const, + run: (projectRef: string | undefined, jobId: number) => [ + 'projects', + projectRef, + 'cron-jobs', + jobId, + 'run', + ], runsInfinite: (projectRef: string | undefined, jobId: number, options?: object) => [ 'projects', projectRef, From 9e9cfd5fe55526b7d794a687004c411c80379e04 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 24 Dec 2024 10:58:33 +0800 Subject: [PATCH 12/56] Allow dots in project name (#31262) --- apps/studio/pages/new/[slug].tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/apps/studio/pages/new/[slug].tsx b/apps/studio/pages/new/[slug].tsx index 1d9d736d17a..31e6a141987 100644 --- a/apps/studio/pages/new/[slug].tsx +++ b/apps/studio/pages/new/[slug].tsx @@ -461,13 +461,7 @@ const Wizard: NextPageWithLayout = () => { render={({ field }) => ( - { - field.onChange(event.target.value.replace(/\./g, '')) - }} - /> + )} From 6f1ccc5d214550c525ffd45b574d62b3fdbbf8ac Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Tue, 24 Dec 2024 21:46:14 +0800 Subject: [PATCH 13/56] Chore/edge functions fixes (#31317) * Add clear search CTA for logs input * Fix searching in pg cron logs + unselect selected log when search input changes * Fix updating search to clear selected row * Fix alignment of function name * Fix spacing for LogsPreviewer used in functions * Reorder edge functions nav + clean up --- .../EdgeFunctionDetails.tsx | 2 +- .../Functions/EdgeFunctionsListItem.tsx | 2 +- .../interfaces/Functions/FunctionsNav.tsx | 9 ++-- .../interfaces/Settings/Logs/LogTable.tsx | 53 ++++++++++--------- .../Settings/Logs/Logs.constants.ts | 3 ++ .../Settings/Logs/LogsPreviewer.tsx | 4 ++ .../Settings/Logs/PreviewFilterPanel.tsx | 51 ++++++++++++++---- .../FunctionsLayout/FunctionsLayout.tsx | 8 +-- .../[ref]/functions/[functionSlug]/index.tsx | 2 +- .../functions/[functionSlug]/invocations.tsx | 2 + .../[ref]/functions/[functionSlug]/logs.tsx | 2 + .../pages/project/[ref]/functions/index.tsx | 18 +------ 12 files changed, 94 insertions(+), 62 deletions(-) diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx index 483a1fa9a84..aa42058a0a5 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionDetails/EdgeFunctionDetails.tsx @@ -101,7 +101,7 @@ const EdgeFunctionDetails = () => { return ( <> -
+
{({ handleReset, values, initialValues, resetForm }: any) => { const hasChanges = JSON.stringify(values) !== JSON.stringify(initialValues) diff --git a/apps/studio/components/interfaces/Functions/EdgeFunctionsListItem.tsx b/apps/studio/components/interfaces/Functions/EdgeFunctionsListItem.tsx index 428d29b3372..269f0183ea0 100644 --- a/apps/studio/components/interfaces/Functions/EdgeFunctionsListItem.tsx +++ b/apps/studio/components/interfaces/Functions/EdgeFunctionsListItem.tsx @@ -36,7 +36,7 @@ const EdgeFunctionsListItem = ({ function: item }: EdgeFunctionsListItemProps) = { - router.push(`/project/${ref}/functions/${item.slug}/details`) + router.push(`/project/${ref}/functions/${item.slug}`) }} > diff --git a/apps/studio/components/interfaces/Functions/FunctionsNav.tsx b/apps/studio/components/interfaces/Functions/FunctionsNav.tsx index 47b6d4f734d..fe37ab1afca 100644 --- a/apps/studio/components/interfaces/Functions/FunctionsNav.tsx +++ b/apps/studio/components/interfaces/Functions/FunctionsNav.tsx @@ -11,17 +11,18 @@ const FunctionsNav = ({ item }: any) => { defaultActiveId="1" type="underlined" size="medium" - activeId={!activeRoute ? 'metrics' : activeRoute} + baseClassNames="!space-y-0" + activeId={!activeRoute ? 'overview' : activeRoute} onChange={(e: string) => { if (item?.slug) { - router.push(`/project/${ref}/functions/${item.slug}/${e === 'metrics' ? '' : e}`) + router.push(`/project/${ref}/functions/${item.slug}/${e === 'overview' ? '' : e}`) } }} > - - + + ) } diff --git a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx index f83f79c0f8d..91cc4ff5233 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx @@ -92,15 +92,10 @@ const LogTable = ({ const { profile } = useProfile() const { show: showContextMenu } = useContextMenu() + const downloadCsvRef = useRef(null) const [cellPosition, setCellPosition] = useState() - const [selectionOpen, setSelectionOpen] = useState(false) - - useEffect(() => { - if (selectedLog || isSelectedLogLoading) { - setSelectionOpen(true) - } - }, [selectedLog, isSelectedLogLoading]) + const [selectedRow, setSelectedRow] = useState(null) const canCreateLogQuery = useCheckPermissions(PermissionAction.CREATE, 'user_content', { resource: { type: 'log_sql', owner_id: profile?.id }, @@ -148,6 +143,7 @@ const LogTable = ({ }) let columns = DEFAULT_COLUMNS + if (!queryType) { columns } else { @@ -235,21 +231,10 @@ const LogTable = ({ } } - const copyResultsToClipboard = () => { - copyToClipboard(stringData, () => { - toast.success('Results copied to clipboard') - }) - } - - const downloadCsvRef = useRef(null) - function downloadCSV() { - downloadCsvRef.current?.click() - } - const LogsExplorerTableHeader = () => (
- + { + downloadCsvRef.current?.click() + }} + className="space-x-2" + >
Download CSV
- + { + copyToClipboard(stringData, () => { + toast.success('Results copied to clipboard') + }) + }} + className="space-x-2" + >
Copy to clipboard
@@ -352,14 +349,22 @@ const LogTable = ({ else return } - const [selectedRow, setSelectedRow] = useState(null) - function onRowClick(row: LogData) { setSelectedRow(row) onSelectedLogChange?.(row) } + useEffect(() => { + if (selectedLog || isSelectedLogLoading) { + setSelectionOpen(true) + } + if (!isSelectedLogLoading && !selectedLog) { + setSelectedRow(null) + } + }, [selectedLog, isSelectedLogLoading]) + if (!data) return null + return (
{!queryType && } @@ -369,7 +374,7 @@ const LogTable = ({ `m.project like '${value}%'`, }, + pg_cron_logs: { + ..._SQL_FILTER_COMMON, + }, } export enum LogsTableName { diff --git a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx index ee03bbd0c93..8af8a9c74c3 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogsPreviewer.tsx @@ -39,6 +39,7 @@ interface LogsPreviewerProps { condensedLayout?: boolean tableName?: LogsTableName EmptyState?: React.ReactNode + filterPanelClassName?: string } export const LogsPreviewer = ({ projectRef, @@ -48,6 +49,7 @@ export const LogsPreviewer = ({ tableName, children, EmptyState, + filterPanelClassName, }: PropsWithChildren) => { const router = useRouter() const { s, ite, its, db } = useParams() @@ -150,6 +152,7 @@ export const LogsPreviewer = ({ } const handleSearch: LogSearchCallback = async (event, { query, to, from }) => { if (event === 'search-input-change') { + setSelectedLogId(null) setFilters((prev) => ({ ...prev, search_query: query })) router.push({ pathname: router.pathname, @@ -199,6 +202,7 @@ export const LogsPreviewer = ({ return (
void filters: Filters onSelectedDatabaseChange: (id: string) => void + className?: string } /** @@ -61,6 +70,7 @@ const PreviewFilterPanel = ({ filters, table, onSelectedDatabaseChange, + className, }: PreviewFilterPanelProps) => { const router = useRouter() const { ref } = useParams() @@ -121,7 +131,13 @@ const PreviewFilterPanel = ({ const handleInputSearch = (query: string) => onSearch('search-input-change', { query }) return ( -
+
handleInputSearch(search)} - className="mx-2 text-foreground-light hover:text-foreground" - > - {'↲'} - - ) +
+ {hasEdits && ( + ↲} + type="text" + className="px-1 h-[20px]" + onClick={() => handleInputSearch(search)} + tooltip={{ content: { side: 'bottom', text: 'Search for events' } }} + /> + )} + + {search.length > 0 && ( + } + type="text" + className="p-[1px] h-[20px]" + onClick={() => handleInputSearch('')} + tooltip={{ content: { side: 'bottom', text: 'Clear search' } }} + /> + )} +
} /> diff --git a/apps/studio/components/layouts/FunctionsLayout/FunctionsLayout.tsx b/apps/studio/components/layouts/FunctionsLayout/FunctionsLayout.tsx index 1b3a03d852d..bf5b9d1dc36 100644 --- a/apps/studio/components/layouts/FunctionsLayout/FunctionsLayout.tsx +++ b/apps/studio/components/layouts/FunctionsLayout/FunctionsLayout.tsx @@ -89,12 +89,12 @@ const FunctionsLayout = ({ title, children }: PropsWithChildren {name && ( -
+
-
{name}
+

{name}

)}
diff --git a/apps/studio/pages/project/[ref]/functions/[functionSlug]/index.tsx b/apps/studio/pages/project/[ref]/functions/[functionSlug]/index.tsx index 053397213a9..7362374780a 100644 --- a/apps/studio/pages/project/[ref]/functions/[functionSlug]/index.tsx +++ b/apps/studio/pages/project/[ref]/functions/[functionSlug]/index.tsx @@ -151,7 +151,7 @@ const PageLayout: NextPageWithLayout = () => { return } return ( -
+
{CHART_INTERVALS.map((item, i) => { diff --git a/apps/studio/pages/project/[ref]/functions/[functionSlug]/invocations.tsx b/apps/studio/pages/project/[ref]/functions/[functionSlug]/invocations.tsx index 29c2e48d83b..5ecb05564fd 100644 --- a/apps/studio/pages/project/[ref]/functions/[functionSlug]/invocations.tsx +++ b/apps/studio/pages/project/[ref]/functions/[functionSlug]/invocations.tsx @@ -19,9 +19,11 @@ export const LogPage: NextPageWithLayout = () => { return ( ) } diff --git a/apps/studio/pages/project/[ref]/functions/[functionSlug]/logs.tsx b/apps/studio/pages/project/[ref]/functions/[functionSlug]/logs.tsx index c3d5282e6d9..e82144574d1 100644 --- a/apps/studio/pages/project/[ref]/functions/[functionSlug]/logs.tsx +++ b/apps/studio/pages/project/[ref]/functions/[functionSlug]/logs.tsx @@ -16,9 +16,11 @@ export const LogPage: NextPageWithLayout = () => { return ( ) } diff --git a/apps/studio/pages/project/[ref]/functions/index.tsx b/apps/studio/pages/project/[ref]/functions/index.tsx index 9a819b83a6f..684fa07eda2 100644 --- a/apps/studio/pages/project/[ref]/functions/index.tsx +++ b/apps/studio/pages/project/[ref]/functions/index.tsx @@ -1,16 +1,5 @@ import { useParams } from 'common' -import { useState } from 'react' -import { - Button, - Dialog, - DialogContent, - DialogFooter, - DialogHeader, - DialogSection, - DialogSectionSeparator, - DialogTrigger, - Modal, -} from 'ui' +import { Button, Dialog, DialogContent, DialogSection, DialogTrigger } from 'ui' import { EdgeFunctionsListItem, @@ -26,7 +15,6 @@ import type { NextPageWithLayout } from 'types' const PageLayout: NextPageWithLayout = () => { const { ref } = useParams() - const [showTerminalInstructions, setShowTerminalInstructions] = useState(false) const { data: functions, @@ -55,9 +43,7 @@ const PageLayout: NextPageWithLayout = () => { } deployed`} - + From f2b1586450e9a985d9bdd122b4dcd9a7ceffa8f6 Mon Sep 17 00:00:00 2001 From: Paul Cioanca Date: Wed, 25 Dec 2024 22:22:37 +0200 Subject: [PATCH 14/56] chore: temporarily change default region to us-west-1 (#31388) --- apps/studio/lib/constants/infrastructure.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/lib/constants/infrastructure.ts b/apps/studio/lib/constants/infrastructure.ts index 5ef80c359a0..3aa2c40a89d 100644 --- a/apps/studio/lib/constants/infrastructure.ts +++ b/apps/studio/lib/constants/infrastructure.ts @@ -4,7 +4,7 @@ import { AWS_REGIONS, FLY_REGIONS } from 'shared-data' import type { components } from 'data/api' export const AWS_REGIONS_DEFAULT = - process.env.NEXT_PUBLIC_ENVIRONMENT !== 'prod' ? AWS_REGIONS.SOUTHEAST_ASIA : AWS_REGIONS.EAST_US + process.env.NEXT_PUBLIC_ENVIRONMENT !== 'prod' ? AWS_REGIONS.SOUTHEAST_ASIA : AWS_REGIONS.WEST_US // TO DO, change default to US region for prod export const FLY_REGIONS_DEFAULT = FLY_REGIONS.SOUTHEAST_ASIA From 9dc05df310094b046eb70591c98c07860c58b8e8 Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Thu, 26 Dec 2024 13:16:37 +1100 Subject: [PATCH 15/56] fix: nodejs and golang direct connection strings (#31390) --- .../components/interfaces/Connect/DatabaseSettings.utils.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/Connect/DatabaseSettings.utils.ts b/apps/studio/components/interfaces/Connect/DatabaseSettings.utils.ts index 23ee85486d5..cb99068e33f 100644 --- a/apps/studio/components/interfaces/Connect/DatabaseSettings.utils.ts +++ b/apps/studio/components/interfaces/Connect/DatabaseSettings.utils.ts @@ -51,7 +51,7 @@ export const getConnectionStrings = ( const directUriString = `postgresql://${directUser}:${password}@${directHost}:${directPort}/${directName}` - const directGolangString = `DATABASE_URL=${poolingInfo.connectionString}` + const directGolangString = `DATABASE_URL=${directUriString}` const directJdbcString = `jdbc:postgresql://${directHost}:${directPort}/${directName}?user=${directUser}&password=${password}` @@ -69,6 +69,8 @@ export const getConnectionStrings = ( } }` + const directNodejsString = `DATABASE_URL=${directUriString}` + // Pooler connection strings const poolerPsqlString = isMd5 ? `psql "postgresql://${poolerUser}:${password}@${poolerHost}:${poolerPort}/${poolerName}?options=reference%3D${projectRef}"` @@ -105,7 +107,7 @@ dbname=${poolerName}` golang: directGolangString, jdbc: directJdbcString, dotnet: directDotNetString, - nodejs: nodejsPoolerUriString, + nodejs: directNodejsString, php: directGolangString, python: directGolangString, sqlalchemy: sqlalchemyString, From 65050e202be64ffddbc87efa6224077d3292d329 Mon Sep 17 00:00:00 2001 From: Pamela Chia Date: Thu, 26 Dec 2024 15:56:09 +0800 Subject: [PATCH 16/56] chore: add sql editor telemetry docs (#31239) * chore: add sql editor telemetry docs * fix: quickstartName --------- Co-authored-by: Long Hoang <1732217+loong@users.noreply.github.com> --- .../SQLEditor/SQLTemplates/SQLQuickstarts.tsx | 2 +- .../SQLEditor/SQLTemplates/SQLTemplates.tsx | 2 +- .../data/telemetry/send-event-mutation.ts | 10 +++ apps/studio/lib/constants/telemetry.ts | 67 +++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx index 1ee8e1d403f..5f1c2fba0b2 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLQuickstarts.tsx @@ -78,7 +78,7 @@ const SQLQuickstarts = () => { handleNewQuery(sql, title) sendEvent({ action: TelemetryActions.SQL_EDITOR_QUICKSTART_CLICKED, - properties: { title }, + properties: { quickstartName: title }, }) }} /> diff --git a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx index 93931d586ed..fc8e1014ff3 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLTemplates/SQLTemplates.tsx @@ -78,7 +78,7 @@ const SQLTemplates = () => { handleNewQuery(sql, title) sendEvent({ action: TelemetryActions.SQL_EDITOR_TEMPLATE_CLICKED, - properties: { title }, + properties: { templateName: title }, }) }} /> diff --git a/apps/studio/data/telemetry/send-event-mutation.ts b/apps/studio/data/telemetry/send-event-mutation.ts index 2cc8968b088..ddf51171365 100644 --- a/apps/studio/data/telemetry/send-event-mutation.ts +++ b/apps/studio/data/telemetry/send-event-mutation.ts @@ -16,6 +16,11 @@ import { FeaturePreviewsClickedEvent, FeaturePreviewEnabledEvent, FeaturePreviewDisabledEvent, + SqlEditorQuickstartClickedEvent, + SqlEditorTemplateClickedEvent, + SqlEditorResultDownloadCsvClickedEvent, + SqlEditorResultCopyMarkdownClickedEvent, + SqlEditorResultCopyJsonClickedEvent, TelemetryActions, } from 'lib/constants/telemetry' import { useRouter } from 'next/router' @@ -33,6 +38,11 @@ export type SendEventVariables = | FeaturePreviewsClickedEvent | FeaturePreviewEnabledEvent | FeaturePreviewDisabledEvent + | SqlEditorQuickstartClickedEvent + | SqlEditorTemplateClickedEvent + | SqlEditorResultDownloadCsvClickedEvent + | SqlEditorResultCopyMarkdownClickedEvent + | SqlEditorResultCopyJsonClickedEvent // TODO remove this once all events are documented | { diff --git a/apps/studio/lib/constants/telemetry.ts b/apps/studio/lib/constants/telemetry.ts index 80b1d84c5b8..d3a9c732ebb 100644 --- a/apps/studio/lib/constants/telemetry.ts +++ b/apps/studio/lib/constants/telemetry.ts @@ -208,3 +208,70 @@ export interface FeaturePreviewDisabledEvent { feature: string } } + +/** + * Quickstart card clicked in the SQL editor. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface SqlEditorQuickstartClickedEvent { + action: TelemetryActions.SQL_EDITOR_QUICKSTART_CLICKED + properties: { + /** + * The title of the quickstart card clicked. + */ + quickstartName: string + } +} + +/** + * Template card clicked in the SQL editor. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface SqlEditorTemplateClickedEvent { + action: TelemetryActions.SQL_EDITOR_TEMPLATE_CLICKED + properties: { + /** + * The name of the template card clicked. + */ + templateName: string + } +} + +/** + * Result download CSV button clicked in the SQL editor. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface SqlEditorResultDownloadCsvClickedEvent { + action: TelemetryActions.SQL_EDITOR_RESULT_DOWNLOAD_CSV_CLICKED +} + +/** + * Result copy markdown button clicked in the SQL editor. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface SqlEditorResultCopyMarkdownClickedEvent { + action: TelemetryActions.SQL_EDITOR_RESULT_COPY_MARKDOWN_CLICKED +} + +/** + * Result copy JSON button clicked in the SQL editor. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface SqlEditorResultCopyJsonClickedEvent { + action: TelemetryActions.SQL_EDITOR_RESULT_COPY_JSON_CLICKED +} From ffe9a71f89947a93b9a2258c210e857e7cb35ffe Mon Sep 17 00:00:00 2001 From: Long Hoang <1732217+loong@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:19:14 +0800 Subject: [PATCH 17/56] chore: document sign up/sign in and realtime events (#31394) * chore: add event defs for realtime events * chore: document sign in and sign up events * chore: update docs to reflect changes on sign in event --- .../data/telemetry/send-event-mutation.ts | 16 +++ apps/studio/lib/constants/telemetry.ts | 97 +++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/apps/studio/data/telemetry/send-event-mutation.ts b/apps/studio/data/telemetry/send-event-mutation.ts index ddf51171365..9ee61e52e9a 100644 --- a/apps/studio/data/telemetry/send-event-mutation.ts +++ b/apps/studio/data/telemetry/send-event-mutation.ts @@ -22,11 +22,21 @@ import { SqlEditorResultCopyMarkdownClickedEvent, SqlEditorResultCopyJsonClickedEvent, TelemetryActions, + SignUpEvent, + SignInEvent, + RealtimeInspectorListenChannelClickedEvent, + RealtimeInspectorBroadcastSentEvent, + RealtimeInspectorMessageClickedEvent, + RealtimeInspectorCopyMessageClickedEvent, + RealtimeInspectorFiltersAppliedEvent, + RealtimeInspectorDatabaseRoleUpdatedEvent, } from 'lib/constants/telemetry' import { useRouter } from 'next/router' import type { ResponseError } from 'types' export type SendEventVariables = + | SignUpEvent + | SignInEvent | ConnectionStringCopiedEvent | CronJobCreatedEvent | CronJobUpdatedEvent @@ -38,6 +48,12 @@ export type SendEventVariables = | FeaturePreviewsClickedEvent | FeaturePreviewEnabledEvent | FeaturePreviewDisabledEvent + | RealtimeInspectorListenChannelClickedEvent + | RealtimeInspectorBroadcastSentEvent + | RealtimeInspectorMessageClickedEvent + | RealtimeInspectorCopyMessageClickedEvent + | RealtimeInspectorFiltersAppliedEvent + | RealtimeInspectorDatabaseRoleUpdatedEvent | SqlEditorQuickstartClickedEvent | SqlEditorTemplateClickedEvent | SqlEditorResultDownloadCsvClickedEvent diff --git a/apps/studio/lib/constants/telemetry.ts b/apps/studio/lib/constants/telemetry.ts index d3a9c732ebb..8b9c691c1fe 100644 --- a/apps/studio/lib/constants/telemetry.ts +++ b/apps/studio/lib/constants/telemetry.ts @@ -40,6 +40,37 @@ export enum TelemetryActions { SQL_EDITOR_RESULT_COPY_JSON_CLICKED = 'sql_editor_result_copy_markdown_clicked', } +/** + * Triggered when a user signs up. When signing up with Email and Password, this is only triggered once user confirms their email. + * + * @group Events + * @source studio + * @page /sign-up + */ +export interface SignUpEvent { + action: TelemetryActions.SIGN_UP + properties: { + category: 'conversion' + } +} + +/** + * Triggered when a user signs in with Github, Email and Password or SSO. + * + * Some unintuitive behavior: + * - If signing up with GitHub the SignInEvent gets triggered first before the SignUpEvent. + * + * @group Events + * @source studio + * @page /sign-in-mfa + */ +export interface SignInEvent { + action: TelemetryActions.SIGN_IN + properties: { + category: 'account' + } +} + /** * User copied the database connection string. * @@ -209,6 +240,72 @@ export interface FeaturePreviewDisabledEvent { } } +/** + * After selecting channel, either "Listening to channel" or "Start listening" button was clicked. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorListenChannelClickedEvent { + action: TelemetryActions.REALTIME_INSPECTOR_LISTEN_CHANNEL_CLICKED +} + +/** + * A broadcast message was sent from the SendMessageModal. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorBroadcastSentEvent { + action: TelemetryActions.REALTIME_INSPECTOR_BROADCAST_SENT +} + +/** + * A message was clicked in the RealtimeInspector, which opens a sidebar that shows the messsage details including metadata. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorMessageClickedEvent { + action: TelemetryActions.REALTIME_INSPECTOR_MESSAGE_CLICKED +} + +/** + * A message was copied from the RealtimeInspector. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorCopyMessageClickedEvent { + action: TelemetryActions.REALTIME_INSPECTOR_COPY_MESSAGE_CLICKED +} + +/** + * Filters were applied in the RealtimeInspector. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorFiltersAppliedEvent { + action: TelemetryActions.REALTIME_INSPECTOR_FILTERS_APPLIED +} + +/** + * Database role was updated in the RealtimeInspector. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/realtime/inspector + */ +export interface RealtimeInspectorDatabaseRoleUpdatedEvent { + action: TelemetryActions.REALTIME_INSPECTOR_DATABASE_ROLE_UPDATED +} + /** * Quickstart card clicked in the SQL editor. * From 50f9ccb5c7f23b4d6f44332204b747424caa2017 Mon Sep 17 00:00:00 2001 From: hawkcookie <29660904+hawkcookie@users.noreply.github.com> Date: Sat, 28 Dec 2024 00:45:12 +0900 Subject: [PATCH 18/56] fix: fix horizontal scroll reset when clicking timestamp cells on the Dashboard (#31624) * add preventScroll option to ref.current.focus * add ref props to Input component and remove autoFocus props --- .../components/grid/components/editor/DateTimeEditor.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx index d48e4d935b7..1676996991d 100644 --- a/apps/studio/components/grid/components/editor/DateTimeEditor.tsx +++ b/apps/studio/components/grid/components/editor/DateTimeEditor.tsx @@ -51,7 +51,11 @@ function BaseEditor({ } useEffect(() => { - if (ref.current) ref.current.focus() + try { + ref.current?.focus({ preventScroll: true }) + } catch (e) { + ref.current?.focus() + } }, []) return ( @@ -69,7 +73,7 @@ function BaseEditor({ onEnter={saveChanges} > setInputValue(e.target.value)} From 2ce8ff97eb52b970c0564749d335ee20402a753d Mon Sep 17 00:00:00 2001 From: Ankit Choudhary <61384771+helloankit@users.noreply.github.com> Date: Fri, 27 Dec 2024 21:32:40 +0530 Subject: [PATCH 19/56] style: align svg icon to the center of the container (#31353) * style: align svg icon to the center of the container * style + refactor: fixed parent div style + removed zombie div --- apps/studio/components/ui/States/EmptyListState.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/studio/components/ui/States/EmptyListState.tsx b/apps/studio/components/ui/States/EmptyListState.tsx index 20c44a8e372..6191da771e0 100644 --- a/apps/studio/components/ui/States/EmptyListState.tsx +++ b/apps/studio/components/ui/States/EmptyListState.tsx @@ -10,9 +10,8 @@ const EmptyListState = ({ title, description }: { title: string; description: st " >
-
-
-
+
+
Date: Fri, 27 Dec 2024 17:24:35 +0100 Subject: [PATCH 20/56] logs explorer: add copy as CSV & rename copy as JSON (#31625) * add copy as json btn * separate copy csv and json --- .../interfaces/Settings/Logs/LogTable.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx index 91cc4ff5233..c7c4cf89dbc 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx @@ -5,6 +5,7 @@ import { ChevronDown, Clipboard, Download, Eye, EyeOff, Play } from 'lucide-reac import { Key, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react' import DataGrid, { Column, RenderRowProps, Row } from 'react-data-grid' import { toast } from 'sonner' +import Papa from 'papaparse' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import CSVButton from 'components/ui/CSVButton' @@ -256,6 +257,18 @@ const LogTable = ({
Download CSV
+ { + const csvData = Papa.unparse(data) + copyToClipboard(csvData, () => { + toast.success('Results copied to clipboard') + }) + }} + className="space-x-2" + > + +
Copy as CSV
+
{ copyToClipboard(stringData, () => { @@ -265,7 +278,7 @@ const LogTable = ({ className="space-x-2" > -
Copy to clipboard
+
Copy as JSON
From dacdddc257e32ca1d4abdf4f1a77d5b4473dd67e Mon Sep 17 00:00:00 2001 From: Alaister Young Date: Sat, 28 Dec 2024 09:23:28 +1100 Subject: [PATCH 21/56] fix: overflow-x-auto (#31391) --- apps/studio/components/layouts/OrganizationLayout.tsx | 2 +- .../layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/layouts/OrganizationLayout.tsx b/apps/studio/components/layouts/OrganizationLayout.tsx index 802b1235097..d3a71f986dc 100644 --- a/apps/studio/components/layouts/OrganizationLayout.tsx +++ b/apps/studio/components/layouts/OrganizationLayout.tsx @@ -78,7 +78,7 @@ const OrganizationLayout = ({ children }: PropsWithChildren<{}>) => { {selectedOrganization?.name ?? 'Organization'} settings {filteredNavMenuItems.map((item) => ( diff --git a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx index 8a37500aa87..9a05ec59bb6 100644 --- a/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx +++ b/apps/studio/components/layouts/ProjectLayout/LayoutHeader/LayoutHeader.tsx @@ -102,7 +102,7 @@ const LayoutHeader = ({
)}
-
+
{projectRef && ( <> From 1aa371a9d7ec41f3c48491bf55bdef3a4e3a5624 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Sat, 28 Dec 2024 10:51:04 +0800 Subject: [PATCH 22/56] Add sign in event for email password login (#31395) * Add sign in event for email password login * Also add event track for sign in with SSO * Remove unused variable --- .../components/interfaces/SignIn/SignInForm.tsx | 9 +++++++-- .../components/interfaces/SignIn/SignInSSOForm.tsx | 11 +++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/apps/studio/components/interfaces/SignIn/SignInForm.tsx b/apps/studio/components/interfaces/SignIn/SignInForm.tsx index 1b72d45fa83..2d202b7ee90 100644 --- a/apps/studio/components/interfaces/SignIn/SignInForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInForm.tsx @@ -9,9 +9,11 @@ import { toast } from 'sonner' import { object, string } from 'yup' import { getMfaAuthenticatorAssuranceLevel } from 'data/profile/mfa-authenticator-assurance-level-query' +import { useSendEventMutation } from 'data/telemetry/send-event-mutation' +import { useLastSignIn } from 'hooks/misc/useLastSignIn' +import { TelemetryActions } from 'lib/constants/telemetry' import { auth, buildPathWithParams, getReturnToPath } from 'lib/gotrue' import { Button, Form, Input } from 'ui' -import { useLastSignIn } from 'hooks/misc/useLastSignIn' import { LastSignInWrapper } from './LastSignInWrapper' const signInSchema = object({ @@ -22,11 +24,13 @@ const signInSchema = object({ const SignInForm = () => { const router = useRouter() const queryClient = useQueryClient() - const [lastSignIn, setLastSignIn] = useLastSignIn() + const [_, setLastSignIn] = useLastSignIn() const [captchaToken, setCaptchaToken] = useState(null) const captchaRef = useRef(null) + const { mutate: sendEvent } = useSendEventMutation() + const onSignIn = async ({ email, password }: { email: string; password: string }) => { const toastId = toast.loading('Signing in...') @@ -56,6 +60,7 @@ const SignInForm = () => { } toast.success(`Signed in successfully!`, { id: toastId }) + sendEvent({ action: TelemetryActions.SIGN_IN, properties: { category: 'account' } }) await queryClient.resetQueries() const returnTo = getReturnToPath() // since we're already on the /sign-in page, prevent redirect loops diff --git a/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx b/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx index 5a31e6baf26..93b2e16951a 100644 --- a/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx +++ b/apps/studio/components/interfaces/SignIn/SignInSSOForm.tsx @@ -5,10 +5,12 @@ import { useRef, useState } from 'react' import { toast } from 'sonner' import { object, string } from 'yup' +import { useSendEventMutation } from 'data/telemetry/send-event-mutation' +import { useLastSignIn } from 'hooks/misc/useLastSignIn' import { BASE_PATH } from 'lib/constants' +import { TelemetryActions } from 'lib/constants/telemetry' import { auth, buildPathWithParams } from 'lib/gotrue' import { Button, Form, Input } from 'ui' -import { useLastSignIn } from 'hooks/misc/useLastSignIn' const WHITELIST_ERRORS = ['No SSO provider assigned for this domain'] @@ -16,10 +18,14 @@ const SignInSSOForm = () => { const queryClient = useQueryClient() const captchaRef = useRef(null) const [captchaToken, setCaptchaToken] = useState(null) - const [lastSignInUsed, setLastSignInUsed] = useLastSignIn() + const [_, setLastSignInUsed] = useLastSignIn() + const signInSchema = object({ email: string().email('Must be a valid email').required('Email is required'), }) + + const { mutate: sendEvent } = useSendEventMutation() + const onSignIn = async ({ email }: { email: string }) => { const toastId = toast.loading('Signing in...') @@ -47,6 +53,7 @@ const SignInSSOForm = () => { }) if (!error) { + sendEvent({ action: TelemetryActions.SIGN_IN, properties: { category: 'account' } }) await queryClient.resetQueries() setLastSignInUsed('sso') if (data) { From e6efee12e78a771b927a36e089a14e60f63ca309 Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Sat, 28 Dec 2024 16:57:59 -0500 Subject: [PATCH 23/56] hotfix: disable guide revalidation (#31948) --- apps/docs/app/guides/(with-sidebar)/layout.tsx | 2 +- apps/docs/app/guides/troubleshooting/[slug]/page.tsx | 2 +- apps/docs/app/guides/troubleshooting/page.tsx | 2 +- apps/docs/features/helpers.fetch.ts | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/docs/app/guides/(with-sidebar)/layout.tsx b/apps/docs/app/guides/(with-sidebar)/layout.tsx index 532645a070d..2824184e834 100644 --- a/apps/docs/app/guides/(with-sidebar)/layout.tsx +++ b/apps/docs/app/guides/(with-sidebar)/layout.tsx @@ -9,7 +9,7 @@ import { getAiPrompts } from './getting-started/ai-prompts/[slug]/AiPrompts.util // Revalidate occasionally to pick up changes to partners // 60 seconds/minute * 60 minutes/hour * 24 hours/day -export const revalidate = 86_400 +// export const revalidate = 86_400 const GuidesLayout = async ({ children }: PropsWithChildren) => { const [partnerNavItems, promptNavItems] = await Promise.all([getPartners(), getPrompts()]) diff --git a/apps/docs/app/guides/troubleshooting/[slug]/page.tsx b/apps/docs/app/guides/troubleshooting/[slug]/page.tsx index 9e2a1471a8d..9fcd77530d1 100644 --- a/apps/docs/app/guides/troubleshooting/[slug]/page.tsx +++ b/apps/docs/app/guides/troubleshooting/[slug]/page.tsx @@ -5,7 +5,7 @@ import { getAllTroubleshootingEntries, getArticleSlug } from '~/features/docs/Tr import { PROD_URL } from '~/lib/constants' // 60 seconds/minute * 60 minutes/hour * 24 hours/day -export const revalidate = 86_400 +// export const revalidate = 86_400 export const dynamicParams = false export default async function TroubleshootingEntryPage({ diff --git a/apps/docs/app/guides/troubleshooting/page.tsx b/apps/docs/app/guides/troubleshooting/page.tsx index ac0be072bfe..b9d65fed5ad 100644 --- a/apps/docs/app/guides/troubleshooting/page.tsx +++ b/apps/docs/app/guides/troubleshooting/page.tsx @@ -17,7 +17,7 @@ import { SidebarSkeleton } from '~/layouts/MainSkeleton' import { PROD_URL } from '~/lib/constants' // 60 seconds/minute * 60 minutes/hour * 24 hours/day -export const revalidate = 86_400 +// export const revalidate = 86_400 export default async function GlobalTroubleshootingPage() { const troubleshootingEntries = await getAllTroubleshootingEntries() diff --git a/apps/docs/features/helpers.fetch.ts b/apps/docs/features/helpers.fetch.ts index cb194482203..55f2de27a93 100644 --- a/apps/docs/features/helpers.fetch.ts +++ b/apps/docs/features/helpers.fetch.ts @@ -18,6 +18,9 @@ function fetchWithNextOptions({ return (info: RequestInfo) => fetch(info, { next, cache }) } -const fetchRevalidatePerDay = fetchWithNextOptions({ next: { revalidate: ONE_DAY_IN_SECONDS } }) +// const fetchRevalidatePerDay = fetchWithNextOptions({ next: { revalidate: ONE_DAY_IN_SECONDS } }) +// [Charis 2024-12-28] +// Temporarily disabling revalidation as a hotfix for Vercel NFT problem +const fetchRevalidatePerDay = fetch export { fetchWithNextOptions, fetchRevalidatePerDay } From 9b5c5cf7d5d3d2e4b0bca1a45beb78e7a846e210 Mon Sep 17 00:00:00 2001 From: Jonathan Summers-Muir Date: Mon, 30 Dec 2024 14:17:40 +0000 Subject: [PATCH 24/56] fix: not-prose on admonition.tsx (#32391) Update admonition.tsx --- packages/ui-patterns/admonition.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/ui-patterns/admonition.tsx b/packages/ui-patterns/admonition.tsx index 9380a6056a0..477f61756b3 100644 --- a/packages/ui-patterns/admonition.tsx +++ b/packages/ui-patterns/admonition.tsx @@ -102,6 +102,7 @@ export const Admonition = forwardRef< variant={typeMapped} {...props} className={cn( + 'not-prose', 'mb-2', admonitionSVG({ type: typeMapped }), admonitionBase({ type: typeMapped }), From c53ddbcb129e97823b43d2614e9e371345c1b1de Mon Sep 17 00:00:00 2001 From: Supun Sudaraka Date: Tue, 31 Dec 2024 16:03:53 +0530 Subject: [PATCH 25/56] fix: fixed the broken external link for "view access control docs" in auth settings (#32421) fixed the broken external link for "view access control docs" in auth settings page --- .../Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx index d4d68c8ced8..6ddf1eafef7 100644 --- a/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx +++ b/apps/studio/components/interfaces/Auth/BasicAuthSettingsForm/BasicAuthSettingsForm.tsx @@ -254,7 +254,7 @@ const BasicAuthSettingsForm = () => { className="w-min" icon={} > - + View access control docs From daa469b96bd91d077a1373bd89a924068acfd7d1 Mon Sep 17 00:00:00 2001 From: Copple <10214025+kiwicopple@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:00:19 +0100 Subject: [PATCH 26/56] chore: update cli reference doc (#32439) --- apps/docs/spec/cli_v1_commands.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/spec/cli_v1_commands.yaml b/apps/docs/spec/cli_v1_commands.yaml index c616b0ab50b..90d76c6144e 100644 --- a/apps/docs/spec/cli_v1_commands.yaml +++ b/apps/docs/spec/cli_v1_commands.yaml @@ -1,7 +1,7 @@ clispec: '001' info: id: cli - version: 2.1.1 + version: 2.2.1 title: Supabase CLI language: sh source: https://github.com/supabase/cli From 364f001e6869ceb6fbf1ffa397c64cd70cb84813 Mon Sep 17 00:00:00 2001 From: Alex Motoc Date: Thu, 2 Jan 2025 04:06:34 +0000 Subject: [PATCH 27/56] fix: update json editor initial value formatting (#30990) (#32513) * fix: update json editor initial value formatting (#30990) * update logic to stringify initialValue before formatting --------- Co-authored-by: Alaister Young --- .../components/grid/components/editor/JsonEditor.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/studio/components/grid/components/editor/JsonEditor.tsx b/apps/studio/components/grid/components/editor/JsonEditor.tsx index 152accb8044..87b6863db12 100644 --- a/apps/studio/components/grid/components/editor/JsonEditor.tsx +++ b/apps/studio/components/grid/components/editor/JsonEditor.tsx @@ -1,4 +1,3 @@ -import { isNil } from 'lodash' import { Maximize } from 'lucide-react' import { useCallback, useState } from 'react' import type { RenderEditCellProps } from 'react-data-grid' @@ -65,8 +64,15 @@ export const JsonEditor = ({ }) const gridColumn = state.gridColumns.find((x) => x.name == column.key) - const initialValue = row[column.key as keyof TRow] as string - const jsonString = prettifyJSON(!isNil(initialValue) ? tryFormatInitialValue(initialValue) : '') + + const rawInitialValue = row[column.key as keyof TRow] as unknown + const initialValue = + rawInitialValue === null || rawInitialValue === undefined || typeof rawInitialValue === 'string' + ? rawInitialValue + : JSON.stringify(rawInitialValue) + + const jsonString = prettifyJSON(initialValue ? tryFormatInitialValue(initialValue) : '') + const isTruncated = typeof initialValue === 'string' && initialValue.endsWith('...') && From 8d00fd0aba1ba3cea49a4eae98749ba56e1ad86f Mon Sep 17 00:00:00 2001 From: Kyle Rummens <58995471+kylerummens@users.noreply.github.com> Date: Wed, 1 Jan 2025 21:52:25 -0700 Subject: [PATCH 28/56] fix(dashboard): Improve scrollbar position on Table Editor list (#32505) * Improve padding on infinite table list when scrollbar is visible * Add back removed bottom padding --------- Co-authored-by: Kyle Rummens --- .../TableEditorLayout/EntityListItem.tsx | 368 +++++++++--------- .../TableEditorLayout/TableEditorMenu.tsx | 2 +- 2 files changed, 186 insertions(+), 184 deletions(-) diff --git a/apps/studio/components/layouts/TableEditorLayout/EntityListItem.tsx b/apps/studio/components/layouts/TableEditorLayout/EntityListItem.tsx index 23ad874970b..02e617995be 100644 --- a/apps/studio/components/layouts/TableEditorLayout/EntityListItem.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/EntityListItem.tsx @@ -267,196 +267,198 @@ const EntityListItem: ItemRenderer = ({ } return ( - - - - {entity.type === ENTITY_TYPE.TABLE ? ( - - ) : entity.type === ENTITY_TYPE.VIEW ? ( - - ) : ( -
- {Object.entries(ENTITY_TYPE) - .find(([, value]) => value === entity.type)?.[0]?.[0] - ?.toUpperCase()} -
- )} -
- - - - {formatTooltipText(entity.type)} - - -
-
+ - + + {entity.type === ENTITY_TYPE.TABLE ? ( + + ) : entity.type === ENTITY_TYPE.VIEW ? ( + + ) : ( +
+ {Object.entries(ENTITY_TYPE) + .find(([, value]) => value === entity.type)?.[0]?.[0] + ?.toUpperCase()} +
+ )} +
+ + + + {formatTooltipText(entity.type)} + + + +
- {entity.name} - - -
- - {canEdit && ( - - - - - - { - e.stopPropagation() - copyToClipboard(entity.name) - }} - > - - Copy name - - - {entity.type === ENTITY_TYPE.TABLE && ( - <> - - - { - e.stopPropagation() - snap.onEditTable() - }} - > - - Edit table - - { - e.stopPropagation() - snap.onDuplicateTable() - }} - > - - Duplicate table - - - - - View policies - - - - - - - Export data - - - { - e.stopPropagation() - exportTableAsCSV() - }} - > - Export table as CSV - - { - e.stopPropagation() - exportTableAsSQL() - }} - > - Export table as SQL - - - - - - { - e.stopPropagation() - snap.onDeleteTable() - }} - > - - Delete table - - + - - )} -
+ > + {entity.name} + + +
+ + {canEdit && ( + + + + + + { + e.stopPropagation() + copyToClipboard(entity.name) + }} + > + + Copy name + + + {entity.type === ENTITY_TYPE.TABLE && ( + <> + + + { + e.stopPropagation() + snap.onEditTable() + }} + > + + Edit table + + { + e.stopPropagation() + snap.onDuplicateTable() + }} + > + + Duplicate table + + + + + View policies + + + + + + + Export data + + + { + e.stopPropagation() + exportTableAsCSV() + }} + > + Export table as CSV + + { + e.stopPropagation() + exportTableAsSQL() + }} + > + Export table as SQL + + + + + + { + e.stopPropagation() + snap.onDeleteTable() + }} + > + + Delete table + + + )} + + + )} +
+
) } diff --git a/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx b/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx index c233915a21e..22d28e67044 100644 --- a/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx +++ b/apps/studio/components/layouts/TableEditorLayout/TableEditorMenu.tsx @@ -269,7 +269,7 @@ const TableEditorMenu = () => { /> )} {(entityTypes?.length ?? 0) > 0 && ( -
+
Date: Thu, 2 Jan 2025 16:54:55 +1100 Subject: [PATCH 29/56] fix: use v2 endpoints for snippets (#32521) * fix: use v2 endpoints for snippets * restore v2 header for content delete --- .../interfaces/SQLEditor/MoveQueryModal.tsx | 4 +- .../SQLEditorNavV2/SQLEditorNav.tsx | 8 +-- .../data/content/content-upsert-mutation.ts | 13 +--- .../content/content-upsert-v2-mutation.ts | 72 ------------------- apps/studio/state/sql-editor-v2.ts | 9 ++- 5 files changed, 12 insertions(+), 94 deletions(-) delete mode 100644 apps/studio/data/content/content-upsert-v2-mutation.ts diff --git a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx index 2e244e0fb95..1841d7d6fdb 100644 --- a/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx +++ b/apps/studio/components/interfaces/SQLEditor/MoveQueryModal.tsx @@ -7,7 +7,7 @@ import * as z from 'zod' import { useParams } from 'common' import { getContentById } from 'data/content/content-id-query' -import { useContentUpsertV2Mutation } from 'data/content/content-upsert-v2-mutation' +import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' import { useSQLSnippetFolderCreateMutation } from 'data/content/sql-folder-create-mutation' import { Snippet } from 'data/content/sql-folders-query' import { @@ -69,7 +69,7 @@ export const MoveQueryModal = ({ visible, snippets = [], onClose }: MoveQueryMod const { mutateAsync: createFolder, isLoading: isCreatingFolder } = useSQLSnippetFolderCreateMutation() - const { mutateAsync: moveSnippetAsync, isLoading: isMovingSnippet } = useContentUpsertV2Mutation({ + const { mutateAsync: moveSnippetAsync, isLoading: isMovingSnippet } = useContentUpsertMutation({ onError: (error) => { toast.error(`Failed to move query: ${error.message}`) }, diff --git a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx index 6ee9cc784f6..31e1163ecb4 100644 --- a/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx +++ b/apps/studio/components/layouts/SQLEditorLayout/SQLEditorNavV2/SQLEditorNav.tsx @@ -13,6 +13,7 @@ import { createSqlSnippetSkeletonV2 } from 'components/interfaces/SQLEditor/SQLE import { useContentCountQuery } from 'data/content/content-count-query' import { useContentDeleteMutation } from 'data/content/content-delete-mutation' import { getContentById } from 'data/content/content-id-query' +import { useContentUpsertMutation } from 'data/content/content-upsert-mutation' import { useSQLSnippetFoldersDeleteMutation } from 'data/content/sql-folders-delete-mutation' import { Snippet, SnippetFolder, useSQLSnippetFoldersQuery } from 'data/content/sql-folders-query' import { useSqlSnippetsQuery } from 'data/content/sql-snippets-query' @@ -24,6 +25,7 @@ import { useSnippetFolders, useSqlEditorV2StateSnapshot, } from 'state/sql-editor-v2' +import { SqlSnippets } from 'types' import { cn, Separator, TreeView } from 'ui' import { InnerSideBarEmptyPanel, @@ -34,10 +36,8 @@ import { } from 'ui-patterns' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import SQLEditorLoadingSnippets from './SQLEditorLoadingSnippets' -import { ROOT_NODE, formatFolderResponseForTreeView, getLastItemIds } from './SQLEditorNav.utils' +import { formatFolderResponseForTreeView, getLastItemIds, ROOT_NODE } from './SQLEditorNav.utils' import { SQLEditorTreeViewItem } from './SQLEditorTreeViewItem' -import { useContentUpsertV2Mutation } from 'data/content/content-upsert-v2-mutation' -import { SqlSnippets } from 'types' interface SQLEditorNavProps { searchText: string @@ -331,7 +331,7 @@ export const SQLEditorNav = ({ // Snippet mutations from RQ // ========================== - const { mutate: upsertContent, isLoading: isUpserting } = useContentUpsertV2Mutation({ + const { mutate: upsertContent, isLoading: isUpserting } = useContentUpsertMutation({ onError: (error) => { toast.error(`Failed to update query: ${error.message}`) }, diff --git a/apps/studio/data/content/content-upsert-mutation.ts b/apps/studio/data/content/content-upsert-mutation.ts index f0a2655afc0..2831298e4b7 100644 --- a/apps/studio/data/content/content-upsert-mutation.ts +++ b/apps/studio/data/content/content-upsert-mutation.ts @@ -25,17 +25,8 @@ export async function upsertContent( ) { const { data, error } = await put('/platform/projects/{ref}/content', { params: { path: { ref: projectRef } }, - body: { - id: payload.id, - name: payload.name, - description: payload.description, - project_id: payload.project_id, - owner_id: payload.owner_id, - type: payload.type, - visibility: payload.visibility, - content: payload.content as any, - folder_id: payload.folder_id, - }, + body: payload, + headers: { Version: '2' }, signal, }) if (error) handleError(error) diff --git a/apps/studio/data/content/content-upsert-v2-mutation.ts b/apps/studio/data/content/content-upsert-v2-mutation.ts deleted file mode 100644 index e456c1a7fce..00000000000 --- a/apps/studio/data/content/content-upsert-v2-mutation.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' -import { toast } from 'sonner' - -import type { components } from 'data/api' -import { handleError, put } from 'data/fetchers' -import type { ResponseError } from 'types' -import type { Content } from './content-query' -import { contentKeys } from './keys' - -export type UpsertContentPayloadV2 = Omit< - components['schemas']['UpsertContentBodyDto'], - 'content' -> & { - content: Content['content'] -} - -export type UpsertContentVariables = { - projectRef: string - payload: UpsertContentPayloadV2 -} - -export async function upsertContent( - { projectRef, payload }: UpsertContentVariables, - signal?: AbortSignal -) { - const { data, error } = await put('/platform/projects/{ref}/content', { - params: { path: { ref: projectRef } }, - body: payload as any, - headers: { Version: '2' }, - signal, - }) - - if (error) handleError(error) - return data -} - -export type UpsertContentData = Awaited> - -export const useContentUpsertV2Mutation = ({ - onError, - onSuccess, - invalidateQueriesOnSuccess = true, - ...options -}: Omit< - UseMutationOptions, - 'mutationFn' -> & { - invalidateQueriesOnSuccess?: boolean -} = {}) => { - const queryClient = useQueryClient() - - return useMutation( - (args) => upsertContent(args), - { - async onSuccess(data, variables, context) { - const { projectRef } = variables - if (invalidateQueriesOnSuccess) { - await queryClient.invalidateQueries(contentKeys.allContentLists(projectRef)) - } - await onSuccess?.(data, variables, context) - }, - async onError(data, variables, context) { - if (onError === undefined) { - toast.error(`Failed to upsert content: ${data.message}`) - } else { - onError(data, variables, context) - } - }, - ...options, - } - ) -} diff --git a/apps/studio/state/sql-editor-v2.ts b/apps/studio/state/sql-editor-v2.ts index f5b3d2f72ba..287eb1620c8 100644 --- a/apps/studio/state/sql-editor-v2.ts +++ b/apps/studio/state/sql-editor-v2.ts @@ -4,15 +4,14 @@ import { proxy, snapshot, subscribe, useSnapshot } from 'valtio' import { devtools, proxySet } from 'valtio/utils' import { DiffType } from 'components/interfaces/SQLEditor/SQLEditor.types' -import { getContentById } from 'data/content/content-id-query' -import { UpsertContentPayloadV2, upsertContent } from 'data/content/content-upsert-v2-mutation' +import { upsertContent, UpsertContentPayload } from 'data/content/content-upsert-mutation' import { contentKeys } from 'data/content/keys' import { createSQLSnippetFolder } from 'data/content/sql-folder-create-mutation' import { updateSQLSnippetFolder } from 'data/content/sql-folder-update-mutation' import { Snippet, SnippetFolder } from 'data/content/sql-folders-query' import { getQueryClient } from 'data/query-client' -import { SqlSnippets } from 'types' import { useMemo } from 'react' +import { SqlSnippets } from 'types' export type StateSnippetFolder = { projectRef: string @@ -285,7 +284,7 @@ export const useSnippets = (projectRef: string) => { // ## Below are all the asynchronous saving logic for the SQL Editor // ======================================================================== -async function upsertSnippet(id: string, projectRef: string, payload: UpsertContentPayloadV2) { +async function upsertSnippet(id: string, projectRef: string, payload: UpsertContentPayload) { try { sqlEditorState.savingStates[id] = 'UPDATING' await upsertContent({ projectRef, payload }) @@ -305,7 +304,7 @@ async function upsertSnippet(id: string, projectRef: string, payload: UpsertCont const memoizedUpdateSnippet = memoize((_id: string) => debounce(upsertSnippet, 1000)) -const debouncedUpdateSnippet = (id: string, projectRef: string, payload: UpsertContentPayloadV2) => +const debouncedUpdateSnippet = (id: string, projectRef: string, payload: UpsertContentPayload) => memoizedUpdateSnippet(id)(id, projectRef, payload) async function upsertFolder(id: string, projectRef: string, name: string) { From 837c1bc2999a20559d49682eb04607ede2e29d36 Mon Sep 17 00:00:00 2001 From: Andrew Valleteau Date: Thu, 2 Jan 2025 18:36:32 +0900 Subject: [PATCH 30/56] chore(docs): add branching remotes section docs (#30886) * chore(docs): add branching remotes section docs * fix: prettier * Update apps/docs/content/guides/deployment/branching.mdx Co-authored-by: Han Qiao * Apply suggestions from code review * chore: close block quote --------- Co-authored-by: Han Qiao Co-authored-by: Qiao Han --- .../content/guides/deployment/branching.mdx | 51 +++++++++++++++++++ apps/docs/spec/cli_v1_config.yaml | 19 +++++++ 2 files changed, 70 insertions(+) diff --git a/apps/docs/content/guides/deployment/branching.mdx b/apps/docs/content/guides/deployment/branching.mdx index 783b8cf29b4..b99936f1689 100644 --- a/apps/docs/content/guides/deployment/branching.mdx +++ b/apps/docs/content/guides/deployment/branching.mdx @@ -532,6 +532,57 @@ Migrations are run in sequential order. Each migration builds upon the previous The preview branch has a record of which migrations have been applied, and only applies new migrations for each commit. This can create an issue when rolling back migrations. +## Branch configuration with remotes + +When Branching is enabled, your `config.toml` settings automatically sync to all ephemeral branches through a one-to-one mapping between your Git and Supabase branches. + +### Basic configuration + +To update configuration for a Supabase branch, simply modify `config.toml` and push to git. The Supabase integration will detect the changes and apply them to the corresponding branch. + +### Remote-specific configuration + +For persistent branches that need specific settings, you can use the `[remotes]` block in your `config.toml`. Each remote configuration must reference an existing project ID. + +Here's an example of configuring a separate seed script for a staging environment: + +```toml +[remotes.staging] +project_id = "your-project-ref" + +[remotes.staging.db.seed] +sql_paths = ["./seeds/staging.sql"] +``` + +Since the `project_id` field must reference an existing branch, you need to create the persistent branch before adding its configuration. Use the CLI to create a persistent branch first: + +```bash +supabase --experimental branches create --persistent +# Do you want to create a branch named develop? [Y/n] +``` + +### Configuration merging + +When merging a PR into a persistent branch, the Supabase integration: + +1. Checks for configuration changes +2. Logs the changes +3. Applies them to the target remote + +If no remote is declared or the project ID is incorrect, the configuration step is skipped. + +### Available configuration options + +All standard configuration options are available in the `[remotes]` block. This includes: + +- Database settings +- API configurations +- Authentication settings +- Edge Functions configuration +- And more + +You can use this to maintain different configurations for different environments while keeping them all in version control. + ### Rolling back migrations You might want to roll back changes you've made in an earlier migration change. For example, you may have pushed a migration file containing schema changes you no longer want. diff --git a/apps/docs/spec/cli_v1_config.yaml b/apps/docs/spec/cli_v1_config.yaml index 2fbdd858fab..d64190472df 100644 --- a/apps/docs/spec/cli_v1_config.yaml +++ b/apps/docs/spec/cli_v1_config.yaml @@ -50,6 +50,9 @@ info: - id: local title: Local Development description: Local Development settings. + - id: branching + title: Branching + description: Branching configurations settings. # This section is an array of public functions which a user might need to execute. parameters: @@ -1587,3 +1590,19 @@ parameters: DO NOT commit your AWS secret key to git. Use environment variable substitution instead. Note: This is an experimental feature and may change in future releases. links: [] + + - id: 'remotes.branch_name.project_id' + title: 'remotes..project_id' + tags: ['branching'] + required: true + description: | + The project reference ID for a specific persistent Supabase branch. + This ID is used to configure branch-specific settings in your config.toml file for branches deployments. + All other configuration options available in the root config are also supported in the remotes block. + For example, you can specify branch-specific database settings like so: + usage: | + [remotes.] + project_id = "your-project-ref" + + [remotes..db.seed] + sql_paths = ["./seeds/staging.sql"] From fd4e7961e09063722933c8cd1d16162eba49a59c Mon Sep 17 00:00:00 2001 From: Andrew Valleteau Date: Thu, 2 Jan 2025 18:48:45 +0900 Subject: [PATCH 31/56] fix(docs): document openai_api_key better (#31210) --- apps/docs/spec/cli_v1_config.yaml | 12 ++++++++++++ .../components/ui/AIAssistantPanel/AIAssistant.tsx | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/docs/spec/cli_v1_config.yaml b/apps/docs/spec/cli_v1_config.yaml index d64190472df..fca79cb6203 100644 --- a/apps/docs/spec/cli_v1_config.yaml +++ b/apps/docs/spec/cli_v1_config.yaml @@ -503,6 +503,18 @@ parameters: External URL of the API server that frontend connects to. links: [] + - id: 'studio.openai_api_key' + title: 'studio.openai_api_key' + tags: ['dashboard'] + required: false + default: 'env(OPENAI_API_KEY)' + description: | + OpenAI API key used for AI features in the Studio dashboard. + DO NOT commit your OpenAI API key to git. Use environment variable substitution instead. + links: + - name: 'OpenAI API Keys' + link: 'https://platform.openai.com/api-keys' + - id: 'inbucket.enabled' title: 'inbucket.enabled' tags: ['local'] diff --git a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx index 2bb77ae57da..d1835325c94 100644 --- a/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/AIAssistant.tsx @@ -511,7 +511,9 @@ export const AIAssistant = ({ title="OpenAI API key not set" description={ } /> From 578248e52af6a8a7ca12d6638c702c1184f34248 Mon Sep 17 00:00:00 2001 From: Joel Lee Date: Thu, 2 Jan 2025 13:46:48 +0200 Subject: [PATCH 32/56] feat: remove Joel from humans.txt (#32388) --- apps/docs/public/humans.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index 73b70492351..69fb2aae602 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -41,7 +41,6 @@ Inian P Ivan Vasilov Jenny Kibiri Jess Shears -Joel Lee John Pena Jon M Jonny Summers-Muir From 35286ed4642848c1223617c0d5a9d3bc13eb0d27 Mon Sep 17 00:00:00 2001 From: Pamela Chia Date: Thu, 2 Jan 2025 20:01:21 +0800 Subject: [PATCH 33/56] chore: add ai assistant event docs (#32394) * chore: add ai assistant event docs * fix: added more details on ai assistant suggestion events * fix: clarify page in description * fix: rename and re specify the events --- .../interfaces/SQLEditor/SQLEditor.tsx | 10 ++- .../ui/AIAssistantPanel/SqlSnippet.tsx | 12 ++- .../data/telemetry/send-event-mutation.ts | 10 +++ apps/studio/lib/constants/telemetry.ts | 79 +++++++++++++++++-- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx index fd4d7194cfb..bd303330e38 100644 --- a/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx +++ b/apps/studio/components/interfaces/SQLEditor/SQLEditor.tsx @@ -421,7 +421,10 @@ export const SQLEditor = () => { } } - sendEvent({ action: TelemetryActions.ASSISTANT_SUGGESTION_ACCEPTED }) + sendEvent({ + action: TelemetryActions.ASSISTANT_SQL_DIFF_HANDLER_EVALUATED, + properties: { handlerAccepted: true }, + }) setSelectedDiffType(DiffType.Modification) resetPrompt() @@ -442,7 +445,10 @@ export const SQLEditor = () => { ]) const discardAiHandler = useCallback(() => { - sendEvent({ action: TelemetryActions.ASSISTANT_SUGGESTION_REJECTED }) + sendEvent({ + action: TelemetryActions.ASSISTANT_SQL_DIFF_HANDLER_EVALUATED, + properties: { handlerAccepted: false }, + }) resetPrompt() closeDiff() }, [closeDiff, resetPrompt, sendEvent]) diff --git a/apps/studio/components/ui/AIAssistantPanel/SqlSnippet.tsx b/apps/studio/components/ui/AIAssistantPanel/SqlSnippet.tsx index 47b3d10a056..87701f56f12 100644 --- a/apps/studio/components/ui/AIAssistantPanel/SqlSnippet.tsx +++ b/apps/studio/components/ui/AIAssistantPanel/SqlSnippet.tsx @@ -213,7 +213,7 @@ export const SqlCard = ({ }) sendEvent({ - action: TelemetryActions.ASSISTANT_SUGGESTION_RAN, + action: TelemetryActions.ASSISTANT_SUGGESTION_RUN_QUERY_CLICKED, properties: { type: 'mutation', category: identifyQueryType(sql) ?? 'unknown', @@ -261,7 +261,13 @@ export const SqlCard = ({ icon={} onClick={() => { handleEditInSQLEditor() - sendEvent({ action: TelemetryActions.ASSISTANT_EDIT_SQL_CLICKED }) + sendEvent({ + action: TelemetryActions.ASSISTANT_EDIT_IN_SQL_EDITOR_CLICKED, + properties: { + isInSQLEditor, + isInNewSnippet, + }, + }) }} tooltip={{ content: { side: 'bottom', text: 'Edit in SQL Editor' } }} /> @@ -306,7 +312,7 @@ export const SqlCard = ({ handleExecute() if (isReadOnlySelect(sql)) { sendEvent({ - action: TelemetryActions.ASSISTANT_SUGGESTION_RAN, + action: TelemetryActions.ASSISTANT_SUGGESTION_RUN_QUERY_CLICKED, properties: { type: 'select' }, }) } diff --git a/apps/studio/data/telemetry/send-event-mutation.ts b/apps/studio/data/telemetry/send-event-mutation.ts index 9ee61e52e9a..ed38f2d7a76 100644 --- a/apps/studio/data/telemetry/send-event-mutation.ts +++ b/apps/studio/data/telemetry/send-event-mutation.ts @@ -30,6 +30,11 @@ import { RealtimeInspectorCopyMessageClickedEvent, RealtimeInspectorFiltersAppliedEvent, RealtimeInspectorDatabaseRoleUpdatedEvent, + AssistantPromptSubmittedEvent, + AssistantDebugSubmittedEvent, + AssistantSuggestionRunQueryClickedEvent, + AssistantSqlDiffHandlerEvaluatedEvent, + AssistantEditInSqlEditorClickedEvent, } from 'lib/constants/telemetry' import { useRouter } from 'next/router' import type { ResponseError } from 'types' @@ -59,6 +64,11 @@ export type SendEventVariables = | SqlEditorResultDownloadCsvClickedEvent | SqlEditorResultCopyMarkdownClickedEvent | SqlEditorResultCopyJsonClickedEvent + | AssistantPromptSubmittedEvent + | AssistantDebugSubmittedEvent + | AssistantSuggestionRunQueryClickedEvent + | AssistantSqlDiffHandlerEvaluatedEvent + | AssistantEditInSqlEditorClickedEvent // TODO remove this once all events are documented | { diff --git a/apps/studio/lib/constants/telemetry.ts b/apps/studio/lib/constants/telemetry.ts index 8b9c691c1fe..4d636fe8abd 100644 --- a/apps/studio/lib/constants/telemetry.ts +++ b/apps/studio/lib/constants/telemetry.ts @@ -6,11 +6,9 @@ export enum TelemetryActions { ASSISTANT_PROMPT_SUBMITTED = 'assistant_prompt_submitted', ASSISTANT_DEBUG_SUBMITTED = 'assistant_debug_submitted', - ASSISTANT_SUGGESTION_RAN = 'assistant_suggestion_ran', - ASSISTANT_SUGGESTION_ACCEPTED = 'assistant_suggestion_accepted', - ASSISTANT_SUGGESTION_REJECTED = 'assistant_suggestion_rejected', - ASSISTANT_SUGGESTION_COPIED = 'assistant_suggestion_copied', - ASSISTANT_EDIT_SQL_CLICKED = 'assistant_edit_sql_clicked', + ASSISTANT_SUGGESTION_RUN_QUERY_CLICKED = 'assistant_suggestion_run_query_clicked', + ASSISTANT_SQL_DIFF_HANDLER_EVALUATED = 'assistant_sql_diff_handler_evaluated', + ASSISTANT_EDIT_IN_SQL_EDITOR_CLICKED = 'assistant_edit_in_sql_editor_clicked', CONNECTION_STRING_COPIED = 'connection_string_copied', @@ -372,3 +370,74 @@ export interface SqlEditorResultCopyMarkdownClickedEvent { export interface SqlEditorResultCopyJsonClickedEvent { action: TelemetryActions.SQL_EDITOR_RESULT_COPY_JSON_CLICKED } + +/** + * User submitted a prompt to the assistant sidebar. + * + * @group Events + * @source studio + */ +export interface AssistantPromptSubmittedEvent { + action: TelemetryActions.ASSISTANT_PROMPT_SUBMITTED +} + +/** + * User submitted a debug request to the assistant sidebar or prompt submitted has Help me to debug. + * + * @group Events + * @source studio + */ +export interface AssistantDebugSubmittedEvent { + action: TelemetryActions.ASSISTANT_DEBUG_SUBMITTED +} + +/** + * User clicked the run query button in the suggestion provided in the assistant sidebar. + * + * @group Events + * @source studio + */ +export interface AssistantSuggestionRunQueryClickedEvent { + action: TelemetryActions.ASSISTANT_SUGGESTION_RUN_QUERY_CLICKED + properties: { + /** + * The type of suggestion that was run by the user. Mutate or Select query types only. + */ + queryType: string + category?: string + } +} + +/** + * User accepted or rejected changes in sql ai diff handler. They can accept change by clicking accept button or typing shortcut (CMD+Enter) or reject by clicking reject button or typing shortcut (Esc). Handler only appears after clicking any dropdown option in Edit in Sql Editor in suggestion provided by the assistant. The dropdown options only appear in any page with 'sql' in url. + * + * @group Events + * @source studio + * @page /dashboard/project/{ref}/sql + */ +export interface AssistantSqlDiffHandlerEvaluatedEvent { + action: TelemetryActions.ASSISTANT_SQL_DIFF_HANDLER_EVALUATED + properties: { + /** + * Whether the user accepted or rejected the changes. + */ + handlerAccepted: boolean + } +} + +/** + * User clicked Edit in SQL Editor button in the assistant sidebar when user is in any page that does not have 'sql' in url or is in a new snippet. + * + * @group Events + * @source studio + */ +export interface AssistantEditInSqlEditorClickedEvent { + action: TelemetryActions.ASSISTANT_EDIT_IN_SQL_EDITOR_CLICKED + properties: { + /** + * Whether the user is in the SQL editor page or in a new snippet. + */ + isInSQLEditor: boolean + isInNewSnippet: boolean + } +} From 2d1783ab00c0cd672828257f33155e717e252161 Mon Sep 17 00:00:00 2001 From: Oliver Rice Date: Thu, 2 Jan 2025 08:07:45 -0600 Subject: [PATCH 34/56] Revert "Remove pg_repack from docs" (#32393) * Revert "Remove pg_repack from docs (#18476)" This reverts commit f2508d2e8246b8a5e29137ea7c67420f3056bcaa. * update pg_repack docs * prettier --- .../NavigationMenu.constants.ts | 4 + .../guides/database/extensions/pg_repack.mdx | 99 +++++++++++++++++++ packages/shared-data/extensions.json | 6 ++ 3 files changed, 109 insertions(+) create mode 100644 apps/docs/content/guides/database/extensions/pg_repack.mdx diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index d882244fc55..c1ddb63d4c1 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -1020,6 +1020,10 @@ export const database: NavMenuConstant = { name: 'pg_stat_statements: SQL Planning and Execution Statistics', url: '/guides/database/extensions/pg_stat_statements', }, + { + name: 'pg_repack: Storage Optimization', + url: '/guides/database/extensions/pg_repack', + }, { name: 'PostGIS: Geo queries', url: '/guides/database/extensions/postgis', diff --git a/apps/docs/content/guides/database/extensions/pg_repack.mdx b/apps/docs/content/guides/database/extensions/pg_repack.mdx new file mode 100644 index 00000000000..b9416f2349a --- /dev/null +++ b/apps/docs/content/guides/database/extensions/pg_repack.mdx @@ -0,0 +1,99 @@ +--- +id: 'pg_repack' +title: 'pg_repack: Physical storage optimization and maintenance' +description: 'A tool to remove bloat from tables and indexes and optimize physical data order and physical storage' +--- + +[pg_repack](https://github.com/reorg/pg_repack) is a Postgres extension to remove bloat from tables and indexes, and optionally restore the physical order of clustered indexes. Unlike CLUSTER and VACUUM FULL, pg_repack runs "online" and does not hold a exclusive locks on the processed tables that could prevent ongoing database operations. pg_repack's efficiency is comparable to using CLUSTER directly. + +pg_repack provides the following methods to optimize physical storage: + +- Online CLUSTER: ordering table data by cluster index in a non-blocking way +- Ordering table data by specified columns +- Online VACUUM FULL: packing rows only in a non-blocking way +- Rebuild or relocate only the indexes of a table + +pg_repack has 2 components, the database extension and a client-side CLI to control it. + +## Requirements + +- A target table must have a PRIMARY KEY, or a UNIQUE total index on a NOT NULL column. +- Performing a full-table repack requires free disk space about twice as large as the target table and its indexes. + +pg_repack requires the Postgres superuser role by default. That role is not available to users on the Supabase platform. To avoid that requirement, use the `-k` or `--no-superuser-check` flags on every `pg_repack` CLI command. + +The first version of pg_repack with full support for non-superuser repacking is 1.5.2. You can check the version installed on your Supabase instance using + +```sql +select default_version +from pg_available_extensions +where name = 'pg_repack'; +``` + +If pg_repack is not present, or the version is < 1.5.2, [upgrade to the latest version](/docs/guides/platform/upgrading) of Supabase to gain access. + +## Usage + +### Enable the extension + +Get started with pg_repack by enabling the extension in the Supabase Dashboard. + + + + +1. Go to the [Database](https://supabase.com/dashboard/project/_/database/tables) page in the Dashboard. +2. Click on **Extensions** in the sidebar. +3. Search for "pg_repack" and enable the extension. + + + + +{/* prettier-ignore */} +```sql +-- Example: enable the "pg_repack" extension +create extension pg_repack with schema extensions; +``` + + + + +### Install the CLI + +Select an option from the pg_repack docs to [install the client CLI](https://reorg.github.io/pg_repack/#download). + +### Syntax + +All pg_repack commands should include the `-k` flag to skip the client-side superuser check. + +{/* prettier-ignore */} +```sh +pg_repack -k [OPTION]... [DBNAME] +``` + +## Example + +Perform an online `VACUUM FULL` on the tables `public.foo` and `public.bar` in the database `postgres`: + +{/* prettier-ignore */} +```sh +pg_repack -k -h db..supabase.co -p 5432 -U postgres -d postgres --no-order --table public.foo --table public.bar +``` + +See the [official pg_repack documentation](https://reorg.github.io/pg_repack/) for the full list of options. + +## Limitations + +- pg_repack cannot reorganize temporary tables. +- pg_repack cannot cluster tables by GiST indexes. +- You cannot perform DDL commands of the target tables except VACUUM or ANALYZE while pg_repack is working. + pg_repack holds an ACCESS SHARE lock on the target table to enforce this restriction. + +## Resources + +- [Official pg_repack documentation](https://reorg.github.io/pg_repack/) diff --git a/packages/shared-data/extensions.json b/packages/shared-data/extensions.json index c1752b0abea..5ea2d9fe7ae 100644 --- a/packages/shared-data/extensions.json +++ b/packages/shared-data/extensions.json @@ -599,6 +599,12 @@ "product": "Supabase Vector", "product_url": null }, + { + "name": "pg_repack", + "comment": "Optimize physical storage and remove bloat from tables and indexes", + "tags": ["Admin", "Utility"], + "link": "/guides/database/extensions/pg_repack" + }, { "name": "wrappers", "comment": "Foreign data wrappers developed by Supabase", From 8c854368dae107606e34d5591ac4959b3f2a35e8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:05:08 +0000 Subject: [PATCH 35/56] feat: update mgmt api docs (#31297) Co-authored-by: phamhieu <689843+phamhieu@users.noreply.github.com> Co-authored-by: Charis <26616127+charislam@users.noreply.github.com> --- apps/docs/spec/api_v1_openapi.json | 22 +++++++++- .../transforms/api_v1_openapi_deparsed.json | 42 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/apps/docs/spec/api_v1_openapi.json b/apps/docs/spec/api_v1_openapi.json index 3802f4ea3f4..5ecb7b3a1a1 100644 --- a/apps/docs/spec/api_v1_openapi.json +++ b/apps/docs/spec/api_v1_openapi.json @@ -336,6 +336,25 @@ "operationId": "v1-list-all-snippets", "summary": "Lists SQL snippets for the logged in user", "parameters": [ + { "name": "cursor", "required": false, "in": "query", "schema": { "type": "string" } }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { "type": "string", "minimum": 1, "maximum": 100 } + }, + { + "name": "sort_by", + "required": false, + "in": "query", + "schema": { "enum": ["name", "inserted_at"], "type": "string" } + }, + { + "name": "sort_order", + "required": false, + "in": "query", + "schema": { "enum": ["asc", "desc"], "type": "string" } + }, { "name": "project_ref", "required": false, @@ -3062,7 +3081,8 @@ "SnippetList": { "type": "object", "properties": { - "data": { "type": "array", "items": { "$ref": "#/components/schemas/SnippetMeta" } } + "data": { "type": "array", "items": { "$ref": "#/components/schemas/SnippetMeta" } }, + "cursor": { "type": "string" } }, "required": ["data"] }, diff --git a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json index f6305737fb3..50b2c52dae6 100644 --- a/apps/docs/spec/transforms/api_v1_openapi_deparsed.json +++ b/apps/docs/spec/transforms/api_v1_openapi_deparsed.json @@ -990,6 +990,42 @@ "operationId": "v1-list-all-snippets", "summary": "Lists SQL snippets for the logged in user", "parameters": [ + { + "name": "cursor", + "required": false, + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "required": false, + "in": "query", + "schema": { + "type": "string", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "sort_by", + "required": false, + "in": "query", + "schema": { + "enum": ["name", "inserted_at"], + "type": "string" + } + }, + { + "name": "sort_order", + "required": false, + "in": "query", + "schema": { + "enum": ["asc", "desc"], + "type": "string" + } + }, { "name": "project_ref", "required": false, @@ -1087,6 +1123,9 @@ "updated_by" ] } + }, + "cursor": { + "type": "string" } }, "required": ["data"] @@ -10798,6 +10837,9 @@ "updated_by" ] } + }, + "cursor": { + "type": "string" } }, "required": ["data"] From fbee5c550b8d01f51a9cded6cb1d5efed689a4f2 Mon Sep 17 00:00:00 2001 From: Adel <78964536+AdelAskri@users.noreply.github.com> Date: Thu, 2 Jan 2025 19:10:39 +0100 Subject: [PATCH 36/56] fix(docs): correct typo in create unlogged queue (#31826) --- apps/docs/content/guides/queues/pgmq.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/content/guides/queues/pgmq.mdx b/apps/docs/content/guides/queues/pgmq.mdx index 9e057e84368..400cedd776d 100644 --- a/apps/docs/content/guides/queues/pgmq.mdx +++ b/apps/docs/content/guides/queues/pgmq.mdx @@ -49,7 +49,7 @@ select from pgmq.create('my_queue'); #### `create_unlogged` -Creates an unlogged table. This is useful when write throughput is more important that durability. +Creates an unlogged table. This is useful when write throughput is more important than durability. See Postgres documentation for [unlogged tables](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-UNLOGGED) for more information. {/* prettier-ignore */} From 6ed0ee3625d72b0d62a05b862fe35d77ad37b75e Mon Sep 17 00:00:00 2001 From: Lakhveer Singh Date: Fri, 3 Jan 2025 01:54:14 +0530 Subject: [PATCH 37/56] fix: grammatical error in supavisor transaction mode explanation (#32508) Co-authored-by: Charis <26616127+charislam@users.noreply.github.com> --- apps/docs/content/guides/database/connecting-to-postgres.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/content/guides/database/connecting-to-postgres.mdx b/apps/docs/content/guides/database/connecting-to-postgres.mdx index d866f655bf8..0dbb2ec3fd6 100644 --- a/apps/docs/content/guides/database/connecting-to-postgres.mdx +++ b/apps/docs/content/guides/database/connecting-to-postgres.mdx @@ -100,7 +100,7 @@ Get your project's session mode string from the [Database Settings](/dashboard/p ## Supavisor transaction mode -The transaction mode connection string connects to your Postgres instance via a proxy which serves as a connection pooler. This is deal for serverless or edge functions, which require many transient connections. +The transaction mode connection string connects to your Postgres instance via a proxy which serves as a connection pooler. This is ideal for serverless or edge functions, which require many transient connections. From c3b4878539e159b55db32e668ae068d0a58cfc31 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Thu, 2 Jan 2025 20:26:24 +0000 Subject: [PATCH 38/56] docs(python): add resumable uploads example (#32517) docs(puthon): add resumable uploads example --- .../storage/uploads/resumable-uploads.mdx | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx index eaeceb400e4..635ab2207d0 100644 --- a/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx +++ b/apps/docs/content/guides/storage/uploads/resumable-uploads.mdx @@ -205,6 +205,53 @@ Supabase Storage implements the [TUS protocol](https://tus.io/) to enable resuma ``` + + + + Here's an example of how to upload a file using [`tus-py-client`](https://github.com/tus/tus-py-client): + + ```python + from io import BufferedReader + from tusclient import client + from supabase import create_client + + def upload_file( + bucket_name: str, file_name: str, file: BufferedReader, access_token: str + ): + # create Tus client + my_client = client.TusClient( + f"{supabase_url}/storage/v1/upload/resumable", + headers={"Authorization": f"Bearer {access_token}", "x-upsert": "true"}, + ) + uploader = my_client.uploader( + file_stream=file, + chunk_size=(6 * 1024 * 1024), + metadata={ + "bucketName": bucket_name, + "objectName": file_name, + "contentType": "image/png", + "cacheControl": "3600", + }, + ) + uploader.upload() + + # create client and sign in + supabase = create_client(supabase_url, supabase_key) + + # retrieve the current user's session for authentication + session = supabase.auth.get_session() + + # open file and send file stream to upload + with open("./assets/40mb.jpg", "rb") as fs: + upload_file( + bucket_name="assets", + file_name="large_file", + file=fs, + access_token=session.access_token, + ) + ``` + + ### Upload URL From d21a2a0cbc4c35693c09ae3e95bf8edc939d0ae6 Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:05:58 -0500 Subject: [PATCH 39/56] chore(ci): comment on external PRs (#32529) Comment on external PRs with some tips for speeding up review process --- .github/workflows/external-pr-comment.yml | 31 +++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/external-pr-comment.yml diff --git a/.github/workflows/external-pr-comment.yml b/.github/workflows/external-pr-comment.yml new file mode 100644 index 00000000000..c6a906e7f33 --- /dev/null +++ b/.github/workflows/external-pr-comment.yml @@ -0,0 +1,31 @@ +name: Comment on external PRs + +on: + pull_request_target: + types: [opened] + +permissions: + pull-requests: write + +jobs: + comment-on-external-pr: + runs-on: ubuntu-latest + if: github.event.pull_request.repository.full_name != github.repository + steps: + - name: Comment on PR + uses: actions/github-script@v7 + with: + script: | + const commentBody = ` + Thanks for contributing to Supabase! ❤️ Our team will review your PR. + + A few tips for a smoother review process: + - If you have a local version of the repo, run \`pnpm run format\` to make sure formatting checks pass. + - Once we've reviewed your PR, please don't trivially merge master (don't click \`Update branch\` if there are no merge conflicts to be fixed). This invalidates any pre-merge checks we've run. + `; + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: commentBody + }); From 4f6b2be1781dc2f605fe833d9e150d4a2996b65b Mon Sep 17 00:00:00 2001 From: Charis <26616127+charislam@users.noreply.github.com> Date: Thu, 2 Jan 2025 17:27:21 -0500 Subject: [PATCH 40/56] fix(ci): comments also appearing on internal prs (#32538) --- .github/workflows/external-pr-comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/external-pr-comment.yml b/.github/workflows/external-pr-comment.yml index c6a906e7f33..5e3c36dd358 100644 --- a/.github/workflows/external-pr-comment.yml +++ b/.github/workflows/external-pr-comment.yml @@ -10,7 +10,7 @@ permissions: jobs: comment-on-external-pr: runs-on: ubuntu-latest - if: github.event.pull_request.repository.full_name != github.repository + if: github.event.pull_request.head.repo.full_name != github.repository steps: - name: Comment on PR uses: actions/github-script@v7 From 91371a3d8feee42903fbabfaafa2b497f30223dc Mon Sep 17 00:00:00 2001 From: Monica Khoury <99693443+monicakh@users.noreply.github.com> Date: Fri, 3 Jan 2025 00:34:47 +0200 Subject: [PATCH 41/56] Fix: change the colour of the 'failed' badge for the cron UI (#32533) * Fix: change the colour of the 'failed' badge for the cron UI * simplify implementation --------- Co-authored-by: Alaister Young --- .../interfaces/Integrations/CronJobs/CronJobCard.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx index a1c980eb923..a7dcafb173c 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobCard.tsx @@ -146,7 +146,10 @@ export const CronJobCard = ({ job, onEditCronJob, onDeleteCronJob }: CronJobCard className="font-sans text-sm" /> {data?.status && ( - + {data.status} )} From fb92efb805243b9172e90a8e29cc1e2c480d85fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20Caba=C3=A7o?= Date: Thu, 2 Jan 2025 22:45:30 +0000 Subject: [PATCH 42/56] fix: handle typos (#31226) --- .../interfaces/Integrations/CronJobs/CronJobs.utils.ts | 2 +- apps/www/_blog/2024-08-12-postgres-new.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts index 41fe71637d2..317bfed450d 100644 --- a/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts +++ b/apps/studio/components/interfaces/Integrations/CronJobs/CronJobs.utils.ts @@ -52,7 +52,7 @@ export const parseCronJobCommand = (originalCommand: string): CronJobType => { /select net\.([^']+)\(\s*url:='([^']+)',\s*headers:=jsonb_build_object\(([^)]*)\),(?:\s*body:='(.*)',)?\s*timeout_milliseconds:=(\d+) \)/i ) || [] - // if the match has been unsuccesful, the cron may be created with the previous encoding/parsing. + // if the match has been unsuccessful, the cron may be created with the previous encoding/parsing. if (matches.length === 0) { matches = command.match( diff --git a/apps/www/_blog/2024-08-12-postgres-new.mdx b/apps/www/_blog/2024-08-12-postgres-new.mdx index 85bf3d1cae0..d1ede74b34e 100644 --- a/apps/www/_blog/2024-08-12-postgres-new.mdx +++ b/apps/www/_blog/2024-08-12-postgres-new.mdx @@ -198,7 +198,7 @@ None of this would be possible without [PGlite](https://pglite.dev/), developed - **Local development:** You can use PGlite as an alternative to a full local Postgres for development; simplifying your development environments. - **Remote development, or local web containers:** As PGlite is so lightweight it can be easily embedded into remote containerised development environments, or in-browser web containers -### Data persistance +### Data persistence PGlite supports multiple backends for data persistence: From 003493e03488dcdba8f2621012487017867e7e30 Mon Sep 17 00:00:00 2001 From: TheOtherBrian1 <91111415+TheOtherBrian1@users.noreply.github.com> Date: Thu, 2 Jan 2025 18:29:52 -0500 Subject: [PATCH 43/56] add beekeeper studio to docs (#31240) Co-authored-by: Brian Brennglass --- .../NavigationMenu.constants.ts | 4 + .../guides/database/beekeeper-studio.mdx | 81 ++++++++++++++++++ .../beekeeper-credentials.png | Bin 0 -> 62214 bytes .../certificate-beekeeper.png | Bin 0 -> 80742 bytes .../beekeeper-studio/certificate.png | Bin 0 -> 40222 bytes .../beekeeper-studio/connect.png | Bin 0 -> 17129 bytes .../beekeeper-studio/new-connection.png | Bin 0 -> 106493 bytes 7 files changed, 85 insertions(+) create mode 100644 apps/docs/content/guides/database/beekeeper-studio.mdx create mode 100644 apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/beekeeper-credentials.png create mode 100644 apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate-beekeeper.png create mode 100644 apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate.png create mode 100644 apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/connect.png create mode 100644 apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/new-connection.png diff --git a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts index c1ddb63d4c1..26b092a7509 100644 --- a/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts +++ b/apps/docs/components/Navigation/NavigationMenu/NavigationMenu.constants.ts @@ -771,6 +771,10 @@ const guiQuickstarts: NavMenuSection = { name: 'Metabase', url: '/guides/database/metabase', }, + { + name: 'Beekeeper Studio', + url: '/guides/database/beekeeper-studio', + }, ], } diff --git a/apps/docs/content/guides/database/beekeeper-studio.mdx b/apps/docs/content/guides/database/beekeeper-studio.mdx new file mode 100644 index 00000000000..59145196cb7 --- /dev/null +++ b/apps/docs/content/guides/database/beekeeper-studio.mdx @@ -0,0 +1,81 @@ +--- +id: 'Beekeeper Studio' +title: 'Connecting with Beekeeper Studio' +breadcrumb: 'GUI Quickstarts' +hideToc: true +--- + +[`Beekeeper Studio Community`](https://www.beekeeperstudio.io/get-community) is a free GUI tool for interacting with databases. + + + + + + + + In Beekeeper, create a new Postgres connection. + + + + + ![Postgres connection](/docs/img/guides/database/connecting-to-postgres/beekeeper-studio/new-connection.png) + + + + + + + + + + Get your connection credentials from the [`Database Settings`](https://supabase.com/dashboard/project/_/settings/database). You will need: + - host + - username + - password + - port + + + + + + Add your credentials to Beekeeper's connection form + + ![Credentials](/docs/img/guides/database/connecting-to-postgres/beekeeper-studio/beekeeper-credentials.png) + + + + + + + + + + Download your SSL certificate from the Dashboard's [`Database Settings`](https://supabase.com/dashboard/project/_/settings/database) + ![SSL](/docs/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate.png) + + + + + Add your SSL to the connection form + ![SSL](/docs/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate-beekeeper.png) + + + + + + + + + + Test your connection and then connect + + + + + ![SSL](/docs/img/guides/database/connecting-to-postgres/beekeeper-studio/connect.png) + + + + + + diff --git a/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/beekeeper-credentials.png b/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/beekeeper-credentials.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf768d3764575b85d5537a4821b23fb2be33b10 GIT binary patch literal 62214 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate-beekeeper.png b/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate-beekeeper.png new file mode 100644 index 0000000000000000000000000000000000000000..fa072beb19eb44f76625a88d084b2622edcb434b GIT binary patch literal 80742 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate.png b/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/certificate.png new file mode 100644 index 0000000000000000000000000000000000000000..8c532535c233474ecfff44468c8f669bc387fc9d GIT binary patch literal 40222 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 literal 0 HcmV?d00001 diff --git a/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/new-connection.png b/apps/docs/public/img/guides/database/connecting-to-postgres/beekeeper-studio/new-connection.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4b7913a7c2b1ab222b0235717c5b3293c86fb0 GIT binary patch literal 106493 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

D*AbWBy{Il+>M`7I9BpfD7y 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%0De?iLHKRwfg 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 literal 0 HcmV?d00001 From 9567740566cecdb12a68346fabcf1349ea98104e Mon Sep 17 00:00:00 2001 From: hallidayo <22655069+Hallidayo@users.noreply.github.com> Date: Thu, 2 Jan 2025 23:49:19 +0000 Subject: [PATCH 44/56] deprecated: alert - disk io bandwidth (#30703) * changed to shadcn alert * changed to use admonition * removed unused imports * removed blank strings --- .../DiskIOBandwidthWarnings.tsx | 120 +++++++++++------- 1 file changed, 75 insertions(+), 45 deletions(-) diff --git a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx index ca114a07351..7fda2bb1e39 100644 --- a/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx +++ b/apps/studio/components/interfaces/Billing/Usage/UsageWarningAlerts/DiskIOBandwidthWarnings.tsx @@ -1,5 +1,6 @@ import Link from 'next/link' -import { Alert, Button } from 'ui' +import { Button } from 'ui' +import { Admonition } from 'ui-patterns' // [Joshen] In the future, conditionals should be from resource exhaustion endpoint as single source of truth interface DiskIOBandwidthWarningsProps { @@ -21,66 +22,95 @@ const DiskIOBandwidthWarnings = ({ }: DiskIOBandwidthWarningsProps) => { if (hasLatest && latestIoBudgetConsumption >= 100) { return ( - -

- Your workload has used up all your Disk IO Budget and is now running at the baseline - performance. If you need consistent disk performance, consider upgrading to a larger - compute add-on. -

- - + +

+ Your workload has used up all your Disk IO Budget and is now running at the baseline + performance. If you need consistent disk performance, consider upgrading to a larger + compute add-on. +

+ + + } + /> ) } if (hasLatest && latestIoBudgetConsumption >= 80) { return ( - -

- Your workload has consumed {latestIoBudgetConsumption}% of your Disk IO Budget. If you use - up all your Disk IO Budget, your instance will reverted to baseline performance. If you - need consistent disk performance, consider upgrading to a larger compute add-on. -

- -
+ +

+ Your workload has consumed {latestIoBudgetConsumption}% of your Disk IO Budget. If you + use up all your Disk IO Budget, your instance will reverted to baseline performance. + If you need consistent disk performance, consider upgrading to a larger compute + add-on. +

+ + + } + /> ) } if (currentBillingCycleSelected && highestIoBudgetConsumption >= 100) { return ( - -

- Your workload has used up all your Disk IO Budget and reverted to baseline performance at - least once during this billing cycle. If you need consistent disk performance, consider - upgrading to a larger compute add-on. -

- -
+ +

+ Your workload has used up all your Disk IO Budget and reverted to baseline performance + at least once during this billing cycle. If you need consistent disk performance, + consider upgrading to a larger compute add-on. +

+ + + } + /> ) } if (currentBillingCycleSelected && highestIoBudgetConsumption >= 80) { return ( - -

- Your workload has consumed {highestIoBudgetConsumption}% of your Disk IO budget during - this billing cycle. If you use up all your Disk IO Budget, your instance will reverted to - baseline performance. If you need consistent disk performance, consider upgrading to a - larger compute add-on. -

- -
+ description={ + <> +

+ Your workload has consumed {highestIoBudgetConsumption}% of your Disk IO budget during + this billing cycle. If you use up all your Disk IO Budget, your instance will reverted + to baseline performance. If you need consistent disk performance, consider upgrading + to a larger compute add-on. +

+ + + } + /> ) } From ac8157525c027e22f99b90ba4f1de9b404a17931 Mon Sep 17 00:00:00 2001 From: Joel Lee Date: Fri, 3 Jan 2025 09:46:21 +0200 Subject: [PATCH 45/56] fix: add link to password reset from react native (#31322) --- apps/docs/content/guides/auth/native-mobile-deep-linking.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/content/guides/auth/native-mobile-deep-linking.mdx b/apps/docs/content/guides/auth/native-mobile-deep-linking.mdx index 603bed79bf3..ba96b451495 100644 --- a/apps/docs/content/guides/auth/native-mobile-deep-linking.mdx +++ b/apps/docs/content/guides/auth/native-mobile-deep-linking.mdx @@ -9,7 +9,7 @@ Many Auth methods involve a redirect to your app. For example: - Signup confirmation emails, Magic Link signins, and password reset emails contain a link that redirects to your app. - In OAuth signins, an automatic redirect occurs to your app. -With Deep Linking, you can configure this redirect to open a specific page. This is necessary if, for example, you need to display a form for password reset, or to manually exchange a token hash. +With Deep Linking, you can configure this redirect to open a specific page. This is necessary if, for example, you need to display a form for [password reset](/docs/guides/auth/passwords#resetting-a-users-password-forgot-password), or to manually exchange a token hash. ## Setting up deep linking From aac7ae8279cf946e68c20f9fbf37013582d90760 Mon Sep 17 00:00:00 2001 From: Joel Lee Date: Fri, 3 Jan 2025 09:46:47 +0200 Subject: [PATCH 46/56] fix: update role recommendations for Postgres Hooks (#31323) * fix: update role recommendations for Postgres Hooks * fix: add newline between description * fix: run npm format --- apps/docs/content/guides/auth/auth-hooks.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/docs/content/guides/auth/auth-hooks.mdx b/apps/docs/content/guides/auth/auth-hooks.mdx index 94118f245a5..960e19d5d37 100644 --- a/apps/docs/content/guides/auth/auth-hooks.mdx +++ b/apps/docs/content/guides/auth/auth-hooks.mdx @@ -79,11 +79,11 @@ revoke execute from authenticated, anon, public; ``` - +You will need to alter your row-level security (RLS) policies to allow the `supabase_auth_admin` role to access tables that you have RLS policies on. You can read more about RLS policies [here](/docs/guides/database/postgres/row-level-security). -We do not recommend creating postgres functions with the `security definer` tag. The `security definer` tag specifies that the function is to be executed with the privileges of the user that owns it. Read more about the `security definer` tag [in our database guide](/docs/guides/database/functions#security-definer-vs-invoker). +Alternatively, you can create your postgres function via the dashboard with the `security definer` tag. The `security definer` tag specifies that the function is to be executed with the privileges of the user that owns it. - +Currently, functions created via the dashboard take on the `postgres` role. Read more about the `security definer` tag [in our database guide](/docs/guides/database/functions#security-definer-vs-invoker) From a069a1e836ec821e03b179db1e8eb41bcc2a76d6 Mon Sep 17 00:00:00 2001 From: Hieu Date: Fri, 3 Jan 2025 15:14:46 +0700 Subject: [PATCH 47/56] feat: expose analytics OAuth scopes (#32543) feat: expose analytics Oauth scopes --- .../Organization/OAuthApps/AuthorizeRequesterDetails.tsx | 5 +++++ .../Organization/OAuthApps/PublishAppSidePanel/Scopes.tsx | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizeRequesterDetails.tsx b/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizeRequesterDetails.tsx index a8590363441..fe2a4ce16fb 100644 --- a/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizeRequesterDetails.tsx +++ b/apps/studio/components/interfaces/Organization/OAuthApps/AuthorizeRequesterDetails.tsx @@ -78,6 +78,11 @@ const AuthorizeRequesterDetails = ({ selected organization and all of its projects.

+ { return (
+ Date: Fri, 3 Jan 2025 13:25:00 +0100 Subject: [PATCH 48/56] chore: Bump next to non-vulnerable version (#31277) * Add next to pnpm catalog and use that next version from all apps and packages. * Remove vite direct dependency. * Set the @types/node to version 20. * Stabilize supports-color by adding it in the main package.json. This will make it appear in all packages that have it as optional. * Use built-in matchers for vitest in @testing-library/jest-dom. * Add libpg-query as a dependency to docs. * Remove nextjs-node-loader for the built-in external packages feature on nextjs. * Clean up extra comment. --- apps/design-system/package.json | 3 +- apps/docs/next.config.mjs | 26 +- apps/docs/package.json | 6 +- apps/studio/package.json | 4 +- .../tests/setup/testing-library-matchers.js | 9 - apps/studio/tests/vitestSetup.ts | 8 + apps/studio/vitest.config.mts | 10 +- apps/www/package.json | 3 +- package.json | 2 + packages/ai-commands/package.json | 1 + packages/common/package.json | 2 +- packages/ui-patterns/package.json | 4 +- packages/ui-patterns/vitest.config.ts | 4 +- packages/ui-patterns/vitest.setup.ts | 5 +- packages/ui/package.json | 4 +- packages/ui/vitest.config.ts | 4 +- packages/ui/vitest.setup.ts | 6 +- playwright-tests/package.json | 3 +- pnpm-lock.yaml | 2318 ++++++----------- pnpm-workspace.yaml | 6 +- tests/package.json | 2 +- 21 files changed, 829 insertions(+), 1601 deletions(-) delete mode 100644 apps/studio/tests/setup/testing-library-matchers.js diff --git a/apps/design-system/package.json b/apps/design-system/package.json index e947582604c..8a5e56ce5a2 100644 --- a/apps/design-system/package.json +++ b/apps/design-system/package.json @@ -23,7 +23,7 @@ "lodash.template": "4.5.0", "lucide-react": "*", "markdown-wasm": "^1.2.0", - "next": "^14.2.10", + "next": "catalog:", "next-contentlayer2": "0.4.6", "next-themes": "^0.3.0", "react": "^18.2.0", @@ -49,7 +49,6 @@ "devDependencies": { "@shikijs/compat": "^1.1.7", "@types/lodash.template": "4.5.0", - "@types/node": "^20", "@types/react": "^18.2.65", "@types/react-dom": "^18.2.22", "autoprefixer": "^10.0.1", diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs index 167677a302d..d2b12e7ea74 100644 --- a/apps/docs/next.config.mjs +++ b/apps/docs/next.config.mjs @@ -1,7 +1,6 @@ // @ts-check import { remarkCodeHike } from '@code-hike/mdx' import nextMdx from '@next/mdx' -import os from 'node:os' import rehypeSlug from 'rehype-slug' import remarkGfm from 'remark-gfm' @@ -61,30 +60,7 @@ const nextConfig = { '/guides/**/*': ['./content/guides/**/*', './content/troubleshooting/**/*'], '/reference/**/*': ['./features/docs/generated/**/*', './docs/ref/**/*'], }, - }, - webpack: (config, options) => { - /** - * The SQL to REST API translator relies on libpg-query, which packages a - * native Node.js module that wraps the Postgres query parser. - * - * The default webpack config can't load native modules, so we need a custom - * loader for it, which calls process.dlopen to load C++ Addons. - * - * See https://github.com/eisberg-labs/nextjs-node-loader - */ - config.module.rules.push({ - test: /\.node$/, - use: [ - { - loader: 'nextjs-node-loader', - options: { - flags: os.constants.dlopen.RTLD_NOW, - outputPath: config.output.path, - }, - }, - ], - }) - return config + serverComponentsExternalPackages: ['libpg-query'], }, async headers() { return [ diff --git a/apps/docs/package.json b/apps/docs/package.json index 6570afa9a6d..cff144eb3e0 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -61,6 +61,7 @@ "js-yaml": "^3.14.1", "jsrsasign": "^11.0.0", "katex": "^0.16.10", + "libpg-query": "15.2.0", "lodash": "^4.17.21", "lucide-react": "*", "markdown-toc": "^1.2.0", @@ -74,7 +75,7 @@ "mdast-util-to-string": "^3.1.1", "micromark-extension-gfm": "^2.0.3", "micromark-extension-mdxjs": "^1.0.0", - "next": "^14.2.10", + "next": "catalog:", "next-mdx-remote": "^4.4.1", "next-plugin-yaml": "^1.0.1", "next-seo": "^6.5.0", @@ -115,7 +116,7 @@ "@types/hast": "^2.3.4", "@types/jsrsasign": "^10.5.12", "@types/mdast": "^3.0.0", - "@types/node": "^20.11.16", + "@types/node": "catalog:", "@types/react": "^18.2.24", "@types/react-copy-to-clipboard": "^5.0.4", "@types/unist": "^2.0.6", @@ -125,7 +126,6 @@ "dotenv": "^16.0.3", "ejs": "^3.1.10", "globby": "^13.2.2", - "nextjs-node-loader": "^1.1.5", "npm-run-all": "^4.1.5", "openapi-types": "^12.1.3", "simple-git": "^3.24.0", diff --git a/apps/studio/package.json b/apps/studio/package.json index 5c95bfd08f6..9aebaccbf60 100644 --- a/apps/studio/package.json +++ b/apps/studio/package.json @@ -79,7 +79,7 @@ "mobx": "^6.10.2", "mobx-react-lite": "^4.0.5", "monaco-editor": "0.33.0", - "next": "^14.2.10", + "next": "catalog:", "next-themes": "^0.3.0", "nuqs": "^1.17.8", "openai": "^4.20.1", @@ -146,6 +146,7 @@ "@types/lodash": "^4.14.172", "@types/markdown-table": "^3.0.0", "@types/mime-db": "^1.43.5", + "@types/node": "catalog:", "@types/papaparse": "^5.3.1", "@types/randombytes": "^2.0.3", "@types/react": "^18.2.24", @@ -177,7 +178,6 @@ "next-router-mock": "^0.9.13", "postcss": "^8.4.31", "prettier": "3.2.4", - "supports-color": "5.5.0", "tailwindcss": "^3.4.1", "typescript": "~5.5.0" } diff --git a/apps/studio/tests/setup/testing-library-matchers.js b/apps/studio/tests/setup/testing-library-matchers.js deleted file mode 100644 index f533ae70ec8..00000000000 --- a/apps/studio/tests/setup/testing-library-matchers.js +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, afterEach } from 'vitest' -import { cleanup } from '@testing-library/react' -import * as matchers from '@testing-library/jest-dom/matchers' - -expect.extend(matchers) - -afterEach(() => { - cleanup() -}) diff --git a/apps/studio/tests/vitestSetup.ts b/apps/studio/tests/vitestSetup.ts index 704b2e8701a..d6ee8de7efb 100644 --- a/apps/studio/tests/vitestSetup.ts +++ b/apps/studio/tests/vitestSetup.ts @@ -1,3 +1,7 @@ +/// + +import '@testing-library/jest-dom/vitest' +import { cleanup } from '@testing-library/react' import { setupServer } from 'msw/node' import { createDynamicRouteParser } from 'next-router-mock/dist/dynamic-routes' import { afterAll, afterEach, beforeAll, vi } from 'vitest' @@ -33,3 +37,7 @@ beforeAll(() => { afterAll(() => mswServer.close()) afterEach(() => mswServer.resetHandlers()) + +afterEach(() => { + cleanup() +}) diff --git a/apps/studio/vitest.config.mts b/apps/studio/vitest.config.mts index c255ef58ca0..390de131082 100644 --- a/apps/studio/vitest.config.mts +++ b/apps/studio/vitest.config.mts @@ -1,9 +1,8 @@ -import { defineConfig } from 'vitest/config' -import tsconfigPaths from 'vite-tsconfig-paths' -import { fileURLToPath } from 'url' -import { resolve } from 'path' -import path from 'path' import react from '@vitejs/plugin-react' +import path, { resolve } from 'path' +import { fileURLToPath } from 'url' +import tsconfigPaths from 'vite-tsconfig-paths' +import { defineConfig } from 'vitest/config' // Some tools like Vitest VSCode extensions, have trouble with resolving relative paths, // as they use the directory of the test file as `cwd`, which makes them believe that @@ -32,7 +31,6 @@ export default defineConfig({ restoreMocks: true, setupFiles: [ resolve(dirname, './tests/vitestSetup.ts'), - resolve(dirname, './tests/setup/testing-library-matchers.js'), resolve(dirname, './tests/setup/polyfills.js'), resolve(dirname, './tests/setup/radix.js'), ], diff --git a/apps/www/package.json b/apps/www/package.json index e6ec5353f3a..4af7705a375 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -52,7 +52,7 @@ "lodash": "^4.0.0", "lucide-react": "*", "markdown-toc": "^1.2.0", - "next": "^14.2.10", + "next": "catalog:", "next-contentlayer2": "0.5.3", "next-mdx-remote": "^4.4.1", "next-seo": "^6.5.0", @@ -92,7 +92,6 @@ "@types/dat.gui": "^0.7.10", "@types/lodash": "^4.0.0", "@types/mdx-js__react": "^1.5.6", - "@types/node": "^20.11.16", "@types/parse-numeric-range": "^0.0.1", "@types/react": "^18.2.24", "@types/react-copy-to-clipboard": "^5.0.4", diff --git a/package.json b/package.json index dbc4242d245..8cd03a570a7 100644 --- a/package.json +++ b/package.json @@ -38,12 +38,14 @@ "api:codegen": "cd packages/api-types && pnpm run codegen" }, "devDependencies": { + "@types/node": "catalog:", "eslint": "^8.57.0", "prettier": "3.2.4", "prettier-plugin-sql-cst": "^0.11.0", "rimraf": "^6.0.0", "sass": "^1.72.0", "supabase": "^1.151.1", + "supports-color": "^8.0.0", "turbo": "2.0.4", "typescript": "~5.5.0" }, diff --git a/packages/ai-commands/package.json b/packages/ai-commands/package.json index 275d867abf6..cca078a1b06 100644 --- a/packages/ai-commands/package.json +++ b/packages/ai-commands/package.json @@ -24,6 +24,7 @@ "devDependencies": { "@ai-sdk/openai": "^0.0.72", "@types/common-tags": "^1.8.4", + "@types/node": "catalog:", "api-types": "workspace:*", "chalk": "^5.3.0", "dotenv": "^16.3.1", diff --git a/packages/common/package.json b/packages/common/package.json index 424fdaabf0a..9b6a54a54f8 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -28,7 +28,7 @@ "peerDependencies": { "@supabase/auth-js": "^2.63.0", "@supabase/supabase-js": "*", - "next": "*", + "next": "catalog:", "react": "*", "react-dom": "*" } diff --git a/packages/ui-patterns/package.json b/packages/ui-patterns/package.json index 32b3a1a393b..3ae95999281 100644 --- a/packages/ui-patterns/package.json +++ b/packages/ui-patterns/package.json @@ -51,16 +51,16 @@ "@testing-library/user-event": "^13.5.0", "@types/common-tags": "^1.8.4", "@types/lodash": "^4.17.5", + "@types/node": "catalog:", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "api-types": "workspace:*", "next-router-mock": "^0.9.13", "typescript": "~5.5.0", - "vite": "^5.2.14", "vitest": "^2.0.3" }, "peerDependencies": { - "next": "*", + "next": "catalog:", "react": "*", "react-dom": "*" } diff --git a/packages/ui-patterns/vitest.config.ts b/packages/ui-patterns/vitest.config.ts index 8623a6c59bf..8506bb4f23a 100644 --- a/packages/ui-patterns/vitest.config.ts +++ b/packages/ui-patterns/vitest.config.ts @@ -1,6 +1,4 @@ -/// - -import { defineConfig } from 'vite' +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { diff --git a/packages/ui-patterns/vitest.setup.ts b/packages/ui-patterns/vitest.setup.ts index a4f40c8d8d0..685e5448170 100644 --- a/packages/ui-patterns/vitest.setup.ts +++ b/packages/ui-patterns/vitest.setup.ts @@ -1,10 +1,9 @@ /// -import * as matchers from '@testing-library/jest-dom/matchers' +import '@testing-library/jest-dom/vitest' import { cleanup } from '@testing-library/react' -import { afterEach, expect, vi } from 'vitest' +import { afterEach, vi } from 'vitest' -expect.extend(matchers) Object.defineProperty(window, 'matchMedia', { writable: true, diff --git a/packages/ui/package.json b/packages/ui/package.json index 231a7414948..6c51230bbc2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -101,6 +101,7 @@ "@tokens-studio/sd-transforms": "^0.8.5", "@types/common-tags": "^1.8.1", "@types/lodash": "4.17.5", + "@types/node": "catalog:", "@types/react": "^18.2.24", "@types/react-copy-to-clipboard": "^5.0.4", "@types/react-dom": "^18.2.8", @@ -114,11 +115,10 @@ "tsconfig": "workspace:*", "tsconfig-paths-webpack-plugin": "^4.0.1", "typescript": "~5.5.0", - "vite": "^5.0.0", "vitest": "^2.0.0" }, "peerDependencies": { - "next": "*", + "next": "catalog:", "react": "*", "react-dom": "*" } diff --git a/packages/ui/vitest.config.ts b/packages/ui/vitest.config.ts index 8623a6c59bf..8506bb4f23a 100644 --- a/packages/ui/vitest.config.ts +++ b/packages/ui/vitest.config.ts @@ -1,6 +1,4 @@ -/// - -import { defineConfig } from 'vite' +import { defineConfig } from 'vitest/config' export default defineConfig({ test: { diff --git a/packages/ui/vitest.setup.ts b/packages/ui/vitest.setup.ts index a4f40c8d8d0..aa5d0c82e44 100644 --- a/packages/ui/vitest.setup.ts +++ b/packages/ui/vitest.setup.ts @@ -1,10 +1,8 @@ /// -import * as matchers from '@testing-library/jest-dom/matchers' +import '@testing-library/jest-dom/vitest' import { cleanup } from '@testing-library/react' -import { afterEach, expect, vi } from 'vitest' - -expect.extend(matchers) +import { afterEach, vi } from 'vitest' Object.defineProperty(window, 'matchMedia', { writable: true, diff --git a/playwright-tests/package.json b/playwright-tests/package.json index f4ca31fe459..5fae3769ec1 100644 --- a/playwright-tests/package.json +++ b/playwright-tests/package.json @@ -17,7 +17,6 @@ "author": "", "license": "ISC", "devDependencies": { - "@playwright/test": "^1.41.2", - "@types/node": "^20.11.16" + "@playwright/test": "^1.41.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff0b329e992..3a7d6daafc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,25 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@types/node': + specifier: ^20.0.0 + version: 20.12.11 + next: + specifier: 14.2.15 + version: 14.2.15 + importers: .: devDependencies: + '@types/node': + specifier: 'catalog:' + version: 20.12.11 eslint: specifier: ^8.57.0 - version: 8.57.0 + version: 8.57.0(supports-color@8.1.1) prettier: specifier: 3.2.4 version: 3.2.4 @@ -25,7 +37,10 @@ importers: version: 1.72.0 supabase: specifier: ^1.151.1 - version: 1.151.1 + version: 1.151.1(supports-color@8.1.1) + supports-color: + specifier: ^8.0.0 + version: 8.1.1 turbo: specifier: 2.0.4 version: 2.0.4 @@ -40,7 +55,7 @@ importers: version: 3.3.1(react-hook-form@7.47.0(react@18.2.0)) contentlayer2: specifier: 0.4.6 - version: 0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0) + version: 0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) eslint-config-supabase: specifier: workspace:* version: link:../../packages/eslint-config-supabase @@ -60,11 +75,11 @@ importers: specifier: ^1.2.0 version: 1.2.0 next: - specifier: ^14.2.10 - version: 14.2.13(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-contentlayer2: specifier: 0.4.6 - version: 0.4.6(contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.13(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.4.6(contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -73,7 +88,7 @@ importers: version: 18.2.0 react-docgen: specifier: ^7.0.3 - version: 7.0.3 + version: 7.0.3(supports-color@8.1.1) react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) @@ -100,13 +115,13 @@ importers: version: 6.0.0 remark: specifier: ^14.0.3 - version: 14.0.3 + version: 14.0.3(supports-color@8.1.1) remark-code-import: specifier: ^1.2.0 version: 1.2.0 remark-gfm: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.0(supports-color@8.1.1) sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -132,9 +147,6 @@ importers: '@types/lodash.template': specifier: 4.5.0 version: 4.5.0 - '@types/node': - specifier: ^20 - version: 20.12.11 '@types/react': specifier: ^18.2.65 version: 18.3.3 @@ -185,7 +197,7 @@ importers: version: 2.2.0 '@mdx-js/loader': specifier: ^2.1.5 - version: 2.3.0(webpack@5.94.0) + version: 2.3.0(supports-color@8.1.1)(webpack@5.94.0) '@mdx-js/react': specifier: ^2.3.0 version: 2.3.0(react@18.2.0) @@ -194,7 +206,7 @@ importers: version: 14.2.3 '@next/mdx': specifier: ^14.2.3 - version: 14.2.3(@mdx-js/loader@2.3.0(webpack@5.94.0))(@mdx-js/react@2.3.0(react@18.2.0)) + version: 14.2.3(@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0))(@mdx-js/react@2.3.0(react@18.2.0)) '@octokit/auth-app': specifier: ^6.0.3 version: 6.0.3 @@ -276,6 +288,9 @@ importers: katex: specifier: ^0.16.10 version: 0.16.10 + libpg-query: + specifier: 15.2.0 + version: 15.2.0(encoding@0.1.13)(supports-color@8.1.1) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -290,16 +305,16 @@ importers: version: 3.0.0 mdast-util-from-markdown: specifier: ^1.2.0 - version: 1.3.1(supports-color@5.5.0) + version: 1.3.1(supports-color@8.1.1) mdast-util-gfm: specifier: ^2.0.2 - version: 2.0.2(supports-color@5.5.0) + version: 2.0.2(supports-color@8.1.1) mdast-util-mdx: specifier: ^2.0.0 - version: 2.0.1 + version: 2.0.1(supports-color@8.1.1) mdast-util-mdx-jsx: specifier: ^2.0.0 - version: 2.1.4 + version: 2.1.4(supports-color@8.1.1) mdast-util-to-hast: specifier: ^12.3.0 version: 12.3.0 @@ -316,23 +331,23 @@ importers: specifier: ^1.0.0 version: 1.0.1 next: - specifier: ^14.2.10 - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-mdx-remote: specifier: ^4.4.1 - version: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1) next-plugin-yaml: specifier: ^1.0.1 version: 1.0.1 next-seo: specifier: ^6.5.0 - version: 6.5.0(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.5.0(next@14.2.15(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) nuqs: specifier: ^1.19.1 - version: 1.19.1(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)) + version: 1.19.1(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)) openai: specifier: ^4.20.1 version: 4.71.1(encoding@0.1.13)(zod@3.23.8) @@ -356,7 +371,7 @@ importers: version: 9.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: specifier: ^8.0.3 - version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@5.5.0) + version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1) react-use: specifier: ^17.5.0 version: 17.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -368,16 +383,16 @@ importers: version: 5.1.0 remark: specifier: ^14.0.2 - version: 14.0.3 + version: 14.0.3(supports-color@8.1.1) remark-emoji: specifier: ^3.1.2 version: 3.1.2 remark-gfm: specifier: ^3.0.1 - version: 3.0.1(supports-color@5.5.0) + version: 3.0.1(supports-color@8.1.1) remark-math: specifier: ^6.0.0 - version: 6.0.0 + version: 6.0.0(supports-color@8.1.1) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -434,7 +449,7 @@ importers: specifier: ^3.0.0 version: 3.0.15 '@types/node': - specifier: ^20.11.16 + specifier: 'catalog:' version: 20.12.11 '@types/react': specifier: ^18.2.24 @@ -460,9 +475,6 @@ importers: globby: specifier: ^13.2.2 version: 13.2.2 - nextjs-node-loader: - specifier: ^1.1.5 - version: 1.1.5(webpack@5.94.0) npm-run-all: specifier: ^4.1.5 version: 4.1.5 @@ -471,7 +483,7 @@ importers: version: 12.1.3 simple-git: specifier: ^3.24.0 - version: 3.24.0 + version: 3.24.0(supports-color@8.1.1) slugify: specifier: ^1.6.6 version: 1.6.6 @@ -492,10 +504,10 @@ importers: version: 5.1.3 vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.5.2)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)) + version: 4.3.2(supports-color@8.1.1)(typescript@5.5.2)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)) vitest: specifier: ^2.0.2 - version: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0) + version: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) apps/studio: dependencies: @@ -507,10 +519,10 @@ importers: version: 1.0.4 '@graphiql/react': specifier: ^0.19.4 - version: 0.19.4(@codemirror/language@6.0.0)(@types/node@22.7.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.19.4(@codemirror/language@6.0.0)(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.3)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@graphiql/toolkit': specifier: ^0.9.1 - version: 0.9.1(@types/node@22.7.5)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1) + version: 0.9.1(@types/node@20.12.11)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1) '@hcaptcha/react-hcaptcha': specifier: ^1.8.1 version: 1.9.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -540,7 +552,7 @@ importers: version: 1.0.7(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@sentry/nextjs': specifier: ^8.34.0 - version: 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0)(supports-color@5.5.0)(webpack@5.94.0) + version: 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0)(supports-color@8.1.1)(webpack@5.94.0) '@stripe/react-stripe-js': specifier: ^2.5.0 version: 2.5.0(@stripe/stripe-js@3.0.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -564,7 +576,7 @@ importers: version: 0.1.74 '@supabase/sql-to-rest': specifier: ^0.1.6 - version: 0.1.6(encoding@0.1.13)(supports-color@5.5.0) + version: 0.1.6(encoding@0.1.13)(supports-color@8.1.1) '@supabase/supabase-js': specifier: ^2.44.3 version: 2.44.3 @@ -582,10 +594,10 @@ importers: version: 10.3.1(react@18.2.0) '@vercel/flags': specifier: ^2.6.0 - version: 2.6.0(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.6.0(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(supports-color@5.5.0)(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0)) + version: 4.2.1(supports-color@8.1.1)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)) '@zip.js/zip.js': specifier: ^2.7.29 version: 2.7.30 @@ -674,14 +686,14 @@ importers: specifier: 0.33.0 version: 0.33.0 next: - specifier: ^14.2.10 - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) nuqs: specifier: ^1.17.8 - version: 1.19.1(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)) + version: 1.19.1(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)) openai: specifier: ^4.20.1 version: 4.71.1(encoding@0.1.13)(zod@3.23.8) @@ -723,7 +735,7 @@ importers: version: 4.18.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-dnd: specifier: ^16.0.1 - version: 16.0.1(@types/hoist-non-react-statics@3.3.2)(@types/node@22.7.5)(@types/react@18.3.3)(react@18.2.0) + version: 16.0.1(@types/hoist-non-react-statics@3.3.2)(@types/node@20.12.11)(@types/react@18.3.3)(react@18.2.0) react-dnd-html5-backend: specifier: ^16.0.1 version: 16.0.1 @@ -747,7 +759,7 @@ importers: version: 9.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: specifier: ^8.0.3 - version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@5.5.0) + version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1) react-simple-maps: specifier: 4.0.0-beta.6 version: 4.0.0-beta.6(prop-types@15.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -774,7 +786,7 @@ importers: version: 2.12.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) remark-gfm: specifier: ^3.0.1 - version: 3.0.1(supports-color@5.5.0) + version: 3.0.1(supports-color@8.1.1) semver: specifier: ^6.3.1 version: 6.3.1 @@ -810,10 +822,10 @@ importers: version: 1.12.0(@types/react@18.3.3)(react@18.2.0) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(supports-color@5.5.0)(typescript@5.5.2)(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0)) + version: 4.3.2(supports-color@8.1.1)(typescript@5.5.2)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0) + version: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) yup: specifier: ^1.4.0 version: 1.4.0 @@ -838,13 +850,13 @@ importers: version: 1.1.0(@types/react@18.3.3)(react@18.2.0) '@supabase/postgres-meta': specifier: ^0.64.4 - version: 0.64.6(encoding@0.1.13)(supports-color@5.5.0) + version: 0.64.6(encoding@0.1.13)(supports-color@8.1.1) '@testing-library/dom': specifier: ^9.3.3 version: 9.3.4 '@testing-library/jest-dom': specifier: ^6.4.6 - version: 6.4.6(@jest/globals@29.7.0(supports-color@5.5.0))(@types/jest@29.5.5)(jest@29.7.0(@types/node@22.7.5)(supports-color@5.5.0))(vitest@1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0)) + version: 6.4.6(@jest/globals@29.7.0(supports-color@8.1.1))(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0)) '@testing-library/react': specifier: ^14.0.0 version: 14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -869,6 +881,9 @@ importers: '@types/mime-db': specifier: ^1.43.5 version: 1.43.5 + '@types/node': + specifier: 'catalog:' + version: 20.12.11 '@types/papaparse': specifier: ^5.3.1 version: 5.3.9 @@ -940,7 +955,7 @@ importers: version: link:../../packages/eslint-config-supabase eslint-plugin-barrel-files: specifier: ^2.0.7 - version: 2.0.7(eslint@8.57.0(supports-color@5.5.0)) + version: 2.0.7(eslint@8.57.0(supports-color@8.1.1)) graphql-ws: specifier: 5.14.1 version: 5.14.1(graphql@16.8.1) @@ -949,16 +964,13 @@ importers: version: 2.4.11(typescript@5.5.2) next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) + version: 0.9.13(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) postcss: specifier: ^8.4.31 version: 8.4.38 prettier: specifier: 3.2.4 version: 3.2.4 - supports-color: - specifier: 5.5.0 - version: 5.5.0 tailwindcss: specifier: ^3.4.1 version: 3.4.1 @@ -982,7 +994,7 @@ importers: version: 14.2.3 '@next/mdx': specifier: ^14.2.3 - version: 14.2.3(@mdx-js/loader@2.3.0(webpack@5.94.0(esbuild@0.20.2)))(@mdx-js/react@2.3.0(react@18.2.0)) + version: 14.2.3(@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0(esbuild@0.20.2)))(@mdx-js/react@2.3.0(react@18.2.0)) '@octokit/auth-app': specifier: ^6.0.3 version: 6.0.3 @@ -1042,7 +1054,7 @@ importers: version: link:../../packages/config contentlayer2: specifier: 0.5.3 - version: 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + version: 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) dat.gui: specifier: ^0.7.9 version: 0.7.9 @@ -1074,17 +1086,17 @@ importers: specifier: ^1.2.0 version: 1.2.0 next: - specifier: ^14.2.10 - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-contentlayer2: specifier: 0.5.3 - version: 0.5.3(contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 0.5.3(contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.15(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1) next-mdx-remote: specifier: ^4.4.1 - version: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1) next-seo: specifier: ^6.5.0 - version: 6.5.0(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.5.0(next@14.2.15(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1108,7 +1120,7 @@ importers: version: 18.2.0(react@18.2.0) react-markdown: specifier: ^8.0.3 - version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@5.5.0) + version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1) react-syntax-highlighter: specifier: ^15.5.0 version: 15.5.0(react@18.2.0) @@ -1129,10 +1141,10 @@ importers: version: 5.1.0 remark: specifier: ^15.0.1 - version: 15.0.1 + version: 15.0.1(supports-color@8.1.1) remark-gfm: specifier: ^3.0.1 - version: 3.0.1(supports-color@5.5.0) + version: 3.0.1(supports-color@8.1.1) remark-html: specifier: ^16.0.1 version: 16.0.1 @@ -1188,9 +1200,6 @@ importers: '@types/mdx-js__react': specifier: ^1.5.6 version: 1.5.6 - '@types/node': - specifier: ^20.11.16 - version: 20.12.11 '@types/parse-numeric-range': specifier: ^0.0.1 version: 0.0.1 @@ -1267,6 +1276,9 @@ importers: '@types/common-tags': specifier: ^1.8.4 version: 1.8.4 + '@types/node': + specifier: 'catalog:' + version: 20.12.11 api-types: specifier: workspace:* version: link:../api-types @@ -1278,10 +1290,10 @@ importers: version: 16.3.1 libpg-query: specifier: 15.2.0 - version: 15.2.0(encoding@0.1.13)(supports-color@5.5.0) + version: 15.2.0(encoding@0.1.13)(supports-color@8.1.1) mdast-util-from-markdown: specifier: ^2.0.0 - version: 2.0.0 + version: 2.0.0(supports-color@8.1.1) sql-formatter: specifier: ^15.0.2 version: 15.3.1 @@ -1293,7 +1305,7 @@ importers: version: 5.5.2 vitest: specifier: ^2.0.0 - version: 2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0) + version: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) packages/api-types: devDependencies: @@ -1343,8 +1355,8 @@ importers: specifier: ^4.17.21 version: 4.17.21 next: - specifier: '*' - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1409,19 +1421,19 @@ importers: dependencies: eslint-config-next: specifier: ^14.2.3 - version: 14.2.4(eslint@8.57.0)(typescript@5.5.2) + version: 14.2.4(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + version: 9.1.0(eslint@8.57.0(supports-color@8.1.1)) eslint-config-turbo: specifier: ^2.0.4 - version: 2.0.4(eslint@8.57.0) + version: 2.0.4(eslint@8.57.0(supports-color@8.1.1)) packages/generator: devDependencies: '@redocly/cli': specifier: ^1.6.0 - version: 1.6.0(encoding@0.1.13) + version: 1.6.0(encoding@0.1.13)(supports-color@8.1.1) '@types/json-stringify-safe': specifier: ^5.0.0 version: 5.0.3 @@ -1612,8 +1624,8 @@ importers: specifier: ^0.436.0 version: 0.436.0(react@18.2.0) next: - specifier: '*' - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1655,7 +1667,7 @@ importers: version: 9.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: specifier: ^8.0.3 - version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@5.5.0) + version: 8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1) react-medium-image-zoom: specifier: ^5.2.4 version: 5.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1679,7 +1691,7 @@ importers: version: 2.12.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) remark-gfm: specifier: ^3.0.1 - version: 3.0.1(supports-color@5.5.0) + version: 3.0.1(supports-color@8.1.1) sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1713,7 +1725,7 @@ importers: version: 3.6.1 '@testing-library/jest-dom': specifier: ^6.1.3 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@22.7.5))(vitest@2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0)) + version: 6.4.6(@jest/globals@29.7.0(supports-color@8.1.1))(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(vitest@2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0)) '@testing-library/react': specifier: ^14.0.0 version: 14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1726,6 +1738,9 @@ importers: '@types/lodash': specifier: 4.17.5 version: 4.17.5 + '@types/node': + specifier: 'catalog:' + version: 20.12.11 '@types/react': specifier: ^18.2.24 version: 18.3.3 @@ -1765,12 +1780,9 @@ importers: typescript: specifier: ~5.5.0 version: 5.5.2 - vite: - specifier: ^5.0.0 - version: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) vitest: specifier: ^2.0.0 - version: 2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0) + version: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) packages/ui-patterns: dependencies: @@ -1782,7 +1794,7 @@ importers: version: 4.6.0(monaco-editor@0.33.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@supabase/sql-to-rest': specifier: ^0.1.6 - version: 0.1.6(encoding@0.1.13)(supports-color@5.5.0) + version: 0.1.6(encoding@0.1.13)(supports-color@8.1.1) class-variance-authority: specifier: ^0.6.0 version: 0.6.1 @@ -1814,8 +1826,8 @@ importers: specifier: '*' version: 0.33.0 next: - specifier: '*' - version: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + specifier: 'catalog:' + version: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) next-themes: specifier: '*' version: 0.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1839,7 +1851,7 @@ importers: version: 9.8.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-markdown: specifier: ^9.0.1 - version: 9.0.1(@types/react@18.3.3)(react@18.2.0) + version: 9.0.1(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1) react-syntax-highlighter: specifier: ^15.5.0 version: 15.5.0(react@18.2.0) @@ -1854,7 +1866,7 @@ importers: version: 11.10.1(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) remark-gfm: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.0(supports-color@8.1.1) sonner: specifier: ^1.5.0 version: 1.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1885,7 +1897,7 @@ importers: version: 10.1.0 '@testing-library/jest-dom': specifier: ^6.4.6 - version: 6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@22.7.5))(vitest@2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0)) + version: 6.4.6(@jest/globals@29.7.0(supports-color@8.1.1))(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(vitest@2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0)) '@testing-library/react': specifier: ^16.0.0 version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1898,6 +1910,9 @@ importers: '@types/lodash': specifier: ^4.17.5 version: 4.17.5 + '@types/node': + specifier: 'catalog:' + version: 20.12.11 '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -1909,25 +1924,19 @@ importers: version: link:../api-types next-router-mock: specifier: ^0.9.13 - version: 0.9.13(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) + version: 0.9.13(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0) typescript: specifier: ~5.5.0 version: 5.5.2 - vite: - specifier: ^5.2.14 - version: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) vitest: specifier: ^2.0.3 - version: 2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0) + version: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) playwright-tests: devDependencies: '@playwright/test': specifier: ^1.41.2 version: 1.41.2 - '@types/node': - specifier: ^20.11.16 - version: 20.12.11 tests: devDependencies: @@ -1944,14 +1953,14 @@ importers: specifier: ^29.5.4 version: 29.5.5 '@types/node': - specifier: ^20.11.16 + specifier: ^20.0.0 version: 20.12.11 '@typescript-eslint/eslint-plugin': specifier: ^6.19.1 - version: 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) + version: 6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) '@typescript-eslint/parser': specifier: ^6.19.1 - version: 6.19.1(eslint@8.57.0)(typescript@5.5.2) + version: 6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) allure-commandline: specifier: ^2.17.2 version: 2.24.0 @@ -1963,19 +1972,19 @@ importers: version: 3.1.5(encoding@0.1.13) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.12.11) + version: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) jest-allure2-adapter: specifier: ^0.3.12 version: 0.3.12 jest-environment-jsdom: specifier: ^29.7.0 - version: 29.7.0 + version: 29.7.0(supports-color@8.1.1) postgres: specifier: ^3.0.5 version: 3.3.5 ts-jest: specifier: ^29.1.1 - version: 29.1.2(@babel/core@7.24.7)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.12.11))(typescript@5.5.2) + version: 29.1.2(@babel/core@7.24.7(supports-color@8.1.1))(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(typescript@5.5.2) typescript: specifier: ~5.5.0 version: 5.5.2 @@ -3146,8 +3155,8 @@ packages: '@next/bundle-analyzer@14.2.3': resolution: {integrity: sha512-Z88hbbngMs7njZKI8kTJIlpdLKYfMSLwnsqYe54AP4aLmgL70/Ynx/J201DQ+q2Lr6FxFw1uCeLGImDrHOl2ZA==} - '@next/env@14.2.13': - resolution: {integrity: sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==} + '@next/env@14.2.15': + resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} '@next/eslint-plugin-next@14.2.4': resolution: {integrity: sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==} @@ -3163,56 +3172,56 @@ packages: '@mdx-js/react': optional: true - '@next/swc-darwin-arm64@14.2.13': - resolution: {integrity: sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==} + '@next/swc-darwin-arm64@14.2.15': + resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.13': - resolution: {integrity: sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==} + '@next/swc-darwin-x64@14.2.15': + resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.13': - resolution: {integrity: sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==} + '@next/swc-linux-arm64-gnu@14.2.15': + resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.13': - resolution: {integrity: sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==} + '@next/swc-linux-arm64-musl@14.2.15': + resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.13': - resolution: {integrity: sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==} + '@next/swc-linux-x64-gnu@14.2.15': + resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.13': - resolution: {integrity: sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==} + '@next/swc-linux-x64-musl@14.2.15': + resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.13': - resolution: {integrity: sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==} + '@next/swc-win32-arm64-msvc@14.2.15': + resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.13': - resolution: {integrity: sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==} + '@next/swc-win32-ia32-msvc@14.2.15': + resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.13': - resolution: {integrity: sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==} + '@next/swc-win32-x64-msvc@14.2.15': + resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -8817,10 +8826,6 @@ packages: resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} engines: {node: '>=4.0.0'} - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - local-pkg@0.5.0: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} @@ -9687,8 +9692,8 @@ packages: react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - next@14.2.13: - resolution: {integrity: sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==} + next@14.2.15: + resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -9705,12 +9710,6 @@ packages: sass: optional: true - nextjs-node-loader@1.1.5: - resolution: {integrity: sha512-tS2wWPh8QsQHBVNG8w7xzL3ua+OFnmFvcOFxrAQsfK4T017nOiCUrybVWVieilEn1z8CqODcRw1z70mFRPQi1Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.76.0 - nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -13132,40 +13131,20 @@ snapshots: '@babel/compat-data@7.24.7': {} - '@babel/core@7.24.7': + '@babel/core@7.24.7(supports-color@8.1.1)': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 '@babel/generator': 7.24.7 '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.24.7 '@babel/parser': 7.24.7 '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/traverse': 7.24.7(supports-color@8.1.1) '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.24.7(supports-color@5.5.0)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7(supports-color@5.5.0))(supports-color@5.5.0) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7(supports-color@5.5.0) - '@babel/types': 7.24.7 - convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -13200,30 +13179,19 @@ snapshots: dependencies: '@babel/types': 7.24.7 - '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': + '@babel/helper-module-imports@7.24.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/traverse': 7.24.7(supports-color@8.1.1) '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7(supports-color@5.5.0))(supports-color@5.5.0)': + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-simple-access': 7.24.7(supports-color@5.5.0) - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-simple-access': 7.24.7(supports-color@5.5.0) + '@babel/helper-module-imports': 7.24.7(supports-color@8.1.1) + '@babel/helper-simple-access': 7.24.7(supports-color@8.1.1) '@babel/helper-split-export-declaration': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 transitivePeerDependencies: @@ -13231,9 +13199,9 @@ snapshots: '@babel/helper-plugin-utils@7.24.8': {} - '@babel/helper-simple-access@7.24.7(supports-color@5.5.0)': + '@babel/helper-simple-access@7.24.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/traverse': 7.24.7(supports-color@8.1.1) '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color @@ -13264,168 +13232,84 @@ snapshots: dependencies: '@babel/types': 7.24.7 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/helper-plugin-utils': 7.24.8 - optional: true - - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.7(supports-color@5.5.0))': + '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.24.8 '@babel/runtime@7.24.7': @@ -13438,7 +13322,7 @@ snapshots: '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - '@babel/traverse@7.24.7(supports-color@5.5.0)': + '@babel/traverse@7.24.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.24.7 '@babel/generator': 7.24.7 @@ -13448,7 +13332,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -13501,9 +13385,9 @@ snapshots: style-mod: 4.1.0 w3c-keyname: 2.2.8 - '@contentlayer2/cli@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/cli@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.4.3 clipanion: 3.2.1(typanion@3.14.0) typanion: 3.14.0 @@ -13513,9 +13397,9 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer2/cli@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/cli@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.5.3 clipanion: 3.2.1(typanion@3.14.0) typanion: 3.14.0 @@ -13525,34 +13409,34 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer2/client@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/client@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) transitivePeerDependencies: - '@effect-ts/otel-node' - esbuild - markdown-wasm - supports-color - '@contentlayer2/client@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/client@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) transitivePeerDependencies: - '@effect-ts/otel-node' - esbuild - markdown-wasm - supports-color - '@contentlayer2/core@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/core@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: '@contentlayer2/utils': 0.4.3 camel-case: 4.1.2 comment-json: 4.2.3 gray-matter: 4.0.3 - mdx-bundler: 10.0.2(esbuild@0.20.2) + mdx-bundler: 10.0.2(esbuild@0.20.2)(supports-color@8.1.1) rehype-stringify: 10.0.0 - remark-frontmatter: 5.0.0 - remark-parse: 11.0.0 + remark-frontmatter: 5.0.0(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.1 source-map-support: 0.5.21 type-fest: 4.30.0 @@ -13564,16 +13448,16 @@ snapshots: - '@effect-ts/otel-node' - supports-color - '@contentlayer2/core@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/core@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: '@contentlayer2/utils': 0.5.3 camel-case: 4.1.2 comment-json: 4.2.3 gray-matter: 4.0.3 - mdx-bundler: 10.0.2(esbuild@0.20.2) + mdx-bundler: 10.0.2(esbuild@0.20.2)(supports-color@8.1.1) rehype-stringify: 10.0.0 - remark-frontmatter: 5.0.0 - remark-parse: 11.0.0 + remark-frontmatter: 5.0.0(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.1 source-map-support: 0.5.21 type-fest: 4.30.0 @@ -13585,9 +13469,9 @@ snapshots: - '@effect-ts/otel-node' - supports-color - '@contentlayer2/source-files@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/source-files@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.4.3 chokidar: 3.5.3 fast-glob: 3.3.2 @@ -13604,9 +13488,9 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer2/source-files@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/source-files@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.5.3 chokidar: 3.5.3 fast-glob: 3.3.2 @@ -13623,10 +13507,10 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer2/source-remote-files@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/source-remote-files@0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.4.3 transitivePeerDependencies: - '@effect-ts/otel-node' @@ -13634,10 +13518,10 @@ snapshots: - markdown-wasm - supports-color - '@contentlayer2/source-remote-files@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)': + '@contentlayer2/source-remote-files@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)': dependencies: - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.5.3 transitivePeerDependencies: - '@effect-ts/otel-node' @@ -13739,10 +13623,10 @@ snapshots: '@emotion/unitless@0.8.0': {} - '@esbuild-plugins/node-resolve@0.2.2(esbuild@0.20.2)': + '@esbuild-plugins/node-resolve@0.2.2(esbuild@0.20.2)(supports-color@8.1.1)': dependencies: '@types/resolve': 1.20.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) esbuild: 0.20.2 escape-string-regexp: 4.0.0 resolve: 1.22.8 @@ -13887,22 +13771,17 @@ snapshots: '@esbuild/win32-x64@0.20.2': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0(supports-color@5.5.0))': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0(supports-color@8.1.1))': dependencies: - eslint: 8.57.0(supports-color@5.5.0) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.9.1': {} - '@eslint/eslintrc@2.1.4(supports-color@5.5.0)': + '@eslint/eslintrc@2.1.4(supports-color@8.1.1)': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.2.4 @@ -13942,9 +13821,9 @@ snapshots: '@gar/promisify@1.1.3': {} - '@graphiql/react@0.19.4(@codemirror/language@6.0.0)(@types/node@22.7.5)(@types/react-dom@18.3.0)(@types/react@18.3.3)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@graphiql/react@0.19.4(@codemirror/language@6.0.0)(@types/node@20.12.11)(@types/react-dom@18.3.0)(@types/react@18.3.3)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@graphiql/toolkit': 0.9.1(@types/node@22.7.5)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1) + '@graphiql/toolkit': 0.9.1(@types/node@20.12.11)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1) '@headlessui/react': 1.7.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-dropdown-menu': 2.0.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -13969,11 +13848,11 @@ snapshots: - '@types/react-dom' - graphql-ws - '@graphiql/toolkit@0.9.1(@types/node@22.7.5)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)': + '@graphiql/toolkit@0.9.1(@types/node@20.12.11)(graphql-ws@5.14.1(graphql@16.8.1))(graphql@16.8.1)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 graphql: 16.8.1 - meros: 1.3.0(@types/node@22.7.5) + meros: 1.3.0(@types/node@20.12.11) optionalDependencies: graphql-ws: 5.14.1(graphql@16.8.1) transitivePeerDependencies: @@ -14031,10 +13910,10 @@ snapshots: dependencies: react-hook-form: 7.47.0(react@18.2.0) - '@humanwhocodes/config-array@0.11.14(supports-color@5.5.0)': + '@humanwhocodes/config-array@0.11.14(supports-color@8.1.1)': dependencies: '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -14095,35 +13974,35 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(supports-color@8.1.1)': dependencies: '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 + '@jest/reporters': 29.7.0(supports-color@8.1.1) '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.7.5) + jest-config: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 + jest-resolve-dependencies: 29.7.0(supports-color@8.1.1) + jest-runner: 29.7.0(supports-color@8.1.1) + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 @@ -14136,114 +14015,60 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(supports-color@5.5.0)': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0(supports-color@5.5.0) - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.8.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0(supports-color@5.5.0) - jest-runner: 29.7.0(supports-color@5.5.0) - jest-runtime: 29.7.0(supports-color@5.5.0) - jest-snapshot: 29.7.0(supports-color@5.5.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - optional: true - '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - '@jest/expect@29.7.0': + '@jest/expect@29.7.0(supports-color@8.1.1)': dependencies: expect: 29.7.0 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@jest/expect@29.7.0(supports-color@5.5.0)': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - optional: true - '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/globals@29.7.0': + '@jest/globals@29.7.0(supports-color@8.1.1)': dependencies: '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 jest-mock: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/globals@29.7.0(supports-color@5.5.0)': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@jest/reporters@29.7.0': + '@jest/reporters@29.7.0(supports-color@8.1.1)': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.0 + istanbul-lib-instrument: 6.0.0(supports-color@8.1.1) istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1(supports-color@5.5.0) + istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) istanbul-reports: 3.1.6 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -14255,36 +14080,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0(supports-color@5.5.0)': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.7.5 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.0(supports-color@5.5.0) - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1(supports-color@5.5.0) - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.0 - transitivePeerDependencies: - - supports-color - optional: true - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -14309,12 +14104,12 @@ snapshots: jest-haste-map: 29.7.0 slash: 3.0.0 - '@jest/transform@29.7.0': + '@jest/transform@29.7.0(supports-color@8.1.1)': dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 @@ -14329,33 +14124,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/transform@29.7.0(supports-color@5.5.0)': - dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1(supports-color@5.5.0) - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - optional: true - '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.2 - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/yargs': 17.0.26 chalk: 4.1.2 @@ -14404,9 +14178,9 @@ snapshots: dependencies: tslib: 2.6.2 - '@kwsites/file-exists@1.1.1': + '@kwsites/file-exists@1.1.1(supports-color@8.1.1)': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -14422,10 +14196,10 @@ snapshots: dependencies: '@lezer/common': 1.1.0 - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)(supports-color@5.5.0)': + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)(supports-color@8.1.1)': dependencies: detect-libc: 2.0.3 - https-proxy-agent: 5.0.1(supports-color@5.5.0) + https-proxy-agent: 5.0.1(supports-color@8.1.1) make-dir: 3.1.0 node-fetch: 2.7.0(encoding@0.1.13) nopt: 5.0.0 @@ -14437,9 +14211,9 @@ snapshots: - encoding - supports-color - '@mdx-js/esbuild@3.0.1(esbuild@0.20.2)': + '@mdx-js/esbuild@3.0.1(esbuild@0.20.2)(supports-color@8.1.1)': dependencies: - '@mdx-js/mdx': 3.0.1 + '@mdx-js/mdx': 3.0.1(supports-color@8.1.1) '@types/unist': 3.0.3 esbuild: 0.20.2 vfile: 6.0.3 @@ -14447,24 +14221,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/loader@2.3.0(webpack@5.94.0(esbuild@0.20.2))': + '@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0(esbuild@0.20.2))': dependencies: - '@mdx-js/mdx': 2.3.0 + '@mdx-js/mdx': 2.3.0(supports-color@8.1.1) source-map: 0.7.4 webpack: 5.94.0(esbuild@0.20.2) transitivePeerDependencies: - supports-color optional: true - '@mdx-js/loader@2.3.0(webpack@5.94.0)': + '@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0)': dependencies: - '@mdx-js/mdx': 2.3.0 + '@mdx-js/mdx': 2.3.0(supports-color@8.1.1) source-map: 0.7.4 webpack: 5.94.0 transitivePeerDependencies: - supports-color - '@mdx-js/mdx@2.3.0': + '@mdx-js/mdx@2.3.0(supports-color@8.1.1)': dependencies: '@types/estree-jsx': 1.0.1 '@types/mdx': 2.0.10 @@ -14472,11 +14246,11 @@ snapshots: estree-util-is-identifier-name: 2.1.0 estree-util-to-js: 1.2.0 estree-walker: 3.0.3 - hast-util-to-estree: 2.3.3 + hast-util-to-estree: 2.3.3(supports-color@8.1.1) markdown-extensions: 1.1.1 periscopic: 3.1.0 - remark-mdx: 2.3.0 - remark-parse: 10.0.2(supports-color@5.5.0) + remark-mdx: 2.3.0(supports-color@8.1.1) + remark-parse: 10.0.2(supports-color@8.1.1) remark-rehype: 10.1.0 unified: 10.1.2 unist-util-position-from-estree: 1.1.2 @@ -14486,7 +14260,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/mdx@3.0.1': + '@mdx-js/mdx@3.0.1(supports-color@8.1.1)': dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.1 @@ -14498,12 +14272,12 @@ snapshots: estree-util-is-identifier-name: 3.0.0 estree-util-to-js: 2.0.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 + hast-util-to-estree: 3.1.0(supports-color@8.1.1) + hast-util-to-jsx-runtime: 2.3.0(supports-color@8.1.1) markdown-extensions: 2.0.0 periscopic: 3.1.0 - remark-mdx: 3.0.1 - remark-parse: 11.0.0 + remark-mdx: 3.0.1(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.1 source-map: 0.7.4 unified: 11.0.5 @@ -14591,51 +14365,51 @@ snapshots: - bufferutil - utf-8-validate - '@next/env@14.2.13': {} + '@next/env@14.2.15': {} '@next/eslint-plugin-next@14.2.4': dependencies: glob: 10.3.10 - '@next/mdx@14.2.3(@mdx-js/loader@2.3.0(webpack@5.94.0(esbuild@0.20.2)))(@mdx-js/react@2.3.0(react@18.2.0))': + '@next/mdx@14.2.3(@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0(esbuild@0.20.2)))(@mdx-js/react@2.3.0(react@18.2.0))': dependencies: source-map: 0.7.4 optionalDependencies: - '@mdx-js/loader': 2.3.0(webpack@5.94.0(esbuild@0.20.2)) + '@mdx-js/loader': 2.3.0(supports-color@8.1.1)(webpack@5.94.0(esbuild@0.20.2)) '@mdx-js/react': 2.3.0(react@18.2.0) - '@next/mdx@14.2.3(@mdx-js/loader@2.3.0(webpack@5.94.0))(@mdx-js/react@2.3.0(react@18.2.0))': + '@next/mdx@14.2.3(@mdx-js/loader@2.3.0(supports-color@8.1.1)(webpack@5.94.0))(@mdx-js/react@2.3.0(react@18.2.0))': dependencies: source-map: 0.7.4 optionalDependencies: - '@mdx-js/loader': 2.3.0(webpack@5.94.0) + '@mdx-js/loader': 2.3.0(supports-color@8.1.1)(webpack@5.94.0) '@mdx-js/react': 2.3.0(react@18.2.0) - '@next/swc-darwin-arm64@14.2.13': + '@next/swc-darwin-arm64@14.2.15': optional: true - '@next/swc-darwin-x64@14.2.13': + '@next/swc-darwin-x64@14.2.15': optional: true - '@next/swc-linux-arm64-gnu@14.2.13': + '@next/swc-linux-arm64-gnu@14.2.15': optional: true - '@next/swc-linux-arm64-musl@14.2.13': + '@next/swc-linux-arm64-musl@14.2.15': optional: true - '@next/swc-linux-x64-gnu@14.2.13': + '@next/swc-linux-x64-gnu@14.2.15': optional: true - '@next/swc-linux-x64-musl@14.2.13': + '@next/swc-linux-x64-musl@14.2.15': optional: true - '@next/swc-win32-arm64-msvc@14.2.13': + '@next/swc-win32-arm64-msvc@14.2.15': optional: true - '@next/swc-win32-ia32-msvc@14.2.13': + '@next/swc-win32-ia32-msvc@14.2.15': optional: true - '@next/swc-win32-x64-msvc@14.2.13': + '@next/swc-win32-x64-msvc@14.2.15': optional: true '@nodelib/fs.scandir@2.1.5': @@ -14650,13 +14424,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - '@npmcli/agent@2.2.2(supports-color@5.5.0)': + '@npmcli/agent@2.2.2(supports-color@8.1.1)': dependencies: - agent-base: 7.1.1(supports-color@5.5.0) - http-proxy-agent: 7.0.2(supports-color@5.5.0) - https-proxy-agent: 7.0.4(supports-color@5.5.0) + agent-base: 7.1.1(supports-color@8.1.1) + http-proxy-agent: 7.0.2(supports-color@8.1.1) + https-proxy-agent: 7.0.4(supports-color@8.1.1) lru-cache: 10.4.3 - socks-proxy-agent: 8.0.3(supports-color@5.5.0) + socks-proxy-agent: 8.0.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -14846,172 +14620,172 @@ snapshots: '@opentelemetry/resources': 1.24.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.24.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib@0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-amqplib@0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-connect@0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-connect@0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 '@types/connect': 3.4.36 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-dataloader@0.12.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-dataloader@0.12.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-express@0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-express@0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fastify@0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-fastify@0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fs@0.15.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-fs@0.15.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-generic-pool@0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-generic-pool@0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-graphql@0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-graphql@0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-hapi@0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-hapi@0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-http@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 semver: 7.6.3 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-ioredis@0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-ioredis@0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/redis-common': 0.36.2 '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-kafkajs@0.3.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-kafkajs@0.3.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-koa@0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-koa@0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-lru-memoizer@0.40.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-lru-memoizer@0.40.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongodb@0.47.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-mongodb@0.47.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mongoose@0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-mongoose@0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql2@0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-mysql2@0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-mysql@0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-mysql@0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 '@types/mysql': 2.15.26 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-nestjs-core@0.40.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-nestjs-core@0.40.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-pg@0.44.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-pg@0.44.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) '@types/pg': 8.6.1 @@ -15019,42 +14793,42 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-redis-4@0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-redis-4@0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/redis-common': 0.36.2 '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-undici@0.6.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation-undici@0.6.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.2.0 import-in-the-middle: 1.11.2 - require-in-the-middle: 7.4.0(supports-color@5.5.0) + require-in-the-middle: 7.4.0(supports-color@8.1.1) semver: 7.6.3 shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0)': + '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api-logs': 0.53.0 '@types/shimmer': 1.2.0 import-in-the-middle: 1.11.2 - require-in-the-middle: 7.4.0(supports-color@5.5.0) + require-in-the-middle: 7.4.0(supports-color@8.1.1) semver: 7.6.3 shimmer: 1.2.1 transitivePeerDependencies: @@ -15173,10 +14947,10 @@ snapshots: '@popperjs/core@2.11.8': {} - '@prisma/instrumentation@5.19.1(supports-color@5.5.0)': + '@prisma/instrumentation@5.19.1(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -16161,7 +15935,7 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - '@redocly/cli@1.6.0(encoding@0.1.13)': + '@redocly/cli@1.6.0(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@redocly/openapi-core': 1.6.0(encoding@0.1.13) chokidar: 3.5.3 @@ -16176,7 +15950,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) redoc: 2.1.3(core-js@3.35.0)(encoding@0.1.13)(mobx@6.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(styled-components@6.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) semver: 7.6.3 - simple-websocket: 9.1.0 + simple-websocket: 9.1.0(supports-color@8.1.1) styled-components: 6.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) yargs: 17.0.1 transitivePeerDependencies: @@ -16310,11 +16084,11 @@ snapshots: '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 - '@sentry/bundler-plugin-core@2.22.3(encoding@0.1.13)(supports-color@5.5.0)': + '@sentry/bundler-plugin-core@2.22.3(encoding@0.1.13)(supports-color@8.1.1)': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) '@sentry/babel-plugin-component-annotate': 2.22.3 - '@sentry/cli': 2.37.0(encoding@0.1.13)(supports-color@5.5.0) + '@sentry/cli': 2.37.0(encoding@0.1.13)(supports-color@8.1.1) dotenv: 16.3.1 find-up: 5.0.0 glob: 9.3.5 @@ -16345,9 +16119,9 @@ snapshots: '@sentry/cli-win32-x64@2.37.0': optional: true - '@sentry/cli@2.37.0(encoding@0.1.13)(supports-color@5.5.0)': + '@sentry/cli@2.37.0(encoding@0.1.13)(supports-color@8.1.1)': dependencies: - https-proxy-agent: 5.0.1(supports-color@5.5.0) + https-proxy-agent: 5.0.1(supports-color@8.1.1) node-fetch: 2.7.0(encoding@0.1.13) progress: 2.0.3 proxy-from-env: 1.1.0 @@ -16369,22 +16143,22 @@ snapshots: '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 - '@sentry/nextjs@8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0)(supports-color@5.5.0)(webpack@5.94.0)': + '@sentry/nextjs@8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0)(supports-color@8.1.1)(webpack@5.94.0)': dependencies: - '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/semantic-conventions': 1.27.0 '@rollup/plugin-commonjs': 26.0.1(rollup@3.29.5) '@sentry-internal/browser-utils': 8.34.0 '@sentry/core': 8.34.0 - '@sentry/node': 8.34.0(supports-color@5.5.0) - '@sentry/opentelemetry': 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) + '@sentry/node': 8.34.0(supports-color@8.1.1) + '@sentry/opentelemetry': 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) '@sentry/react': 8.34.0(react@18.2.0) '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 '@sentry/vercel-edge': 8.34.0 - '@sentry/webpack-plugin': 2.22.3(encoding@0.1.13)(supports-color@5.5.0)(webpack@5.94.0) + '@sentry/webpack-plugin': 2.22.3(encoding@0.1.13)(supports-color@8.1.1)(webpack@5.94.0) chalk: 3.0.0 - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) resolve: 1.22.8 rollup: 3.29.5 stacktrace-parser: 0.1.10 @@ -16399,51 +16173,51 @@ snapshots: - react - supports-color - '@sentry/node@8.34.0(supports-color@5.5.0)': + '@sentry/node@8.34.0(supports-color@8.1.1)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-amqplib': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-connect': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-dataloader': 0.12.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-express': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-fastify': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-fs': 0.15.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-generic-pool': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-graphql': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-hapi': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-ioredis': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-kafkajs': 0.3.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-koa': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.40.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-mongodb': 0.47.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-mongoose': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-mysql': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-mysql2': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-nestjs-core': 0.40.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-pg': 0.44.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-redis-4': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) - '@opentelemetry/instrumentation-undici': 0.6.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-amqplib': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-connect': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-dataloader': 0.12.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-express': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-fastify': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-fs': 0.15.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-generic-pool': 0.39.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-graphql': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-hapi': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-ioredis': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-kafkajs': 0.3.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-koa': 0.43.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-lru-memoizer': 0.40.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-mongodb': 0.47.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-mongoose': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-mysql': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-mysql2': 0.41.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-nestjs-core': 0.40.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-pg': 0.44.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-redis-4': 0.42.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) + '@opentelemetry/instrumentation-undici': 0.6.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@prisma/instrumentation': 5.19.1(supports-color@5.5.0) + '@prisma/instrumentation': 5.19.1(supports-color@8.1.1) '@sentry/core': 8.34.0 - '@sentry/opentelemetry': 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) + '@sentry/opentelemetry': 8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0) '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 import-in-the-middle: 1.11.2 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)': + '@sentry/opentelemetry@8.34.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1))(@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@5.5.0) + '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0)(supports-color@8.1.1) '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 '@sentry/core': 8.34.0 @@ -16471,9 +16245,9 @@ snapshots: '@sentry/types': 8.34.0 '@sentry/utils': 8.34.0 - '@sentry/webpack-plugin@2.22.3(encoding@0.1.13)(supports-color@5.5.0)(webpack@5.94.0)': + '@sentry/webpack-plugin@2.22.3(encoding@0.1.13)(supports-color@8.1.1)(webpack@5.94.0)': dependencies: - '@sentry/bundler-plugin-core': 2.22.3(encoding@0.1.13)(supports-color@5.5.0) + '@sentry/bundler-plugin-core': 2.22.3(encoding@0.1.13)(supports-color@8.1.1) unplugin: 1.0.1 uuid: 9.0.1 webpack: 5.94.0 @@ -16801,12 +16575,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 - '@supabase/postgres-meta@0.64.6(encoding@0.1.13)(supports-color@5.5.0)': + '@supabase/postgres-meta@0.64.6(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@sinclair/typebox': 0.25.24 pg: 8.11.3 pg-format: 1.0.4 - pgsql-parser: 13.5.0(encoding@0.1.13)(supports-color@5.5.0) + pgsql-parser: 13.5.0(encoding@0.1.13)(supports-color@8.1.1) postgres-array: 3.0.2 prettier: 2.8.8 prettier-plugin-sql: 0.13.0(prettier@2.8.8) @@ -16832,10 +16606,10 @@ snapshots: '@supabase/shared-types@0.1.74': {} - '@supabase/sql-to-rest@0.1.6(encoding@0.1.13)(supports-color@5.5.0)': + '@supabase/sql-to-rest@0.1.6(encoding@0.1.13)(supports-color@8.1.1)': dependencies: '@babel/parser': 7.24.7 - libpg-query: 15.2.0(encoding@0.1.13)(supports-color@5.5.0) + libpg-query: 15.2.0(encoding@0.1.13)(supports-color@8.1.1) prettier: 3.2.5 transitivePeerDependencies: - encoding @@ -16970,7 +16744,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0(supports-color@5.5.0))(@types/jest@29.5.5)(jest@29.7.0(@types/node@22.7.5)(supports-color@5.5.0))(vitest@1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0))': + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0(supports-color@8.1.1))(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.7 @@ -16981,12 +16755,12 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 optionalDependencies: - '@jest/globals': 29.7.0(supports-color@5.5.0) + '@jest/globals': 29.7.0(supports-color@8.1.1) '@types/jest': 29.5.5 - jest: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - vitest: 1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0) + jest: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) + vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) - '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@22.7.5))(vitest@2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0))': + '@testing-library/jest-dom@6.4.6(@jest/globals@29.7.0(supports-color@8.1.1))(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(vitest@2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0))': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.24.7 @@ -16997,10 +16771,10 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 optionalDependencies: - '@jest/globals': 29.7.0 + '@jest/globals': 29.7.0(supports-color@8.1.1) '@types/jest': 29.5.5 - jest: 29.7.0(@types/node@22.7.5) - vitest: 2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0) + jest: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) + vitest: 2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) '@testing-library/react@14.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -17115,7 +16889,7 @@ snapshots: '@types/connect@3.4.36': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/cookie@0.6.0': {} @@ -17283,7 +17057,7 @@ snapshots: '@types/graceful-fs@4.1.7': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/hast@2.3.6': dependencies: @@ -17319,7 +17093,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 @@ -17333,7 +17107,7 @@ snapshots: '@types/jsonwebtoken@9.0.5': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/jsrsasign@10.5.12': {} @@ -17369,15 +17143,15 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/mysql@2.15.26': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/node-fetch@2.6.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 form-data: 4.0.0 '@types/node@10.17.60': {} @@ -17398,7 +17172,7 @@ snapshots: '@types/papaparse@5.3.9': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/parse-numeric-range@0.0.1': {} @@ -17408,7 +17182,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 pg-protocol: 1.6.0 pg-types: 2.2.0 @@ -17420,7 +17194,7 @@ snapshots: '@types/randombytes@2.0.3': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/react-beautiful-dnd@13.1.5': dependencies: @@ -17546,7 +17320,7 @@ snapshots: '@types/ws@8.5.10': dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/yargs-parser@21.0.1': {} @@ -17556,16 +17330,16 @@ snapshots: '@types/zxcvbn@4.4.2': {} - '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@6.19.1(@typescript-eslint/parser@6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.19.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) '@typescript-eslint/scope-manager': 6.19.1 - '@typescript-eslint/type-utils': 6.19.1(eslint@8.57.0)(typescript@5.5.2) - '@typescript-eslint/utils': 6.19.1(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/type-utils': 6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) + '@typescript-eslint/utils': 6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0(supports-color@8.1.1) graphemer: 1.4.0 ignore: 5.2.4 natural-compare: 1.4.0 @@ -17576,27 +17350,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.19.1(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/parser@6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2)': dependencies: '@typescript-eslint/scope-manager': 6.19.1 '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 6.19.1(supports-color@8.1.1)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0(supports-color@8.1.1) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2)': dependencies: '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.5.2) + '@typescript-eslint/typescript-estree': 7.2.0(supports-color@8.1.1)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.0 + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0(supports-color@8.1.1) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: @@ -17612,12 +17386,12 @@ snapshots: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - '@typescript-eslint/type-utils@6.19.1(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/type-utils@6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.5.2) - '@typescript-eslint/utils': 6.19.1(eslint@8.57.0)(typescript@5.5.2) - debug: 4.3.7(supports-color@5.5.0) - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 6.19.1(supports-color@8.1.1)(typescript@5.5.2) + '@typescript-eslint/utils': 6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0(supports-color@8.1.1) ts-api-utils: 1.0.3(typescript@5.5.2) optionalDependencies: typescript: 5.5.2 @@ -17628,11 +17402,11 @@ snapshots: '@typescript-eslint/types@7.2.0': {} - '@typescript-eslint/typescript-estree@6.19.1(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@6.19.1(supports-color@8.1.1)(typescript@5.5.2)': dependencies: '@typescript-eslint/types': 6.19.1 '@typescript-eslint/visitor-keys': 6.19.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -17643,11 +17417,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@7.2.0(supports-color@8.1.1)(typescript@5.5.2)': dependencies: '@typescript-eslint/types': 7.2.0 '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -17658,15 +17432,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.19.1(eslint@8.57.0)(typescript@5.5.2)': + '@typescript-eslint/utils@6.19.1(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0(supports-color@8.1.1)) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 '@typescript-eslint/scope-manager': 6.19.1 '@typescript-eslint/types': 6.19.1 - '@typescript-eslint/typescript-estree': 6.19.1(typescript@5.5.2) - eslint: 8.57.0 + '@typescript-eslint/typescript-estree': 6.19.1(supports-color@8.1.1)(typescript@5.5.2) + eslint: 8.57.0(supports-color@8.1.1) semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -17696,11 +17470,11 @@ snapshots: '@use-gesture/core': 10.3.1 react: 18.2.0 - '@vercel/flags@2.6.0(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@vercel/flags@2.6.0(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: jose: 5.2.1 optionalDependencies: - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -17710,14 +17484,14 @@ snapshots: satori: 0.10.9 yoga-wasm-web: 0.3.3 - '@vitejs/plugin-react@4.2.1(supports-color@5.5.0)(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0))': + '@vitejs/plugin-react@4.2.1(supports-color@8.1.1)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0))': dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.7(supports-color@5.5.0)) + '@babel/core': 7.24.7(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.7(supports-color@8.1.1)) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) + vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) transitivePeerDependencies: - supports-color @@ -17743,15 +17517,6 @@ snapshots: msw: 2.4.11(typescript@5.5.2) vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) - '@vitest/mocker@2.1.8(msw@2.4.11(typescript@5.5.2))(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0))': - dependencies: - '@vitest/spy': 2.1.8 - estree-walker: 3.0.3 - magic-string: 0.30.12 - optionalDependencies: - msw: 2.4.11(typescript@5.5.2) - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 @@ -17796,7 +17561,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.1 sirv: 2.0.4 - vitest: 1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0) + vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) '@vitest/utils@1.6.0': dependencies: @@ -17989,15 +17754,15 @@ snapshots: acorn@8.11.3: {} - agent-base@6.0.2(supports-color@5.5.0): + agent-base@6.0.2(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - agent-base@7.1.1(supports-color@5.5.0): + agent-base@7.1.1(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18261,106 +18026,57 @@ snapshots: axobject-query@4.1.0: {} - babel-jest@29.7.0(@babel/core@7.24.7(supports-color@5.5.0))(supports-color@5.5.0): + babel-jest@29.7.0(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@types/babel__core': 7.20.2 - babel-plugin-istanbul: 6.1.1(supports-color@5.5.0) - babel-preset-jest: 29.6.3(@babel/core@7.24.7(supports-color@5.5.0)) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - optional: true - - babel-jest@29.7.0(@babel/core@7.24.7): - dependencies: - '@babel/core': 7.24.7 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.2 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.7) + '@babel/core': 7.24.7(supports-color@8.1.1) + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) + babel-preset-jest: 29.6.3(@babel/core@7.24.7(supports-color@8.1.1)) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-plugin-istanbul@6.1.1(supports-color@8.1.1): dependencies: '@babel/helper-plugin-utils': 7.24.8 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 + istanbul-lib-instrument: 5.2.1(supports-color@8.1.1) test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1(supports-color@5.5.0): - dependencies: - '@babel/helper-plugin-utils': 7.24.8 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1(supports-color@5.5.0) - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - optional: true - babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.24.7 '@babel/types': 7.24.7 - '@types/babel__core': 7.20.2 + '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.2 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7(supports-color@5.5.0)): + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7(supports-color@8.1.1)): dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7(supports-color@5.5.0)) - optional: true + '@babel/core': 7.24.7(supports-color@8.1.1) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7(supports-color@8.1.1)) - babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): + babel-preset-jest@29.6.3(@babel/core@7.24.7(supports-color@8.1.1)): dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - - babel-preset-jest@29.6.3(@babel/core@7.24.7(supports-color@5.5.0)): - dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7(supports-color@5.5.0)) - optional: true - - babel-preset-jest@29.6.3(@babel/core@7.24.7): - dependencies: - '@babel/core': 7.24.7 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7(supports-color@8.1.1)) bail@2.0.2: {} @@ -18794,13 +18510,13 @@ snapshots: tslib: 2.6.2 upper-case: 2.0.2 - contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0): + contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1): dependencies: - '@contentlayer2/cli': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/client': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-remote-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/cli': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/client': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-remote-files': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.4.3 transitivePeerDependencies: - '@effect-ts/otel-node' @@ -18808,13 +18524,13 @@ snapshots: - markdown-wasm - supports-color - contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0): + contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1): dependencies: - '@contentlayer2/cli': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/client': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - '@contentlayer2/source-remote-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/cli': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/client': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + '@contentlayer2/source-remote-files': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.5.3 transitivePeerDependencies: - '@effect-ts/otel-node' @@ -18852,13 +18568,13 @@ snapshots: core-util-is@1.0.3: {} - create-jest@29.7.0(@types/node@20.12.11): + create-jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.12.11) + jest-config: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -18867,38 +18583,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.7.5): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - - create-jest@29.7.0(@types/node@22.7.5)(supports-color@5.5.0): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - cron-parser@4.9.0: dependencies: luxon: 3.5.0 @@ -19098,15 +18782,17 @@ snapshots: debounce@1.2.1: {} - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.7(supports-color@5.5.0): + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: - supports-color: 5.5.0 + supports-color: 8.1.1 + + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decimal.js-light@2.5.1: {} @@ -19557,48 +19243,48 @@ snapshots: eslint-barrel-file-utils-win32-ia32-msvc: 0.0.10 eslint-barrel-file-utils-win32-x64-msvc: 0.0.10 - eslint-config-next@14.2.4(eslint@8.57.0)(typescript@5.5.2): + eslint-config-next@14.2.4(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2): dependencies: '@next/eslint-plugin-next': 14.2.4 '@rushstack/eslint-patch': 1.10.3 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) - eslint-plugin-react: 7.34.2(eslint@8.57.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) + eslint: 8.57.0(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0(supports-color@8.1.1)) + eslint-plugin-react: 7.34.2(eslint@8.57.0(supports-color@8.1.1)) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0(supports-color@8.1.1)) optionalDependencies: typescript: 5.5.2 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - eslint-config-prettier@9.1.0(eslint@8.57.0): + eslint-config-prettier@9.1.0(eslint@8.57.0(supports-color@8.1.1)): dependencies: - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) - eslint-config-turbo@2.0.4(eslint@8.57.0): + eslint-config-turbo@2.0.4(eslint@8.57.0(supports-color@8.1.1)): dependencies: - eslint: 8.57.0 - eslint-plugin-turbo: 2.0.4(eslint@8.57.0) + eslint: 8.57.0(supports-color@8.1.1) + eslint-plugin-turbo: 2.0.4(eslint@8.57.0(supports-color@8.1.1)) - eslint-import-resolver-node@0.3.9: + eslint-import-resolver-node@0.3.9(supports-color@8.1.1): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint: 8.57.0(supports-color@8.1.1) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) fast-glob: 3.3.2 get-tsconfig: 4.7.2 is-core-module: 2.13.1 @@ -19609,34 +19295,34 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) + eslint: 8.57.0(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - eslint-plugin-barrel-files@2.0.7(eslint@8.57.0(supports-color@5.5.0)): + eslint-plugin-barrel-files@2.0.7(eslint@8.57.0(supports-color@8.1.1)): dependencies: - eslint: 8.57.0(supports-color@5.5.0) + eslint: 8.57.0(supports-color@8.1.1) eslint-barrel-file-utils: 0.0.10 requireindex: 1.2.0 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint: 8.57.0(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.29.1)(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -19647,13 +19333,13 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/parser': 7.2.0(eslint@8.57.0(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0): + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0(supports-color@8.1.1)): dependencies: '@babel/runtime': 7.24.7 aria-query: 5.3.0 @@ -19665,7 +19351,7 @@ snapshots: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.19 - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -19673,11 +19359,11 @@ snapshots: object.entries: 1.1.8 object.fromentries: 2.0.8 - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0(supports-color@8.1.1)): dependencies: - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) - eslint-plugin-react@7.34.2(eslint@8.57.0): + eslint-plugin-react@7.34.2(eslint@8.57.0(supports-color@8.1.1)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -19686,7 +19372,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.0.19 - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -19699,10 +19385,10 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.11 - eslint-plugin-turbo@2.0.4(eslint@8.57.0): + eslint-plugin-turbo@2.0.4(eslint@8.57.0(supports-color@8.1.1)): dependencies: dotenv: 16.0.3 - eslint: 8.57.0 + eslint: 8.57.0(supports-color@8.1.1) eslint-scope@5.1.1: dependencies: @@ -19716,63 +19402,20 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.57.0: + eslint@8.57.0(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0(supports-color@8.1.1)) '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.4(supports-color@5.5.0) + '@eslint/eslintrc': 2.1.4(supports-color@8.1.1) '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14(supports-color@5.5.0) + '@humanwhocodes/config-array': 0.11.14(supports-color@8.1.1) '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7(supports-color@5.5.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.5.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.2.4 - 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.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - eslint@8.57.0(supports-color@5.5.0): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0(supports-color@5.5.0)) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.4(supports-color@5.5.0) - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14(supports-color@5.5.0) - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -20470,7 +20113,7 @@ snapshots: '@ungap/structured-clone': 1.2.0 unist-util-position: 5.0.0 - hast-util-to-estree@2.3.3: + hast-util-to-estree@2.3.3(supports-color@8.1.1): dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.1 @@ -20480,8 +20123,8 @@ snapshots: estree-util-attach-comments: 2.1.1 estree-util-is-identifier-name: 2.1.0 hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 + mdast-util-mdx-expression: 1.3.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 1.3.1(supports-color@8.1.1) property-information: 6.3.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.2 @@ -20490,7 +20133,7 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-estree@3.1.0: + hast-util-to-estree@3.1.0(supports-color@8.1.1): dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.1 @@ -20500,9 +20143,9 @@ snapshots: estree-util-attach-comments: 3.0.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 6.3.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.2 @@ -20526,7 +20169,7 @@ snapshots: stringify-entities: 4.0.3 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.0: + hast-util-to-jsx-runtime@2.3.0(supports-color@8.1.1): dependencies: '@types/estree': 1.0.5 '@types/hast': 3.0.4 @@ -20535,9 +20178,9 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 6.3.0 space-separated-tokens: 2.0.2 style-to-object: 1.0.6 @@ -20635,42 +20278,42 @@ snapshots: http-cache-semantics@4.1.1: {} - http-proxy-agent@4.0.1(supports-color@5.5.0): + http-proxy-agent@4.0.1(supports-color@8.1.1): dependencies: '@tootallnate/once': 1.1.2 - agent-base: 6.0.2(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - http-proxy-agent@5.0.0(supports-color@5.5.0): + http-proxy-agent@5.0.0(supports-color@8.1.1): dependencies: '@tootallnate/once': 2.0.0 - agent-base: 6.0.2(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - http-proxy-agent@7.0.2(supports-color@5.5.0): + http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: - agent-base: 7.1.1(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 7.1.1(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color http2-client@1.3.5: {} - https-proxy-agent@5.0.1(supports-color@5.5.0): + https-proxy-agent@5.0.1(supports-color@8.1.1): dependencies: - agent-base: 6.0.2(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.4(supports-color@5.5.0): + https-proxy-agent@7.0.4(supports-color@8.1.1): dependencies: - agent-base: 7.1.1(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 7.1.1(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -20966,9 +20609,9 @@ snapshots: istanbul-lib-coverage@3.2.0: {} - istanbul-lib-instrument@5.2.1: + istanbul-lib-instrument@5.2.1(supports-color@8.1.1): dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -20976,20 +20619,9 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-instrument@5.2.1(supports-color@5.5.0): + istanbul-lib-instrument@6.0.0(supports-color@8.1.1): dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/parser': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - optional: true - - istanbul-lib-instrument@6.0.0: - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -20997,26 +20629,15 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.0(supports-color@5.5.0): - dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/parser': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - optional: true - istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.0 make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1(supports-color@5.5.0): + istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -21073,13 +20694,13 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@29.7.0(supports-color@8.1.1): dependencies: '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -21087,8 +20708,8 @@ snapshots: jest-each: 29.7.0 jest-matcher-utils: 29.7.0 jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 @@ -21099,43 +20720,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-circus@29.7.0(supports-color@5.5.0): + jest-cli@29.7.0(@types/node@20.12.11)(supports-color@8.1.1): dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0(supports-color@5.5.0) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0(supports-color@5.5.0) - jest-snapshot: 29.7.0(supports-color@5.5.0) - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - optional: true - - jest-cli@29.7.0(@types/node@20.12.11): - dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(supports-color@8.1.1) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.11) + create-jest: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.12.11) + jest-config: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -21145,63 +20739,23 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.5): + jest-config@29.7.0(@types/node@20.12.11)(supports-color@8.1.1): dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - - jest-cli@29.7.0(@types/node@22.7.5)(supports-color@5.5.0): - dependencies: - '@jest/core': 29.7.0(supports-color@5.5.0) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - - jest-config@29.7.0(@types/node@20.12.11): - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) + babel-jest: 29.7.0(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1) chalk: 4.1.2 ci-info: 3.8.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(supports-color@8.1.1) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-runner: 29.7.0 + jest-runner: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-validate: 29.7.0 micromatch: 4.0.8 @@ -21215,67 +20769,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.7.5): - dependencies: - '@babel/core': 7.24.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.7.5 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@22.7.5)(supports-color@5.5.0): - dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7(supports-color@5.5.0))(supports-color@5.5.0) - chalk: 4.1.2 - ci-info: 3.8.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(supports-color@5.5.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0(supports-color@5.5.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.7.5 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - optional: true - jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -21295,16 +20788,16 @@ snapshots: jest-util: 29.7.0 pretty-format: 29.7.0 - jest-environment-jsdom@29.7.0: + jest-environment-jsdom@29.7.0(supports-color@8.1.1): dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-mock: 29.7.0 jest-util: 29.7.0 - jsdom: 20.0.3(supports-color@5.5.0) + jsdom: 20.0.3(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - supports-color @@ -21315,7 +20808,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -21325,7 +20818,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.7 - '@types/node': 22.7.5 + '@types/node': 20.12.11 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -21364,7 +20857,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -21373,21 +20866,13 @@ snapshots: jest-regex-util@29.6.3: {} - jest-resolve-dependencies@29.7.0: + jest-resolve-dependencies@29.7.0(supports-color@8.1.1): dependencies: jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - jest-resolve-dependencies@29.7.0(supports-color@5.5.0): - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - optional: true - jest-resolve@29.7.0: dependencies: chalk: 4.1.2 @@ -21400,14 +20885,14 @@ snapshots: resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@29.7.0: + jest-runner@29.7.0(supports-color@8.1.1): dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -21417,7 +20902,7 @@ snapshots: jest-leak-detector: 29.7.0 jest-message-util: 29.7.0 jest-resolve: 29.7.0 - jest-runtime: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 jest-watcher: 29.7.0 jest-worker: 29.7.0 @@ -21426,43 +20911,16 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runner@29.7.0(supports-color@5.5.0): - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0(supports-color@5.5.0) - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - optional: true - - jest-runtime@29.7.0: + jest-runtime@29.7.0(supports-color@8.1.1): dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 + '@jest/globals': 29.7.0(supports-color@8.1.1) '@jest/source-map': 29.6.3 '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -21473,52 +20931,24 @@ snapshots: jest-mock: 29.7.0 jest-regex-util: 29.6.3 jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) jest-util: 29.7.0 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-runtime@29.7.0(supports-color@5.5.0): + jest-snapshot@29.7.0(supports-color@8.1.1): dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0(supports-color@5.5.0) - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0(supports-color@5.5.0) - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - optional: true - - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@babel/generator': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7(supports-color@8.1.1)) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7(supports-color@8.1.1)) '@babel/types': 7.24.7 '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7(supports-color@8.1.1)) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -21533,36 +20963,10 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0(supports-color@5.5.0): - dependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - '@babel/generator': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7(supports-color@5.5.0)) - '@babel/types': 7.24.7 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7(supports-color@5.5.0)) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - optional: true - jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -21581,7 +20985,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 20.12.11 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -21596,49 +21000,23 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.12.11): + jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(supports-color@8.1.1) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.12.11) + jest-cli: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@22.7.5): - dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - - jest@29.7.0(@types/node@22.7.5)(supports-color@5.5.0): - dependencies: - '@jest/core': 29.7.0(supports-color@5.5.0) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(supports-color@5.5.0) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - jiti@1.20.0: {} jose@5.2.1: {} @@ -21685,7 +21063,7 @@ snapshots: jsbn@1.1.0: {} - jsdom@20.0.3(supports-color@5.5.0): + jsdom@20.0.3(supports-color@8.1.1): dependencies: abab: 2.0.6 acorn: 8.11.3 @@ -21698,8 +21076,8 @@ snapshots: escodegen: 2.1.0 form-data: 4.0.0 html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0(supports-color@5.5.0) - https-proxy-agent: 5.0.1(supports-color@5.5.0) + http-proxy-agent: 5.0.0(supports-color@8.1.1) + https-proxy-agent: 5.0.1(supports-color@8.1.1) is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 parse5: 7.1.2 @@ -21832,23 +21210,23 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libpg-query@13.3.1(encoding@0.1.13)(supports-color@5.5.0): + libpg-query@13.3.1(encoding@0.1.13)(supports-color@8.1.1): dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@5.5.0) + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@8.1.1) node-addon-api: 1.7.2 - node-gyp: 8.4.1(supports-color@5.5.0) + node-gyp: 8.4.1(supports-color@8.1.1) transitivePeerDependencies: - bluebird - encoding - supports-color - libpg-query@15.2.0(encoding@0.1.13)(supports-color@5.5.0): + libpg-query@15.2.0(encoding@0.1.13)(supports-color@8.1.1): dependencies: '@emnapi/runtime': 0.43.1 - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@5.5.0) + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13)(supports-color@8.1.1) '@pgsql/types': 15.0.2 node-addon-api: 7.1.0 - node-gyp: 10.1.0(supports-color@5.5.0) + node-gyp: 10.1.0(supports-color@8.1.1) transitivePeerDependencies: - encoding - supports-color @@ -21888,12 +21266,6 @@ snapshots: emojis-list: 3.0.0 json5: 1.0.2 - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - local-pkg@0.5.0: dependencies: mlly: 1.7.1 @@ -22037,9 +21409,9 @@ snapshots: make-error@1.3.6: {} - make-fetch-happen@13.0.1(supports-color@5.5.0): + make-fetch-happen@13.0.1(supports-color@8.1.1): dependencies: - '@npmcli/agent': 2.2.2(supports-color@5.5.0) + '@npmcli/agent': 2.2.2(supports-color@8.1.1) cacache: 18.0.3 http-cache-semantics: 4.1.1 is-lambda: 1.0.1 @@ -22054,13 +21426,13 @@ snapshots: transitivePeerDependencies: - supports-color - make-fetch-happen@9.1.0(supports-color@5.5.0): + make-fetch-happen@9.1.0(supports-color@8.1.1): dependencies: agentkeepalive: 4.5.0 cacache: 15.3.0 http-cache-semantics: 4.1.1 - http-proxy-agent: 4.0.1(supports-color@5.5.0) - https-proxy-agent: 5.0.1(supports-color@5.5.0) + http-proxy-agent: 4.0.1(supports-color@8.1.1) + https-proxy-agent: 5.0.1(supports-color@8.1.1) is-lambda: 1.0.1 lru-cache: 6.0.0 minipass: 3.3.6 @@ -22070,7 +21442,7 @@ snapshots: minipass-pipeline: 1.2.4 negotiator: 0.6.3 promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1(supports-color@5.5.0) + socks-proxy-agent: 6.2.1(supports-color@8.1.1) ssri: 8.0.1 transitivePeerDependencies: - bluebird @@ -22143,13 +21515,13 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - mdast-util-from-markdown@1.3.1(supports-color@5.5.0): + mdast-util-from-markdown@1.3.1(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.8 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 - micromark: 3.2.0(supports-color@5.5.0) + micromark: 3.2.0(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-decode-string: 1.1.0 micromark-util-normalize-identifier: 1.1.0 @@ -22160,14 +21532,14 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-from-markdown@2.0.0: + mdast-util-from-markdown@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 '@types/unist': 3.0.3 decode-named-character-reference: 1.0.2 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.0 + micromark: 4.0.0(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-decode-string: 2.0.0 micromark-util-normalize-identifier: 2.0.0 @@ -22177,12 +21549,12 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-frontmatter@2.0.1: + mdast-util-frontmatter@2.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -22209,11 +21581,11 @@ snapshots: mdast-util-to-markdown: 1.5.0 micromark-util-normalize-identifier: 1.1.0 - mdast-util-gfm-footnote@2.0.0: + mdast-util-gfm-footnote@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: @@ -22224,29 +21596,29 @@ snapshots: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@1.0.7(supports-color@5.5.0): + mdast-util-gfm-table@1.0.7(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 markdown-table: 3.0.3 - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 devlop: 1.1.0 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -22256,80 +21628,80 @@ snapshots: '@types/mdast': 3.0.15 mdast-util-to-markdown: 1.5.0 - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-gfm@2.0.2(supports-color@5.5.0): + mdast-util-gfm@2.0.2(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 1.0.3 mdast-util-gfm-footnote: 1.0.2 mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7(supports-color@5.5.0) + mdast-util-gfm-table: 1.0.7(supports-color@8.1.1) mdast-util-gfm-task-list-item: 1.0.2 mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.0.0: + mdast-util-gfm@3.0.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-strikethrough: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-table: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: + mdast-util-math@3.0.0(supports-color@8.1.1): dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.1 devlop: 1.1.0 longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 unist-util-remove-position: 5.0.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@1.3.2: + mdast-util-mdx-expression@1.3.2(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 2.3.6 '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.0: + mdast-util-mdx-expression@2.0.0(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 3.0.4 '@types/mdast': 4.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@2.1.4: + mdast-util-mdx-jsx@2.1.4(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 2.3.6 '@types/mdast': 3.0.15 '@types/unist': 2.0.8 ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) mdast-util-to-markdown: 1.5.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 @@ -22339,7 +21711,7 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.1.2: + mdast-util-mdx-jsx@3.1.2(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 3.0.4 @@ -22347,7 +21719,7 @@ snapshots: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 @@ -22357,43 +21729,43 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdx@2.0.1: + mdast-util-mdx@2.0.1(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) + mdast-util-mdx-expression: 1.3.2(supports-color@8.1.1) + mdast-util-mdx-jsx: 2.1.4(supports-color@8.1.1) + mdast-util-mdxjs-esm: 1.3.1(supports-color@8.1.1) mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-mdx@3.0.0: + mdast-util-mdx@3.0.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.1.2 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-expression: 2.0.0(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.1.2(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@1.3.1: + mdast-util-mdxjs-esm@1.3.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 2.3.6 '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@2.0.1: + mdast-util-mdxjs-esm@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.1 '@types/hast': 3.0.4 '@types/mdast': 4.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color @@ -22481,15 +21853,15 @@ snapshots: mdurl@1.0.1: {} - mdx-bundler@10.0.2(esbuild@0.20.2): + mdx-bundler@10.0.2(esbuild@0.20.2)(supports-color@8.1.1): dependencies: '@babel/runtime': 7.24.7 - '@esbuild-plugins/node-resolve': 0.2.2(esbuild@0.20.2) + '@esbuild-plugins/node-resolve': 0.2.2(esbuild@0.20.2)(supports-color@8.1.1) '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@mdx-js/esbuild': 3.0.1(esbuild@0.20.2) + '@mdx-js/esbuild': 3.0.1(esbuild@0.20.2)(supports-color@8.1.1) esbuild: 0.20.2 gray-matter: 4.0.3 - remark-frontmatter: 5.0.0 + remark-frontmatter: 5.0.0(supports-color@8.1.1) remark-mdx-frontmatter: 4.0.0 uuid: 9.0.1 vfile: 6.0.3 @@ -22511,9 +21883,9 @@ snapshots: merge2@1.4.1: {} - meros@1.3.0(@types/node@22.7.5): + meros@1.3.0(@types/node@20.12.11): optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 meshoptimizer@0.18.1: {} @@ -23018,10 +22390,10 @@ snapshots: micromark-util-types@2.0.0: {} - micromark@3.2.0(supports-color@5.5.0): + micromark@3.2.0(supports-color@8.1.1): dependencies: '@types/debug': 4.1.9 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -23040,10 +22412,10 @@ snapshots: transitivePeerDependencies: - supports-color - micromark@4.0.0: + micromark@4.0.0(supports-color@8.1.1): dependencies: '@types/debug': 4.1.9 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.1 @@ -23273,12 +22645,12 @@ snapshots: neo-async@2.6.2: {} - next-contentlayer2@0.4.6(contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.13(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-contentlayer2@0.4.6(contentlayer2@0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1): dependencies: - '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.4.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.4.3 - contentlayer2: 0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0) - next: 14.2.13(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + contentlayer2: 0.4.6(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -23287,12 +22659,12 @@ snapshots: - markdown-wasm - supports-color - next-contentlayer2@0.5.3(contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-contentlayer2@0.5.3(contentlayer2@0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.20.2)(markdown-wasm@1.2.0)(next@14.2.15(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1): dependencies: - '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) + '@contentlayer2/core': 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) '@contentlayer2/utils': 0.5.3 - contentlayer2: 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0) - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + contentlayer2: 0.5.3(esbuild@0.20.2)(markdown-wasm@1.2.0)(supports-color@8.1.1) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -23301,9 +22673,9 @@ snapshots: - markdown-wasm - supports-color - next-mdx-remote@4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-mdx-remote@4.4.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(supports-color@8.1.1): dependencies: - '@mdx-js/mdx': 2.3.0 + '@mdx-js/mdx': 2.3.0(supports-color@8.1.1) '@mdx-js/react': 2.3.0(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -23316,14 +22688,14 @@ snapshots: dependencies: js-yaml-loader: 1.2.2 - next-router-mock@0.9.13(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0): + next-router-mock@0.9.13(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react@18.2.0): dependencies: - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 - next-seo@6.5.0(next@14.2.13(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next-seo@6.5.0(next@14.2.15(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -23332,9 +22704,9 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0): + next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0): dependencies: - '@next/env': 14.2.13 + '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 caniuse-lite: 1.0.30001651 @@ -23342,17 +22714,17 @@ snapshots: postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.7(supports-color@5.5.0))(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.24.7(supports-color@8.1.1))(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.13 - '@next/swc-darwin-x64': 14.2.13 - '@next/swc-linux-arm64-gnu': 14.2.13 - '@next/swc-linux-arm64-musl': 14.2.13 - '@next/swc-linux-x64-gnu': 14.2.13 - '@next/swc-linux-x64-musl': 14.2.13 - '@next/swc-win32-arm64-msvc': 14.2.13 - '@next/swc-win32-ia32-msvc': 14.2.13 - '@next/swc-win32-x64-msvc': 14.2.13 + '@next/swc-darwin-arm64': 14.2.15 + '@next/swc-darwin-x64': 14.2.15 + '@next/swc-linux-arm64-gnu': 14.2.15 + '@next/swc-linux-arm64-musl': 14.2.15 + '@next/swc-linux-x64-gnu': 14.2.15 + '@next/swc-linux-x64-musl': 14.2.15 + '@next/swc-win32-arm64-msvc': 14.2.15 + '@next/swc-win32-ia32-msvc': 14.2.15 + '@next/swc-win32-x64-msvc': 14.2.15 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.41.2 sass: 1.72.0 @@ -23360,39 +22732,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@14.2.13(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0): - dependencies: - '@next/env': 14.2.13 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001651 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.24.7)(react@18.2.0) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.13 - '@next/swc-darwin-x64': 14.2.13 - '@next/swc-linux-arm64-gnu': 14.2.13 - '@next/swc-linux-arm64-musl': 14.2.13 - '@next/swc-linux-x64-gnu': 14.2.13 - '@next/swc-linux-x64-musl': 14.2.13 - '@next/swc-win32-arm64-msvc': 14.2.13 - '@next/swc-win32-ia32-msvc': 14.2.13 - '@next/swc-win32-x64-msvc': 14.2.13 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.41.2 - sass: 1.72.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - nextjs-node-loader@1.1.5(webpack@5.94.0): - dependencies: - loader-utils: 2.0.4 - webpack: 5.94.0 - nice-try@1.0.5: {} no-case@3.0.4: @@ -23432,13 +22771,13 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-gyp@10.1.0(supports-color@5.5.0): + node-gyp@10.1.0(supports-color@8.1.1): dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 glob: 10.4.5 graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1(supports-color@5.5.0) + make-fetch-happen: 13.0.1(supports-color@8.1.1) nopt: 7.2.1 proc-log: 3.0.0 semver: 7.6.3 @@ -23447,12 +22786,12 @@ snapshots: transitivePeerDependencies: - supports-color - node-gyp@8.4.1(supports-color@5.5.0): + node-gyp@8.4.1(supports-color@8.1.1): dependencies: env-paths: 2.2.1 glob: 7.2.3 graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0(supports-color@5.5.0) + make-fetch-happen: 9.1.0(supports-color@8.1.1) nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 @@ -23543,10 +22882,10 @@ snapshots: number-flow@0.3.7: {} - nuqs@1.19.1(next@14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)): + nuqs@1.19.1(next@14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0)): dependencies: mitt: 3.0.1 - next: 14.2.13(@babel/core@7.24.7(supports-color@5.5.0))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) + next: 14.2.15(@babel/core@7.24.7(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.41.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(sass@1.72.0) nwsapi@2.2.7: {} @@ -23903,10 +23242,10 @@ snapshots: dependencies: '@babel/runtime': 7.24.7 - pgsql-parser@13.5.0(encoding@0.1.13)(supports-color@5.5.0): + pgsql-parser@13.5.0(encoding@0.1.13)(supports-color@8.1.1): dependencies: '@babel/runtime': 7.24.7 - libpg-query: 13.3.1(encoding@0.1.13)(supports-color@5.5.0) + libpg-query: 13.3.1(encoding@0.1.13)(supports-color@8.1.1) minimist: 1.2.8 pgsql-deparser: 13.4.0 pgsql-enums: 13.1.3 @@ -24126,7 +23465,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.7.5 + '@types/node': 20.12.11 long: 5.2.3 proxy-compare@2.4.0: {} @@ -24236,7 +23575,7 @@ snapshots: dependencies: dnd-core: 16.0.1 - react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.2)(@types/node@22.7.5)(@types/react@18.3.3)(react@18.2.0): + react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.2)(@types/node@20.12.11)(@types/react@18.3.3)(react@18.2.0): dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -24246,13 +23585,13 @@ snapshots: react: 18.2.0 optionalDependencies: '@types/hoist-non-react-statics': 3.3.2 - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@types/react': 18.3.3 - react-docgen@7.0.3: + react-docgen@7.0.3(supports-color@8.1.1): dependencies: - '@babel/core': 7.24.7 - '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/core': 7.24.7(supports-color@8.1.1) + '@babel/traverse': 7.24.7(supports-color@8.1.1) '@babel/types': 7.24.7 '@types/babel__core': 7.20.2 '@types/babel__traverse': 7.20.2 @@ -24322,7 +23661,7 @@ snapshots: react-is@18.3.1: {} - react-markdown@8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@5.5.0): + react-markdown@8.0.7(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1): dependencies: '@types/hast': 2.3.6 '@types/prop-types': 15.7.8 @@ -24334,7 +23673,7 @@ snapshots: property-information: 6.3.0 react: 18.2.0 react-is: 18.3.1 - remark-parse: 10.0.2(supports-color@5.5.0) + remark-parse: 10.0.2(supports-color@8.1.1) remark-rehype: 10.1.0 space-separated-tokens: 2.0.2 style-to-object: 0.4.2 @@ -24344,16 +23683,16 @@ snapshots: transitivePeerDependencies: - supports-color - react-markdown@9.0.1(@types/react@18.3.3)(react@18.2.0): + react-markdown@9.0.1(@types/react@18.3.3)(react@18.2.0)(supports-color@8.1.1): dependencies: '@types/hast': 3.0.4 '@types/react': 18.3.3 devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.0 + hast-util-to-jsx-runtime: 2.3.0(supports-color@8.1.1) html-url-attributes: 3.0.0 mdast-util-to-hast: 13.2.0 react: 18.2.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.1 unified: 11.0.5 unist-util-visit: 5.0.0 @@ -24769,30 +24108,30 @@ snapshots: mdast-util-find-and-replace: 2.2.2 node-emoji: 1.11.0 - remark-frontmatter@5.0.0: + remark-frontmatter@5.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - mdast-util-frontmatter: 2.0.1 + mdast-util-frontmatter: 2.0.1(supports-color@8.1.1) micromark-extension-frontmatter: 2.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-gfm@3.0.1(supports-color@5.5.0): + remark-gfm@3.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2(supports-color@5.5.0) + mdast-util-gfm: 2.0.2(supports-color@8.1.1) micromark-extension-gfm: 2.0.3 unified: 10.1.2 transitivePeerDependencies: - supports-color - remark-gfm@4.0.0: + remark-gfm@4.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - mdast-util-gfm: 3.0.0 + mdast-util-gfm: 3.0.0(supports-color@8.1.1) micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: @@ -24806,10 +24145,10 @@ snapshots: mdast-util-to-hast: 13.2.0 unified: 11.0.5 - remark-math@6.0.0: + remark-math@6.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - mdast-util-math: 3.0.0 + mdast-util-math: 3.0.0(supports-color@8.1.1) micromark-extension-math: 3.0.0 unified: 11.0.5 transitivePeerDependencies: @@ -24824,32 +24163,32 @@ snapshots: unified: 11.0.5 yaml: 2.4.5 - remark-mdx@2.3.0: + remark-mdx@2.3.0(supports-color@8.1.1): dependencies: - mdast-util-mdx: 2.0.1 + mdast-util-mdx: 2.0.1(supports-color@8.1.1) micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color - remark-mdx@3.0.1: + remark-mdx@3.0.1(supports-color@8.1.1): dependencies: - mdast-util-mdx: 3.0.0 + mdast-util-mdx: 3.0.0(supports-color@8.1.1) micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - remark-parse@10.0.2(supports-color@5.5.0): + remark-parse@10.0.2(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1(supports-color@5.5.0) + mdast-util-from-markdown: 1.3.1(supports-color@8.1.1) unified: 10.1.2 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-parse@11.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - mdast-util-from-markdown: 2.0.0 + mdast-util-from-markdown: 2.0.0(supports-color@8.1.1) micromark-util-types: 2.0.0 unified: 11.0.5 transitivePeerDependencies: @@ -24882,19 +24221,19 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.5 - remark@14.0.3: + remark@14.0.3(supports-color@8.1.1): dependencies: '@types/mdast': 3.0.15 - remark-parse: 10.0.2(supports-color@5.5.0) + remark-parse: 10.0.2(supports-color@8.1.1) remark-stringify: 10.0.3 unified: 10.1.2 transitivePeerDependencies: - supports-color - remark@15.0.1: + remark@15.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.1 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: @@ -24917,9 +24256,9 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.4.0(supports-color@5.5.0): + require-in-the-middle@7.4.0(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: @@ -25188,11 +24527,11 @@ snapshots: signal-exit@4.1.0: {} - simple-git@3.24.0: + simple-git@3.24.0(supports-color@8.1.1): dependencies: - '@kwsites/file-exists': 1.1.1 + '@kwsites/file-exists': 1.1.1(supports-color@8.1.1) '@kwsites/promise-deferred': 1.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -25200,9 +24539,9 @@ snapshots: dependencies: is-arrayish: 0.3.2 - simple-websocket@9.1.0: + simple-websocket@9.1.0(supports-color@8.1.1): dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) queue-microtask: 1.2.3 randombytes: 2.1.0 readable-stream: 3.6.2 @@ -25237,18 +24576,18 @@ snapshots: dot-case: 3.0.4 tslib: 2.6.2 - socks-proxy-agent@6.2.1(supports-color@5.5.0): + socks-proxy-agent@6.2.1(supports-color@8.1.1): dependencies: - agent-base: 6.0.2(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 6.0.2(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color - socks-proxy-agent@8.0.3(supports-color@5.5.0): + socks-proxy-agent@8.0.3(supports-color@8.1.1): dependencies: - agent-base: 7.1.1(supports-color@5.5.0) - debug: 4.3.7(supports-color@5.5.0) + agent-base: 7.1.1(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -25544,19 +24883,12 @@ snapshots: stylis: 4.3.1 tslib: 2.5.0 - styled-jsx@5.1.1(@babel/core@7.24.7(supports-color@5.5.0))(react@18.2.0): + styled-jsx@5.1.1(@babel/core@7.24.7(supports-color@8.1.1))(react@18.2.0): dependencies: client-only: 0.0.1 react: 18.2.0 optionalDependencies: - '@babel/core': 7.24.7(supports-color@5.5.0) - - styled-jsx@5.1.1(@babel/core@7.24.7)(react@18.2.0): - dependencies: - client-only: 0.0.1 - react: 18.2.0 - optionalDependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) stylis@4.3.1: {} @@ -25570,10 +24902,10 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 - supabase@1.151.1: + supabase@1.151.1(supports-color@8.1.1): dependencies: bin-links: 4.0.3 - https-proxy-agent: 7.0.4(supports-color@5.5.0) + https-proxy-agent: 7.0.4(supports-color@8.1.1) node-fetch: 3.3.2 tar: 6.2.1 transitivePeerDependencies: @@ -25856,11 +25188,11 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.2(@babel/core@7.24.7)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(jest@29.7.0(@types/node@20.12.11))(typescript@5.5.2): + ts-jest@29.1.2(@babel/core@7.24.7(supports-color@8.1.1))(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1))(jest@29.7.0(@types/node@20.12.11)(supports-color@8.1.1))(typescript@5.5.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.11) + jest: 29.7.0(@types/node@20.12.11)(supports-color@8.1.1) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -25869,9 +25201,9 @@ snapshots: typescript: 5.5.2 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.24.7(supports-color@8.1.1) '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.24.7) + babel-jest: 29.7.0(@babel/core@7.24.7(supports-color@8.1.1))(supports-color@8.1.1) ts-morph@22.0.0: dependencies: @@ -26370,13 +25702,13 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-node@1.6.0(@types/node@22.7.5)(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0): + vite-node@1.6.0(@types/node@20.12.11)(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) + vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) transitivePeerDependencies: - '@types/node' - less @@ -26387,10 +25719,10 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0): + vite-node@2.1.8(@types/node@20.12.11)(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) @@ -26404,37 +25736,9 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0): + vite-tsconfig-paths@4.3.2(supports-color@8.1.1)(typescript@5.5.2)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)): dependencies: - cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) - es-module-lexer: 1.5.4 - pathe: 1.1.2 - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite-tsconfig-paths@4.3.2(supports-color@5.5.0)(typescript@5.5.2)(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0)): - dependencies: - debug: 4.3.7(supports-color@5.5.0) - globrex: 0.1.2 - tsconfck: 3.0.3(typescript@5.5.2) - optionalDependencies: - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - transitivePeerDependencies: - - supports-color - - typescript - - vite-tsconfig-paths@4.3.2(typescript@5.5.2)(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)): - dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.5.2) optionalDependencies: @@ -26454,18 +25758,7 @@ snapshots: sass: 1.72.0 terser: 5.32.0 - vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0): - dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.22.4 - optionalDependencies: - '@types/node': 22.7.5 - fsevents: 2.3.3 - sass: 1.72.0 - terser: 5.32.0 - - vitest@1.6.0(@types/node@22.7.5)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@5.5.0))(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0): + vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@20.0.3(supports-color@8.1.1))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -26474,7 +25767,7 @@ snapshots: '@vitest/utils': 1.6.0 acorn-walk: 8.3.2 chai: 4.4.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.12 @@ -26484,13 +25777,13 @@ snapshots: strip-literal: 2.0.0 tinybench: 2.9.0 tinypool: 0.8.3 - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - vite-node: 1.6.0(@types/node@22.7.5)(sass@1.72.0)(supports-color@5.5.0)(terser@5.32.0) + vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) + vite-node: 1.6.0(@types/node@20.12.11)(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.7.5 + '@types/node': 20.12.11 '@vitest/ui': 1.6.0(vitest@1.6.0) - jsdom: 20.0.3(supports-color@5.5.0) + jsdom: 20.0.3(supports-color@8.1.1) transitivePeerDependencies: - less - lightningcss @@ -26500,7 +25793,7 @@ snapshots: - supports-color - terser - vitest@2.1.8(@types/node@20.12.11)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0): + vitest@2.1.8(@types/node@20.12.11)(jsdom@20.0.3(supports-color@8.1.1))(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0): dependencies: '@vitest/expect': 2.1.8 '@vitest/mocker': 2.1.8(msw@2.4.11(typescript@5.5.2))(vite@5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0)) @@ -26510,7 +25803,7 @@ snapshots: '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 @@ -26520,46 +25813,11 @@ snapshots: tinypool: 1.0.2 tinyrainbow: 1.2.0 vite: 5.2.14(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) - vite-node: 2.1.8(@types/node@20.12.11)(sass@1.72.0)(terser@5.32.0) + vite-node: 2.1.8(@types/node@20.12.11)(sass@1.72.0)(supports-color@8.1.1)(terser@5.32.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.12.11 - jsdom: 20.0.3(supports-color@5.5.0) - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - stylus - - sugarss - - supports-color - - terser - - vitest@2.1.8(@types/node@22.7.5)(jsdom@20.0.3)(msw@2.4.11(typescript@5.5.2))(sass@1.72.0)(terser@5.32.0): - dependencies: - '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(msw@2.4.11(typescript@5.5.2))(vite@5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0)) - '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.8 - '@vitest/snapshot': 2.1.8 - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 - chai: 5.1.2 - debug: 4.3.7(supports-color@5.5.0) - expect-type: 1.1.0 - magic-string: 0.30.12 - pathe: 1.1.2 - std-env: 3.8.0 - tinybench: 2.9.0 - tinyexec: 0.3.1 - tinypool: 1.0.2 - tinyrainbow: 1.2.0 - vite: 5.2.14(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - vite-node: 2.1.8(@types/node@22.7.5)(sass@1.72.0)(terser@5.32.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.7.5 - jsdom: 20.0.3(supports-color@5.5.0) + jsdom: 20.0.3(supports-color@8.1.1) transitivePeerDependencies: - less - lightningcss diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f1804f8014a..2aeb07628b3 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,8 @@ packages: - "apps/*" - "packages/*" - "tests" - - "playwright-tests" \ No newline at end of file + - "playwright-tests" + +catalog: + '@types/node': ^20.0.0 + next: 14.2.15 diff --git a/tests/package.json b/tests/package.json index 13207948e74..354f06f3799 100644 --- a/tests/package.json +++ b/tests/package.json @@ -23,7 +23,7 @@ "@supabase/supabase-js": "^2.44.3", "@testdeck/jest": "^0.3.3", "@types/jest": "^29.5.4", - "@types/node": "^20.11.16", + "@types/node": "^20.0.0", "@typescript-eslint/eslint-plugin": "^6.19.1", "@typescript-eslint/parser": "^6.19.1", "allure-commandline": "^2.17.2", From 71fc66981c7cdc370e0ed3603dc8f7d23d5d234e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Gr=C3=BCneberg?= Date: Fri, 3 Jan 2025 21:34:23 +0800 Subject: [PATCH 49/56] chore: bump turbo (#32548) --- apps/studio/Dockerfile | 4 +-- package.json | 2 +- pnpm-lock.yaml | 58 +++++++++++++++++++++--------------------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/apps/studio/Dockerfile b/apps/studio/Dockerfile index ac935b26cec..1d3d57dcb4e 100644 --- a/apps/studio/Dockerfile +++ b/apps/studio/Dockerfile @@ -30,7 +30,7 @@ WORKDIR /app FROM base AS turbo COPY . . -RUN pnpm dlx turbo@2.0.4 prune studio --docker +RUN pnpm dlx turbo@2.3.3 prune studio --docker # Install dev dependencies (only if needed) FROM base AS deps @@ -50,7 +50,7 @@ CMD ["pnpm", "dev:studio"] # Compile Next.js FROM dev AS builder -RUN pnpm dlx turbo@2.0.4 run build --filter studio -- --no-lint +RUN pnpm dlx turbo@2.3.3 run build --filter studio -- --no-lint # Copy only compiled code and dependencies FROM base AS production diff --git a/package.json b/package.json index 8cd03a570a7..3c9999a71b0 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "sass": "^1.72.0", "supabase": "^1.151.1", "supports-color": "^8.0.0", - "turbo": "2.0.4", + "turbo": "2.3.3", "typescript": "~5.5.0" }, "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3a7d6daafc1..a891ba1bf9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: specifier: ^8.0.0 version: 8.1.1 turbo: - specifier: 2.0.4 - version: 2.0.4 + specifier: 2.3.3 + version: 2.3.3 typescript: specifier: ~5.5.0 version: 5.5.2 @@ -11886,38 +11886,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.0.4: - resolution: {integrity: sha512-x9mvmh4wudBstML8Z8IOmokLWglIhSfhQwnh2gBCSqabgVBKYvzl8Y+i+UCNPxheCGTgtsPepTcIaKBIyFIcvw==} + turbo-darwin-64@2.3.3: + resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.0.4: - resolution: {integrity: sha512-/B1Ih8zPRGVw5vw4SlclOf3C/woJ/2T6ieH6u54KT4wypoaVyaiyMqBcziIXycdObIYr7jQ+raHO7q3mhay9/A==} + turbo-darwin-arm64@2.3.3: + resolution: {integrity: sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.0.4: - resolution: {integrity: sha512-6aG670e5zOWu6RczEYcB81nEl8EhiGJEvWhUrnAfNEUIMBEH1pR5SsMmG2ol5/m3PgiRM12r13dSqTxCLcHrVg==} + turbo-linux-64@2.3.3: + resolution: {integrity: sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.0.4: - resolution: {integrity: sha512-AXfVOjst+mCtPDFT4tCu08Qrfv12Nj7NDd33AjGwV79NYN1Y1rcFY59UQ4nO3ij3rbcvV71Xc+TZJ4csEvRCSg==} + turbo-linux-arm64@2.3.3: + resolution: {integrity: sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.0.4: - resolution: {integrity: sha512-QOnUR9hKl0T5gq5h1fAhVEqBSjpcBi/BbaO71YGQNgsr6pAnCQdbG8/r3MYXet53efM0KTdOhieWeO3KLNKybA==} + turbo-windows-64@2.3.3: + resolution: {integrity: sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.0.4: - resolution: {integrity: sha512-3v8WpdZy1AxZw0gha0q3caZmm+0gveBQ40OspD6mxDBIS+oBtO5CkxhIXkFJJW+jDKmDlM7wXDIGfMEq+QyNCQ==} + turbo-windows-arm64@2.3.3: + resolution: {integrity: sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==} cpu: [arm64] os: [win32] - turbo@2.0.4: - resolution: {integrity: sha512-Ilme/2Q5kYw0AeRr+aw3s02+WrEYaY7U8vPnqSZU/jaDG/qd6jHVN6nRWyd/9KXvJGYM69vE6JImoGoyNjLwaw==} + turbo@2.3.3: + resolution: {integrity: sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==} hasBin: true tus-js-client@4.1.0: @@ -25248,32 +25248,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.0.4: + turbo-darwin-64@2.3.3: optional: true - turbo-darwin-arm64@2.0.4: + turbo-darwin-arm64@2.3.3: optional: true - turbo-linux-64@2.0.4: + turbo-linux-64@2.3.3: optional: true - turbo-linux-arm64@2.0.4: + turbo-linux-arm64@2.3.3: optional: true - turbo-windows-64@2.0.4: + turbo-windows-64@2.3.3: optional: true - turbo-windows-arm64@2.0.4: + turbo-windows-arm64@2.3.3: optional: true - turbo@2.0.4: + turbo@2.3.3: optionalDependencies: - turbo-darwin-64: 2.0.4 - turbo-darwin-arm64: 2.0.4 - turbo-linux-64: 2.0.4 - turbo-linux-arm64: 2.0.4 - turbo-windows-64: 2.0.4 - turbo-windows-arm64: 2.0.4 + turbo-darwin-64: 2.3.3 + turbo-darwin-arm64: 2.3.3 + turbo-linux-64: 2.3.3 + turbo-linux-arm64: 2.3.3 + turbo-windows-64: 2.3.3 + turbo-windows-arm64: 2.3.3 tus-js-client@4.1.0: dependencies: From a4acebe1bc5e324893b7fc4bbe1316227cd9777e Mon Sep 17 00:00:00 2001 From: Ivan Vasilov Date: Fri, 3 Jan 2025 16:23:32 +0100 Subject: [PATCH 50/56] chore: Expand prettier commands to also run on packages (#32550) * Run prettier on packages too. * Add the generated files for icons to prettierignore. * Format all files in the packages folder. * Minor fix. --- .prettierignore | 4 +- package.json | 4 +- packages/ai-commands/test/sql-util.ts | 5 +- packages/ai-commands/tsconfig.json | 16 +- packages/common/database-types.ts | 143 +- packages/generator/tsdoc.ts | 19 +- packages/icons/src/createSupabaseIcon.ts | 36 +- packages/icons/src/defaultAttributes.ts | 2 +- .../src/raw-icons/_example-template.json | 20 +- packages/shared-data/config.ts | 9 +- packages/shared-data/regions.ts | 2 +- packages/tsconfig/package.json | 6 +- packages/ui-patterns/vitest.setup.ts | 1 - packages/ui/build/css/tw-extend/color.js | 1288 ++++++++--------- packages/ui/components.json | 2 +- .../transform/common/camelCaseHelper.js | 3 +- .../internals/transform/common/colorToHex8.js | 2 +- .../transform/common/colorToRgbaString.js | 2 +- .../transform/common/copyFileOrFolder.js | 2 +- .../transform/web/createPropertyFormatter.js | 84 +- .../ui/internals/transform/web/fileHeader.js | 11 +- .../ui/internals/transform/web/filterWeb.js | 10 +- .../ui/internals/transform/web/formatCss.js | 45 +- .../transform/web/formattedVariables.js | 8 +- packages/ui/internals/transform/web/sizePx.js | 2 +- .../transform/web/sortByReference.js | 36 +- .../ui/internals/transform/web/webFont.js | 7 +- .../ui/internals/transform/web/webGradient.js | 10 +- .../ui/internals/transform/web/webPadding.js | 4 +- .../ui/internals/transform/web/webRadius.js | 4 +- .../ui/internals/transform/web/webShadows.js | 2 +- .../components/Breadcrumb/Breadcrumb.test.jsx | 8 +- .../ContextMenu/ContextMenu.module.css | 8 +- .../ui/src/components/InputOld/Input.test.jsx | 7 +- .../ui/src/components/RadioOld/Radio.test.jsx | 20 +- .../ui/src/components/Typography/index.tsx | 3 - .../src/components/Upload/Upload.module.css | 2 +- .../src/components/shadcn/ui/aspect-ratio.tsx | 4 +- packages/ui/src/lib/Spinner/styles.module.css | 85 +- packages/ui/src/lib/tailwind-demo-classes.ts | 330 +++-- packages/ui/tailwind-theming.md | 6 +- 41 files changed, 1109 insertions(+), 1153 deletions(-) diff --git a/.prettierignore b/.prettierignore index 37dd5d06e3c..f399c6bc555 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,4 +16,6 @@ apps/docs/pages/guides/integrations/*.mdx apps/studio/public apps/**/.turbo apps/docs/CONTRIBUTING.md -apps/design-system/__registry__ \ No newline at end of file +apps/design-system/__registry__ +packages/icons/__registry__ +packages/icons/src/icons/*.ts \ No newline at end of file diff --git a/package.json b/package.json index 3c9999a71b0..f92f9268c5d 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "dev:design-system": "turbo run dev --filter=design-system --parallel", "lint": "turbo run lint", "typecheck": "turbo --continue typecheck", - "test:prettier": "prettier -c 'apps/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", - "format": "prettier --write \"apps/**/*.{js,jsx,ts,tsx,css,md,mdx,json}\" \"packages/pg-meta/**/*.ts\"", + "test:prettier": "prettier -c '{apps,packages}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", + "format": "prettier --write '{apps,packages}/**/*.{js,jsx,ts,tsx,css,md,mdx,json}'", "docker:dev": "cd docker && docker compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml up --renew-anon-volumes", "docker:up": "cd docker && docker compose up", "docker:down": "cd docker && docker compose -f docker-compose.yml -f ./dev/docker-compose.dev.yml down --remove-orphans", diff --git a/packages/ai-commands/test/sql-util.ts b/packages/ai-commands/test/sql-util.ts index 79fae6a4795..d9c5eea6c66 100644 --- a/packages/ai-commands/test/sql-util.ts +++ b/packages/ai-commands/test/sql-util.ts @@ -17,9 +17,8 @@ type ExtractKeys = T extends T ? keyof T : never /** * Unwraps a Node to get its underlying value. */ -type NodeValue> = T extends Record - ? V - : never +type NodeValue> = + T extends Record ? V : never export class AssertionError extends Error { constructor(message: string) { diff --git a/packages/ai-commands/tsconfig.json b/packages/ai-commands/tsconfig.json index e8b5504d293..f612f0c8a27 100644 --- a/packages/ai-commands/tsconfig.json +++ b/packages/ai-commands/tsconfig.json @@ -1,16 +1,8 @@ { "extends": "tsconfig/react-library.json", - "include": [ - "." - ], - "exclude": [ - "dist", - "build", - "node_modules" - ], + "include": ["."], + "exclude": ["dist", "build", "node_modules"], "compilerOptions": { - "types": [ - "./test/extensions.d.ts" - ] + "types": ["./test/extensions.d.ts"] } -} \ No newline at end of file +} diff --git a/packages/common/database-types.ts b/packages/common/database-types.ts index 79ee7683f14..4acdbef0dc2 100644 --- a/packages/common/database-types.ts +++ b/packages/common/database-types.ts @@ -1,10 +1,4 @@ -export type Json = - | string - | number - | boolean - | null - | { [key: string]: Json | undefined } - | Json[] +export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[] export type Database = { graphql_public: { @@ -40,21 +34,21 @@ export type Database = { id: number metadata: Json | null page: string - vote: Database["public"]["Enums"]["feedback_vote"] + vote: Database['public']['Enums']['feedback_vote'] } Insert: { date_created?: string id?: never metadata?: Json | null page: string - vote: Database["public"]["Enums"]["feedback_vote"] + vote: Database['public']['Enums']['feedback_vote'] } Update: { date_created?: string id?: never metadata?: Json | null page?: string - vote?: Database["public"]["Enums"]["feedback_vote"] + vote?: Database['public']['Enums']['feedback_vote'] } Relationships: [] } @@ -145,11 +139,11 @@ export type Database = { } Relationships: [ { - foreignKeyName: "meetups_launch_week_fkey" - columns: ["launch_week"] + foreignKeyName: 'meetups_launch_week_fkey' + columns: ['launch_week'] isOneToOne: false - referencedRelation: "launch_weeks" - referencedColumns: ["id"] + referencedRelation: 'launch_weeks' + referencedColumns: ['id'] }, ] } @@ -228,11 +222,11 @@ export type Database = { } Relationships: [ { - foreignKeyName: "page_section_page_id_fkey" - columns: ["page_id"] + foreignKeyName: 'page_section_page_id_fkey' + columns: ['page_id'] isOneToOne: false - referencedRelation: "page" - referencedColumns: ["id"] + referencedRelation: 'page' + referencedColumns: ['id'] }, ] } @@ -293,25 +287,25 @@ export type Database = { } Relationships: [ { - foreignKeyName: "public_tickets_id_fkey" - columns: ["user_id"] + foreignKeyName: 'public_tickets_id_fkey' + columns: ['user_id'] isOneToOne: false - referencedRelation: "users" - referencedColumns: ["id"] + referencedRelation: 'users' + referencedColumns: ['id'] }, { - foreignKeyName: "tickets_launch_week_fkey" - columns: ["launch_week"] + foreignKeyName: 'tickets_launch_week_fkey' + columns: ['launch_week'] isOneToOne: false - referencedRelation: "launch_weeks" - referencedColumns: ["id"] + referencedRelation: 'launch_weeks' + referencedColumns: ['id'] }, { - foreignKeyName: "tickets_user_id_fkey" - columns: ["user_id"] + foreignKeyName: 'tickets_user_id_fkey' + columns: ['user_id'] isOneToOne: false - referencedRelation: "users" - referencedColumns: ["id"] + referencedRelation: 'users' + referencedColumns: ['id'] }, ] } @@ -397,11 +391,11 @@ export type Database = { } Relationships: [ { - foreignKeyName: "tickets_launch_week_fkey" - columns: ["launch_week"] + foreignKeyName: 'tickets_launch_week_fkey' + columns: ['launch_week'] isOneToOne: false - referencedRelation: "launch_weeks" - referencedColumns: ["id"] + referencedRelation: 'launch_weeks' + referencedColumns: ['id'] }, ] } @@ -451,7 +445,7 @@ export type Database = { } hnswhandler: { Args: { - "": unknown + '': unknown } Returns: unknown } @@ -466,7 +460,7 @@ export type Database = { } ivfflathandler: { Args: { - "": unknown + '': unknown } Returns: unknown } @@ -532,43 +526,43 @@ export type Database = { } vector_avg: { Args: { - "": number[] + '': number[] } Returns: string } vector_dims: { Args: { - "": string + '': string } Returns: number } vector_norm: { Args: { - "": string + '': string } Returns: number } vector_out: { Args: { - "": string + '': string } Returns: unknown } vector_send: { Args: { - "": string + '': string } Returns: string } vector_typmod_in: { Args: { - "": unknown[] + '': unknown[] } Returns: number } } Enums: { - feedback_vote: "yes" | "no" + feedback_vote: 'yes' | 'no' } CompositeTypes: { [_ in never]: never @@ -678,11 +672,11 @@ export type Database = { } Relationships: [ { - foreignKeyName: "objects_bucketId_fkey" - columns: ["bucket_id"] + foreignKeyName: 'objects_bucketId_fkey' + columns: ['bucket_id'] isOneToOne: false - referencedRelation: "buckets" - referencedColumns: ["id"] + referencedRelation: 'buckets' + referencedColumns: ['id'] }, ] } @@ -755,27 +749,25 @@ export type Database = { } } -type PublicSchema = Database[Extract] +type PublicSchema = Database[Extract] export type Tables< PublicTableNameOrOptions extends - | keyof (PublicSchema["Tables"] & PublicSchema["Views"]) + | keyof (PublicSchema['Tables'] & PublicSchema['Views']) | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & - Database[PublicTableNameOrOptions["schema"]]["Views"]) + ? keyof (Database[PublicTableNameOrOptions['schema']]['Tables'] & + Database[PublicTableNameOrOptions['schema']]['Views']) : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & - Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { + ? (Database[PublicTableNameOrOptions['schema']]['Tables'] & + Database[PublicTableNameOrOptions['schema']]['Views'])[TableName] extends { Row: infer R } ? R : never - : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & - PublicSchema["Views"]) - ? (PublicSchema["Tables"] & - PublicSchema["Views"])[PublicTableNameOrOptions] extends { + : PublicTableNameOrOptions extends keyof (PublicSchema['Tables'] & PublicSchema['Views']) + ? (PublicSchema['Tables'] & PublicSchema['Views'])[PublicTableNameOrOptions] extends { Row: infer R } ? R @@ -783,20 +775,18 @@ export type Tables< : never export type TablesInsert< - PublicTableNameOrOptions extends - | keyof PublicSchema["Tables"] - | { schema: keyof Database }, + PublicTableNameOrOptions extends keyof PublicSchema['Tables'] | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + ? keyof Database[PublicTableNameOrOptions['schema']]['Tables'] : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + ? Database[PublicTableNameOrOptions['schema']]['Tables'][TableName] extends { Insert: infer I } ? I : never - : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] - ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + : PublicTableNameOrOptions extends keyof PublicSchema['Tables'] + ? PublicSchema['Tables'][PublicTableNameOrOptions] extends { Insert: infer I } ? I @@ -804,20 +794,18 @@ export type TablesInsert< : never export type TablesUpdate< - PublicTableNameOrOptions extends - | keyof PublicSchema["Tables"] - | { schema: keyof Database }, + PublicTableNameOrOptions extends keyof PublicSchema['Tables'] | { schema: keyof Database }, TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + ? keyof Database[PublicTableNameOrOptions['schema']]['Tables'] : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + ? Database[PublicTableNameOrOptions['schema']]['Tables'][TableName] extends { Update: infer U } ? U : never - : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] - ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + : PublicTableNameOrOptions extends keyof PublicSchema['Tables'] + ? PublicSchema['Tables'][PublicTableNameOrOptions] extends { Update: infer U } ? U @@ -825,15 +813,12 @@ export type TablesUpdate< : never export type Enums< - PublicEnumNameOrOptions extends - | keyof PublicSchema["Enums"] - | { schema: keyof Database }, + PublicEnumNameOrOptions extends keyof PublicSchema['Enums'] | { schema: keyof Database }, EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] + ? keyof Database[PublicEnumNameOrOptions['schema']]['Enums'] : never = never, > = PublicEnumNameOrOptions extends { schema: keyof Database } - ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] - : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] - ? PublicSchema["Enums"][PublicEnumNameOrOptions] + ? Database[PublicEnumNameOrOptions['schema']]['Enums'][EnumName] + : PublicEnumNameOrOptions extends keyof PublicSchema['Enums'] + ? PublicSchema['Enums'][PublicEnumNameOrOptions] : never - diff --git a/packages/generator/tsdoc.ts b/packages/generator/tsdoc.ts index e01d11b8d33..a362c345ef1 100644 --- a/packages/generator/tsdoc.ts +++ b/packages/generator/tsdoc.ts @@ -2,7 +2,7 @@ import { writeToDisk } from './helpers' import stringify from 'json-stringify-safe' import { parseArgs } from 'node:util' import fs from 'fs' -import { strict as assert } from 'node:assert'; +import { strict as assert } from 'node:assert' const args = parseArgs({ options: { @@ -24,13 +24,7 @@ interface KV { [key: string]: any } -async function dereference({ - input, - output, -}: { - input: string - output: string -}) { +async function dereference({ input, output }: { input: string; output: string }) { console.log('input', input) const specRaw = fs.readFileSync(input, 'utf8') @@ -72,9 +66,7 @@ function dereferenceReducer(child: any, kv: KV) { !!child.type.declaration.children && child.type.type === 'reflection' ) { - child.type.declaration.children.forEach((x: any) => - dereferenceReducer(x, kv) - ) + child.type.declaration.children.forEach((x: any) => dereferenceReducer(x, kv)) } const final = { ...child } @@ -97,10 +89,7 @@ function dereferenceReducer(child: any, kv: KV) { const dereferenced = kv[final.type.id] final.type.dereferenced = dereferenced || {} return final - } else if ( - final.kindString === 'Type alias' && - final.type?.type === 'union' - ) { + } else if (final.kindString === 'Type alias' && final.type?.type === 'union') { // handles union types that contain nested references // by replacing the reference in-place final.type.types = final.type.types.map((item: any) => { diff --git a/packages/icons/src/createSupabaseIcon.ts b/packages/icons/src/createSupabaseIcon.ts index 172a509f94e..5671d38e552 100644 --- a/packages/icons/src/createSupabaseIcon.ts +++ b/packages/icons/src/createSupabaseIcon.ts @@ -5,20 +5,20 @@ import { SVGProps, ForwardRefExoticComponent, RefAttributes, -} from 'react'; -import defaultAttributes from './defaultAttributes'; +} from 'react' +import defaultAttributes from './defaultAttributes' -export type IconNode = [elementName: keyof ReactSVG, attrs: Record][]; +export type IconNode = [elementName: keyof ReactSVG, attrs: Record][] -export type SVGAttributes = Partial>; -type ComponentAttributes = RefAttributes & SVGAttributes; +export type SVGAttributes = Partial> +type ComponentAttributes = RefAttributes & SVGAttributes export interface LucideProps extends ComponentAttributes { - size?: string | number; - absoluteStrokeWidth?: boolean; + size?: string | number + absoluteStrokeWidth?: boolean } -export type LucideIcon = ForwardRefExoticComponent; +export type LucideIcon = ForwardRefExoticComponent /** * Converts string to KebabCase * Copied from scripts/helper. If anyone knows how to properly import it here @@ -31,7 +31,7 @@ export const toKebabCase = (string: string) => string .replace(/([a-z0-9])([A-Z])/g, '$1-$2') .toLowerCase() - .trim(); + .trim() const createLucideIcon = (iconName: string, iconNode: IconNode): LucideIcon => { const Component = forwardRef( @@ -45,7 +45,7 @@ const createLucideIcon = (iconName: string, iconNode: IconNode): LucideIcon => { children, ...rest }, - ref, + ref ) => { return createElement( 'svg', @@ -64,14 +64,14 @@ const createLucideIcon = (iconName: string, iconNode: IconNode): LucideIcon => { [ ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)), ...(Array.isArray(children) ? children : [children]), - ], - ); - }, - ); + ] + ) + } + ) - Component.displayName = `${iconName}`; + Component.displayName = `${iconName}` - return Component; -}; + return Component +} -export default createLucideIcon; +export default createLucideIcon diff --git a/packages/icons/src/defaultAttributes.ts b/packages/icons/src/defaultAttributes.ts index ce97fb05877..e1644175a13 100644 --- a/packages/icons/src/defaultAttributes.ts +++ b/packages/icons/src/defaultAttributes.ts @@ -8,4 +8,4 @@ export default { strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', -}; +} diff --git a/packages/icons/src/raw-icons/_example-template.json b/packages/icons/src/raw-icons/_example-template.json index 90144eed90b..30e98ddf155 100644 --- a/packages/icons/src/raw-icons/_example-template.json +++ b/packages/icons/src/raw-icons/_example-template.json @@ -1,20 +1,6 @@ { "$schema": "../icon.schema.json", - "contributors": [ - "it-is-not", - "jguddas", - "danielbayley", - "ericfennis" - ], - "tags": [ - "letter", - "font size", - "text", - "formatting", - "smaller" - ], - "categories": [ - "text", - "design" - ] + "contributors": ["it-is-not", "jguddas", "danielbayley", "ericfennis"], + "tags": ["letter", "font size", "text", "formatting", "smaller"], + "categories": ["text", "design"] } diff --git a/packages/shared-data/config.ts b/packages/shared-data/config.ts index 03bac52848b..01f390522ce 100644 --- a/packages/shared-data/config.ts +++ b/packages/shared-data/config.ts @@ -104,9 +104,8 @@ const config = { }, http_hooks: { value: 5, - }, - } + }, }, branching: { inactivity_period_in_minutes: { @@ -119,9 +118,9 @@ const config = { */ free_tier: { value: '1', - unit: 'week' - } - } + unit: 'week', + }, + }, } as const export default config diff --git a/packages/shared-data/regions.ts b/packages/shared-data/regions.ts index 850e7880f99..06f6b0fe27a 100644 --- a/packages/shared-data/regions.ts +++ b/packages/shared-data/regions.ts @@ -11,7 +11,7 @@ export const AWS_REGIONS = { WEST_EU_3: { code: 'eu-west-3', displayName: 'West EU (Paris)' }, CENTRAL_EU: { code: 'eu-central-1', displayName: 'Central EU (Frankfurt)' }, CENTRAL_EU_2: { code: 'eu-central-2', displayName: 'Central Europe (Zurich)' }, - NORTH_EU: { code: 'eu-north-1', displayName: 'North EU (Stockholm)'}, + NORTH_EU: { code: 'eu-north-1', displayName: 'North EU (Stockholm)' }, SOUTH_ASIA: { code: 'ap-south-1', displayName: 'South Asia (Mumbai)' }, SOUTHEAST_ASIA: { code: 'ap-southeast-1', displayName: 'Southeast Asia (Singapore)' }, NORTHEAST_ASIA: { code: 'ap-northeast-1', displayName: 'Northeast Asia (Tokyo)' }, diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index d49a4c6ee80..bbb02c7fce4 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -3,9 +3,5 @@ "version": "0.0.0", "private": true, "main": "index.js", - "files": [ - "base.json", - "nextjs.json", - "react-library.json" - ] + "files": ["base.json", "nextjs.json", "react-library.json"] } diff --git a/packages/ui-patterns/vitest.setup.ts b/packages/ui-patterns/vitest.setup.ts index 685e5448170..aa5d0c82e44 100644 --- a/packages/ui-patterns/vitest.setup.ts +++ b/packages/ui-patterns/vitest.setup.ts @@ -4,7 +4,6 @@ import '@testing-library/jest-dom/vitest' import { cleanup } from '@testing-library/react' import { afterEach, vi } from 'vitest' - Object.defineProperty(window, 'matchMedia', { writable: true, value: vi.fn().mockImplementation((query) => ({ diff --git a/packages/ui/build/css/tw-extend/color.js b/packages/ui/build/css/tw-extend/color.js index 3809cd6673e..1e2e93751dd 100644 --- a/packages/ui/build/css/tw-extend/color.js +++ b/packages/ui/build/css/tw-extend/color.js @@ -1,646 +1,646 @@ module.exports = { -"colors-black": { - cssVariable: "var(--core-colors-black)", - value: "hsl(0, 0%, 0%)" -}, -"colors-white": { - cssVariable: "var(--core-colors-white)", - value: "hsl(0, 0%, 100%)" -}, -"colors-gray-dark-100": { - cssVariable: "var(--core-colors-gray-dark-100)", - value: "hsl(0, 0%, 8.6%)" -}, -"colors-gray-dark-200": { - cssVariable: "var(--core-colors-gray-dark-200)", - value: "hsl(0, 0%, 11%)" -}, -"colors-gray-dark-300": { - cssVariable: "var(--core-colors-gray-dark-300)", - value: "hsl(0, 0%, 13.7%)" -}, -"colors-gray-dark-400": { - cssVariable: "var(--core-colors-gray-dark-400)", - value: "hsl(0, 0%, 15.7%)" -}, -"colors-gray-dark-500": { - cssVariable: "var(--core-colors-gray-dark-500)", - value: "hsl(0, 0%, 18%)" -}, -"colors-gray-dark-600": { - cssVariable: "var(--core-colors-gray-dark-600)", - value: "hsl(0, 0%, 20.4%)" -}, -"colors-gray-dark-700": { - cssVariable: "var(--core-colors-gray-dark-700)", - value: "hsl(0, 0%, 24.3%)" -}, -"colors-gray-dark-800": { - cssVariable: "var(--core-colors-gray-dark-800)", - value: "hsl(0, 0%, 31.4%)" -}, -"colors-gray-dark-900": { - cssVariable: "var(--core-colors-gray-dark-900)", - value: "hsl(0, 0%, 43.9%)" -}, -"colors-gray-dark-1000": { - cssVariable: "var(--core-colors-gray-dark-1000)", - value: "hsl(0, 0%, 49.4%)" -}, -"colors-gray-dark-1100": { - cssVariable: "var(--core-colors-gray-dark-1100)", - value: "hsl(0, 0%, 62.7%)" -}, -"colors-gray-dark-1200": { - cssVariable: "var(--core-colors-gray-dark-1200)", - value: "hsl(0, 0%, 92.9%)" -}, -"colors-gray-dark-alpha-100": { - cssVariable: "var(--core-colors-gray-dark-alpha-100)", - value: "hsla(0, 0%, 0%, 0)" -}, -"colors-gray-dark-alpha-200": { - cssVariable: "var(--core-colors-gray-dark-alpha-200)", - value: "hsla(0, 0%, 100%, 0.03137254901960784)" -}, -"colors-gray-dark-alpha-300": { - cssVariable: "var(--core-colors-gray-dark-alpha-300)", - value: "hsla(0, 0%, 100%, 0.058823529411764705)" -}, -"colors-gray-dark-alpha-400": { - cssVariable: "var(--core-colors-gray-dark-alpha-400)", - value: "hsla(0, 0%, 100%, 0.0784313725490196)" -}, -"colors-gray-dark-alpha-500": { - cssVariable: "var(--core-colors-gray-dark-alpha-500)", - value: "hsla(0, 0%, 100%, 0.10196078431372549)" -}, -"colors-gray-dark-alpha-600": { - cssVariable: "var(--core-colors-gray-dark-alpha-600)", - value: "hsla(0, 0%, 100%, 0.12941176470588237)" -}, -"colors-gray-dark-alpha-700": { - cssVariable: "var(--core-colors-gray-dark-alpha-700)", - value: "hsla(0, 0%, 100%, 0.16862745098039217)" -}, -"colors-gray-dark-alpha-800": { - cssVariable: "var(--core-colors-gray-dark-alpha-800)", - value: "hsla(0, 0%, 100%, 0.25098039215686274)" -}, -"colors-gray-dark-alpha-900": { - cssVariable: "var(--core-colors-gray-dark-alpha-900)", - value: "hsla(0, 0%, 100%, 0.38823529411764707)" -}, -"colors-gray-dark-alpha-1000": { - cssVariable: "var(--core-colors-gray-dark-alpha-1000)", - value: "hsla(0, 0%, 100%, 0.45098039215686275)" -}, -"colors-gray-dark-alpha-1100": { - cssVariable: "var(--core-colors-gray-dark-alpha-1100)", - value: "hsla(0, 0%, 100%, 0.5882352941176471)" -}, -"colors-gray-dark-alpha-1200": { - cssVariable: "var(--core-colors-gray-dark-alpha-1200)", - value: "hsla(0, 0%, 100%, 0.9215686274509803)" -}, -"colors-gray-light-100": { - cssVariable: "var(--core-colors-gray-light-100)", - value: "hsl(0, 0%, 98.8%)" -}, -"colors-gray-light-200": { - cssVariable: "var(--core-colors-gray-light-200)", - value: "hsl(0, 0%, 97.3%)" -}, -"colors-gray-light-300": { - cssVariable: "var(--core-colors-gray-light-300)", - value: "hsl(0, 0%, 95.3%)" -}, -"colors-gray-light-400": { - cssVariable: "var(--core-colors-gray-light-400)", - value: "hsl(0, 0%, 92.9%)" -}, -"colors-gray-light-500": { - cssVariable: "var(--core-colors-gray-light-500)", - value: "hsl(0, 0%, 91%)" -}, -"colors-gray-light-600": { - cssVariable: "var(--core-colors-gray-light-600)", - value: "hsl(0, 0%, 88.6%)" -}, -"colors-gray-light-700": { - cssVariable: "var(--core-colors-gray-light-700)", - value: "hsl(0, 0%, 85.9%)" -}, -"colors-gray-light-800": { - cssVariable: "var(--core-colors-gray-light-800)", - value: "hsl(0, 0%, 78%)" -}, -"colors-gray-light-900": { - cssVariable: "var(--core-colors-gray-light-900)", - value: "hsl(0, 0%, 56.1%)" -}, -"colors-gray-light-1000": { - cssVariable: "var(--core-colors-gray-light-1000)", - value: "hsl(0, 0%, 52.2%)" -}, -"colors-gray-light-1100": { - cssVariable: "var(--core-colors-gray-light-1100)", - value: "hsl(0, 0%, 43.5%)" -}, -"colors-gray-light-1200": { - cssVariable: "var(--core-colors-gray-light-1200)", - value: "hsl(0, 0%, 9%)" -}, -"colors-gray-light-alpha-100": { - cssVariable: "var(--core-colors-gray-light-alpha-100)", - value: "hsla(0, 0%, 0%, 0.011764705882352941)" -}, -"colors-gray-light-alpha-200": { - cssVariable: "var(--core-colors-gray-light-alpha-200)", - value: "hsla(0, 0%, 0%, 0.03137254901960784)" -}, -"colors-gray-light-alpha-300": { - cssVariable: "var(--core-colors-gray-light-alpha-300)", - value: "hsla(0, 0%, 0%, 0.050980392156862744)" -}, -"colors-gray-light-alpha-400": { - cssVariable: "var(--core-colors-gray-light-alpha-400)", - value: "hsla(0, 0%, 0%, 0.07058823529411765)" -}, -"colors-gray-light-alpha-500": { - cssVariable: "var(--core-colors-gray-light-alpha-500)", - value: "hsla(0, 0%, 0%, 0.09019607843137255)" -}, -"colors-gray-light-alpha-600": { - cssVariable: "var(--core-colors-gray-light-alpha-600)", - value: "hsla(0, 0%, 0%, 0.10980392156862745)" -}, -"colors-gray-light-alpha-700": { - cssVariable: "var(--core-colors-gray-light-alpha-700)", - value: "hsla(0, 0%, 0%, 0.1411764705882353)" -}, -"colors-gray-light-alpha-800": { - cssVariable: "var(--core-colors-gray-light-alpha-800)", - value: "hsla(0, 0%, 0%, 0.2196078431372549)" -}, -"colors-gray-light-alpha-900": { - cssVariable: "var(--core-colors-gray-light-alpha-900)", - value: "hsla(0, 0%, 0%, 0.4392156862745098)" -}, -"colors-gray-light-alpha-1000": { - cssVariable: "var(--core-colors-gray-light-alpha-1000)", - value: "hsla(0, 0%, 0%, 0.47843137254901963)" -}, -"colors-gray-light-alpha-1100": { - cssVariable: "var(--core-colors-gray-light-alpha-1100)", - value: "hsla(0, 0%, 0%, 0.5607843137254902)" -}, -"colors-gray-light-alpha-1200": { - cssVariable: "var(--core-colors-gray-light-alpha-1200)", - value: "hsla(0, 0%, 0%, 0.9098039215686274)" -}, -"colors-slate-dark-100": { - cssVariable: "var(--core-colors-slate-dark-100)", - value: "hsl(200, 6.7%, 8.8%)" -}, -"colors-slate-dark-200": { - cssVariable: "var(--core-colors-slate-dark-200)", - value: "hsl(195, 7.1%, 11%)" -}, -"colors-slate-dark-300": { - cssVariable: "var(--core-colors-slate-dark-300)", - value: "hsl(192, 7.2%, 13.5%)" -}, -"colors-slate-dark-400": { - cssVariable: "var(--core-colors-slate-dark-400)", - value: "hsl(204, 6.2%, 15.9%)" -}, -"colors-slate-dark-500": { - cssVariable: "var(--core-colors-slate-dark-500)", - value: "hsl(200, 6.5%, 18%)" -}, -"colors-slate-dark-600": { - cssVariable: "var(--core-colors-slate-dark-600)", - value: "hsl(205.70000000000005, 6.7%, 20.6%)" -}, -"colors-slate-dark-700": { - cssVariable: "var(--core-colors-slate-dark-700)", - value: "hsl(202.5, 6.5%, 24.3%)" -}, -"colors-slate-dark-800": { - cssVariable: "var(--core-colors-slate-dark-800)", - value: "hsl(206.70000000000005, 5.6%, 31.6%)" -}, -"colors-slate-dark-900": { - cssVariable: "var(--core-colors-slate-dark-900)", - value: "hsl(205.70000000000005, 6.3%, 43.9%)" -}, -"colors-slate-dark-1000": { - cssVariable: "var(--core-colors-slate-dark-1000)", - value: "hsl(207.70000000000005, 5.1%, 49.6%)" -}, -"colors-slate-dark-1100": { - cssVariable: "var(--core-colors-slate-dark-1100)", - value: "hsl(207.29999999999995, 5.8%, 62.9%)" -}, -"colors-slate-dark-1200": { - cssVariable: "var(--core-colors-slate-dark-1200)", - value: "hsl(210, 5.6%, 92.9%)" -}, -"colors-slate-dark-alpha-100": { - cssVariable: "var(--core-colors-slate-dark-alpha-100)", - value: "hsla(0, 0%, 0%, 0)" -}, -"colors-slate-dark-alpha-200": { - cssVariable: "var(--core-colors-slate-dark-alpha-200)", - value: "hsla(181.39999999999998, 100%, 91.8%, 0.03137254901960784)" -}, -"colors-slate-dark-alpha-300": { - cssVariable: "var(--core-colors-slate-dark-alpha-300)", - value: "hsla(181.60000000000002, 86.4%, 91.4%, 0.058823529411764705)" -}, -"colors-slate-dark-alpha-400": { - cssVariable: "var(--core-colors-slate-dark-alpha-400)", - value: "hsla(208.89999999999998, 87.1%, 93.9%, 0.0784313725490196)" -}, -"colors-slate-dark-alpha-500": { - cssVariable: "var(--core-colors-slate-dark-alpha-500)", - value: "hsla(200, 88.2%, 93.3%, 0.10980392156862745)" -}, -"colors-slate-dark-alpha-600": { - cssVariable: "var(--core-colors-slate-dark-alpha-600)", - value: "hsla(209, 93.9%, 93.5%, 0.1411764705882353)" -}, -"colors-slate-dark-alpha-700": { - cssVariable: "var(--core-colors-slate-dark-alpha-700)", - value: "hsla(203.20000000000005, 100%, 93.9%, 0.1803921568627451)" -}, -"colors-slate-dark-alpha-800": { - cssVariable: "var(--core-colors-slate-dark-alpha-800)", - value: "hsla(208.79999999999995, 92.6%, 94.7%, 0.25882352941176473)" -}, -"colors-slate-dark-alpha-900": { - cssVariable: "var(--core-colors-slate-dark-alpha-900)", - value: "hsla(208, 100%, 94.1%, 0.4117647058823529)" -}, -"colors-slate-dark-alpha-1000": { - cssVariable: "var(--core-colors-slate-dark-alpha-1000)", - value: "hsla(210, 100%, 95.3%, 0.47058823529411764)" -}, -"colors-slate-dark-alpha-1100": { - cssVariable: "var(--core-colors-slate-dark-alpha-1100)", - value: "hsla(210, 100%, 96.9%, 0.6196078431372549)" -}, -"colors-slate-dark-alpha-1200": { - cssVariable: "var(--core-colors-slate-dark-alpha-1200)", - value: "hsla(210, 100%, 99.6%, 0.9294117647058824)" -}, -"colors-slate-light-100": { - cssVariable: "var(--core-colors-slate-light-100)", - value: "hsl(210, 33.3%, 98.8%)" -}, -"colors-slate-light-200": { - cssVariable: "var(--core-colors-slate-light-200)", - value: "hsl(210, 16.7%, 97.6%)" -}, -"colors-slate-light-300": { - cssVariable: "var(--core-colors-slate-light-300)", - value: "hsl(210, 16.7%, 95.3%)" -}, -"colors-slate-light-400": { - cssVariable: "var(--core-colors-slate-light-400)", - value: "hsl(210, 11.8%, 93.3%)" -}, -"colors-slate-light-500": { - cssVariable: "var(--core-colors-slate-light-500)", - value: "hsl(216, 11.1%, 91.2%)" -}, -"colors-slate-light-600": { - cssVariable: "var(--core-colors-slate-light-600)", - value: "hsl(205.70000000000005, 12.3%, 88.8%)" -}, -"colors-slate-light-700": { - cssVariable: "var(--core-colors-slate-light-700)", - value: "hsl(210, 11.1%, 85.9%)" -}, -"colors-slate-light-800": { - cssVariable: "var(--core-colors-slate-light-800)", - value: "hsl(205, 10.7%, 78%)" -}, -"colors-slate-light-900": { - cssVariable: "var(--core-colors-slate-light-900)", - value: "hsl(205.70000000000005, 6.3%, 56.1%)" -}, -"colors-slate-light-1000": { - cssVariable: "var(--core-colors-slate-light-1000)", - value: "hsl(205.70000000000005, 5.7%, 52.2%)" -}, -"colors-slate-light-1100": { - cssVariable: "var(--core-colors-slate-light-1100)", - value: "hsl(205.70000000000005, 6.3%, 43.5%)" -}, -"colors-slate-light-1200": { - cssVariable: "var(--core-colors-slate-light-1200)", - value: "hsl(201.79999999999995, 24.4%, 8.8%)" -}, -"colors-slate-light-alpha-100": { - cssVariable: "var(--core-colors-slate-light-alpha-100)", - value: "hsla(209.79999999999995, 92.6%, 26.5%, 0.0196078431372549)" -}, -"colors-slate-light-alpha-200": { - cssVariable: "var(--core-colors-slate-light-alpha-200)", - value: "hsla(210, 87.8%, 16.1%, 0.03137254901960784)" -}, -"colors-slate-light-alpha-300": { - cssVariable: "var(--core-colors-slate-light-alpha-300)", - value: "hsla(209.60000000000002, 100%, 14.3%, 0.050980392156862744)" -}, -"colors-slate-light-alpha-400": { - cssVariable: "var(--core-colors-slate-light-alpha-400)", - value: "hsla(210.60000000000002, 93%, 11.2%, 0.0784313725490196)" -}, -"colors-slate-light-alpha-500": { - cssVariable: "var(--core-colors-slate-light-alpha-500)", - value: "hsla(215.29999999999995, 92.7%, 10.8%, 0.10196078431372549)" -}, -"colors-slate-light-alpha-600": { - cssVariable: "var(--core-colors-slate-light-alpha-600)", - value: "hsla(205.70000000000005, 96.6%, 11.4%, 0.12941176470588237)" -}, -"colors-slate-light-alpha-700": { - cssVariable: "var(--core-colors-slate-light-alpha-700)", - value: "hsla(209.39999999999998, 100%, 10%, 0.1607843137254902)" -}, -"colors-slate-light-alpha-800": { - cssVariable: "var(--core-colors-slate-light-alpha-800)", - value: "hsla(204.5, 96.1%, 10%, 0.23921568627450981)" -}, -"colors-slate-light-alpha-900": { - cssVariable: "var(--core-colors-slate-light-alpha-900)", - value: "hsla(206, 100%, 5.9%, 0.47058823529411764)" -}, -"colors-slate-light-alpha-1000": { - cssVariable: "var(--core-colors-slate-light-alpha-1000)", - value: "hsla(204.39999999999998, 100%, 5.3%, 0.5098039215686274)" -}, -"colors-slate-light-alpha-1100": { - cssVariable: "var(--core-colors-slate-light-alpha-1100)", - value: "hsla(205, 100%, 4.7%, 0.5882352941176471)" -}, -"colors-slate-light-alpha-1200": { - cssVariable: "var(--core-colors-slate-light-alpha-1200)", - value: "hsla(200, 100%, 2.4%, 0.9294117647058824)" -}, -"variables-colors-brand-primary": { - cssVariable: "var(--core-variables-colors-brand-primary)", - value: "hsl(153.10000000000002, 60.2%, 52.7%)" -}, -"variables-colors-brand-accent": { - cssVariable: "var(--core-variables-colors-brand-accent)", - value: "hsl(152.89999999999998, 56.1%, 46.5%)" -}, -"foreground-DEFAULT": { - cssVariable: "var(--foreground-default)", - value: "hsl(0, 0%, 98%)" -}, -"foreground-light": { - cssVariable: "var(--foreground-light)", - value: "hsl(0, 0%, 70.6%)" -}, -"foreground-lighter": { - cssVariable: "var(--foreground-lighter)", - value: "hsl(0, 0%, 53.7%)" -}, -"foreground-muted": { - cssVariable: "var(--foreground-muted)", - value: "hsl(0, 0%, 30.2%)" -}, -"foreground-contrast": { - cssVariable: "var(--foreground-contrast)", - value: "hsl(0, 0%, 8.6%)" -}, -"background-200": { - cssVariable: "var(--background-200)", - value: "hsl(0, 0%, 9%)" -}, -"background-DEFAULT": { - cssVariable: "var(--background-default)", - value: "hsl(0, 0%, 7.1%)" -}, -"background-alternative-200": { - cssVariable: "var(--background-alternative-200)", - value: "hsl(0, 0%, 11%)" -}, -"background-alternative-DEFAULT": { - cssVariable: "var(--background-alternative-default)", - value: "hsl(0, 0%, 5.9%)" -}, -"background-selection": { - cssVariable: "var(--background-selection)", - value: "hsl(0, 0%, 19.2%)" -}, -"background-control": { - cssVariable: "var(--background-control)", - value: "hsl(0, 0%, 14.1%)" -}, -"background-surface-75": { - cssVariable: "var(--background-surface-75)", - value: "hsl(0, 0%, 9%)" -}, -"background-surface-100": { - cssVariable: "var(--background-surface-100)", - value: "hsl(0, 0%, 12.2%)" -}, -"background-surface-200": { - cssVariable: "var(--background-surface-200)", - value: "hsl(0, 0%, 12.9%)" -}, -"background-surface-300": { - cssVariable: "var(--background-surface-300)", - value: "hsl(0, 0%, 16.1%)" -}, -"background-surface-400": { - cssVariable: "var(--background-surface-400)", - value: "hsl(0, 0%, 16.1%)" -}, -"background-overlay-DEFAULT": { - cssVariable: "var(--background-overlay-default)", - value: "hsl(0, 0%, 14.1%)" -}, -"background-overlay-hover": { - cssVariable: "var(--background-overlay-hover)", - value: "hsl(0, 0%, 18%)" -}, -"background-muted": { - cssVariable: "var(--background-muted)", - value: "hsl(0, 0%, 14.1%)" -}, -"background-button-DEFAULT": { - cssVariable: "var(--background-button-default)", - value: "hsl(0, 0%, 18%)" -}, -"background-dialog-DEFAULT": { - cssVariable: "var(--background-dialog-default)", - value: "hsl(0, 0%, 7.1%)" -}, -"background-dash-sidebar": { - cssVariable: "var(--background-dash-sidebar)", - value: "hsl(0, 0%, 9%)" -}, -"background-dash-canvas": { - cssVariable: "var(--background-dash-canvas)", - value: "hsl(0, 0%, 7.1%)" -}, -"border-DEFAULT": { - cssVariable: "var(--border-default)", - value: "hsl(0, 0%, 18%)" -}, -"border-muted": { - cssVariable: "var(--border-muted)", - value: "hsl(0, 0%, 14.1%)" -}, -"border-secondary": { - cssVariable: "var(--border-secondary)", - value: "hsl(0, 0%, 14.1%)" -}, -"border-overlay": { - cssVariable: "var(--border-overlay)", - value: "hsl(0, 0%, 20%)" -}, -"border-control": { - cssVariable: "var(--border-control)", - value: "hsl(0, 0%, 22.4%)" -}, -"border-alternative": { - cssVariable: "var(--border-alternative)", - value: "hsl(0, 0%, 26.7%)" -}, -"border-strong": { - cssVariable: "var(--border-strong)", - value: "hsl(0, 0%, 21.2%)" -}, -"border-stronger": { - cssVariable: "var(--border-stronger)", - value: "hsl(0, 0%, 27.1%)" -}, -"border-button-DEFAULT": { - cssVariable: "var(--border-button-default)", - value: "hsl(0, 0%, 24.3%)" -}, -"border-button-hover": { - cssVariable: "var(--border-button-hover)", - value: "hsl(0, 0%, 31.4%)" -}, -"destructive-200": { - cssVariable: "var(--destructive-200)", - value: "hsl(10.899999999999977, 23.4%, 9.2%)" -}, -"destructive-300": { - cssVariable: "var(--destructive-300)", - value: "hsl(7.5, 51.3%, 15.3%)" -}, -"destructive-400": { - cssVariable: "var(--destructive-400)", - value: "hsl(6.699999999999989, 60%, 20.6%)" -}, -"destructive-500": { - cssVariable: "var(--destructive-500)", - value: "hsl(7.899999999999977, 71.6%, 29%)" -}, -"destructive-600": { - cssVariable: "var(--destructive-600)", - value: "hsl(9.699999999999989, 85.2%, 62.9%)" -}, -"destructive-DEFAULT": { - cssVariable: "var(--destructive-default)", - value: "hsl(10.199999999999989, 77.9%, 53.9%)" -}, -"warning-200": { - cssVariable: "var(--warning-200)", - value: "hsl(36.60000000000002, 100%, 8%)" -}, -"warning-300": { - cssVariable: "var(--warning-300)", - value: "hsl(32.30000000000001, 100%, 10.2%)" -}, -"warning-400": { - cssVariable: "var(--warning-400)", - value: "hsl(33.19999999999999, 100%, 14.5%)" -}, -"warning-500": { - cssVariable: "var(--warning-500)", - value: "hsl(34.80000000000001, 90.9%, 21.6%)" -}, -"warning-600": { - cssVariable: "var(--warning-600)", - value: "hsl(38.89999999999998, 100%, 42.9%)" -}, -"warning-DEFAULT": { - cssVariable: "var(--warning-default)", - value: "hsl(38.89999999999998, 100%, 42.9%)" -}, -"brand-200": { - cssVariable: "var(--brand-200)", - value: "hsl(162, 100%, 2%)" -}, -"brand-300": { - cssVariable: "var(--brand-300)", - value: "hsl(155.10000000000002, 100%, 8%)" -}, -"brand-400": { - cssVariable: "var(--brand-400)", - value: "hsl(155.5, 100%, 9.6%)" -}, -"brand-500": { - cssVariable: "var(--brand-500)", - value: "hsl(154.89999999999998, 100%, 19.2%)" -}, -"brand-600": { - cssVariable: "var(--brand-600)", - value: "hsl(154.89999999999998, 59.5%, 70%)" -}, -"brand-DEFAULT": { - cssVariable: "var(--brand-default)", - value: "hsl(153.10000000000002, 60.2%, 52.7%)" -}, -"brand-button": { - cssVariable: "var(--brand-button)", - value: "hsl(154.89999999999998, 100%, 19.2%)" -}, -"brand-link": { - cssVariable: "var(--brand-link)", - value: "hsl(155, 100%, 38.6%)" -}, -"_secondary-200": { - cssVariable: "var(--secondary-200)", - value: "hsl(248, 53.6%, 11%)" -}, -"_secondary-400": { - cssVariable: "var(--secondary-400)", - value: "hsl(248.29999999999995, 54.5%, 25.9%)" -}, -"_secondary-DEFAULT": { - cssVariable: "var(--secondary-default)", - value: "hsl(247.79999999999995, 100%, 70%)" -}, -"code_block-1": { - cssVariable: "var(--code-block-1)", - value: "hsl(170.79999999999995, 43.1%, 61.4%)" -}, -"code_block-2": { - cssVariable: "var(--code-block-2)", - value: "hsl(33.19999999999999, 90.3%, 75.7%)" -}, -"code_block-3": { - cssVariable: "var(--code-block-3)", - value: "hsl(83.80000000000001, 61.7%, 63.1%)" -}, -"code_block-4": { - cssVariable: "var(--code-block-4)", - value: "hsl(276.1, 67.7%, 74.5%)" -}, -"code_block-5": { - cssVariable: "var(--code-block-5)", - value: "hsl(13.800000000000011, 89.7%, 69.6%)" + 'colors-black': { + cssVariable: 'var(--core-colors-black)', + value: 'hsl(0, 0%, 0%)', + }, + 'colors-white': { + cssVariable: 'var(--core-colors-white)', + value: 'hsl(0, 0%, 100%)', + }, + 'colors-gray-dark-100': { + cssVariable: 'var(--core-colors-gray-dark-100)', + value: 'hsl(0, 0%, 8.6%)', + }, + 'colors-gray-dark-200': { + cssVariable: 'var(--core-colors-gray-dark-200)', + value: 'hsl(0, 0%, 11%)', + }, + 'colors-gray-dark-300': { + cssVariable: 'var(--core-colors-gray-dark-300)', + value: 'hsl(0, 0%, 13.7%)', + }, + 'colors-gray-dark-400': { + cssVariable: 'var(--core-colors-gray-dark-400)', + value: 'hsl(0, 0%, 15.7%)', + }, + 'colors-gray-dark-500': { + cssVariable: 'var(--core-colors-gray-dark-500)', + value: 'hsl(0, 0%, 18%)', + }, + 'colors-gray-dark-600': { + cssVariable: 'var(--core-colors-gray-dark-600)', + value: 'hsl(0, 0%, 20.4%)', + }, + 'colors-gray-dark-700': { + cssVariable: 'var(--core-colors-gray-dark-700)', + value: 'hsl(0, 0%, 24.3%)', + }, + 'colors-gray-dark-800': { + cssVariable: 'var(--core-colors-gray-dark-800)', + value: 'hsl(0, 0%, 31.4%)', + }, + 'colors-gray-dark-900': { + cssVariable: 'var(--core-colors-gray-dark-900)', + value: 'hsl(0, 0%, 43.9%)', + }, + 'colors-gray-dark-1000': { + cssVariable: 'var(--core-colors-gray-dark-1000)', + value: 'hsl(0, 0%, 49.4%)', + }, + 'colors-gray-dark-1100': { + cssVariable: 'var(--core-colors-gray-dark-1100)', + value: 'hsl(0, 0%, 62.7%)', + }, + 'colors-gray-dark-1200': { + cssVariable: 'var(--core-colors-gray-dark-1200)', + value: 'hsl(0, 0%, 92.9%)', + }, + 'colors-gray-dark-alpha-100': { + cssVariable: 'var(--core-colors-gray-dark-alpha-100)', + value: 'hsla(0, 0%, 0%, 0)', + }, + 'colors-gray-dark-alpha-200': { + cssVariable: 'var(--core-colors-gray-dark-alpha-200)', + value: 'hsla(0, 0%, 100%, 0.03137254901960784)', + }, + 'colors-gray-dark-alpha-300': { + cssVariable: 'var(--core-colors-gray-dark-alpha-300)', + value: 'hsla(0, 0%, 100%, 0.058823529411764705)', + }, + 'colors-gray-dark-alpha-400': { + cssVariable: 'var(--core-colors-gray-dark-alpha-400)', + value: 'hsla(0, 0%, 100%, 0.0784313725490196)', + }, + 'colors-gray-dark-alpha-500': { + cssVariable: 'var(--core-colors-gray-dark-alpha-500)', + value: 'hsla(0, 0%, 100%, 0.10196078431372549)', + }, + 'colors-gray-dark-alpha-600': { + cssVariable: 'var(--core-colors-gray-dark-alpha-600)', + value: 'hsla(0, 0%, 100%, 0.12941176470588237)', + }, + 'colors-gray-dark-alpha-700': { + cssVariable: 'var(--core-colors-gray-dark-alpha-700)', + value: 'hsla(0, 0%, 100%, 0.16862745098039217)', + }, + 'colors-gray-dark-alpha-800': { + cssVariable: 'var(--core-colors-gray-dark-alpha-800)', + value: 'hsla(0, 0%, 100%, 0.25098039215686274)', + }, + 'colors-gray-dark-alpha-900': { + cssVariable: 'var(--core-colors-gray-dark-alpha-900)', + value: 'hsla(0, 0%, 100%, 0.38823529411764707)', + }, + 'colors-gray-dark-alpha-1000': { + cssVariable: 'var(--core-colors-gray-dark-alpha-1000)', + value: 'hsla(0, 0%, 100%, 0.45098039215686275)', + }, + 'colors-gray-dark-alpha-1100': { + cssVariable: 'var(--core-colors-gray-dark-alpha-1100)', + value: 'hsla(0, 0%, 100%, 0.5882352941176471)', + }, + 'colors-gray-dark-alpha-1200': { + cssVariable: 'var(--core-colors-gray-dark-alpha-1200)', + value: 'hsla(0, 0%, 100%, 0.9215686274509803)', + }, + 'colors-gray-light-100': { + cssVariable: 'var(--core-colors-gray-light-100)', + value: 'hsl(0, 0%, 98.8%)', + }, + 'colors-gray-light-200': { + cssVariable: 'var(--core-colors-gray-light-200)', + value: 'hsl(0, 0%, 97.3%)', + }, + 'colors-gray-light-300': { + cssVariable: 'var(--core-colors-gray-light-300)', + value: 'hsl(0, 0%, 95.3%)', + }, + 'colors-gray-light-400': { + cssVariable: 'var(--core-colors-gray-light-400)', + value: 'hsl(0, 0%, 92.9%)', + }, + 'colors-gray-light-500': { + cssVariable: 'var(--core-colors-gray-light-500)', + value: 'hsl(0, 0%, 91%)', + }, + 'colors-gray-light-600': { + cssVariable: 'var(--core-colors-gray-light-600)', + value: 'hsl(0, 0%, 88.6%)', + }, + 'colors-gray-light-700': { + cssVariable: 'var(--core-colors-gray-light-700)', + value: 'hsl(0, 0%, 85.9%)', + }, + 'colors-gray-light-800': { + cssVariable: 'var(--core-colors-gray-light-800)', + value: 'hsl(0, 0%, 78%)', + }, + 'colors-gray-light-900': { + cssVariable: 'var(--core-colors-gray-light-900)', + value: 'hsl(0, 0%, 56.1%)', + }, + 'colors-gray-light-1000': { + cssVariable: 'var(--core-colors-gray-light-1000)', + value: 'hsl(0, 0%, 52.2%)', + }, + 'colors-gray-light-1100': { + cssVariable: 'var(--core-colors-gray-light-1100)', + value: 'hsl(0, 0%, 43.5%)', + }, + 'colors-gray-light-1200': { + cssVariable: 'var(--core-colors-gray-light-1200)', + value: 'hsl(0, 0%, 9%)', + }, + 'colors-gray-light-alpha-100': { + cssVariable: 'var(--core-colors-gray-light-alpha-100)', + value: 'hsla(0, 0%, 0%, 0.011764705882352941)', + }, + 'colors-gray-light-alpha-200': { + cssVariable: 'var(--core-colors-gray-light-alpha-200)', + value: 'hsla(0, 0%, 0%, 0.03137254901960784)', + }, + 'colors-gray-light-alpha-300': { + cssVariable: 'var(--core-colors-gray-light-alpha-300)', + value: 'hsla(0, 0%, 0%, 0.050980392156862744)', + }, + 'colors-gray-light-alpha-400': { + cssVariable: 'var(--core-colors-gray-light-alpha-400)', + value: 'hsla(0, 0%, 0%, 0.07058823529411765)', + }, + 'colors-gray-light-alpha-500': { + cssVariable: 'var(--core-colors-gray-light-alpha-500)', + value: 'hsla(0, 0%, 0%, 0.09019607843137255)', + }, + 'colors-gray-light-alpha-600': { + cssVariable: 'var(--core-colors-gray-light-alpha-600)', + value: 'hsla(0, 0%, 0%, 0.10980392156862745)', + }, + 'colors-gray-light-alpha-700': { + cssVariable: 'var(--core-colors-gray-light-alpha-700)', + value: 'hsla(0, 0%, 0%, 0.1411764705882353)', + }, + 'colors-gray-light-alpha-800': { + cssVariable: 'var(--core-colors-gray-light-alpha-800)', + value: 'hsla(0, 0%, 0%, 0.2196078431372549)', + }, + 'colors-gray-light-alpha-900': { + cssVariable: 'var(--core-colors-gray-light-alpha-900)', + value: 'hsla(0, 0%, 0%, 0.4392156862745098)', + }, + 'colors-gray-light-alpha-1000': { + cssVariable: 'var(--core-colors-gray-light-alpha-1000)', + value: 'hsla(0, 0%, 0%, 0.47843137254901963)', + }, + 'colors-gray-light-alpha-1100': { + cssVariable: 'var(--core-colors-gray-light-alpha-1100)', + value: 'hsla(0, 0%, 0%, 0.5607843137254902)', + }, + 'colors-gray-light-alpha-1200': { + cssVariable: 'var(--core-colors-gray-light-alpha-1200)', + value: 'hsla(0, 0%, 0%, 0.9098039215686274)', + }, + 'colors-slate-dark-100': { + cssVariable: 'var(--core-colors-slate-dark-100)', + value: 'hsl(200, 6.7%, 8.8%)', + }, + 'colors-slate-dark-200': { + cssVariable: 'var(--core-colors-slate-dark-200)', + value: 'hsl(195, 7.1%, 11%)', + }, + 'colors-slate-dark-300': { + cssVariable: 'var(--core-colors-slate-dark-300)', + value: 'hsl(192, 7.2%, 13.5%)', + }, + 'colors-slate-dark-400': { + cssVariable: 'var(--core-colors-slate-dark-400)', + value: 'hsl(204, 6.2%, 15.9%)', + }, + 'colors-slate-dark-500': { + cssVariable: 'var(--core-colors-slate-dark-500)', + value: 'hsl(200, 6.5%, 18%)', + }, + 'colors-slate-dark-600': { + cssVariable: 'var(--core-colors-slate-dark-600)', + value: 'hsl(205.70000000000005, 6.7%, 20.6%)', + }, + 'colors-slate-dark-700': { + cssVariable: 'var(--core-colors-slate-dark-700)', + value: 'hsl(202.5, 6.5%, 24.3%)', + }, + 'colors-slate-dark-800': { + cssVariable: 'var(--core-colors-slate-dark-800)', + value: 'hsl(206.70000000000005, 5.6%, 31.6%)', + }, + 'colors-slate-dark-900': { + cssVariable: 'var(--core-colors-slate-dark-900)', + value: 'hsl(205.70000000000005, 6.3%, 43.9%)', + }, + 'colors-slate-dark-1000': { + cssVariable: 'var(--core-colors-slate-dark-1000)', + value: 'hsl(207.70000000000005, 5.1%, 49.6%)', + }, + 'colors-slate-dark-1100': { + cssVariable: 'var(--core-colors-slate-dark-1100)', + value: 'hsl(207.29999999999995, 5.8%, 62.9%)', + }, + 'colors-slate-dark-1200': { + cssVariable: 'var(--core-colors-slate-dark-1200)', + value: 'hsl(210, 5.6%, 92.9%)', + }, + 'colors-slate-dark-alpha-100': { + cssVariable: 'var(--core-colors-slate-dark-alpha-100)', + value: 'hsla(0, 0%, 0%, 0)', + }, + 'colors-slate-dark-alpha-200': { + cssVariable: 'var(--core-colors-slate-dark-alpha-200)', + value: 'hsla(181.39999999999998, 100%, 91.8%, 0.03137254901960784)', + }, + 'colors-slate-dark-alpha-300': { + cssVariable: 'var(--core-colors-slate-dark-alpha-300)', + value: 'hsla(181.60000000000002, 86.4%, 91.4%, 0.058823529411764705)', + }, + 'colors-slate-dark-alpha-400': { + cssVariable: 'var(--core-colors-slate-dark-alpha-400)', + value: 'hsla(208.89999999999998, 87.1%, 93.9%, 0.0784313725490196)', + }, + 'colors-slate-dark-alpha-500': { + cssVariable: 'var(--core-colors-slate-dark-alpha-500)', + value: 'hsla(200, 88.2%, 93.3%, 0.10980392156862745)', + }, + 'colors-slate-dark-alpha-600': { + cssVariable: 'var(--core-colors-slate-dark-alpha-600)', + value: 'hsla(209, 93.9%, 93.5%, 0.1411764705882353)', + }, + 'colors-slate-dark-alpha-700': { + cssVariable: 'var(--core-colors-slate-dark-alpha-700)', + value: 'hsla(203.20000000000005, 100%, 93.9%, 0.1803921568627451)', + }, + 'colors-slate-dark-alpha-800': { + cssVariable: 'var(--core-colors-slate-dark-alpha-800)', + value: 'hsla(208.79999999999995, 92.6%, 94.7%, 0.25882352941176473)', + }, + 'colors-slate-dark-alpha-900': { + cssVariable: 'var(--core-colors-slate-dark-alpha-900)', + value: 'hsla(208, 100%, 94.1%, 0.4117647058823529)', + }, + 'colors-slate-dark-alpha-1000': { + cssVariable: 'var(--core-colors-slate-dark-alpha-1000)', + value: 'hsla(210, 100%, 95.3%, 0.47058823529411764)', + }, + 'colors-slate-dark-alpha-1100': { + cssVariable: 'var(--core-colors-slate-dark-alpha-1100)', + value: 'hsla(210, 100%, 96.9%, 0.6196078431372549)', + }, + 'colors-slate-dark-alpha-1200': { + cssVariable: 'var(--core-colors-slate-dark-alpha-1200)', + value: 'hsla(210, 100%, 99.6%, 0.9294117647058824)', + }, + 'colors-slate-light-100': { + cssVariable: 'var(--core-colors-slate-light-100)', + value: 'hsl(210, 33.3%, 98.8%)', + }, + 'colors-slate-light-200': { + cssVariable: 'var(--core-colors-slate-light-200)', + value: 'hsl(210, 16.7%, 97.6%)', + }, + 'colors-slate-light-300': { + cssVariable: 'var(--core-colors-slate-light-300)', + value: 'hsl(210, 16.7%, 95.3%)', + }, + 'colors-slate-light-400': { + cssVariable: 'var(--core-colors-slate-light-400)', + value: 'hsl(210, 11.8%, 93.3%)', + }, + 'colors-slate-light-500': { + cssVariable: 'var(--core-colors-slate-light-500)', + value: 'hsl(216, 11.1%, 91.2%)', + }, + 'colors-slate-light-600': { + cssVariable: 'var(--core-colors-slate-light-600)', + value: 'hsl(205.70000000000005, 12.3%, 88.8%)', + }, + 'colors-slate-light-700': { + cssVariable: 'var(--core-colors-slate-light-700)', + value: 'hsl(210, 11.1%, 85.9%)', + }, + 'colors-slate-light-800': { + cssVariable: 'var(--core-colors-slate-light-800)', + value: 'hsl(205, 10.7%, 78%)', + }, + 'colors-slate-light-900': { + cssVariable: 'var(--core-colors-slate-light-900)', + value: 'hsl(205.70000000000005, 6.3%, 56.1%)', + }, + 'colors-slate-light-1000': { + cssVariable: 'var(--core-colors-slate-light-1000)', + value: 'hsl(205.70000000000005, 5.7%, 52.2%)', + }, + 'colors-slate-light-1100': { + cssVariable: 'var(--core-colors-slate-light-1100)', + value: 'hsl(205.70000000000005, 6.3%, 43.5%)', + }, + 'colors-slate-light-1200': { + cssVariable: 'var(--core-colors-slate-light-1200)', + value: 'hsl(201.79999999999995, 24.4%, 8.8%)', + }, + 'colors-slate-light-alpha-100': { + cssVariable: 'var(--core-colors-slate-light-alpha-100)', + value: 'hsla(209.79999999999995, 92.6%, 26.5%, 0.0196078431372549)', + }, + 'colors-slate-light-alpha-200': { + cssVariable: 'var(--core-colors-slate-light-alpha-200)', + value: 'hsla(210, 87.8%, 16.1%, 0.03137254901960784)', + }, + 'colors-slate-light-alpha-300': { + cssVariable: 'var(--core-colors-slate-light-alpha-300)', + value: 'hsla(209.60000000000002, 100%, 14.3%, 0.050980392156862744)', + }, + 'colors-slate-light-alpha-400': { + cssVariable: 'var(--core-colors-slate-light-alpha-400)', + value: 'hsla(210.60000000000002, 93%, 11.2%, 0.0784313725490196)', + }, + 'colors-slate-light-alpha-500': { + cssVariable: 'var(--core-colors-slate-light-alpha-500)', + value: 'hsla(215.29999999999995, 92.7%, 10.8%, 0.10196078431372549)', + }, + 'colors-slate-light-alpha-600': { + cssVariable: 'var(--core-colors-slate-light-alpha-600)', + value: 'hsla(205.70000000000005, 96.6%, 11.4%, 0.12941176470588237)', + }, + 'colors-slate-light-alpha-700': { + cssVariable: 'var(--core-colors-slate-light-alpha-700)', + value: 'hsla(209.39999999999998, 100%, 10%, 0.1607843137254902)', + }, + 'colors-slate-light-alpha-800': { + cssVariable: 'var(--core-colors-slate-light-alpha-800)', + value: 'hsla(204.5, 96.1%, 10%, 0.23921568627450981)', + }, + 'colors-slate-light-alpha-900': { + cssVariable: 'var(--core-colors-slate-light-alpha-900)', + value: 'hsla(206, 100%, 5.9%, 0.47058823529411764)', + }, + 'colors-slate-light-alpha-1000': { + cssVariable: 'var(--core-colors-slate-light-alpha-1000)', + value: 'hsla(204.39999999999998, 100%, 5.3%, 0.5098039215686274)', + }, + 'colors-slate-light-alpha-1100': { + cssVariable: 'var(--core-colors-slate-light-alpha-1100)', + value: 'hsla(205, 100%, 4.7%, 0.5882352941176471)', + }, + 'colors-slate-light-alpha-1200': { + cssVariable: 'var(--core-colors-slate-light-alpha-1200)', + value: 'hsla(200, 100%, 2.4%, 0.9294117647058824)', + }, + 'variables-colors-brand-primary': { + cssVariable: 'var(--core-variables-colors-brand-primary)', + value: 'hsl(153.10000000000002, 60.2%, 52.7%)', + }, + 'variables-colors-brand-accent': { + cssVariable: 'var(--core-variables-colors-brand-accent)', + value: 'hsl(152.89999999999998, 56.1%, 46.5%)', + }, + 'foreground-DEFAULT': { + cssVariable: 'var(--foreground-default)', + value: 'hsl(0, 0%, 98%)', + }, + 'foreground-light': { + cssVariable: 'var(--foreground-light)', + value: 'hsl(0, 0%, 70.6%)', + }, + 'foreground-lighter': { + cssVariable: 'var(--foreground-lighter)', + value: 'hsl(0, 0%, 53.7%)', + }, + 'foreground-muted': { + cssVariable: 'var(--foreground-muted)', + value: 'hsl(0, 0%, 30.2%)', + }, + 'foreground-contrast': { + cssVariable: 'var(--foreground-contrast)', + value: 'hsl(0, 0%, 8.6%)', + }, + 'background-200': { + cssVariable: 'var(--background-200)', + value: 'hsl(0, 0%, 9%)', + }, + 'background-DEFAULT': { + cssVariable: 'var(--background-default)', + value: 'hsl(0, 0%, 7.1%)', + }, + 'background-alternative-200': { + cssVariable: 'var(--background-alternative-200)', + value: 'hsl(0, 0%, 11%)', + }, + 'background-alternative-DEFAULT': { + cssVariable: 'var(--background-alternative-default)', + value: 'hsl(0, 0%, 5.9%)', + }, + 'background-selection': { + cssVariable: 'var(--background-selection)', + value: 'hsl(0, 0%, 19.2%)', + }, + 'background-control': { + cssVariable: 'var(--background-control)', + value: 'hsl(0, 0%, 14.1%)', + }, + 'background-surface-75': { + cssVariable: 'var(--background-surface-75)', + value: 'hsl(0, 0%, 9%)', + }, + 'background-surface-100': { + cssVariable: 'var(--background-surface-100)', + value: 'hsl(0, 0%, 12.2%)', + }, + 'background-surface-200': { + cssVariable: 'var(--background-surface-200)', + value: 'hsl(0, 0%, 12.9%)', + }, + 'background-surface-300': { + cssVariable: 'var(--background-surface-300)', + value: 'hsl(0, 0%, 16.1%)', + }, + 'background-surface-400': { + cssVariable: 'var(--background-surface-400)', + value: 'hsl(0, 0%, 16.1%)', + }, + 'background-overlay-DEFAULT': { + cssVariable: 'var(--background-overlay-default)', + value: 'hsl(0, 0%, 14.1%)', + }, + 'background-overlay-hover': { + cssVariable: 'var(--background-overlay-hover)', + value: 'hsl(0, 0%, 18%)', + }, + 'background-muted': { + cssVariable: 'var(--background-muted)', + value: 'hsl(0, 0%, 14.1%)', + }, + 'background-button-DEFAULT': { + cssVariable: 'var(--background-button-default)', + value: 'hsl(0, 0%, 18%)', + }, + 'background-dialog-DEFAULT': { + cssVariable: 'var(--background-dialog-default)', + value: 'hsl(0, 0%, 7.1%)', + }, + 'background-dash-sidebar': { + cssVariable: 'var(--background-dash-sidebar)', + value: 'hsl(0, 0%, 9%)', + }, + 'background-dash-canvas': { + cssVariable: 'var(--background-dash-canvas)', + value: 'hsl(0, 0%, 7.1%)', + }, + 'border-DEFAULT': { + cssVariable: 'var(--border-default)', + value: 'hsl(0, 0%, 18%)', + }, + 'border-muted': { + cssVariable: 'var(--border-muted)', + value: 'hsl(0, 0%, 14.1%)', + }, + 'border-secondary': { + cssVariable: 'var(--border-secondary)', + value: 'hsl(0, 0%, 14.1%)', + }, + 'border-overlay': { + cssVariable: 'var(--border-overlay)', + value: 'hsl(0, 0%, 20%)', + }, + 'border-control': { + cssVariable: 'var(--border-control)', + value: 'hsl(0, 0%, 22.4%)', + }, + 'border-alternative': { + cssVariable: 'var(--border-alternative)', + value: 'hsl(0, 0%, 26.7%)', + }, + 'border-strong': { + cssVariable: 'var(--border-strong)', + value: 'hsl(0, 0%, 21.2%)', + }, + 'border-stronger': { + cssVariable: 'var(--border-stronger)', + value: 'hsl(0, 0%, 27.1%)', + }, + 'border-button-DEFAULT': { + cssVariable: 'var(--border-button-default)', + value: 'hsl(0, 0%, 24.3%)', + }, + 'border-button-hover': { + cssVariable: 'var(--border-button-hover)', + value: 'hsl(0, 0%, 31.4%)', + }, + 'destructive-200': { + cssVariable: 'var(--destructive-200)', + value: 'hsl(10.899999999999977, 23.4%, 9.2%)', + }, + 'destructive-300': { + cssVariable: 'var(--destructive-300)', + value: 'hsl(7.5, 51.3%, 15.3%)', + }, + 'destructive-400': { + cssVariable: 'var(--destructive-400)', + value: 'hsl(6.699999999999989, 60%, 20.6%)', + }, + 'destructive-500': { + cssVariable: 'var(--destructive-500)', + value: 'hsl(7.899999999999977, 71.6%, 29%)', + }, + 'destructive-600': { + cssVariable: 'var(--destructive-600)', + value: 'hsl(9.699999999999989, 85.2%, 62.9%)', + }, + 'destructive-DEFAULT': { + cssVariable: 'var(--destructive-default)', + value: 'hsl(10.199999999999989, 77.9%, 53.9%)', + }, + 'warning-200': { + cssVariable: 'var(--warning-200)', + value: 'hsl(36.60000000000002, 100%, 8%)', + }, + 'warning-300': { + cssVariable: 'var(--warning-300)', + value: 'hsl(32.30000000000001, 100%, 10.2%)', + }, + 'warning-400': { + cssVariable: 'var(--warning-400)', + value: 'hsl(33.19999999999999, 100%, 14.5%)', + }, + 'warning-500': { + cssVariable: 'var(--warning-500)', + value: 'hsl(34.80000000000001, 90.9%, 21.6%)', + }, + 'warning-600': { + cssVariable: 'var(--warning-600)', + value: 'hsl(38.89999999999998, 100%, 42.9%)', + }, + 'warning-DEFAULT': { + cssVariable: 'var(--warning-default)', + value: 'hsl(38.89999999999998, 100%, 42.9%)', + }, + 'brand-200': { + cssVariable: 'var(--brand-200)', + value: 'hsl(162, 100%, 2%)', + }, + 'brand-300': { + cssVariable: 'var(--brand-300)', + value: 'hsl(155.10000000000002, 100%, 8%)', + }, + 'brand-400': { + cssVariable: 'var(--brand-400)', + value: 'hsl(155.5, 100%, 9.6%)', + }, + 'brand-500': { + cssVariable: 'var(--brand-500)', + value: 'hsl(154.89999999999998, 100%, 19.2%)', + }, + 'brand-600': { + cssVariable: 'var(--brand-600)', + value: 'hsl(154.89999999999998, 59.5%, 70%)', + }, + 'brand-DEFAULT': { + cssVariable: 'var(--brand-default)', + value: 'hsl(153.10000000000002, 60.2%, 52.7%)', + }, + 'brand-button': { + cssVariable: 'var(--brand-button)', + value: 'hsl(154.89999999999998, 100%, 19.2%)', + }, + 'brand-link': { + cssVariable: 'var(--brand-link)', + value: 'hsl(155, 100%, 38.6%)', + }, + '_secondary-200': { + cssVariable: 'var(--secondary-200)', + value: 'hsl(248, 53.6%, 11%)', + }, + '_secondary-400': { + cssVariable: 'var(--secondary-400)', + value: 'hsl(248.29999999999995, 54.5%, 25.9%)', + }, + '_secondary-DEFAULT': { + cssVariable: 'var(--secondary-default)', + value: 'hsl(247.79999999999995, 100%, 70%)', + }, + 'code_block-1': { + cssVariable: 'var(--code-block-1)', + value: 'hsl(170.79999999999995, 43.1%, 61.4%)', + }, + 'code_block-2': { + cssVariable: 'var(--code-block-2)', + value: 'hsl(33.19999999999999, 90.3%, 75.7%)', + }, + 'code_block-3': { + cssVariable: 'var(--code-block-3)', + value: 'hsl(83.80000000000001, 61.7%, 63.1%)', + }, + 'code_block-4': { + cssVariable: 'var(--code-block-4)', + value: 'hsl(276.1, 67.7%, 74.5%)', + }, + 'code_block-5': { + cssVariable: 'var(--code-block-5)', + value: 'hsl(13.800000000000011, 89.7%, 69.6%)', + }, } -} \ No newline at end of file diff --git a/packages/ui/components.json b/packages/ui/components.json index 9f1db7ce50e..f850184173f 100644 --- a/packages/ui/components.json +++ b/packages/ui/components.json @@ -12,4 +12,4 @@ "components": "src/components/shadcn", "utils": "src/lib/utils" } -} \ No newline at end of file +} diff --git a/packages/ui/internals/transform/common/camelCaseHelper.js b/packages/ui/internals/transform/common/camelCaseHelper.js index 69d260dca17..6ee7dec94d7 100644 --- a/packages/ui/internals/transform/common/camelCaseHelper.js +++ b/packages/ui/internals/transform/common/camelCaseHelper.js @@ -1,3 +1,4 @@ const changeCase = require('change-case') -module.exports = name => changeCase.camelCase(name, { transform: changeCase.camelCaseTransformMerge }) +module.exports = (name) => + changeCase.camelCase(name, { transform: changeCase.camelCaseTransformMerge }) diff --git a/packages/ui/internals/transform/common/colorToHex8.js b/packages/ui/internals/transform/common/colorToHex8.js index 42b6fd71ac7..64096af5c23 100644 --- a/packages/ui/internals/transform/common/colorToHex8.js +++ b/packages/ui/internals/transform/common/colorToHex8.js @@ -7,5 +7,5 @@ module.exports = { }, transformer: function ({ value }) { return `${new TinyColor.TinyColor(value).toHex8String()}` - } + }, } diff --git a/packages/ui/internals/transform/common/colorToRgbaString.js b/packages/ui/internals/transform/common/colorToRgbaString.js index 01819adbede..bc97f942a46 100644 --- a/packages/ui/internals/transform/common/colorToRgbaString.js +++ b/packages/ui/internals/transform/common/colorToRgbaString.js @@ -7,5 +7,5 @@ module.exports = { }, transformer: function ({ value }) { return `${new TinyColor.TinyColor(value).toRgbString()}` - } + }, } diff --git a/packages/ui/internals/transform/common/copyFileOrFolder.js b/packages/ui/internals/transform/common/copyFileOrFolder.js index 62ba766a3b6..3a8c2793f2a 100644 --- a/packages/ui/internals/transform/common/copyFileOrFolder.js +++ b/packages/ui/internals/transform/common/copyFileOrFolder.js @@ -12,5 +12,5 @@ module.exports = { console.log(`Cleaning ${destination}`) fs.removeSync(destination) }) - } + }, } diff --git a/packages/ui/internals/transform/web/createPropertyFormatter.js b/packages/ui/internals/transform/web/createPropertyFormatter.js index 31687131d6a..a3c129f4ee0 100644 --- a/packages/ui/internals/transform/web/createPropertyFormatter.js +++ b/packages/ui/internals/transform/web/createPropertyFormatter.js @@ -16,7 +16,7 @@ const defaultFormatting = { commentStyle: 'long', indentation: '', separator: ' =', - suffix: ';' + suffix: ';', } /** @@ -47,38 +47,44 @@ const defaultFormatting = { * @param {Object} options.formatting - Custom formatting properties that define parts of a declaration line in code. The configurable strings are: prefix, indentation, separator, suffix, and commentStyle. Those are used to generate a line like this: `${indentation}${prefix}${prop.name}${separator} ${prop.value}${suffix}` * @returns {Function} */ -function createPropertyFormatter({outputReferences, dictionary, format, formatting={}}) { - let {prefix, commentStyle, indentation, separator, suffix} = Object.assign({}, defaultFormatting, formatting); +function createPropertyFormatter({ outputReferences, dictionary, format, formatting = {} }) { + let { prefix, commentStyle, indentation, separator, suffix } = Object.assign( + {}, + defaultFormatting, + formatting + ) - switch(format) { + switch (format) { case 'css': - prefix = '--'; - indentation = ' '; - separator = ':'; - break; + prefix = '--' + indentation = ' ' + separator = ':' + break case 'sass': - prefix = '$'; - commentStyle = 'short'; - indentation = ''; - separator = ':'; - break; + prefix = '$' + commentStyle = 'short' + indentation = '' + separator = ':' + break case 'less': - prefix = '@'; - commentStyle = 'short'; - indentation = ''; - separator = ':'; - break; + prefix = '@' + commentStyle = 'short' + indentation = '' + separator = ':' + break case 'stylus': - prefix = '$'; - commentStyle = 'short'; - indentation = ''; - separator = '='; - break; + prefix = '$' + commentStyle = 'short' + indentation = '' + separator = '=' + break } - return function(prop) { - let to_ret_prop = `${indentation}${prefix}${prop.name}${separator} `.replace('--dark-', '--').replace('--light-', '--'); - let value = prop.value; + return function (prop) { + let to_ret_prop = `${indentation}${prefix}${prop.name}${separator} ` + .replace('--dark-', '--') + .replace('--light-', '--') + let value = prop.value /** * A single value can have multiple references either by interpolation: @@ -96,43 +102,43 @@ function createPropertyFormatter({outputReferences, dictionary, format, formatti // Formats that use this function expect `value` to be a string // or else you will get '[object Object]' in the output if (typeof value === 'string') { - const refs = dictionary.getReferences(prop.original.value); - refs.forEach(ref => { + const refs = dictionary.getReferences(prop.original.value) + refs.forEach((ref) => { // value should be a string that contains the resolved reference // because Style Dictionary resolved this in the resolution step. // Here we are undoing that by replacing the value with // the reference's name if (ref.value && ref.name) { - value = value.replace(ref.value, function() { + value = value.replace(ref.value, function () { if (format === 'css') { return `var(${prefix}${ref.name})` } else { - return `${prefix}${ref.name}`; + return `${prefix}${ref.name}` } - }); + }) } - }); + }) } } - to_ret_prop += prop.attributes.category === 'asset' ? `"${value}"` : value; + to_ret_prop += prop.attributes.category === 'asset' ? `"${value}"` : value if (format == 'sass' && prop.themeable === true) { - to_ret_prop += ' !default'; + to_ret_prop += ' !default' } - to_ret_prop += suffix; + to_ret_prop += suffix if (prop.comment && commentStyle !== 'none') { if (commentStyle === 'short') { - to_ret_prop = to_ret_prop.concat(` // ${prop.comment}`); + to_ret_prop = to_ret_prop.concat(` // ${prop.comment}`) } else { - to_ret_prop = to_ret_prop.concat(` /* ${prop.comment} */`); + to_ret_prop = to_ret_prop.concat(` /* ${prop.comment} */`) } } - return to_ret_prop; + return to_ret_prop } } -module.exports = createPropertyFormatter; +module.exports = createPropertyFormatter diff --git a/packages/ui/internals/transform/web/fileHeader.js b/packages/ui/internals/transform/web/fileHeader.js index 153922ace66..c48930e2916 100644 --- a/packages/ui/internals/transform/web/fileHeader.js +++ b/packages/ui/internals/transform/web/fileHeader.js @@ -19,7 +19,7 @@ const defaultFormatting = { lineSeparator, prefix: ' * ', header: `/**${lineSeparator}`, - footer: `${lineSeparator} */${lineSeparator}${lineSeparator}` + footer: `${lineSeparator} */${lineSeparator}${lineSeparator}`, } /** @@ -45,7 +45,7 @@ const defaultFormatting = { * }); * ``` */ -function fileHeader ({ file = {}, commentStyle, formatting = {} }) { +function fileHeader({ file = {}, commentStyle, formatting = {} }) { // showFileHeader is true by default let showFileHeader = true if (file.options && typeof file.options.showFileHeader !== 'undefined') { @@ -61,10 +61,7 @@ function fileHeader ({ file = {}, commentStyle, formatting = {} }) { } // default header - const defaultHeader = [ - 'Do not edit directly', - `Generated on ${new Date().toString()}` - ] + const defaultHeader = ['Do not edit directly', `Generated on ${new Date().toString()}`] let { prefix, lineSeparator, header, footer } = Object.assign({}, defaultFormatting, formatting) @@ -79,7 +76,7 @@ function fileHeader ({ file = {}, commentStyle, formatting = {} }) { } return `${header}${fn(defaultHeader) - .map(line => `${prefix}${line}`) + .map((line) => `${prefix}${line}`) .join(lineSeparator)}${footer}` } diff --git a/packages/ui/internals/transform/web/filterWeb.js b/packages/ui/internals/transform/web/filterWeb.js index 6246ae733d1..f03fc479b0d 100644 --- a/packages/ui/internals/transform/web/filterWeb.js +++ b/packages/ui/internals/transform/web/filterWeb.js @@ -1,3 +1,11 @@ -const acceptedTypes = ['color', 'dimension', 'font', 'custom-radius', 'custom-fontStyle', 'custom-shadow', 'custom-gradient'] +const acceptedTypes = [ + 'color', + 'dimension', + 'font', + 'custom-radius', + 'custom-fontStyle', + 'custom-shadow', + 'custom-gradient', +] module.exports = (token) => acceptedTypes.includes(token.type) diff --git a/packages/ui/internals/transform/web/formatCss.js b/packages/ui/internals/transform/web/formatCss.js index 87fec87c828..17a70e1d206 100644 --- a/packages/ui/internals/transform/web/formatCss.js +++ b/packages/ui/internals/transform/web/formatCss.js @@ -2,13 +2,13 @@ const formattedVariables = require('./formattedVariables') const fileHeader = require('./fileHeader') const filteredTokens = (dictionary, filterFn) => { - const filtered = dictionary.allTokens.filter(token => filterFn(token)) + const filtered = dictionary.allTokens.filter((token) => filterFn(token)) return { ...dictionary, ...{ allProperties: filtered, - allTokens: filtered - } + allTokens: filtered, + }, } } @@ -19,27 +19,30 @@ module.exports = ({ dictionary, options, file }) => { // if you export the prefixes use token.path[0] instead of [1] light: filteredTokens(dictionary, (token) => token.path[1].toLowerCase() === 'light'), dark: filteredTokens(dictionary, (token) => token.path[1].toLowerCase() === 'dark'), - rest: filteredTokens(dictionary, (token) => !['light', 'dark'].includes(token.path[1].toLowerCase())) + rest: filteredTokens( + dictionary, + (token) => !['light', 'dark'].includes(token.path[1].toLowerCase()) + ), } return ( fileHeader({ file }) + - ':root {\n' + - formattedVariables({ format: 'css', dictionary: groupedTokens.rest, outputReferences }) + - '\n}\n\n' + - '@media (prefers-color-scheme: light) {\n' + - ' :root {\n' + - formattedVariables({ format: 'css', dictionary: groupedTokens.light, outputReferences }) + - '\n }\n}\n\n' + - '@media (prefers-color-scheme: dark) {\n' + - ' :root {\n' + - formattedVariables({ format: 'css', dictionary: groupedTokens.dark, outputReferences }) + - '\n }\n}\n\n' + - 'html[data-theme="light"] {\n' + - formattedVariables({ format: 'css', dictionary: groupedTokens.light, outputReferences }) + - '\n}\n\n' + - 'html[data-theme="dark"] {\n' + - formattedVariables({ format: 'css', dictionary: groupedTokens.dark, outputReferences }) + - '\n}\n' + ':root {\n' + + formattedVariables({ format: 'css', dictionary: groupedTokens.rest, outputReferences }) + + '\n}\n\n' + + '@media (prefers-color-scheme: light) {\n' + + ' :root {\n' + + formattedVariables({ format: 'css', dictionary: groupedTokens.light, outputReferences }) + + '\n }\n}\n\n' + + '@media (prefers-color-scheme: dark) {\n' + + ' :root {\n' + + formattedVariables({ format: 'css', dictionary: groupedTokens.dark, outputReferences }) + + '\n }\n}\n\n' + + 'html[data-theme="light"] {\n' + + formattedVariables({ format: 'css', dictionary: groupedTokens.light, outputReferences }) + + '\n}\n\n' + + 'html[data-theme="dark"] {\n' + + formattedVariables({ format: 'css', dictionary: groupedTokens.dark, outputReferences }) + + '\n}\n' ) } diff --git a/packages/ui/internals/transform/web/formattedVariables.js b/packages/ui/internals/transform/web/formattedVariables.js index b73b817b382..195d6a9f83a 100644 --- a/packages/ui/internals/transform/web/formattedVariables.js +++ b/packages/ui/internals/transform/web/formattedVariables.js @@ -15,7 +15,7 @@ const createPropertyFormatter = require('./createPropertyFormatter') const sortByReference = require('./sortByReference') const defaultFormatting = { - lineSeparator: '\n' + lineSeparator: '\n', } /** @@ -38,7 +38,7 @@ const defaultFormatting = { * }); * ``` */ -function formattedVariables ({ format, dictionary, outputReferences = false, formatting = {} }) { +function formattedVariables({ format, dictionary, outputReferences = false, formatting = {} }) { let { allTokens } = dictionary const { lineSeparator } = Object.assign({}, defaultFormatting, formatting) @@ -57,7 +57,9 @@ function formattedVariables ({ format, dictionary, outputReferences = false, for return allTokens .map(createPropertyFormatter({ outputReferences, dictionary, format, formatting })) - .filter(function (strVal) { return !!strVal }) + .filter(function (strVal) { + return !!strVal + }) .join(lineSeparator) } diff --git a/packages/ui/internals/transform/web/sizePx.js b/packages/ui/internals/transform/web/sizePx.js index b19899f0b86..04fe72999eb 100644 --- a/packages/ui/internals/transform/web/sizePx.js +++ b/packages/ui/internals/transform/web/sizePx.js @@ -5,5 +5,5 @@ module.exports = { }, transformer: function (token) { return `${token.value}px` - } + }, } diff --git a/packages/ui/internals/transform/web/sortByReference.js b/packages/ui/internals/transform/web/sortByReference.js index 16eeb80a248..5dd4af79b99 100644 --- a/packages/ui/internals/transform/web/sortByReference.js +++ b/packages/ui/internals/transform/web/sortByReference.js @@ -24,48 +24,48 @@ * @param {Dictionary} dictionary * @returns {Function} */ - function sortByReference(dictionary) { +function sortByReference(dictionary) { // The sorter function is recursive to account for multiple levels of nesting function sorter(a, b) { - const aComesFirst = -1; - const bComesFirst = 1; + const aComesFirst = -1 + const bComesFirst = 1 // If token a uses a reference and token b doesn't, b might come before a // read on.. if (a.original && dictionary.usesReference(a.original.value)) { // Both a and b have references, we need to see if the reference each other if (b.original && dictionary.usesReference(b.original.value)) { - const aRefs = dictionary.getReferences(a.original.value); - const bRefs = dictionary.getReferences(b.original.value); + const aRefs = dictionary.getReferences(a.original.value) + const bRefs = dictionary.getReferences(b.original.value) - aRefs.forEach(aRef => { + aRefs.forEach((aRef) => { // a references b, we want b to come first if (aRef.name === b.name) { - return bComesFirst; + return bComesFirst } - }); + }) - bRefs.forEach(bRef => { + bRefs.forEach((bRef) => { // ditto but opposite if (bRef.name === a.name) { - return aComesFirst; + return aComesFirst } - }); + }) // both a and b have references and don't reference each other // we go further down the rabbit hole (reference chain) - return sorter(aRefs[0], bRefs[0]); - // a has a reference and b does not: + return sorter(aRefs[0], bRefs[0]) + // a has a reference and b does not: } else { - return bComesFirst; + return bComesFirst } - // a does not have a reference it should come first regardless if b has one + // a does not have a reference it should come first regardless if b has one } else { - return aComesFirst; + return aComesFirst } } - return sorter; + return sorter } -module.exports = sortByReference; \ No newline at end of file +module.exports = sortByReference diff --git a/packages/ui/internals/transform/web/webFont.js b/packages/ui/internals/transform/web/webFont.js index 808a9e9a160..4bebf5e80f5 100644 --- a/packages/ui/internals/transform/web/webFont.js +++ b/packages/ui/internals/transform/web/webFont.js @@ -1,6 +1,7 @@ -const notDefault = (value, defaultValue) => (value !== defaultValue) ? value : '' +const notDefault = (value, defaultValue) => (value !== defaultValue ? value : '') -const fontFamily = ({ fontFamily }, { fontFamilies } = {}) => fontFamilies && fontFamilies[fontFamily] ? fontFamilies[fontFamily] : fontFamily +const fontFamily = ({ fontFamily }, { fontFamilies } = {}) => + fontFamilies && fontFamilies[fontFamily] ? fontFamilies[fontFamily] : fontFamily module.exports = { type: 'value', @@ -10,5 +11,5 @@ module.exports = { transformer: function ({ value: font }, { options }) { // font: font-style font-variant font-weight font-size/line-height font-family; return `${notDefault(font.fontStretch, 'normal')} ${notDefault(font.fontStyle, 'normal')} ${font.fontWeight} ${font.fontSize}/${font.lineHeight} ${fontFamily(font, options)}`.trim() - } + }, } diff --git a/packages/ui/internals/transform/web/webGradient.js b/packages/ui/internals/transform/web/webGradient.js index 8c4ee2f19f4..1325b271a0a 100644 --- a/packages/ui/internals/transform/web/webGradient.js +++ b/packages/ui/internals/transform/web/webGradient.js @@ -6,14 +6,16 @@ module.exports = { return token.type === 'custom-gradient' }, transformer: function ({ value }) { - const stopsString = value.stops.map(stop => { - return `${new TinyColor.TinyColor(stop.color).toRgbString()} ${stop.position * 100}%` - }).join(', ') + const stopsString = value.stops + .map((stop) => { + return `${new TinyColor.TinyColor(stop.color).toRgbString()} ${stop.position * 100}%` + }) + .join(', ') if (value.gradientType === 'linear') { return `linear-gradient(${value.rotation}deg, ${stopsString})` } if (value.gradientType === 'radial') { return `radial-gradient(${stopsString})` } - } + }, } diff --git a/packages/ui/internals/transform/web/webPadding.js b/packages/ui/internals/transform/web/webPadding.js index 0aff7bf248d..29826a90911 100644 --- a/packages/ui/internals/transform/web/webPadding.js +++ b/packages/ui/internals/transform/web/webPadding.js @@ -4,9 +4,9 @@ module.exports = { return token.type === 'custom-spacing' }, transformer: ({ value: { top, left, bottom, right } }) => { - if ([bottom, left, right].every(v => v === top)) { + if ([bottom, left, right].every((v) => v === top)) { return `${top}px` } return `${top}px ${right}px ${bottom}px ${left}px` - } + }, } diff --git a/packages/ui/internals/transform/web/webRadius.js b/packages/ui/internals/transform/web/webRadius.js index 730be6d3bca..0b72b06d01a 100644 --- a/packages/ui/internals/transform/web/webRadius.js +++ b/packages/ui/internals/transform/web/webRadius.js @@ -4,9 +4,9 @@ module.exports = { return token.type === 'custom-radius' }, transformer: function ({ value }) { - if ([value.topRight, value.bottomLeft, value.bottomRight].every(v => v === value.topLeft)) { + if ([value.topRight, value.bottomLeft, value.bottomRight].every((v) => v === value.topLeft)) { return `${value.topLeft}px` } return `${value.topLeft}px ${value.topRight}px ${value.bottomLeft}px ${value.bottomRight}px` - } + }, } diff --git a/packages/ui/internals/transform/web/webShadows.js b/packages/ui/internals/transform/web/webShadows.js index 997cddd5cb8..3268c2232fd 100644 --- a/packages/ui/internals/transform/web/webShadows.js +++ b/packages/ui/internals/transform/web/webShadows.js @@ -7,5 +7,5 @@ module.exports = { }, transformer: function ({ value }) { return `${value.shadowType === 'innerShadow' ? 'inset ' : ''}${value.offsetX}px ${value.offsetY}px ${value.radius}px ${value.spread}px ${new TinyColor.TinyColor(value.color).toRgbString()}` - } + }, } diff --git a/packages/ui/src/components/Breadcrumb/Breadcrumb.test.jsx b/packages/ui/src/components/Breadcrumb/Breadcrumb.test.jsx index c560eb50a02..a6c2b316c56 100644 --- a/packages/ui/src/components/Breadcrumb/Breadcrumb.test.jsx +++ b/packages/ui/src/components/Breadcrumb/Breadcrumb.test.jsx @@ -1,8 +1,8 @@ -import { render, screen } from '@testing-library/react'; -import React from 'react'; -import { describe, expect, it } from 'vitest'; +import { render, screen } from '@testing-library/react' +import React from 'react' +import { describe, expect, it } from 'vitest' -import Breadcrumb from './Breadcrumb'; +import Breadcrumb from './Breadcrumb' describe('#Breadcrumb', () => { it.skip('should render breadcrumb correctly', async () => { diff --git a/packages/ui/src/components/ContextMenu/ContextMenu.module.css b/packages/ui/src/components/ContextMenu/ContextMenu.module.css index c4651c0ef7a..3c8a401fe73 100644 --- a/packages/ui/src/components/ContextMenu/ContextMenu.module.css +++ b/packages/ui/src/components/ContextMenu/ContextMenu.module.css @@ -46,12 +46,12 @@ @keyframes transition { /* 0% { */ - /* opacity: 0; */ - /* transform: scale(0.95); */ + /* opacity: 0; */ + /* transform: scale(0.95); */ /* } */ /* 100% { */ - /* opacity: 1; */ - /* transform: scale(1); */ + /* opacity: 1; */ + /* transform: scale(1); */ /* } */ } diff --git a/packages/ui/src/components/InputOld/Input.test.jsx b/packages/ui/src/components/InputOld/Input.test.jsx index fb3ec4ec06e..ae0df1ee953 100644 --- a/packages/ui/src/components/InputOld/Input.test.jsx +++ b/packages/ui/src/components/InputOld/Input.test.jsx @@ -1,6 +1,5 @@ import { describe, it } from 'vitest' - describe('#Input', () => { it.skip('should render input correctly', async () => { // render() @@ -13,7 +12,7 @@ describe('#Input', () => { }) // it.each(SIZES)('should have "form-input--%s" class', (size) => { - // render() - // expect(screen.queryByTestId('form-input')).toHaveClass(`form-input border-solid form-input--${size}`) + // render() + // expect(screen.queryByTestId('form-input')).toHaveClass(`form-input border-solid form-input--${size}`) // }) -}) \ No newline at end of file +}) diff --git a/packages/ui/src/components/RadioOld/Radio.test.jsx b/packages/ui/src/components/RadioOld/Radio.test.jsx index e9fb5d9f0ae..511e0f47452 100644 --- a/packages/ui/src/components/RadioOld/Radio.test.jsx +++ b/packages/ui/src/components/RadioOld/Radio.test.jsx @@ -1,19 +1,17 @@ import { describe, it } from 'vitest' - describe('#Radio', () => { - it('should render radio correctly', () => { - // render( - // // - // ) - // expect(screen.queryByTestId('form-radio')).toBeInTheDocument() + // render( + // // + // ) + // expect(screen.queryByTestId('form-radio')).toBeInTheDocument() }) it('should show label', () => { - // render( - // - // ) - // expect(screen.queryByText('JavaScript')).toBeInTheDocument() + // render( + // + // ) + // expect(screen.queryByText('JavaScript')).toBeInTheDocument() }) -}) \ No newline at end of file +}) diff --git a/packages/ui/src/components/Typography/index.tsx b/packages/ui/src/components/Typography/index.tsx index 3b869c1aab7..4761fd9f69e 100644 --- a/packages/ui/src/components/Typography/index.tsx +++ b/packages/ui/src/components/Typography/index.tsx @@ -1,6 +1,3 @@ - import Typography from './Typography' export default Typography export { default as Typography } from './Typography' - - diff --git a/packages/ui/src/components/Upload/Upload.module.css b/packages/ui/src/components/Upload/Upload.module.css index c6f6109ae27..56056bde222 100644 --- a/packages/ui/src/components/Upload/Upload.module.css +++ b/packages/ui/src/components/Upload/Upload.module.css @@ -4,4 +4,4 @@ .sbui-upload-dragger--dragged { @apply bg-brand-100; -} \ No newline at end of file +} diff --git a/packages/ui/src/components/shadcn/ui/aspect-ratio.tsx b/packages/ui/src/components/shadcn/ui/aspect-ratio.tsx index d6a5226f5e9..794c6f4cd34 100644 --- a/packages/ui/src/components/shadcn/ui/aspect-ratio.tsx +++ b/packages/ui/src/components/shadcn/ui/aspect-ratio.tsx @@ -1,6 +1,6 @@ -"use client" +'use client' -import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" +import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio' const AspectRatio = AspectRatioPrimitive.Root diff --git a/packages/ui/src/lib/Spinner/styles.module.css b/packages/ui/src/lib/Spinner/styles.module.css index 0bf8d819238..ed2d7f5c929 100644 --- a/packages/ui/src/lib/Spinner/styles.module.css +++ b/packages/ui/src/lib/Spinner/styles.module.css @@ -1,51 +1,52 @@ html { - background: #009688; + background: #009688; } - html, body { - height: 100%; +html, +body { + height: 100%; } - body { - display: flex; - align-items: center; - justify-content: center; +body { + display: flex; + align-items: center; + justify-content: center; } - .spin-loader { - border-radius: 80%; - display: block; - height: 50px; - width: 50px; - position: relative; - animation: spin 0.675s linear 0s infinite normal; - background: #26a69a; +.spin-loader { + border-radius: 80%; + display: block; + height: 50px; + width: 50px; + position: relative; + animation: spin 0.675s linear 0s infinite normal; + background: #26a69a; } - .spin-loader:before, .spin-loader:after { - content: ""; - display: block; - position: absolute; +.spin-loader:before, +.spin-loader:after { + content: ''; + display: block; + position: absolute; } - .spin-loader:before { - border-radius: 0 90px 90px 0; - height: 50px; - width: 50%; - top: 0; - right: 0; - z-index: 1; - background: #005041; - background-image: linear-gradient(#26a69a, #005041); +.spin-loader:before { + border-radius: 0 90px 90px 0; + height: 50px; + width: 50%; + top: 0; + right: 0; + z-index: 1; + background: #005041; + background-image: linear-gradient(#26a69a, #005041); } - .spin-loader:after { - border-radius: 80%; - height: 40px; - width: 40px; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 1; - background: #009688; +.spin-loader:after { + border-radius: 80%; + height: 40px; + width: 40px; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1; + background: #009688; } - @keyframes spin { - to { - transform: rotate(360deg); - } +@keyframes spin { + to { + transform: rotate(360deg); + } } - \ No newline at end of file diff --git a/packages/ui/src/lib/tailwind-demo-classes.ts b/packages/ui/src/lib/tailwind-demo-classes.ts index 3312dbf86cc..015278bf9b4 100644 --- a/packages/ui/src/lib/tailwind-demo-classes.ts +++ b/packages/ui/src/lib/tailwind-demo-classes.ts @@ -1,173 +1,167 @@ export default { - "background": [ - "bg-200", - "bg", - "bg-alternative-200", - "bg-alternative", - "bg-selection", - "bg-control", - "bg-surface-75", - "bg-surface-100", - "bg-surface-200", - "bg-surface-300", - "bg-surface-400", - "bg-overlay", - "bg-overlay-hover", - "bg-muted", - "bg-button", - "bg-dialog", - "bg-dash-sidebar", - "bg-dash-canvas" + background: [ + 'bg-200', + 'bg', + 'bg-alternative-200', + 'bg-alternative', + 'bg-selection', + 'bg-control', + 'bg-surface-75', + 'bg-surface-100', + 'bg-surface-200', + 'bg-surface-300', + 'bg-surface-400', + 'bg-overlay', + 'bg-overlay-hover', + 'bg-muted', + 'bg-button', + 'bg-dialog', + 'bg-dash-sidebar', + 'bg-dash-canvas', ], - "border": [ - "border", - "border-muted", - "border-secondary", - "border-overlay", - "border-control", - "border-alternative", - "border-strong", - "border-stronger", - "border-button", - "border-button-hover" + border: [ + 'border', + 'border-muted', + 'border-secondary', + 'border-overlay', + 'border-control', + 'border-alternative', + 'border-strong', + 'border-stronger', + 'border-button', + 'border-button-hover', ], - "text": [ - "text", - "text-light", - "text-lighter", - "text-muted", - "text-contrast" + text: ['text', 'text-light', 'text-lighter', 'text-muted', 'text-contrast'], + colors: [ + 'bg-destructive-200', + 'bg-destructive-300', + 'bg-destructive-400', + 'bg-destructive-500', + 'bg-destructive-600', + 'bg-destructive', + 'bg-warning-200', + 'bg-warning-300', + 'bg-warning-400', + 'bg-warning-500', + 'bg-warning-600', + 'bg-warning', + 'bg-brand-200', + 'bg-brand-300', + 'bg-brand-400', + 'bg-brand-500', + 'bg-brand-600', + 'bg-brand', + 'bg-brand-button', + 'bg-brand-link', + 'bg-_secondary-200', + 'bg-_secondary-400', + 'bg-_secondary', + 'bg-code_block-1', + 'bg-code_block-2', + 'bg-code_block-3', + 'bg-code_block-4', + 'bg-code_block-5', ], - "colors": [ - "bg-destructive-200", - "bg-destructive-300", - "bg-destructive-400", - "bg-destructive-500", - "bg-destructive-600", - "bg-destructive", - "bg-warning-200", - "bg-warning-300", - "bg-warning-400", - "bg-warning-500", - "bg-warning-600", - "bg-warning", - "bg-brand-200", - "bg-brand-300", - "bg-brand-400", - "bg-brand-500", - "bg-brand-600", - "bg-brand", - "bg-brand-button", - "bg-brand-link", - "bg-_secondary-200", - "bg-_secondary-400", - "bg-_secondary", - "bg-code_block-1", - "bg-code_block-2", - "bg-code_block-3", - "bg-code_block-4", - "bg-code_block-5" + palletes: [ + 'bg-black', + 'bg-white', + 'bg-gray-dark-100', + 'bg-gray-dark-200', + 'bg-gray-dark-300', + 'bg-gray-dark-400', + 'bg-gray-dark-500', + 'bg-gray-dark-600', + 'bg-gray-dark-700', + 'bg-gray-dark-800', + 'bg-gray-dark-900', + 'bg-gray-dark-1000', + 'bg-gray-dark-1100', + 'bg-gray-dark-1200', + 'bg-gray-dark-alpha-100', + 'bg-gray-dark-alpha-200', + 'bg-gray-dark-alpha-300', + 'bg-gray-dark-alpha-400', + 'bg-gray-dark-alpha-500', + 'bg-gray-dark-alpha-600', + 'bg-gray-dark-alpha-700', + 'bg-gray-dark-alpha-800', + 'bg-gray-dark-alpha-900', + 'bg-gray-dark-alpha-1000', + 'bg-gray-dark-alpha-1100', + 'bg-gray-dark-alpha-1200', + 'bg-gray-light-100', + 'bg-gray-light-200', + 'bg-gray-light-300', + 'bg-gray-light-400', + 'bg-gray-light-500', + 'bg-gray-light-600', + 'bg-gray-light-700', + 'bg-gray-light-800', + 'bg-gray-light-900', + 'bg-gray-light-1000', + 'bg-gray-light-1100', + 'bg-gray-light-1200', + 'bg-gray-light-alpha-100', + 'bg-gray-light-alpha-200', + 'bg-gray-light-alpha-300', + 'bg-gray-light-alpha-400', + 'bg-gray-light-alpha-500', + 'bg-gray-light-alpha-600', + 'bg-gray-light-alpha-700', + 'bg-gray-light-alpha-800', + 'bg-gray-light-alpha-900', + 'bg-gray-light-alpha-1000', + 'bg-gray-light-alpha-1100', + 'bg-gray-light-alpha-1200', + 'bg-slate-dark-100', + 'bg-slate-dark-200', + 'bg-slate-dark-300', + 'bg-slate-dark-400', + 'bg-slate-dark-500', + 'bg-slate-dark-600', + 'bg-slate-dark-700', + 'bg-slate-dark-800', + 'bg-slate-dark-900', + 'bg-slate-dark-1000', + 'bg-slate-dark-1100', + 'bg-slate-dark-1200', + 'bg-slate-dark-alpha-100', + 'bg-slate-dark-alpha-200', + 'bg-slate-dark-alpha-300', + 'bg-slate-dark-alpha-400', + 'bg-slate-dark-alpha-500', + 'bg-slate-dark-alpha-600', + 'bg-slate-dark-alpha-700', + 'bg-slate-dark-alpha-800', + 'bg-slate-dark-alpha-900', + 'bg-slate-dark-alpha-1000', + 'bg-slate-dark-alpha-1100', + 'bg-slate-dark-alpha-1200', + 'bg-slate-light-100', + 'bg-slate-light-200', + 'bg-slate-light-300', + 'bg-slate-light-400', + 'bg-slate-light-500', + 'bg-slate-light-600', + 'bg-slate-light-700', + 'bg-slate-light-800', + 'bg-slate-light-900', + 'bg-slate-light-1000', + 'bg-slate-light-1100', + 'bg-slate-light-1200', + 'bg-slate-light-alpha-100', + 'bg-slate-light-alpha-200', + 'bg-slate-light-alpha-300', + 'bg-slate-light-alpha-400', + 'bg-slate-light-alpha-500', + 'bg-slate-light-alpha-600', + 'bg-slate-light-alpha-700', + 'bg-slate-light-alpha-800', + 'bg-slate-light-alpha-900', + 'bg-slate-light-alpha-1000', + 'bg-slate-light-alpha-1100', + 'bg-slate-light-alpha-1200', + 'variables-bg-brand-primary', + 'variables-bg-brand-accent', ], - "palletes": [ - "bg-black", - "bg-white", - "bg-gray-dark-100", - "bg-gray-dark-200", - "bg-gray-dark-300", - "bg-gray-dark-400", - "bg-gray-dark-500", - "bg-gray-dark-600", - "bg-gray-dark-700", - "bg-gray-dark-800", - "bg-gray-dark-900", - "bg-gray-dark-1000", - "bg-gray-dark-1100", - "bg-gray-dark-1200", - "bg-gray-dark-alpha-100", - "bg-gray-dark-alpha-200", - "bg-gray-dark-alpha-300", - "bg-gray-dark-alpha-400", - "bg-gray-dark-alpha-500", - "bg-gray-dark-alpha-600", - "bg-gray-dark-alpha-700", - "bg-gray-dark-alpha-800", - "bg-gray-dark-alpha-900", - "bg-gray-dark-alpha-1000", - "bg-gray-dark-alpha-1100", - "bg-gray-dark-alpha-1200", - "bg-gray-light-100", - "bg-gray-light-200", - "bg-gray-light-300", - "bg-gray-light-400", - "bg-gray-light-500", - "bg-gray-light-600", - "bg-gray-light-700", - "bg-gray-light-800", - "bg-gray-light-900", - "bg-gray-light-1000", - "bg-gray-light-1100", - "bg-gray-light-1200", - "bg-gray-light-alpha-100", - "bg-gray-light-alpha-200", - "bg-gray-light-alpha-300", - "bg-gray-light-alpha-400", - "bg-gray-light-alpha-500", - "bg-gray-light-alpha-600", - "bg-gray-light-alpha-700", - "bg-gray-light-alpha-800", - "bg-gray-light-alpha-900", - "bg-gray-light-alpha-1000", - "bg-gray-light-alpha-1100", - "bg-gray-light-alpha-1200", - "bg-slate-dark-100", - "bg-slate-dark-200", - "bg-slate-dark-300", - "bg-slate-dark-400", - "bg-slate-dark-500", - "bg-slate-dark-600", - "bg-slate-dark-700", - "bg-slate-dark-800", - "bg-slate-dark-900", - "bg-slate-dark-1000", - "bg-slate-dark-1100", - "bg-slate-dark-1200", - "bg-slate-dark-alpha-100", - "bg-slate-dark-alpha-200", - "bg-slate-dark-alpha-300", - "bg-slate-dark-alpha-400", - "bg-slate-dark-alpha-500", - "bg-slate-dark-alpha-600", - "bg-slate-dark-alpha-700", - "bg-slate-dark-alpha-800", - "bg-slate-dark-alpha-900", - "bg-slate-dark-alpha-1000", - "bg-slate-dark-alpha-1100", - "bg-slate-dark-alpha-1200", - "bg-slate-light-100", - "bg-slate-light-200", - "bg-slate-light-300", - "bg-slate-light-400", - "bg-slate-light-500", - "bg-slate-light-600", - "bg-slate-light-700", - "bg-slate-light-800", - "bg-slate-light-900", - "bg-slate-light-1000", - "bg-slate-light-1100", - "bg-slate-light-1200", - "bg-slate-light-alpha-100", - "bg-slate-light-alpha-200", - "bg-slate-light-alpha-300", - "bg-slate-light-alpha-400", - "bg-slate-light-alpha-500", - "bg-slate-light-alpha-600", - "bg-slate-light-alpha-700", - "bg-slate-light-alpha-800", - "bg-slate-light-alpha-900", - "bg-slate-light-alpha-1000", - "bg-slate-light-alpha-1100", - "bg-slate-light-alpha-1200", - "variables-bg-brand-primary", - "variables-bg-brand-accent" - ] -}; +} diff --git a/packages/ui/tailwind-theming.md b/packages/ui/tailwind-theming.md index 38a34bf4639..6d572aa15a9 100644 --- a/packages/ui/tailwind-theming.md +++ b/packages/ui/tailwind-theming.md @@ -62,9 +62,9 @@ bg-foreground-light | ------------------------------- | ------------------------------------------------------------ | | `{background}-{DEFAULT}` | Main body background (**DEFAULT** is optional) | | `{background}-surface-100` | Panels and surfaces on the same level of the main background | -| `{background}-surface-200` | Surfaces that overlap the main content (ex. dropdowns) | +| `{background}-surface-200` | Surfaces that overlap the main content (ex. dropdowns) | | `{background}-surface-300` | Surfaces that are stacked above {background}-surface-200 | -| `{background}-alternative` | Alternative background (inverted) | +| `{background}-alternative` | Alternative background (inverted) | | `{background}-overlay` | Overlays, Dropdowns, Popovers | | `{background}-control` | Inputs, Radios, Checkboxes | | `{background}-button-{DEFAULT}` | Button default | @@ -88,7 +88,7 @@ text-background-surface-100 | ------------------------- | ---------------------------------------- | | `border-{DEFAULT}` | Default border (**DEFAULT** is optional) | | `border-secondary` | Secondary border | -| `border-alternative` | Alternative border (inverted) | +| `border-alternative` | Alternative border (inverted) | | `border-overlay` | Overlays, Dropdowns, Popovers | | `border-control` | Inputs, Radios, Checkboxes | | `border-strong` | Hover, Focus | From 00b713e8f388f267d978862d80eab6227867274e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Gr=C3=BCneberg?= Date: Sat, 4 Jan 2025 00:33:13 +0800 Subject: [PATCH 51/56] chore: remove LW8 animation (#32549) To avoid continuous maintenance burden for upgrades and dependencies and also slower build times / installs, this PR removes the animated "8" and gets rid of a couple of dependencies. --- .../8/AnimatedParticles/Particle.tsx | 49 ----- .../8/AnimatedParticles/ParticlesCanvas.tsx | 101 ---------- .../hooks/useParticlesConfig.tsx | 178 ------------------ apps/www/package.json | 3 - apps/www/pages/launch-week/8/index.tsx | 4 +- pnpm-lock.yaml | 116 ------------ 6 files changed, 1 insertion(+), 450 deletions(-) delete mode 100644 apps/www/components/LaunchWeek/8/AnimatedParticles/Particle.tsx delete mode 100644 apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx delete mode 100644 apps/www/components/LaunchWeek/8/AnimatedParticles/hooks/useParticlesConfig.tsx diff --git a/apps/www/components/LaunchWeek/8/AnimatedParticles/Particle.tsx b/apps/www/components/LaunchWeek/8/AnimatedParticles/Particle.tsx deleted file mode 100644 index 29908f79016..00000000000 --- a/apps/www/components/LaunchWeek/8/AnimatedParticles/Particle.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useRef } from 'react' -import { useFrame } from '@react-three/fiber' - -interface Props { - animate?: boolean - children: any - config: any - user?: any -} - -const Particle = ({ animate = true, children, config }: Props) => { - const particle = useRef(null) - - const pathOffsetShape = - Math.pow( - Math.random() * config.xRandomnessShape, - config.xRandomness - 1 + 1 - config.xRandomness / 2 - ) * config.xThickness - - const pathOffset = pathOffsetShape * (pathOffsetShape < 1 || Math.random() < 0.5 ? 1 : -1) - const verticalRandomness = Math.random() * (config.yThickness - 1) + 1 - config.yThickness / 2 - - const speed = Math.random() * (config.min_speed - config.max_speed) + config.max_speed - - const circumference = (config.widthRadius * Math.PI * 2) / 100 - const delayOffsetFactor = 100 - const delayOffset = Math.random() * delayOffsetFactor - - useFrame(({ clock }) => { - if (animate) { - const timer = clock.getElapsedTime() * speed + delayOffset - // When the loop count is even, draw bottom 8 shape - // if odd, draw top 8 shape - const isEven = Math.floor(timer / circumference) % 2 == 0 - particle.current.position.x = isEven - ? Math.sin(timer) * config.widthRadius * config.widthRatio + pathOffset - : Math.sin(timer) * config.widthRadius + pathOffset - particle.current.position.y = isEven - ? Math.cos(timer) * config.bottomHeightRadius - - config.bottomHeightRadius + - verticalRandomness - : -Math.cos(timer) * config.topHeightRadius + config.topHeightRadius + verticalRandomness - } - }) - - return {children} -} - -export default Particle diff --git a/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx b/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx deleted file mode 100644 index 0e258a3bf86..00000000000 --- a/apps/www/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import React, { useMemo, useEffect, useState } from 'react' -import { Canvas } from '@react-three/fiber' -import { AdditiveBlending } from 'three' -import Particle from './Particle' -import useParticlesConfig from './hooks/useParticlesConfig' - -const ParticlesCanvas = () => { - const isWindowUndefined = typeof window === 'undefined' - if (isWindowUndefined) return null - - const canvasRef = React.useRef(null) - - const [animate, setAnimate] = useState(true) - const { config, particles } = useParticlesConfig() - - // stop animation if canvas if is not in viewport - // to stop unnecessary computations - const handleScroll = () => { - if (canvasRef.current && typeof window !== 'undefined') { - const rect = (canvasRef.current as HTMLCanvasElement)?.getBoundingClientRect() - const isInView = rect.bottom > 0 - - setAnimate(isInView) - } - } - - useEffect(() => { - window.addEventListener('scroll', handleScroll) - - return () => { - window.removeEventListener('scroll', handleScroll) - } - }, []) - - /* ThreeJs setup */ - - const Geometry = useMemo( - () => () => , - [] - ) - const GoldGeometry = useMemo( - () => () => , - [] - ) - const Material = () => - useMemo( - () => ( - - ), - [] - ) - const GoldMaterial = () => - useMemo( - () => ( - - ), - [] - ) - - return ( - - - - {particles?.map((user: any, index: number) => ( - - {config.showGold && Math.random() <= 0.5 ? ( - <> - - - - ) : ( - <> - - - - )} - - ))} - - - ) -} - -export default ParticlesCanvas diff --git a/apps/www/components/LaunchWeek/8/AnimatedParticles/hooks/useParticlesConfig.tsx b/apps/www/components/LaunchWeek/8/AnimatedParticles/hooks/useParticlesConfig.tsx deleted file mode 100644 index 6eaf48d8204..00000000000 --- a/apps/www/components/LaunchWeek/8/AnimatedParticles/hooks/useParticlesConfig.tsx +++ /dev/null @@ -1,178 +0,0 @@ -import { useEffect, useState } from 'react' -import { range } from 'lodash' - -let defaultConfig = { - particles: 700, - particlesSize: 1.2, - goldParticlesSize: 1.5, - particlesSides: 5, - particlesBlending: true, - lightIntensity: 0.4, - widthRadius: 100, - widthRatio: 1.2, - topHeightRadius: 80, - bottomHeightRadius: 100, - color: '#ffffff', - colorGold: '#b89d18', - xThickness: 7, - xRandomnessFactor: 2.2, - xRandomnessShape: 2.2, - xRandomness: 5, - yThickness: 20, - max_speed: 0.1, - min_speed: -0.1, - showGold: true, -} - -const useParticlesConfig = (): any => { - const isWindowUndefined = typeof window === 'undefined' - if (isWindowUndefined) return null - const hash = window.location.hash - const isDebugMode = hash.includes('#debug') - const [particles, setParticles] = useState(range(0, defaultConfig.particles)) - - const [config, setConfig] = useState(defaultConfig) - - const handleSetConfig = (name: string, value: any) => { - setConfig((prevConfig) => ({ ...prevConfig, [name]: value })) - } - - const init = async () => { - if (!isDebugMode) return - const dat = await import('dat.gui') - const gui = new dat.GUI() - const particlesFolder = gui.addFolder('Particles') - const shapeFolder = gui.addFolder('Shape') - const speedFolder = gui.addFolder('Speed') - - gui.width = 500 - particlesFolder - .add(config, 'particles') - .min(1) - .max(5000) - .step(1) - .name('Count') - .onChange((value) => { - handleSetConfig('particles', value) - setParticles(range(0, value)) - }) - particlesFolder - .add(config, 'particlesSize') - .min(1) - .max(10) - .step(0.05) - .name('Size') - .onChange((value) => handleSetConfig('particlesSize', value)) - particlesFolder - .add(config, 'goldParticlesSize') - .min(1) - .max(10) - .step(0.05) - .name('Gold Particles Size') - .onChange((value) => handleSetConfig('goldParticlesSize', value)) - particlesFolder - .add(config, 'particlesSides') - .min(3) - .max(20) - .step(1) - .name('Sides') - .onChange((value) => handleSetConfig('particlesSides', value)) - particlesFolder - .add(config, 'lightIntensity') - .min(0) - .max(10) - .step(0.05) - .name('Light intensity') - .onChange((value) => handleSetConfig('lightIntensity', value)) - particlesFolder - .add(config, 'showGold') - .name('Show Gold Particles') - .onChange((value) => handleSetConfig('showGold', value)) - particlesFolder - .add(config, 'particlesBlending') - .name('Blending') - .onChange((value) => handleSetConfig('particlesBlending', value)) - shapeFolder - .add(config, 'widthRadius') - .min(1) - .max(200) - .step(1) - .name('Width Radius') - .onChange((value) => handleSetConfig('widthRadius', value)) - shapeFolder - .add(config, 'widthRatio') - .min(0.5) - .max(3) - .step(0.01) - .name('Top/Bottom Ratio') - .onChange((value) => handleSetConfig('widthRatio', value)) - shapeFolder - .add(config, 'topHeightRadius') - .min(1) - .max(200) - .step(1) - .name('Height Radius - Top') - .onChange((value) => handleSetConfig('topHeightRadius', value)) - shapeFolder - .add(config, 'bottomHeightRadius') - .min(1) - .max(200) - .step(1) - .name('Height Radius - Bottom') - .onChange((value) => handleSetConfig('bottomHeightRadius', value)) - shapeFolder - .add(config, 'xThickness') - .min(1) - .max(100) - .step(0.1) - .name('Stroke Width') - .onChange((value) => handleSetConfig('xThickness', value)) - shapeFolder - .add(config, 'xRandomnessShape') - .min(0) - .max(5) - .step(0.001) - .name('Randomness shape') - .onChange((value) => handleSetConfig('xRandomnessShape', value)) - shapeFolder - .add(config, 'xRandomness') - .min(0) - .max(50) - .step(0.01) - .name('Randomness') - .onChange((value) => handleSetConfig('xRandomness', value)) - shapeFolder - .add(config, 'yThickness') - .min(1) - .max(50) - .step(0.1) - .name('y thickness') - .onChange((value) => handleSetConfig('yThickness', value)) - speedFolder - .add(config, 'min_speed') - .min(-6) - .max(6) - .step(0.01) - .name('Min speed') - .onChange((value) => handleSetConfig('min_speed', value)) - speedFolder - .add(config, 'max_speed') - .min(-6) - .max(6) - .step(0.01) - .name('Max speed') - .onChange((value) => handleSetConfig('max_speed', value)) - - particlesFolder.open() - shapeFolder.open() - speedFolder.open() - } - - useEffect(() => { - init() - }, []) - - return { config, handleSetConfig, particles, setParticles, isDebugMode } -} - -export default useParticlesConfig diff --git a/apps/www/package.json b/apps/www/package.json index 4af7705a375..440ae4365d9 100644 --- a/apps/www/package.json +++ b/apps/www/package.json @@ -28,7 +28,6 @@ "@octokit/plugin-paginate-graphql": "^4.0.0", "@octokit/rest": "^20.0.2", "@radix-ui/react-dialog": "^1.0.5", - "@react-three/fiber": "^7.0.29", "@supabase/auth-helpers-react": "^0.4.2", "@supabase/auth-ui-react": "^0.4.5", "@supabase/supabase-js": "^2.44.3", @@ -42,7 +41,6 @@ "common-tags": "^1.8.2", "config": "workspace:*", "contentlayer2": "0.5.3", - "dat.gui": "^0.7.9", "dayjs": "^1.11.12", "eslint-config-supabase": "workspace:*", "framer-motion": "^11.0.3", @@ -89,7 +87,6 @@ "@types/animejs": "^3.1.12", "@types/classnames": "^2.3.1", "@types/common-tags": "^1.8.4", - "@types/dat.gui": "^0.7.10", "@types/lodash": "^4.0.0", "@types/mdx-js__react": "^1.5.6", "@types/parse-numeric-range": "^0.0.1", diff --git a/apps/www/pages/launch-week/8/index.tsx b/apps/www/pages/launch-week/8/index.tsx index 2d983a7475e..44d75858a11 100644 --- a/apps/www/pages/launch-week/8/index.tsx +++ b/apps/www/pages/launch-week/8/index.tsx @@ -16,7 +16,6 @@ import SectionContainer from '~/components/Layouts/SectionContainer' import { LaunchWeekLogoHeader } from '~/components/LaunchWeek/8/LaunchWeekLogoHeader' import { Meetup } from '~/components/LaunchWeek/8/LW8Meetups' import LW8CalloutsSection from '~/components/LaunchWeek/8/LW8CalloutsSection' -import AnimatedParticles from '~/components/LaunchWeek/8/AnimatedParticles/ParticlesCanvas' const LW8Releases = dynamic(() => import('~/components/LaunchWeek/8/Releases')) const LW8Meetups = dynamic(() => import('~/components/LaunchWeek/8/LW8Meetups')) @@ -134,12 +133,11 @@ export default function TicketHome({ users, meetups }: Props) {
- +
- starts background=17.0' - react-dom: '>=17.0' - three: '>=0.133' - peerDependenciesMeta: - react-dom: - optional: true - '@reactflow/background@11.3.6': resolution: {integrity: sha512-06FPlSUOOMALEEs+2PqPAbpqmL7WDjrkbG2UsDr2d6mbcDDhHiV4tu9FYoz44SQvXo7ma9VRotlsaR4OiRcYsg==} peerDependencies: @@ -5548,9 +5529,6 @@ packages: '@types/react-grid-layout@1.3.3': resolution: {integrity: sha512-VLgUoEN0PaAL3GeRsmYbHuoN0tpDNoRhlkdzHK4Ll8shHW6e16YpNCZWb7P9vrlZdzFtY75cM/hPr8p0ukZQCw==} - '@types/react-reconciler@0.26.7': - resolution: {integrity: sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==} - '@types/react-redux@7.1.27': resolution: {integrity: sha512-xj7d9z32p1K/eBmO+OEy+qfaWXtcPlN8f1Xk3Ne0p/ZRQ867RI5bQ/bpBtxbqU1AHNhKJSgGvld/P2myU2uYkg==} @@ -10605,9 +10583,6 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-merge-refs@1.1.0: - resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} - react-onclickoutside@6.13.0: resolution: {integrity: sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==} peerDependencies: @@ -10621,12 +10596,6 @@ packages: react: ^16.8.0 || ^17 || ^18 react-dom: ^16.8.0 || ^17 || ^18 - react-reconciler@0.26.2: - resolution: {integrity: sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==} - engines: {node: '>=0.10.0'} - peerDependencies: - react: ^17.0.2 - react-redux@7.2.9: resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==} peerDependencies: @@ -10717,9 +10686,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-0 || ^18.0.0 - react-three-fiber@0.0.0-deprecated: - resolution: {integrity: sha512-EblIqTAsIpkYeM8bZtC4lcpTE0A2zCEGipFB52RgcQq/q+0oryrk7Sxt+sqhIjUu6xMNEVywV8dr74lz5yWO6A==} - react-tooltip@4.5.1: resolution: {integrity: sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw==} engines: {npm: '>=6.13'} @@ -10752,12 +10718,6 @@ packages: react: '*' tslib: '*' - react-use-measure@2.1.1: - resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} - peerDependencies: - react: '>=16.13' - react-dom: '>=16.13' - react-use@17.5.0: resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} peerDependencies: @@ -11095,9 +11055,6 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.20.2: - resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} - scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} @@ -12138,11 +12095,6 @@ packages: url-template@2.0.8: resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} - use-asset@1.0.4: - resolution: {integrity: sha512-7/hqDrWa0iMnCoET9W1T07EmD4Eg/Wmoj/X8TGBc++ECRK4m5yTsjP4O6s0yagbxfqIOuUkIxe2/sA+VR2GxZA==} - peerDependencies: - react: '>=17.0' - use-callback-ref@1.3.0: resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} engines: {node: '>=10'} @@ -12195,10 +12147,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utility-types@3.10.0: - resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} - engines: {node: '>= 4'} - uuid-by-string@3.0.7: resolution: {integrity: sha512-9xf+GAcwzLLGL2Z2Vb7hmi7jWIAKSiuaI5cLFsKw1IIlm7S5VpqvdJ5S7N36hqdy0v7DAwnnENJVAeev57/H1A==} @@ -12631,15 +12579,6 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zustand@3.7.2: - resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: '>=16.8' - peerDependenciesMeta: - react: - optional: true - zustand@4.4.7: resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} engines: {node: '>=12.7.0'} @@ -15832,24 +15771,6 @@ snapshots: '@react-dnd/shallowequal@4.0.2': {} - '@react-three/fiber@7.0.29(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(three@0.170.0)': - dependencies: - '@babel/runtime': 7.24.7 - '@types/react-reconciler': 0.26.7 - react: 18.2.0 - react-merge-refs: 1.1.0 - react-reconciler: 0.26.2(react@18.2.0) - react-three-fiber: 0.0.0-deprecated - react-use-measure: 2.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - resize-observer-polyfill: 1.5.1 - scheduler: 0.20.2 - three: 0.170.0 - use-asset: 1.0.4(react@18.2.0) - utility-types: 3.10.0 - zustand: 3.7.2(react@18.2.0) - optionalDependencies: - react-dom: 18.2.0(react@18.2.0) - '@reactflow/background@11.3.6(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@reactflow/core': 11.10.1(@types/react@18.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -17226,10 +17147,6 @@ snapshots: dependencies: '@types/react': 18.3.3 - '@types/react-reconciler@0.26.7': - dependencies: - '@types/react': 18.3.3 - '@types/react-redux@7.1.27': dependencies: '@types/hoist-non-react-statics': 3.3.2 @@ -23705,8 +23622,6 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-merge-refs@1.1.0: {} - react-onclickoutside@6.13.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: react: 18.2.0 @@ -23720,13 +23635,6 @@ snapshots: react-fast-compare: 3.2.2 warning: 4.0.3 - react-reconciler@0.26.2(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 18.2.0 - scheduler: 0.20.2 - react-redux@7.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.24.7 @@ -23826,8 +23734,6 @@ snapshots: prop-types: 15.8.1 react: 18.2.0 - react-three-fiber@0.0.0-deprecated: {} - react-tooltip@4.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: prop-types: 15.8.1 @@ -23858,12 +23764,6 @@ snapshots: react: 18.2.0 tslib: 2.6.2 - react-use-measure@2.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - debounce: 1.2.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-use@17.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@types/js-cookie': 2.2.7 @@ -24395,11 +24295,6 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.20.2: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - scheduler@0.23.0: dependencies: loose-envify: 1.4.0 @@ -25542,11 +25437,6 @@ snapshots: url-template@2.0.8: {} - use-asset@1.0.4(react@18.2.0): - dependencies: - fast-deep-equal: 3.1.3 - react: 18.2.0 - use-callback-ref@1.3.0(@types/react@18.3.3)(react@18.2.0): dependencies: react: 18.2.0 @@ -25583,8 +25473,6 @@ snapshots: util-deprecate@1.0.2: {} - utility-types@3.10.0: {} - uuid-by-string@3.0.7: dependencies: js-md5: 0.7.3 @@ -26148,10 +26036,6 @@ snapshots: zod@3.23.8: {} - zustand@3.7.2(react@18.2.0): - optionalDependencies: - react: 18.2.0 - zustand@4.4.7(@types/react@18.3.3)(react@18.2.0): dependencies: use-sync-external-store: 1.2.0(react@18.2.0) From 36943c9725d51353045df66096ec528e12f7e28b Mon Sep 17 00:00:00 2001 From: ChangHun Lee Date: Sat, 4 Jan 2025 09:45:09 +0900 Subject: [PATCH 52/56] chore: update README.ko.md for missing client libraries and translations (#32108) --- i18n/README.ko.md | 99 ++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/i18n/README.ko.md b/i18n/README.ko.md index 216d3f7174e..1781e3a9851 100644 --- a/i18n/README.ko.md +++ b/i18n/README.ko.md @@ -22,7 +22,7 @@ - [x] AI + 벡터/임베딩스 툴킷. [Docs](https://supabase.com/docs/guides/ai) - [x] 대시보드 -![슈퍼베이스 대시보드](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png) +![Supabase Dashboard](https://raw.githubusercontent.com/supabase/supabase/master/apps/www/public/images/github/supabase-dashboard.png) 주요 업데이트에 대한 알림을 받으려면 이 리포지토리의 "릴리즈"를 살펴보세요. @@ -56,11 +56,11 @@ Supabase는 [호스팅 플랫폼](https://supabase.com/dashboard)입니다. 가 - [PostgreSQL](https://www.postgresql.org/)은 30년 이상 활발하게 개발되어 안정성, 기능 견고성 및 성능에 대한 높은 평판을 얻고 있는 객체 관계형 데이터베이스 시스템입니다. - [Realtime](https://github.com/supabase/realtime)은 웹소켓을 사용하여 PostgreSQL 삽입, 업데이트, 삭제를 수신할 수 있는 Elixir 서버입니다. Realtime은 데이터베이스 변경 사항에 대해 Postgres의 기본 제공 복제 기능을 폴링하고, 변경 사항을 JSON으로 변환한 다음, 웹 소켓을 통해 승인된 클라이언트에 JSON을 브로드캐스트합니다. -- [PostgREST](http://postgrest.org/)는 PostgreSQL 데이터베이스를 RESTful API로 직접 전환하는 웹 서버입니다 -- [pg_graphql](http://github.com/supabase/pg_graphql/)은 GraphQL API를 노출하는 PostgreSQL 확장입니다 -- [스토리지](https://github.com/supabase/storage-api) - Postgres를 사용하여 권한을 관리하기 위해 S3에 저장된 파일을 관리하기 위한 RESTful 인터페이스를 제공합니다. -- [postgres-meta](https://github.com/supabase/postgres-meta)는 Postgres를 관리하기 위한 RESTful API로, 테이블 가져오기, 역할 추가, 쿼리 실행 등을 할 수 있습니다. +- [PostgREST](http://postgrest.org/)는 PostgreSQL 데이터베이스를 RESTful API로 직접 전환하는 웹 서버입니다. - [GoTrue](https://github.com/netlify/gotrue)는 사용자를 관리하고 SWT 토큰을 발행하기 위한 SWT 기반 API입니다. +- [스토리지](https://github.com/supabase/storage-api)는 Postgres를 사용하여 권한을 관리하고 S3에 저장된 파일을 관리하기 위한 RESTful 인터페이스를 제공합니다. +- [pg_graphql](http://github.com/supabase/pg_graphql/)은 GraphQL API를 노출하는 PostgreSQL 확장입니다. +- [postgres-meta](https://github.com/supabase/postgres-meta)는 테이블 가져오기, 역할 추가, 쿼리 실행 등을 할 수 있는 Postgres 관리용 RESTful API입니다. - [콩](https://github.com/Kong/kong)은 클라우드 네이티브 API 게이트웨이입니다. #### 클라이언트 라이브러리 @@ -115,6 +115,24 @@ Supabase는 [호스팅 플랫폼](https://supabase.com/dashboard)입니다. 가 storage-dart functions-dart + + Swift + supabase-swift + postgrest-swift + auth-swift + realtime-swift + storage-swift + functions-swift + + + Python + supabase-py + postgrest-py + gotrue-py + realtime-py + storage-py + functions-py + 💚 커뮤니티 💚 @@ -149,20 +167,11 @@ Supabase는 [호스팅 플랫폼](https://supabase.com/dashboard)입니다. 가 Kotlin supabase-kt postgrest-kt - gotrue-kt + auth-kt realtime-kt storage-kt functions-kt - - Python - supabase-py - postgrest-py - gotrue-py - realtime-py - storage-py - functions-py - Ruby supabase-rb @@ -181,15 +190,6 @@ Supabase는 [호스팅 플랫폼](https://supabase.com/dashboard)입니다. 가 - - - - Swift - supabase-swift - postgrest-swift - gotrue-swift - realtime-swift - storage-swift - functions-swift - Godot Engine (GDScript) supabase-gdscript @@ -243,48 +243,49 @@ Supabase는 [호스팅 플랫폼](https://supabase.com/dashboard)입니다. 가 ## 번역 -- [아랍어 | 아랍어](/i18n/README.ar.md) -- [알바니아어 / 쉬킵어](/i18n/README.sq.md) +- [아랍어 | العربية](/i18n/README.ar.md) +- [알바니아어 / Shqip](/i18n/README.sq.md) - [방글라데시어 / বাংলা](/i18n/README.bn.md) - [불가리아어 / Български](/i18n/README.bg.md) -- [카탈루냐어 / 카탈루냐어](/i18n/README.ca.md) +- [카탈루냐어 / Català](/i18n/README.ca.md) +- [체코어 / čeština](/i18n/README.cs.md) - [덴마크어 / Dansk](/i18n/README.da.md) -- [네덜란드어 / 네덜란드어](/i18n/README.nl.md) -- [영어](https://github.com/supabase/supabase) -- [핀란드어 / 수오말라이넨](/i18n/README.fi.md) -- [프랑스어 / 프랑스어](/i18n/README.fr.md) +- [네덜란드어 / Nederlands](/i18n/README.nl.md) +- [영어 / English](https://github.com/supabase/supabase) +- [에스토니아어 / eesti keel](/i18n/README.et.md) +- [핀란드어 / Suomalainen](/i18n/README.fi.md) +- [프랑스어 / Français](/i18n/README.fr.md) - [독일어 / Deutsch](/i18n/README.de.md) -- [그리스어 / Ελληνικά](/i18n/README.gr.md) +- [그리스어 / Ελληνικά](/i18n/README.el.md) +- [구자라트어 / ગુજરાતી](/i18n/README.gu.md) - [히브리어 / עברית](/i18n/README.he.md) - [힌디어 / हिंदी](/i18n/README.hi.md) -- [헝가리어 / 마자르어](/i18n/README.hu.md) +- [헝가리어 / Magyar](/i18n/README.hu.md) - [네팔어 / नेपाली](/i18n/README.ne.md) -- [인도네시아어 / 바하사 인도네시아](/i18n/README.id.md) -- [이탈리아어 / Italiano](/i18n/README.it.md) +- [인도네시아어 / Bahasa Indonesia](/i18n/README.id.md) +- [이탈리아어 / Italian](/i18n/README.it.md) - [일본어 / 日本語](/i18n/README.jp.md) -- [한국어 / 한국어](/i18n/README.ko.md) -- [말레이어 / 바하사 말레이시아](/i18n/README.ms.md) -- [노르웨이어(복말) / 노르웨이어(복말)](/i18n/README.nb-no.md) +- [한국어](/i18n/README.ko.md) +- [리투아니아어 / lietuvių](/i18n/README.lt.md) +- [라트비아어 / latviski](/i18n/README.lv.md) +- [말레이어 / Bahasa Malaysia](/i18n/README.ms.md) +- [노르웨이어(복말) / Norsk (Bokmål)](/i18n/README.nb.md) - [페르시아어 / فارسی](/i18n/README.fa.md) - [폴란드어 / Polski](/i18n/README.pl.md) -- [포르투갈어 / 포르투갈어](/i18n/README.pt.md) -- [포르투갈어(브라질어) / 포르투갈어 브라질](/i18n/README.pt-br.md) -- [루마니아어 / 루마니아어](/i18n/README.ro.md) +- [포르투갈어 / Português](/i18n/README.pt.md) +- [포르투갈어(브라질) / Português Brasileiro](/i18n/README.pt-br.md) +- [루마니아어 / Română](/i18n/README.ro.md) - [러시아어 / Pусский](/i18n/README.ru.md) - [세르비아어 / Srpski](/i18n/README.sr.md) - [신할라어 / සිංහල](/i18n/README.si.md) -- [스페인어 / 에스파냐어](/i18n/README.es.md) +- [슬로바키아어 / slovenský](/i18n/README.sk.md) +- [슬로베니아어 / Slovenščina](/i18n/README.sl.md) +- [스페인어 / Español](/i18n/README.es.md) - [중국어 간체 / 简体中文](/i18n/README.zh-cn.md) -- [스웨덴어 / 스벤스카르어](/i18n/README.sv.md) +- [스웨덴어 / Svenska](/i18n/README.sv.md) - [태국어 / ไทย](/i18n/README.th.md) - [중국어 번체 / 繁體中文](/i18n/README.zh-tw.md) - [터키어 / Türkçe](/i18n/README.tr.md) - [우크라이나어 / Українська](/i18n/README.uk.md) - [베트남어 / Tiếng Việt](/i18n/README.vi-vn.md) - [번역 목록](/i18n/languages.md) - ---- - -## 스폰서 - -[![신규 스폰서](https://user-images.githubusercontent.com/10214025/90518111-e74bbb00-e198-11ea-8f88-c9e3c1aa4b5b.png)](https://github.com/sponsors/supabase) From 079fdb00f277ee908ada010494561fefe3f7f433 Mon Sep 17 00:00:00 2001 From: Greg Richardson Date: Fri, 3 Jan 2025 17:51:26 -0700 Subject: [PATCH 53/56] OAuth2 reference in management api docs (#32556) --- apps/docs/docs/ref/api/introduction.mdx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/docs/docs/ref/api/introduction.mdx b/apps/docs/docs/ref/api/introduction.mdx index 76a6ed4541b..a5cd9b0057e 100644 --- a/apps/docs/docs/ref/api/introduction.mdx +++ b/apps/docs/docs/ref/api/introduction.mdx @@ -17,9 +17,19 @@ hideTitle: true ## Authentication - All API requests require a Supabase Personal token to be included in the Authorization header: `Authorization Bearer `. - To generate or manage your API token, visit your [account](https://supabase.com/dashboard/account/tokens) page. - Your API tokens carry the same privileges as your user account, so be sure to keep it secret. + All API requests require an access token to be included in the Authorization header: `Authorization Bearer `. + + There are two ways to generate an access token: + + 1. **Personal access token (PAT):** + PATs are long-lived tokens that you manually generate to access the Management API. They are useful for automating workflows or developing against the Management API. PATs carry the same privileges as your user account, so be sure to keep it secret. + + To generate or manage your personal access tokens, visit your [account](/dashboard/account/tokens) page. + + 2. **OAuth2:** + OAuth2 allows your application to generate tokens on behalf of a Supabase user, providing secure and limited access to their account without requiring their credentials. Use this if you're building a third-party app that needs to create or manage Supabase projects on behalf of your users. Tokens generated via OAuth2 are short-lived and tied to specific scopes to ensure your app can only perform actions that are explicitly approved by the user. + + See [Build a Supabase Integration](/docs/guides/integrations/build-a-supabase-integration) to set up OAuth2 for your application. ```bash curl https://api.supabase.com/v1/projects \ From b447ef62d10044d041c6378d0f4faf6a6f64da5a Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Sat, 4 Jan 2025 12:21:19 +0100 Subject: [PATCH 54/56] fillTimeseries: Skip filling if theres a minimum of datapoints (#31311) * allow fillTimeseries to skip filling if theres a minimum of datapoints * rm empty string * allow strings in fillTimeseries defaultValue * fix header, reduce min data points to do fill * rm comment --- .../components/interfaces/Home/ProjectUsage.tsx | 3 ++- .../interfaces/Settings/Logs/Logs.utils.ts | 12 +++++++++++- apps/studio/components/ui/Charts/BarChart.tsx | 6 +----- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/apps/studio/components/interfaces/Home/ProjectUsage.tsx b/apps/studio/components/interfaces/Home/ProjectUsage.tsx index b872fc4657c..1c9b9c6cfa3 100644 --- a/apps/studio/components/interfaces/Home/ProjectUsage.tsx +++ b/apps/studio/components/interfaces/Home/ProjectUsage.tsx @@ -64,7 +64,8 @@ const ProjectUsage = () => { ], 0, startDateLocal.toISOString(), - endDateLocal.toISOString() + endDateLocal.toISOString(), + 5 ) const datetimeFormat = selectedInterval.format || 'MMM D, ha' diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts index 7367bf296ee..527194f63af 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -458,8 +458,18 @@ export const fillTimeseries = ( valueKey: string | string[], defaultValue: number, min?: string, - max?: string + max?: string, + minPointsToFill: number = 20 ) => { + // If we have more points than minPointsToFill, just normalize timestamps and return + if (timeseriesData.length > minPointsToFill) { + return timeseriesData.map((datum) => { + const iso = dayjs.utc(datum[timestampKey]).toISOString() + datum[timestampKey] = iso + return datum + }) + } + if (timeseriesData.length <= 1 && !(min || max)) return timeseriesData const dates: unknown[] = timeseriesData.map((datum) => dayjs.utc(datum[timestampKey])) diff --git a/apps/studio/components/ui/Charts/BarChart.tsx b/apps/studio/components/ui/Charts/BarChart.tsx index aa2ec9766b6..addd36773ad 100644 --- a/apps/studio/components/ui/Charts/BarChart.tsx +++ b/apps/studio/components/ui/Charts/BarChart.tsx @@ -111,11 +111,7 @@ const BarChart = ({ title={title} format={format} customDateFormat={customDateFormat} - highlightedValue={ - typeof resolvedHighlightedValue === 'number' - ? numberFormatter(resolvedHighlightedValue, valuePrecision) - : resolvedHighlightedValue - } + highlightedValue={resolvedHighlightedValue} highlightedLabel={resolvedHighlightedLabel} minimalHeader={minimalHeader} /> From ef3da0d9f3d67d3d87eb132a1d13d17dd9109914 Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Sat, 4 Jan 2025 12:41:16 +0100 Subject: [PATCH 55/56] Hide r2np for fly hosted projects (#31304) * hide r2np for fly hosted projects * rm unnecessary fly warning * fix missing default value * fix type err --- .../interfaces/Database/Backups/DatabaseBackupsNav.tsx | 4 ++-- .../[ref]/database/backups/restore-to-new-project.tsx | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx b/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx index cd0ef0f72a7..5005de5146a 100644 --- a/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx +++ b/apps/studio/components/interfaces/Database/Backups/DatabaseBackupsNav.tsx @@ -11,7 +11,7 @@ type Props = { function DatabaseBackupsNav({ active }: Props) { const isCloneToNewProjectEnabled = useFlag('clonetonewproject') - const ref = useProjectContext()?.project?.ref + const { ref, cloud_provider } = useProjectContext()?.project || {} const navMenuItems = [ { @@ -27,7 +27,7 @@ function DatabaseBackupsNav({ active }: Props) { href: `/project/${ref}/database/backups/pitr`, }, { - enabled: isCloneToNewProjectEnabled, + enabled: isCloneToNewProjectEnabled && cloud_provider !== 'FLY', id: 'rtnp', label: (
diff --git a/apps/studio/pages/project/[ref]/database/backups/restore-to-new-project.tsx b/apps/studio/pages/project/[ref]/database/backups/restore-to-new-project.tsx index 7f685eb6989..ef9d807df68 100644 --- a/apps/studio/pages/project/[ref]/database/backups/restore-to-new-project.tsx +++ b/apps/studio/pages/project/[ref]/database/backups/restore-to-new-project.tsx @@ -83,10 +83,9 @@ const RestoreToNewProject = () => { 'queue_job.restore.prepare' ) const PITR_ENABLED = cloneBackups?.pitr_enabled - + const PHYSICAL_BACKUPS_ENABLED = project?.is_physical_backups_enabled const dbVersion = getDatabaseMajorVersion(project?.dbVersion ?? '') const IS_PG15_OR_ABOVE = dbVersion >= 15 - const PHYSICAL_BACKUPS_ENABLED = project?.is_physical_backups_enabled const { data: cloneStatus, @@ -260,7 +259,7 @@ const RestoreToNewProject = () => { - {(!isProjectActive || !canCreateCredentials) && ( + {disableCreation && ( {!isProjectActive ? 'Restore your project to create new access keys' - : !canCreateCredentials - ? 'You need additional permissions to create new access keys' - : ''} + : !isS3ConnectionEnabled + ? 'Connection via S3 protocol is currently disabled' + : !canCreateCredentials + ? 'You need additional permissions to create new access keys' + : ''} )} @@ -159,7 +163,7 @@ export const CreateCredentialModal = ({ visible, onOpenChange }: CreateCredentia ( + render={() => ( { const [deleteCred, setDeleteCred] = useState<{ id: string; description: string }>() const canReadS3Credentials = useCheckPermissions(PermissionAction.STORAGE_ADMIN_READ, '*') + const canUpdateStorageSettings = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') const { data: settings } = useProjectSettingsV2Query({ projectRef }) - const { data: storageCreds, ...storageCredsQuery } = useStorageCredentialsQuery( + const { + data: config, + error: configError, + isSuccess: isSuccessStorageConfig, + isError: isErrorStorageConfig, + } = useProjectStorageConfigQuery({ projectRef }) + const { data: storageCreds, isLoading: isLoadingStorageCreds } = useStorageCredentialsQuery( { projectRef }, { enabled: canReadS3Credentials } ) + const { mutate: updateStorageConfig, isLoading: isUpdating } = + useProjectStorageConfigUpdateUpdateMutation({ + onSuccess: (_, vars) => { + if (vars.features) form.reset({ s3ConnectionEnabled: vars.features.s3Protocol.enabled }) + toast.success('Successfully updated storage settings') + }, + }) + + const FormSchema = z.object({ s3ConnectionEnabled: z.boolean() }) + const form = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: { s3ConnectionEnabled: false }, + }) + const protocol = settings?.app_config?.protocol ?? 'https' const endpoint = settings?.app_config?.endpoint const hasStorageCreds = storageCreds?.data && storageCreds.data.length > 0 const s3connectionUrl = getConnectionURL(projectRef ?? '', protocol, endpoint) + const onSubmit: SubmitHandler> = async (data) => { + if (!projectRef) return console.error('Project ref is required') + if (!config) return console.error('Storage config is required') + updateStorageConfig({ + projectRef, + features: { + ...config?.features, + s3Protocol: { enabled: data.s3ConnectionEnabled }, + }, + }) + } + + useEffect(() => { + form.reset({ s3ConnectionEnabled: config?.features.s3Protocol.enabled }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isSuccessStorageConfig]) + return ( <> -
- - {projectIsLoading ? ( - - ) : isProjectActive ? ( - - - - - {!projectIsLoading && ( - - - - )} - - ) : ( - - - Project is paused - - To connect to your S3 bucket, you need to restore your project. - -
- -
-
- )} -
+ +
+ + {projectIsLoading ? ( + + ) : isProjectActive ? ( + + ( + + + + + + )} + /> + + {isErrorStorageConfig && ( +
+ +
+ )} + + + +
+ + + + {!projectIsLoading && ( + + + + )} +
+ + + +
+ {!canUpdateStorageSettings ? ( +

+ You need additional permissions to update storage settings +

+ ) : ( +
+ )} +
+ + +
+
+ + ) : ( + + + Project is paused + + To connect to your S3 bucket, you need to restore your project. + +
+ +
+
+ )} + +
{ ) : ( <> - {storageCredsQuery.isLoading ? ( + {isLoadingStorageCreds ? (
diff --git a/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx index acc0d6d5ca9..5ad69e661f2 100644 --- a/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/to-be-cleaned/Storage/StorageSettings/StorageSettings.tsx @@ -8,6 +8,7 @@ import * as z from 'zod' import { useParams } from 'common' import AlertError from 'components/ui/AlertError' +import { InlineLink } from 'components/ui/InlineLink' import NoPermission from 'components/ui/NoPermission' import { GenericSkeletonLoader } from 'components/ui/ShimmeringLoader' import UpgradeToPro from 'components/ui/UpgradeToPro' @@ -35,7 +36,6 @@ import { } from 'ui' import { STORAGE_FILE_SIZE_LIMIT_MAX_BYTES, StorageSizeUnits } from './StorageSettings.constants' import { convertFromBytes, convertToBytes } from './StorageSettings.utils' -import { Markdown } from 'components/interfaces/Markdown' interface StorageSettingsState { fileSizeLimit: number @@ -54,7 +54,7 @@ const StorageSettings = () => { isLoading, isSuccess, isError, - } = useProjectStorageConfigQuery({ projectRef }, { enabled: IS_PLATFORM }) + } = useProjectStorageConfigQuery({ projectRef }) const organization = useSelectedOrganization() const { data: subscription, isSuccess: isSuccessSubscription } = useOrgSubscriptionQuery({ @@ -116,7 +116,7 @@ const StorageSettings = () => { resolver: zodResolver(FormSchema), defaultValues: initialValues, }) - const { fileSizeLimit: limit, unit: storageUnit, imageTransformationEnabled } = form.watch() + const { fileSizeLimit: limit, unit: storageUnit } = form.watch() const { mutate: updateStorageConfig, isLoading: isUpdating } = useProjectStorageConfigUpdateUpdateMutation({ @@ -127,13 +127,14 @@ const StorageSettings = () => { const onSubmit: SubmitHandler> = async (data) => { if (!projectRef) return console.error('Project ref is required') + if (!config) return console.error('Storage config is required') + updateStorageConfig({ projectRef, fileSizeLimit: convertToBytes(data.fileSizeLimit, data.unit), features: { - imageTransformation: { - enabled: data.imageTransformationEnabled, - }, + imageTransformation: { enabled: data.imageTransformationEnabled }, + s3Protocol: config.features.s3Protocol, }, }) } @@ -153,7 +154,7 @@ const StorageSettings = () => { {isSuccess && (
-
+

Upload file size limit

@@ -251,7 +252,13 @@ const StorageSettings = () => { )} />
- +

+ Optimize and resize images on the fly.{' '} + + Learn more + + . +

diff --git a/apps/studio/components/ui/InlineLink.tsx b/apps/studio/components/ui/InlineLink.tsx index b33d5981939..f8f547457f8 100644 --- a/apps/studio/components/ui/InlineLink.tsx +++ b/apps/studio/components/ui/InlineLink.tsx @@ -7,7 +7,7 @@ interface InlineLinkProps { export const InlineLink = ({ href, children }: PropsWithChildren) => { const className = - 'underline transition underline-offset-2 decoration-foreground-lighter hover:decoration-foreground' + 'underline transition underline-offset-2 decoration-foreground-lighter hover:decoration-foreground text-foreground' if (href.startsWith('http')) { return ( diff --git a/apps/studio/data/config/project-storage-config-query.ts b/apps/studio/data/config/project-storage-config-query.ts index 56cbaf50708..058fa95e9a9 100644 --- a/apps/studio/data/config/project-storage-config-query.ts +++ b/apps/studio/data/config/project-storage-config-query.ts @@ -4,6 +4,7 @@ import { components } from 'data/api' import { get, handleError } from 'data/fetchers' import type { ResponseError } from 'types' import { configKeys } from './keys' +import { IS_PLATFORM } from 'lib/constants' export type ProjectStorageConfigVariables = { projectRef?: string @@ -39,5 +40,5 @@ export const useProjectStorageConfigQuery = ( useQuery( configKeys.storage(projectRef), ({ signal }) => getProjectStorageConfig({ projectRef }, signal), - { enabled: enabled && typeof projectRef !== 'undefined', ...options } + { enabled: enabled && IS_PLATFORM && typeof projectRef !== 'undefined', ...options } ) diff --git a/apps/studio/data/config/project-storage-config-update-mutation.ts b/apps/studio/data/config/project-storage-config-update-mutation.ts index 9c55eeb2ec9..3ded8ea5326 100644 --- a/apps/studio/data/config/project-storage-config-update-mutation.ts +++ b/apps/studio/data/config/project-storage-config-update-mutation.ts @@ -1,19 +1,15 @@ import { useMutation, UseMutationOptions, useQueryClient } from '@tanstack/react-query' import { toast } from 'sonner' -import { patch } from 'lib/common/fetch' -import { API_URL } from 'lib/constants' +import { handleError, patch } from 'data/fetchers' import type { ResponseError } from 'types' import { configKeys } from './keys' +import { components } from 'api-types' -export type ProjectStorageConfigUpdateUpdateVariables = { +type StorageConfigUpdatePayload = components['schemas']['UpdateStorageConfigBody'] + +export type ProjectStorageConfigUpdateUpdateVariables = StorageConfigUpdatePayload & { projectRef: string - fileSizeLimit: number - features?: { - imageTransformation: { - enabled: boolean - } - } } export async function updateProjectStorageConfigUpdate({ @@ -21,12 +17,12 @@ export async function updateProjectStorageConfigUpdate({ fileSizeLimit, features, }: ProjectStorageConfigUpdateUpdateVariables) { - const response = await patch(`${API_URL}/projects/${projectRef}/config/storage`, { - fileSizeLimit, - features, + const { data, error } = await patch('/platform/projects/{ref}/config/storage', { + params: { path: { ref: projectRef } }, + body: { fileSizeLimit, features }, }) - if (response.error) throw response.error - return response + if (error) handleError(error) + return data } type ProjectStorageConfigUpdateUpdateData = Awaited< diff --git a/apps/studio/data/storage/s3-access-key-query.ts b/apps/studio/data/storage/s3-access-key-query.ts index 67a1e1acc4c..9bef91e3b3c 100644 --- a/apps/studio/data/storage/s3-access-key-query.ts +++ b/apps/studio/data/storage/s3-access-key-query.ts @@ -3,6 +3,7 @@ import { UseQueryOptions, useQuery } from '@tanstack/react-query' import { get, handleError } from 'data/fetchers' import { ResponseError } from 'types' import { storageCredentialsKeys } from './s3-access-key-keys' +import { IS_PLATFORM } from 'lib/constants' type StorageCredentialsVariables = { projectRef?: string } @@ -39,5 +40,5 @@ export const useStorageCredentialsQuery = ( useQuery( storageCredentialsKeys.credentials(projectRef), ({ signal }) => fetchStorageCredentials({ projectRef }, signal), - { enabled: enabled && typeof projectRef !== 'undefined', ...options } + { enabled: enabled && IS_PLATFORM && typeof projectRef !== 'undefined', ...options } ) diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts index 1cf709bab4e..0035062a5cd 100644 --- a/packages/api-types/types/api.d.ts +++ b/packages/api-types/types/api.d.ts @@ -5681,6 +5681,10 @@ export interface components { } StorageFeatures: { imageTransformation: components['schemas']['StorageFeatureImageTransformation'] + s3Protocol: components['schemas']['StorageFeatureS3Protocol'] + } + StorageFeatureS3Protocol: { + enabled: boolean } StorageObject: { bucket_id: string

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