From 68d76fbda0ee51efdaf1855b14f3a559fe5cbe81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 12 Feb 2026 11:50:44 +0100 Subject: [PATCH 01/74] nicolium: actually stop displaying repeated repost info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../pl-fe/src/features/notifications/components/notification.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/pl-fe/src/features/notifications/components/notification.tsx b/packages/pl-fe/src/features/notifications/components/notification.tsx index 18b345904..be558c11d 100644 --- a/packages/pl-fe/src/features/notifications/components/notification.tsx +++ b/packages/pl-fe/src/features/notifications/components/notification.tsx @@ -452,6 +452,7 @@ const Notification: React.FC = (props) => { avatarSize={avatarSize} contextType='notifications' showGroup={false} + showInfo={false} variant='slim' /> )) : null; From 6819a8b56c138dba18894ecfd750aa421eaff20f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 22:41:54 +0100 Subject: [PATCH 02/74] nicolium: style migrations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/src/columns/notifications.tsx | 2 +- packages/pl-fe/src/columns/search.tsx | 2 +- packages/pl-fe/src/columns/trends.tsx | 2 +- packages/pl-fe/src/components/status-list.tsx | 30 +++++++------------ .../src/components/statuses/status-info.tsx | 15 +++------- .../components/conversations-list.tsx | 2 +- .../src/modals/compare-history-modal.tsx | 2 +- .../report-modal/steps/other-actions-step.tsx | 2 +- .../src/modals/select-drive-file-modal.tsx | 2 +- .../src/pages/dashboard/awaiting-approval.tsx | 2 +- .../src/pages/dashboard/moderation-log.tsx | 2 +- .../pl-fe/src/pages/groups/group-members.tsx | 2 +- .../src/pages/status-lists/draft-statuses.tsx | 2 +- .../status-lists/interaction-requests.tsx | 2 +- .../pages/status-lists/scheduled-statuses.tsx | 2 +- packages/pl-fe/src/styles/new/statuses.scss | 8 +++++ packages/pl-fe/src/styles/new/timelines.scss | 28 +++++++++++++++++ 17 files changed, 64 insertions(+), 43 deletions(-) diff --git a/packages/pl-fe/src/columns/notifications.tsx b/packages/pl-fe/src/columns/notifications.tsx index a11ebe939..8550abdbc 100644 --- a/packages/pl-fe/src/columns/notifications.tsx +++ b/packages/pl-fe/src/columns/notifications.tsx @@ -260,7 +260,7 @@ const NotificationsColumn: React.FC = ({ multiColumn }) => onLoadMore={handleLoadOlder} onScrollToTop={handleScrollToTop} onScroll={handleScroll} - listClassName={clsx('divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800', { + listClassName={clsx('⁂-status-list', { 'animate-pulse': displayedNotifications.length === 0, })} useWindowScroll={!multiColumn} diff --git a/packages/pl-fe/src/columns/search.tsx b/packages/pl-fe/src/columns/search.tsx index 589e717c4..53630220f 100644 --- a/packages/pl-fe/src/columns/search.tsx +++ b/packages/pl-fe/src/columns/search.tsx @@ -136,7 +136,7 @@ const SearchColumn: React.FC = ({ type, query, accountId, multiCo onLoadMore={handleLoadMore} placeholderComponent={placeholderComponent} placeholderCount={20} - listClassName={type === 'statuses' ? 'divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' : ''} + listClassName={type === 'statuses' ? '⁂-status-list' : ''} itemClassName={clsx({ 'pb-4': type === 'accounts' || type === 'links', 'pb-3': type === 'hashtags', diff --git a/packages/pl-fe/src/columns/trends.tsx b/packages/pl-fe/src/columns/trends.tsx index 5d461d9ba..1e04d8c16 100644 --- a/packages/pl-fe/src/columns/trends.tsx +++ b/packages/pl-fe/src/columns/trends.tsx @@ -71,7 +71,7 @@ const TrendsColumn: React.FC = ({ type, multiColumn }) => { showLoading={isLoading} placeholderComponent={placeholderComponent} placeholderCount={20} - listClassName={type === 'statuses' ? 'divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' : ''} + listClassName={type === 'statuses' ? '⁂-status-list' : ''} itemClassName={clsx({ 'pb-4': type === 'accounts' || type === 'links', 'pb-3': type === 'hashtags', diff --git a/packages/pl-fe/src/components/status-list.tsx b/packages/pl-fe/src/components/status-list.tsx index efeb3daa4..200646679 100644 --- a/packages/pl-fe/src/components/status-list.tsx +++ b/packages/pl-fe/src/components/status-list.tsx @@ -5,8 +5,6 @@ import { FormattedMessage } from 'react-intl'; import LoadGap from '@/components/load-gap'; import ScrollableList, { type IScrollableList } from '@/components/scrollable-list'; -import Stack from '@/components/ui/stack'; -import Text from '@/components/ui/text'; import StatusContainer from '@/containers/status-container'; import PlaceholderStatus from '@/features/placeholder/components/placeholder-status'; import PendingStatus from '@/features/ui/components/pending-status'; @@ -18,18 +16,12 @@ import type { VirtuosoHandle } from 'react-virtuoso'; const SkipPinned: React.FC> = ({ onClick }) => { return ( - ); }; @@ -203,15 +195,15 @@ const StatusList: React.FC = ({ if (isPartial) { return ( - - +
+

- +

- +

- - +

+
); } @@ -229,7 +221,7 @@ const StatusList: React.FC = ({ placeholderComponent={() => } placeholderCount={20} ref={node} - listClassName={clsx('divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800', className)} + listClassName={clsx('⁂-status-list', className)} {...other} > {scrollableContent} diff --git a/packages/pl-fe/src/components/statuses/status-info.tsx b/packages/pl-fe/src/components/statuses/status-info.tsx index fecf36b52..4199047e4 100644 --- a/packages/pl-fe/src/components/statuses/status-info.tsx +++ b/packages/pl-fe/src/components/statuses/status-info.tsx @@ -1,9 +1,6 @@ import clsx from 'clsx'; import React from 'react'; -import HStack from '@/components/ui/hstack'; -import Text from '@/components/ui/text'; - interface IStatusInfo { avatarSize: number; icon: React.ReactNode; @@ -20,20 +17,16 @@ const StatusInfo = (props: IStatusInfo) => { }; return ( - {icon} - - {text} - - +

{text}

+ ); }; diff --git a/packages/pl-fe/src/features/conversations/components/conversations-list.tsx b/packages/pl-fe/src/features/conversations/components/conversations-list.tsx index c9a9ed5d5..acecafccb 100644 --- a/packages/pl-fe/src/features/conversations/components/conversations-list.tsx +++ b/packages/pl-fe/src/features/conversations/components/conversations-list.tsx @@ -46,7 +46,7 @@ const ConversationsList: React.FC = () => { isLoading={isLoading} showLoading={isLoading && conversations.length === 0} emptyMessageText={} - listClassName='divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' + listClassName='⁂-status-list' > {conversations.map((item: any) => ( = body = ; } else { body = ( -
+
{versions?.map((version) => { const content = ; diff --git a/packages/pl-fe/src/modals/report-modal/steps/other-actions-step.tsx b/packages/pl-fe/src/modals/report-modal/steps/other-actions-step.tsx index fdc491810..c26746068 100644 --- a/packages/pl-fe/src/modals/report-modal/steps/other-actions-step.tsx +++ b/packages/pl-fe/src/modals/report-modal/steps/other-actions-step.tsx @@ -79,7 +79,7 @@ const OtherActionsStep = ({ {showAdditionalStatuses ? ( -
+
{statusIds.map((statusId) => ( setCurrentFolder(folderId)} />
{ isLoading={isFetching} showLoading={isPending} emptyMessageText={} - listClassName='divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' + listClassName='⁂-status-list' > {accountIds.map(id => (
diff --git a/packages/pl-fe/src/pages/dashboard/moderation-log.tsx b/packages/pl-fe/src/pages/dashboard/moderation-log.tsx index fb5f14b92..10edcf0b8 100644 --- a/packages/pl-fe/src/pages/dashboard/moderation-log.tsx +++ b/packages/pl-fe/src/pages/dashboard/moderation-log.tsx @@ -38,7 +38,7 @@ const ModerationLogPage = () => { emptyMessageText={} hasMore={hasNextPage} onLoadMore={handleLoadMore} - listClassName='divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' + listClassName='⁂-status-list' > {data.map(item => item && ( diff --git a/packages/pl-fe/src/pages/groups/group-members.tsx b/packages/pl-fe/src/pages/groups/group-members.tsx index ccd684d0e..8618ba0e8 100644 --- a/packages/pl-fe/src/pages/groups/group-members.tsx +++ b/packages/pl-fe/src/pages/groups/group-members.tsx @@ -38,7 +38,7 @@ const GroupMembers: React.FC = () => { showLoading={!group || isFetchingPending || isLoading && members.length === 0} placeholderComponent={PlaceholderAccount} placeholderCount={3} - className='divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' + className='⁂-status-list' itemClassName='py-3 last:pb-0' prepend={(pendingCount > 0) && (
diff --git a/packages/pl-fe/src/pages/status-lists/draft-statuses.tsx b/packages/pl-fe/src/pages/status-lists/draft-statuses.tsx index 231de659e..20f572156 100644 --- a/packages/pl-fe/src/pages/status-lists/draft-statuses.tsx +++ b/packages/pl-fe/src/pages/status-lists/draft-statuses.tsx @@ -22,7 +22,7 @@ const DraftStatusesPage = () => { {drafts.toReversed().map((draft) => )} diff --git a/packages/pl-fe/src/pages/status-lists/interaction-requests.tsx b/packages/pl-fe/src/pages/status-lists/interaction-requests.tsx index 68f7a3ce1..7a25d5aea 100644 --- a/packages/pl-fe/src/pages/status-lists/interaction-requests.tsx +++ b/packages/pl-fe/src/pages/status-lists/interaction-requests.tsx @@ -246,7 +246,7 @@ const InteractionRequestsPage = () => { hasMore={hasNextPage} emptyMessageText={emptyMessage} onLoadMore={() => fetchNextPage()} - listClassName={clsx('divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800', { + listClassName={clsx('⁂-status-list', { 'animate-pulse': data?.length === 0, })} > diff --git a/packages/pl-fe/src/pages/status-lists/scheduled-statuses.tsx b/packages/pl-fe/src/pages/status-lists/scheduled-statuses.tsx index a7ae8592c..e2f7e9529 100644 --- a/packages/pl-fe/src/pages/status-lists/scheduled-statuses.tsx +++ b/packages/pl-fe/src/pages/status-lists/scheduled-statuses.tsx @@ -25,7 +25,7 @@ const ScheduledStatusesPage = () => { isLoading={isLoading} onLoadMore={() => fetchNextPage({ cancelRefetch: false })} emptyMessageText={emptyMessage} - listClassName='divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800' + listClassName='⁂-status-list' > {scheduledStatuses.map((status) => )} diff --git a/packages/pl-fe/src/styles/new/statuses.scss b/packages/pl-fe/src/styles/new/statuses.scss index 5d46451ed..197af6f5f 100644 --- a/packages/pl-fe/src/styles/new/statuses.scss +++ b/packages/pl-fe/src/styles/new/statuses.scss @@ -8,6 +8,14 @@ } } +.⁂-status-info { + @apply flex gap-2 items-center w-fit max-w-full cursor-default rounded-full border border-gray-200 bg-gray-100 px-3 py-1 black:border-gray-800 black:bg-gray-900 dark:border-transparent dark:bg-primary-800 rtl:space-x-reverse; + + p { + @include mixins.text($theme: muted, $size: xs, $weight: medium, $truncate: true); + } +} + .⁂-status-reply-mentions { @apply mb-1 block text-sm text-gray-700 dark:text-gray-600; } diff --git a/packages/pl-fe/src/styles/new/timelines.scss b/packages/pl-fe/src/styles/new/timelines.scss index a19daf712..2797a83e7 100644 --- a/packages/pl-fe/src/styles/new/timelines.scss +++ b/packages/pl-fe/src/styles/new/timelines.scss @@ -25,6 +25,34 @@ } } +.⁂-status-list { + @apply divide-y divide-solid divide-gray-200 black:divide-gray-800 dark:divide-primary-800; + + &__empty { + @apply flex flex-col gap-2 py-2; + + h2 { + @include mixins.text($size: 2xl, $weight: bold, $align: center); + } + + p { + @include mixins.text($size: sm, $theme: muted, $align: center); + } + } +} + +.⁂-skip-pinned { + @apply absolute right-6 z-10 flex w-fit max-w-full items-center gap-2 rounded-full border border-gray-200 bg-gray-100 px-3 py-1 hover:bg-gray-200 black:border-gray-800 black:bg-gray-900 black:hover:bg-gray-800 dark:border-transparent dark:hover:border-primary-800 dark:bg-primary-800 dark:hover:bg-primary-900 rtl:space-x-reverse text-gray-700 dark:text-gray-600; + + svg { + @apply size-4; + } + + p { + @include mixins.text($size: xs, $theme: muted, $weight: medium, $truncate: true); + } +} + .⁂-load-more { @include mixins.button($theme: primary, $block: true); } \ No newline at end of file From 5e8edc767bf2ebf864e63303112cd289d8957c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 22:51:54 +0100 Subject: [PATCH 03/74] nicolium: update some deps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/package.json | 12 +- pnpm-lock.yaml | 1667 ++++++++++++++++++++++------------- 2 files changed, 1082 insertions(+), 597 deletions(-) diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index f32707683..5d3b81e87 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -72,7 +72,6 @@ "@twemoji/svg": "^15.0.0", "@uidotdev/usehooks": "^2.4.1", "@use-gesture/react": "^10.3.1", - "@vitejs/plugin-react": "^4.3.4", "@yornaath/batshit": "^0.11.2", "abortcontroller-polyfill": "^1.7.8", "autoprefixer": "^10.4.23", @@ -163,6 +162,7 @@ "@types/redux-mock-store": "^1.5.0", "@typescript-eslint/eslint-plugin": "^8.24.1", "@typescript-eslint/parser": "^8.24.0", + "@vitejs/plugin-react": "^5.1.3", "eslint": "^8.57.1", "eslint-import-resolver-typescript": "^4.0.0", "eslint-plugin-compat": "^6.0.2", @@ -177,20 +177,20 @@ "fake-indexeddb": "^6.0.0", "globals": "^15.14.0", "jsdom": "^25.0.1", - "rollup-plugin-bundle-stats": "^4.17.0", + "rollup-plugin-bundle-stats": "^4.21.10", "stylelint": "^16.12.0", "stylelint-config-standard-scss": "^12.0.0", "tailwindcss": "^3.4.17", "tslib": "^2.8.1", "type-fest": "^4.30.1", "typescript": "5.7.3", - "vite": "^5.4.21", - "vite-plugin-checker": "^0.10.0", + "vite": "^7.3.1", + "vite-plugin-checker": "^0.12.0", "vite-plugin-compile-time": "^0.3.2", "vite-plugin-html": "^3.2.2", - "vite-plugin-pwa": "^0.21.1", + "vite-plugin-pwa": "^1.2.0", "vite-plugin-require": "^1.2.14", - "vite-plugin-static-copy": "^2.3.2", + "vite-plugin-static-copy": "^3.2.0", "vitest": "^2.1.9" }, "lint-staged": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b81c114d1..13336d530 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,7 +108,7 @@ importers: version: 5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.17.0)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) ws: specifier: ^8.18.3 version: 8.18.3 @@ -217,9 +217,6 @@ importers: '@use-gesture/react': specifier: ^10.3.1 version: 10.3.1(react@19.2.3) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.7.0(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) '@yornaath/batshit': specifier: ^0.11.2 version: 0.11.2 @@ -485,6 +482,9 @@ importers: '@typescript-eslint/parser': specifier: ^8.24.0 version: 8.38.0(eslint@8.57.1)(typescript@5.7.3) + '@vitejs/plugin-react': + specifier: ^5.1.3 + version: 5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -528,8 +528,8 @@ importers: specifier: ^25.0.1 version: 25.0.1 rollup-plugin-bundle-stats: - specifier: ^4.17.0 - version: 4.21.1(core-js@3.44.0)(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + specifier: ^4.21.10 + version: 4.21.10(core-js@3.44.0)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) stylelint: specifier: ^16.12.0 version: 16.23.0(typescript@5.7.3) @@ -549,26 +549,26 @@ importers: specifier: 5.7.3 version: 5.7.3 vite: - specifier: ^5.4.21 - version: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + specifier: ^7.3.1 + version: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-checker: - specifier: ^0.10.0 - version: 0.10.2(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + specifier: ^0.12.0 + version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-compile-time: specifier: ^0.3.2 - version: 0.3.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 0.3.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-pwa: - specifier: ^0.21.1 - version: 0.21.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + specifier: ^1.2.0 + version: 1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-require: specifier: ^1.2.14 - version: 1.2.14(esbuild@0.24.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-static-copy: - specifier: ^2.3.2 - version: 2.3.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + specifier: ^3.2.0 + version: 3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vitest: specifier: ^2.1.9 version: 2.1.9(@types/node@25.0.3)(jsdom@25.0.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) @@ -629,7 +629,7 @@ importers: version: 5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) vite-plugin-dts: specifier: ^4.2.1 - version: 4.5.4(@types/node@20.19.9)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) packages: @@ -643,10 +643,6 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@apideck/better-ajv-errors@0.3.6': resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} engines: {node: '>=10'} @@ -669,46 +665,30 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.28.6': - resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.6': - resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.6': - resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} engines: {node: '>=6.9.0'} '@babel/generator@7.28.0': resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.6': - resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} @@ -725,8 +705,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -738,20 +718,10 @@ packages: resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} @@ -762,10 +732,6 @@ packages: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.28.6': resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} @@ -806,10 +772,6 @@ packages: resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.2': - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} @@ -824,8 +786,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true @@ -889,8 +851,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.6': - resolution: {integrity: sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==} + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -955,8 +917,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': - resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1033,8 +995,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1045,8 +1007,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -1129,8 +1091,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.6': - resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1201,8 +1163,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.6': - resolution: {integrity: sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==} + '@babel/preset-env@7.29.0': + resolution: {integrity: sha512-fNEdfc0yi16lt6IZo2Qxk3knHVdfMYX33czNb4v8yWhemoBhibCpQK/uYHtSKIiO+p/zd3+8fYVXhQdOVV608w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1235,12 +1197,8 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} '@babel/types@7.28.2': @@ -1251,32 +1209,32 @@ packages: resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@bufbuild/protobuf@2.10.1': resolution: {integrity: sha512-ckS3+vyJb5qGpEYv/s1OebUHDi/xSNtfgw1wqKZo7MR9F2z+qXr0q5XagafAG/9O0QPVIUfST0smluYSTpYFkg==} - '@bundle-stats/cli-utils@4.21.1': - resolution: {integrity: sha512-KQpA3v+ffZL1kuGa4jLESWllkki1e8KlBAFD5Ri/jl6wNQWvpxCl1HLCpXxeh1YhgEJE0OsLAt4+HtqjVe9UwQ==} + '@bundle-stats/cli-utils@4.21.10': + resolution: {integrity: sha512-x+wJvQFLU+82hLyIfzo3IR3oj7Ba+OaBF2Jhkg7i11bUkxR+KjTtdguwKcI5COI1ZT5dnPgngySEiNXd+vTuXA==} engines: {node: '>= 14.0'} - '@bundle-stats/html-templates@4.21.1': - resolution: {integrity: sha512-w/ITXyKRUCH45+pVTDIqN9TWw11JpUfcq69pTOhpNrX91Yvj2jrwG/7q2tXbzPx6LBfEF6hqd3s9pPo20P86AA==} + '@bundle-stats/html-templates@4.21.10': + resolution: {integrity: sha512-PKOlrbsU7pOE2meid8Pudbi+CriH5nO/CQtVjVxtktgw+kDOMt2fZoasWaZ+pP6Zk07r6chX/F9ntBP9FjYVYg==} - '@bundle-stats/plugin-webpack-filter@4.21.1': - resolution: {integrity: sha512-4yg9rgNmML3kM6yBT74JZ4ljYiQo1h0Fj+3MpkHwbv7gmjyL4AgXL26Tf2nadGOelbx5M0xW6l9sVP1XwYC6Rg==} + '@bundle-stats/plugin-webpack-filter@4.21.10': + resolution: {integrity: sha512-r32p1Y4xNkXPP2vZIJBiKhynog8P2AJDbgw9lxROp3IBe/7M7i+wkxATSGHkuWaYisJDBj7/28acjl7YJYDuzA==} engines: {node: '>= 14.0'} peerDependencies: core-js: ^3.0.0 - '@bundle-stats/plugin-webpack-validate@4.21.1': - resolution: {integrity: sha512-2z7eJZ/rXZss2b+8C+xtF5VSTwdFAZPzZdh9tr5KztXYDK2oayF21pX8Z6eefhjbeN5lKG99zE2hvVQnLD+5FQ==} + '@bundle-stats/plugin-webpack-validate@4.21.10': + resolution: {integrity: sha512-izQrd6Bbjcuh+HzYhvcS2STdPRbtnKYQ1yTj1itxm09piVS9UEtbXqzfRsMkiKZ8lXr9IauKOWK7ZOSCIlcgkg==} engines: {node: '>= 14.0'} - '@bundle-stats/utils@4.21.1': - resolution: {integrity: sha512-QqFJs9mfVp67NIyRi34H/e2JrAfhVbHdbAtbQ2gBZfn6d/UGsCwKoxyd9qMYBR98Y95Me9Sj3kkn03CkkAhB3A==} + '@bundle-stats/utils@4.21.10': + resolution: {integrity: sha512-eKsrvf+/nP4l1NaJXv7dsot0iSDuadsefBE4oL3+fCsir+kaMYVqknN9oh4EEaDb3ycxxWglE/50xDqFXTWEwg==} engines: {node: '>= 14.0'} peerDependencies: core-js: ^3.0.0 @@ -1369,6 +1327,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1381,6 +1345,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1393,6 +1363,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1405,6 +1381,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1417,6 +1399,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1429,6 +1417,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1441,6 +1435,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1453,6 +1453,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1465,6 +1471,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1477,6 +1489,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1489,6 +1507,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1501,6 +1525,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1513,6 +1543,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1525,6 +1561,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1537,6 +1579,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1549,6 +1597,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1561,12 +1615,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1579,12 +1645,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1597,6 +1675,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1609,6 +1699,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1621,6 +1717,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1633,6 +1735,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1645,6 +1753,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2155,8 +2269,8 @@ packages: react-redux: optional: true - '@rolldown/pluginutils@1.0.0-beta.27': - resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + '@rolldown/pluginutils@1.0.0-rc.3': + resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} @@ -2225,111 +2339,236 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.52.5': resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.52.5': resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.52.5': resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.52.5': resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.52.5': resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.52.5': resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.52.5': resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.52.5': resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.5': resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} cpu: [loong64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.52.5': resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.52.5': resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.52.5': resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.52.5': resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.52.5': resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.52.5': resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + '@rollup/rollup-openharmony-arm64@4.52.5': resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} cpu: [arm64] os: [openharmony] + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.52.5': resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.52.5': resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.5': resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.52.5': resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2932,9 +3171,9 @@ packages: peerDependencies: react: '>= 16.8.0' - '@vitejs/plugin-react@4.7.0': - resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} - engines: {node: ^14.18.0 || >=16.0.0} + '@vitejs/plugin-react@5.1.4': + resolution: {integrity: sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -3123,6 +3362,9 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} @@ -3260,18 +3502,18 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + babel-plugin-polyfill-corejs3@0.14.0: + resolution: {integrity: sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -3868,6 +4110,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4102,6 +4349,9 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -4120,6 +4370,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@10.1.3: resolution: {integrity: sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==} @@ -4250,11 +4509,12 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} @@ -4884,9 +5144,6 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -5167,8 +5424,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} p-try@2.2.0: @@ -5667,8 +5924,8 @@ packages: redux: optional: true - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} react-sparklines@1.7.0: @@ -5825,37 +6082,46 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup-plugin-bundle-stats@4.21.1: - resolution: {integrity: sha512-6RS5Riinh1VvycBYCZCDd2YfDd7TJ9Cv/+wdobm2jX8s9xs4Prp0ojA+79p4R6uOXzYdDcMA/sOglk0lYEQNxw==} + rollup-plugin-bundle-stats@4.21.10: + resolution: {integrity: sha512-vcUqcAZpXHhBf/Gu7OLcRIVU4Rz6ZXISNCsbuFdpfkGcYDOOcB+pYkTXx73ZHHdD4RkT5SlkrQQwdNKfrTPc5g==} engines: {node: '>= 16.0'} peerDependencies: + rolldown: ^1.0.0-beta.0 rollup: ^3.0.0 || ^4.0.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: + rolldown: + optional: true rollup: optional: true vite: optional: true - rollup-plugin-stats@1.4.0: - resolution: {integrity: sha512-qbwuMysGHqNrW0XBO3dU8qM7SdVYmMuaABp6SG1wFDClFVdUo8Umtk/LIDFCocNxDf6Tvtu7tXF/FsMy8NZCew==} + rollup-plugin-stats@1.5.6: + resolution: {integrity: sha512-uWclISMxZcWfmcnwOJgJ2sLIKsXvDUI7yFfqXFq6g20IeBE+bc+RhXcvMAO2vPN3A66wBvIF6XkGhI7v/KuwGw==} engines: {node: '>=18'} peerDependencies: + rolldown: ^1.0.0-beta.0 rollup: ^3.0.0 || ^4.0.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: + rolldown: + optional: true rollup: optional: true vite: optional: true - rollup-plugin-webpack-stats@2.1.0: - resolution: {integrity: sha512-7cxCelMRPkqZvjQa4NuHSkdJ6nshLDuDYyPAky8YOjcaz+qEocg0DRcJoSd4r2mKSupz0uZpoav5vqpDm7bSxg==} + rollup-plugin-webpack-stats@2.1.11: + resolution: {integrity: sha512-F4R1Lbg9cmOE/C+UjIQ2EghT/bFpe2eF+ei1g1PBUp2EpQgYeED7So/pwC/ROi+4X1LXfi1sQHR5A0zgwUr/Kw==} engines: {node: '>=18'} peerDependencies: + rolldown: ^1.0.0-beta.0 rollup: ^3.0.0 || ^4.0.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: + rolldown: + optional: true rollup: optional: true vite: @@ -5871,6 +6137,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.7.1: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} @@ -6043,8 +6314,8 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serialize-query-params@2.0.2: - resolution: {integrity: sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==} + serialize-query-params@2.0.4: + resolution: {integrity: sha512-y9WzzDj3BsGgKLCh0ugiinufS//YqOfao/yVJjkXA4VLuyNCfHOLU/cbulGPxs3aeCqhvROw7qPL04JSZnCo0w==} seroval-plugins@1.4.2: resolution: {integrity: sha512-X7p4MEDTi+60o2sXZ4bnDBhgsUYDSkQEvzYZuJyFqWg9jcoPsHts5nrg5O956py2wyt28lUrBxk0M0/wU8URpA==} @@ -6121,8 +6392,9 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smob@1.6.1: + resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} + engines: {node: '>=20.0.0'} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -6447,6 +6719,10 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -6687,17 +6963,18 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-checker@0.10.2: - resolution: {integrity: sha512-FX9U8TnIS6AGOlqmC6O2YmkJzcZJRrjA03UF7FOhcUJ7it3HmCoxcIPMcoHliBP6EFOuNzle9K4c0JL4suRPow==} - engines: {node: '>=14.16'} + vite-plugin-checker@0.12.0: + resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} + engines: {node: '>=16.11'} peerDependencies: '@biomejs/biome': '>=1.7' - eslint: '>=7' + eslint: '>=9.39.1' meow: ^13.2.0 optionator: ^0.9.4 + oxlint: '>=1' stylelint: '>=16' typescript: '*' - vite: '>=2.0.0' + vite: '>=5.4.21' vls: '*' vti: '*' vue-tsc: ~2.2.10 || ^3.0.0 @@ -6710,6 +6987,8 @@ packages: optional: true optionator: optional: true + oxlint: + optional: true stylelint: optional: true typescript: @@ -6740,14 +7019,14 @@ packages: peerDependencies: vite: '>=2.0.0' - vite-plugin-pwa@0.21.2: - resolution: {integrity: sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==} + vite-plugin-pwa@1.2.0: + resolution: {integrity: sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==} engines: {node: '>=16.0.0'} peerDependencies: - '@vite-pwa/assets-generator': ^0.2.6 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - workbox-build: ^7.3.0 - workbox-window: ^7.3.0 + '@vite-pwa/assets-generator': ^1.0.0 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + workbox-build: ^7.4.0 + workbox-window: ^7.4.0 peerDependenciesMeta: '@vite-pwa/assets-generator': optional: true @@ -6758,11 +7037,11 @@ packages: peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - vite-plugin-static-copy@2.3.2: - resolution: {integrity: sha512-iwrrf+JupY4b9stBttRWzGHzZbeMjAHBhkrn67MNACXJVjEMRpCI10Q3AkxdBkl45IHaTfw/CNVevzQhP7yTwg==} + vite-plugin-static-copy@3.2.0: + resolution: {integrity: sha512-g2k9z8B/1Bx7D4wnFjPLx9dyYGrqWMLTpwTtPHhcU+ElNZP2O4+4OsyaficiDClus0dzVhdGvoGFYMJxoXZ12Q==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} @@ -6795,6 +7074,46 @@ packages: terser: optional: true + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@2.1.9: resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -7077,14 +7396,9 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': + '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': - dependencies: - ajv: 8.17.1 + ajv: 8.18.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -7121,47 +7435,25 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.28.6': + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.4': {} + '@babel/compat-data@7.29.0': {} - '@babel/compat-data@7.28.6': {} - - '@babel/core@7.28.0': + '@babel/core@7.29.0': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - convert-source-map: 2.0.0 - debug: 4.4.1 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7179,65 +7471,49 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 - '@babel/generator@7.28.3': + '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/generator@7.28.6': - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.6 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.4 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.29.0 '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.28.6 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.6)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.6)': + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 @@ -7250,73 +7526,55 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.6 - - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.28.6': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.6)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -7331,20 +7589,15 @@ snapshots: '@babel/helper-wrap-function@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.2': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 '@babel/parser@7.28.0': dependencies: @@ -7354,489 +7607,489 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@babel/parser@7.28.6': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.6)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) - '@babel/traverse': 7.28.6 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) - '@babel/traverse': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.28.6 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.6)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.6)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) - '@babel/traverse': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.6)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.0)': + dependencies: + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.28.6 - '@babel/preset-env@7.28.6(@babel/core@7.28.6)': + '@babel/preset-env@7.29.0(@babel/core@7.29.0)': dependencies: - '@babel/compat-data': 7.28.6 - '@babel/core': 7.28.6 + '@babel/compat-data': 7.29.0 + '@babel/core': 7.29.0 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.6) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.6) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.6) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.6) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.6) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.6) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.6) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.6) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.6) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.6) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.29.0) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.29.0) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.0) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.0) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.29.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.29.0) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.29.0) + babel-plugin-polyfill-corejs3: 0.14.0(@babel/core@7.29.0) + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.29.0) core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.6)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/runtime@7.0.0': @@ -7855,9 +8108,9 @@ snapshots: '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@babel/traverse@7.28.0': dependencies: @@ -7871,26 +8124,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.4': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 + '@babel/parser': 7.29.0 '@babel/template': 7.28.6 - '@babel/types': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -7905,18 +8146,18 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.6': + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 '@bufbuild/protobuf@2.10.1': {} - '@bundle-stats/cli-utils@4.21.1(core-js@3.44.0)': + '@bundle-stats/cli-utils@4.21.10(core-js@3.44.0)': dependencies: - '@bundle-stats/html-templates': 4.21.1 - '@bundle-stats/plugin-webpack-filter': 4.21.1(core-js@3.44.0) - '@bundle-stats/utils': 4.21.1(core-js@3.44.0)(lodash@4.17.23) + '@bundle-stats/html-templates': 4.21.10 + '@bundle-stats/plugin-webpack-filter': 4.21.10(core-js@3.44.0) + '@bundle-stats/utils': 4.21.10(core-js@3.44.0)(lodash@4.17.23) find-cache-dir: 3.3.2 lodash: 4.17.23 stream-chain: 3.4.0 @@ -7924,26 +8165,26 @@ snapshots: transitivePeerDependencies: - core-js - '@bundle-stats/html-templates@4.21.1': {} + '@bundle-stats/html-templates@4.21.10': {} - '@bundle-stats/plugin-webpack-filter@4.21.1(core-js@3.44.0)': + '@bundle-stats/plugin-webpack-filter@4.21.10(core-js@3.44.0)': dependencies: core-js: 3.44.0 tslib: 2.8.1 - '@bundle-stats/plugin-webpack-validate@4.21.1': + '@bundle-stats/plugin-webpack-validate@4.21.10': dependencies: - lodash: 4.17.21 + lodash: 4.17.23 superstruct: 2.0.2 tslib: 2.8.1 - '@bundle-stats/utils@4.21.1(core-js@3.44.0)(lodash@4.17.23)': + '@bundle-stats/utils@4.21.10(core-js@3.44.0)(lodash@4.17.23)': dependencies: - '@bundle-stats/plugin-webpack-filter': 4.21.1(core-js@3.44.0) - '@bundle-stats/plugin-webpack-validate': 4.21.1 + '@bundle-stats/plugin-webpack-filter': 4.21.10(core-js@3.44.0) + '@bundle-stats/plugin-webpack-validate': 4.21.10 core-js: 3.44.0 lodash: 4.17.23 - serialize-query-params: 2.0.2 + serialize-query-params: 2.0.4 '@csstools/color-helpers@5.0.2': {} @@ -8019,144 +8260,222 @@ snapshots: '@esbuild/aix-ppc64@0.24.2': optional: true + '@esbuild/aix-ppc64@0.27.3': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.24.2': optional: true + '@esbuild/android-arm64@0.27.3': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.24.2': optional: true + '@esbuild/android-arm@0.27.3': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.24.2': optional: true + '@esbuild/android-x64@0.27.3': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.24.2': optional: true + '@esbuild/darwin-arm64@0.27.3': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.24.2': optional: true + '@esbuild/darwin-x64@0.27.3': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.24.2': optional: true + '@esbuild/freebsd-arm64@0.27.3': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.24.2': optional: true + '@esbuild/freebsd-x64@0.27.3': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.24.2': optional: true + '@esbuild/linux-arm64@0.27.3': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.24.2': optional: true + '@esbuild/linux-arm@0.27.3': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.24.2': optional: true + '@esbuild/linux-ia32@0.27.3': + optional: true + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.24.2': optional: true + '@esbuild/linux-loong64@0.27.3': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.24.2': optional: true + '@esbuild/linux-mips64el@0.27.3': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.24.2': optional: true + '@esbuild/linux-ppc64@0.27.3': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.24.2': optional: true + '@esbuild/linux-riscv64@0.27.3': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.24.2': optional: true + '@esbuild/linux-s390x@0.27.3': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.24.2': optional: true + '@esbuild/linux-x64@0.27.3': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true + '@esbuild/netbsd-arm64@0.27.3': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.24.2': optional: true + '@esbuild/netbsd-x64@0.27.3': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true + '@esbuild/openbsd-arm64@0.27.3': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.24.2': optional: true + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.24.2': optional: true + '@esbuild/sunos-x64@0.27.3': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.24.2': optional: true + '@esbuild/win32-arm64@0.27.3': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.24.2': optional: true + '@esbuild/win32-ia32@0.27.3': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.24.2': optional: true + '@esbuild/win32-x64@0.27.3': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -8804,11 +9123,11 @@ snapshots: react: 19.2.3 react-redux: 9.2.0(@types/react@18.3.27)(react@19.2.3)(redux@5.0.1) - '@rolldown/pluginutils@1.0.0-beta.27': {} + '@rolldown/pluginutils@1.0.0-rc.3': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 '@rollup/pluginutils': 3.1.0(rollup@2.79.2) rollup: 2.79.2 @@ -8836,7 +9155,7 @@ snapshots: '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': dependencies: serialize-javascript: 6.0.2 - smob: 1.5.0 + smob: 1.6.1 terser: 5.46.0 optionalDependencies: rollup: 2.79.2 @@ -8853,13 +9172,13 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.2.0(rollup@4.52.5)': + '@rollup/pluginutils@5.2.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.52.5 + rollup: 4.57.1 '@rollup/pluginutils@5.3.0(rollup@2.79.2)': dependencies: @@ -8872,69 +9191,144 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.52.5': optional: true + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + '@rollup/rollup-android-arm64@4.52.5': optional: true + '@rollup/rollup-android-arm64@4.57.1': + optional: true + '@rollup/rollup-darwin-arm64@4.52.5': optional: true + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + '@rollup/rollup-darwin-x64@4.52.5': optional: true + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + '@rollup/rollup-freebsd-x64@4.52.5': optional: true + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.52.5': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + '@rtsao/scc@1.1.0': {} '@rushstack/node-core-library@5.14.0(@types/node@20.19.9)': @@ -9182,7 +9576,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 @@ -9245,24 +9639,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.29.0 '@types/dom-chromium-ai@0.0.11': {} @@ -9723,15 +10117,15 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.3 - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))': dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.27 + '@babel/core': 7.29.0 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + react-refresh: 0.18.0 + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -9982,6 +10376,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + alien-signals@0.4.14: {} ansi-escapes@7.0.0: @@ -10127,27 +10528,27 @@ snapshots: axobject-query@4.1.0: {} - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.6): + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): dependencies: - '@babel/compat-data': 7.28.6 - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + '@babel/compat-data': 7.29.0 + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.6): + babel-plugin-polyfill-corejs3@0.14.0(@babel/core@7.29.0): dependencies: - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.6): + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.29.0): dependencies: - '@babel/core': 7.28.6 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.6) + '@babel/core': 7.29.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.29.0) transitivePeerDependencies: - supports-color @@ -10832,6 +11233,35 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -11239,6 +11669,8 @@ snapshots: fast-uri@3.0.6: {} + fast-uri@3.1.0: {} + fastest-levenshtein@1.0.16: {} fastq@1.19.1: @@ -11253,6 +11685,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + file-entry-cache@10.1.3: dependencies: flat-cache: 6.1.12 @@ -12068,8 +12504,6 @@ snapshots: lodash.uniq@4.5.0: {} - lodash@4.17.21: {} - lodash@4.17.23: {} log-update@6.1.0: @@ -12342,7 +12776,7 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.3: {} + p-map@7.0.4: {} p-try@2.2.0: {} @@ -12798,7 +13232,7 @@ snapshots: '@types/react': 18.3.27 redux: 5.0.1 - react-refresh@0.17.0: {} + react-refresh@0.18.0: {} react-sparklines@1.7.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: @@ -12964,28 +13398,28 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-bundle-stats@4.21.1(core-js@3.44.0)(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + rollup-plugin-bundle-stats@4.21.10(core-js@3.44.0)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: - '@bundle-stats/cli-utils': 4.21.1(core-js@3.44.0) - rollup-plugin-webpack-stats: 2.1.0(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + '@bundle-stats/cli-utils': 4.21.10(core-js@3.44.0) + rollup-plugin-webpack-stats: 2.1.11(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) tslib: 2.8.1 optionalDependencies: rollup: 2.79.2 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - core-js - rollup-plugin-stats@1.4.0(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + rollup-plugin-stats@1.5.6(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): optionalDependencies: rollup: 2.79.2 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - rollup-plugin-webpack-stats@2.1.0(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + rollup-plugin-webpack-stats@2.1.11(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: - rollup-plugin-stats: 1.4.0(rollup@2.79.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + rollup-plugin-stats: 1.5.6(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) optionalDependencies: rollup: 2.79.2 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) rollup@2.79.2: optionalDependencies: @@ -13019,6 +13453,37 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} rrweb-cssom@0.8.0: {} @@ -13176,7 +13641,7 @@ snapshots: dependencies: randombytes: 2.1.0 - serialize-query-params@2.0.2: {} + serialize-query-params@2.0.4: {} seroval-plugins@1.4.2(seroval@1.4.2): dependencies: @@ -13266,7 +13731,7 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - smob@1.5.0: {} + smob@1.6.1: {} source-map-js@1.2.1: {} @@ -13664,6 +14129,11 @@ snapshots: fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinypool@1.1.1: {} tinyrainbow@1.2.0: {} @@ -13927,17 +14397,16 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.10.2(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chokidar: 4.0.3 npm-run-path: 6.0.0 picocolors: 1.1.1 picomatch: 4.0.3 - strip-ansi: 7.1.0 tiny-invariant: 1.3.3 - tinyglobby: 0.2.14 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 8.57.1 @@ -13946,18 +14415,18 @@ snapshots: stylelint: 16.23.0(typescript@5.7.3) typescript: 5.7.3 - vite-plugin-compile-time@0.3.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-compile-time@0.3.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: bundle-require: 5.1.0(esbuild@0.24.2) devalue: 5.1.1 esbuild: 0.24.2 magic-string: 0.30.17 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@20.19.9) - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.57.1) '@volar/typescript': 2.4.22 '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 @@ -13973,10 +14442,10 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.52.5)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@22.17.0) - '@rollup/pluginutils': 5.2.0(rollup@4.52.5) + '@rollup/pluginutils': 5.2.0(rollup@4.57.1) '@volar/typescript': 2.4.22 '@vue/language-core': 2.2.0(typescript@5.9.2) compare-versions: 6.1.1 @@ -13992,7 +14461,7 @@ snapshots: - rollup - supports-color - vite-plugin-html@3.2.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-html@3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -14006,27 +14475,27 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite-plugin-pwa@0.21.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: - debug: 4.4.1 + debug: 4.4.3 pretty-bytes: 6.1.1 - tinyglobby: 0.2.14 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 '@babel/types': 7.28.2 '@vue/compiler-sfc': 3.5.18 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vue-loader: 17.4.2(@vue/compiler-sfc@3.5.18)(webpack@5.101.0(esbuild@0.24.2)) webpack: 5.101.0(esbuild@0.24.2) transitivePeerDependencies: @@ -14037,14 +14506,13 @@ snapshots: - vue - webpack-cli - vite-plugin-static-copy@2.3.2(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: chokidar: 3.6.0 - fast-glob: 3.3.3 - fs-extra: 11.3.1 - p-map: 7.0.3 + p-map: 7.0.4 picocolors: 1.1.1 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): dependencies: @@ -14082,6 +14550,23 @@ snapshots: sass-embedded: 1.93.3 terser: 5.46.0 + vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + jiti: 1.21.7 + sass: 1.93.3 + sass-embedded: 1.93.3 + terser: 5.46.0 + yaml: 2.8.0 + vitest@2.1.9(@types/node@25.0.3)(jsdom@25.0.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): dependencies: '@vitest/expect': 2.1.9 @@ -14271,16 +14756,16 @@ snapshots: workbox-build@7.3.0(@types/babel__core@7.20.5): dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.28.6 - '@babel/preset-env': 7.28.6(@babel/core@7.28.6) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.18.0) + '@babel/core': 7.29.0 + '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/runtime': 7.28.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.28.6)(@types/babel__core@7.20.5)(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2) '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.17.1 + ajv: 8.18.0 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 From 5a179f2a3d20b64dafdd6b33cb74757ed3947edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 22:55:09 +0100 Subject: [PATCH 04/74] nicolium: remove tests for now, remove unused code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/package.json | 18 +- .../pl-fe/src/__fixtures__/account-moved.json | 46 - .../src/__fixtures__/account-with-emojis.json | 140 - packages/pl-fe/src/__fixtures__/accounts.json | 182 - .../__fixtures__/accounts_counter_follow.json | 7 - .../accounts_counter_initial.json | 7 - .../accounts_counter_unfollow.json | 7 - .../admin_api_frontend_config.json | 55 - .../src/__fixtures__/akkoma-instance.json | 105 - .../pl-fe/src/__fixtures__/announcements.json | 44 - packages/pl-fe/src/__fixtures__/app.json | 15 - packages/pl-fe/src/__fixtures__/blocks.json | 8 - .../pl-fe/src/__fixtures__/config_db.json | 2735 ---------- .../src/__fixtures__/fedibird-account.json | 35 - .../src/__fixtures__/fedibird-instance.json | 185 - .../fedibird-quote-of-quote-post.json | 109 - .../src/__fixtures__/fedibird-quote-post.json | 108 - .../src/__fixtures__/friendica-instance.json | 46 - .../src/__fixtures__/friendica-status.json | 53 - .../src/__fixtures__/gotosocial-account.json | 27 - .../src/__fixtures__/gotosocial-instance.json | 42 - .../src/__fixtures__/gotosocial-status.json | 50 - .../src/__fixtures__/group-truthsocial.json | 19 - .../pl-fe/src/__fixtures__/intlMessages.json | 962 ---- packages/pl-fe/src/__fixtures__/lain.json | 57 - packages/pl-fe/src/__fixtures__/markers.json | 18 - .../__fixtures__/mastodon-3.0.0-instance.json | 43 - .../src/__fixtures__/mastodon-account.json | 23 - .../__fixtures__/mastodon-instance-rc.json | 123 - .../src/__fixtures__/mastodon-instance.json | 128 - .../__fixtures__/mastodon-reply-to-self.json | 51 - .../__fixtures__/mastodon_initial_state.json | 228 - .../pl-fe/src/__fixtures__/mitra-context.json | 107 - .../src/__fixtures__/mitra-instance.json | 13 - .../mitra-status-with-attachments.json | 95 - packages/pl-fe/src/__fixtures__/mk.json | 123 - .../__fixtures__/notification-favourite.json | 290 -- .../src/__fixtures__/notification-follow.json | 61 - .../notification-follow_request.json | 61 - .../__fixtures__/notification-mention.json | 226 - .../src/__fixtures__/notification-move.json | 119 - .../notification-pleroma-chat_mention.json | 73 - .../notification-pleroma-emoji_reaction.json | 301 -- .../src/__fixtures__/notification-poll.json | 202 - .../src/__fixtures__/notification-reblog.json | 284 -- .../pl-fe/src/__fixtures__/notification.json | 250 - .../pl-fe/src/__fixtures__/notifications.json | 4461 ----------------- .../src/__fixtures__/patron-instance.json | 17 - .../pl-fe/src/__fixtures__/patron-user.json | 4 - .../src/__fixtures__/pixelfed-instance.json | 66 - packages/pl-fe/src/__fixtures__/pl-fe.json | 40 - .../__fixtures__/pleroma-2.2.2-account.json | 46 - .../src/__fixtures__/pleroma-account.json | 127 - .../__fixtures__/pleroma-admin-config.json | 3120 ------------ .../src/__fixtures__/pleroma-instance.json | 131 - .../pleroma-notification-move.json | 119 - .../src/__fixtures__/pleroma-quote-post.json | 364 -- .../__fixtures__/pleroma-status-deleted.json | 229 - .../pleroma-status-reply-with-mentions.json | 207 - .../pleroma-status-with-attachments.json | 238 - .../__fixtures__/pleroma_initial_results.json | 6 - .../pl-fe/src/__fixtures__/relationship.json | 14 - packages/pl-fe/src/__fixtures__/rules.json | 12 - .../src/__fixtures__/status-custom-emoji.json | 126 - .../pl-fe/src/__fixtures__/status-cw.json | 63 - .../pl-fe/src/__fixtures__/status-quotes.json | 15 - .../status-unordered-mentions.json | 122 - .../src/__fixtures__/status-with-card.json | 210 - .../src/__fixtures__/status-with-poll.json | 201 - packages/pl-fe/src/__fixtures__/user.json | 8 - packages/pl-fe/src/actions/accounts.test.ts | 466 -- packages/pl-fe/src/actions/compose.test.ts | 133 - packages/pl-fe/src/actions/importer.ts | 9 +- packages/pl-fe/src/actions/me.test.ts | 121 - .../pl-fe/src/actions/notifications.test.ts | 42 - packages/pl-fe/src/actions/preload.test.ts | 37 - packages/pl-fe/src/actions/preload.ts | 1 - packages/pl-fe/src/actions/statuses.test.ts | 161 - packages/pl-fe/src/api/__mocks__/index.ts | 29 - .../src/api/hooks/groups/use-group.test.ts | 41 - .../src/api/hooks/groups/use-groups.test.ts | 49 - .../pl-fe/src/components/account.test.tsx | 67 - .../src/components/autosuggest-emoji.test.tsx | 33 - packages/pl-fe/src/components/badge.test.tsx | 13 - .../src/components/polls/poll-footer.test.tsx | 140 - .../src/components/quoted-status.test.tsx | 31 - .../src/components/scroll-top-button.test.tsx | 44 - packages/pl-fe/src/components/status.test.tsx | 38 - .../sensitive-content-overlay.test.tsx | 64 - .../pl-fe/src/components/ui/avatar.test.tsx | 21 - .../src/components/ui/button/index.test.tsx | 91 - .../pl-fe/src/components/ui/card.test.tsx | 37 - .../pl-fe/src/components/ui/column.test.tsx | 13 - .../pl-fe/src/components/ui/divider.test.tsx | 20 - .../pl-fe/src/components/ui/emoji.test.tsx | 24 - .../src/components/ui/form-actions.test.tsx | 13 - .../src/components/ui/form-group.test.tsx | 59 - .../pl-fe/src/components/ui/form.test.tsx | 30 - .../pl-fe/src/components/ui/modal.test.tsx | 139 - .../pl-fe/src/components/ui/svg-icon.test.tsx | 17 - packages/pl-fe/src/entity-store/actions.ts | 11 - .../pl-fe/src/entity-store/reducer.test.ts | 209 - packages/pl-fe/src/entity-store/reducer.ts | 20 +- packages/pl-fe/src/entity-store/utils.ts | 1 - .../auth-login/components/captcha.test.tsx | 36 - .../auth-login/components/captcha.tsx | 1 - .../auth-login/components/login-form.test.tsx | 43 - .../components/otp-auth-form.test.tsx | 14 - .../chats/components/chat-list-item.test.tsx | 65 - .../components/chat-message-list.test.tsx | 144 - .../components/chat-pane-header.test.tsx | 84 - .../components/chat-pane/chat-pane.test.tsx | 60 - .../chat-search/chat-search.test.tsx | 66 - .../chats/components/chat-widget.test.tsx | 100 - .../polls/duration-selector.test.tsx | 78 - .../src/features/compose/editor/utils/url.ts | 11 - .../pl-fe/src/features/emoji/index.test.ts | 1914 ------- .../pl-fe/src/features/emoji/search.test.ts | 129 - .../components/group-action-button.test.tsx | 132 - .../group/components/group-header.test.tsx | 47 - .../components/group-member-count.test.tsx | 56 - .../group-member-list-item.test.tsx | 303 -- .../components/group-options-button.test.tsx | 87 - .../group/components/group-privacy.test.tsx | 40 - .../components/group-relationship.test.tsx | 67 - .../discover/group-list-item.test.tsx | 21 - .../components/notifications.test.tsx | 130 - .../ui/components/compose-button.test.tsx | 39 - .../src/features/ui/components/hotkeys.tsx | 4 +- .../components/panels/sign-up-panel.test.tsx | 20 - .../components/panels/trends-panel.test.tsx | 74 - .../ui/components/subscribe-button.test.tsx | 26 - .../src/hooks/__mocks__/resize-observer.ts | 25 - .../pl-fe/src/hooks/use-dimensions.test.ts | 62 - packages/pl-fe/src/hooks/use-dimensions.ts | 38 - packages/pl-fe/src/jest/factory.ts | 74 - packages/pl-fe/src/jest/fixtures/chats.json | 54 - packages/pl-fe/src/jest/mock-stores.tsx | 9 - packages/pl-fe/src/jest/test-helpers.tsx | 118 - packages/pl-fe/src/jest/test-setup.ts | 42 - .../src/modals/unauthorized-modal.test.tsx | 25 - packages/pl-fe/src/pages/auth/login.test.tsx | 52 - .../pl-fe/src/queries/__mocks__/client.ts | 13 - packages/pl-fe/src/queries/chats.test.ts | 295 -- packages/pl-fe/src/queries/trends.test.ts | 46 - packages/pl-fe/src/reducers/admin.test.ts | 11 - packages/pl-fe/src/reducers/auth.test.ts | 353 -- packages/pl-fe/src/reducers/compose.test.ts | 482 -- packages/pl-fe/src/reducers/contexts.test.ts | 118 - .../pl-fe/src/reducers/conversations.test.ts | 67 - packages/pl-fe/src/reducers/filters.test.ts | 9 - packages/pl-fe/src/reducers/index.test.ts | 11 - packages/pl-fe/src/reducers/instance.test.ts | 51 - packages/pl-fe/src/reducers/me.test.ts | 7 - packages/pl-fe/src/reducers/meta.test.ts | 12 - .../src/reducers/push-notifications.test.ts | 19 - packages/pl-fe/src/reducers/statuses.test.ts | 243 - packages/pl-fe/src/reducers/timelines.test.ts | 123 - packages/pl-fe/src/toast.test.tsx | 166 - packages/pl-fe/src/utils/badges.test.ts | 41 - packages/pl-fe/src/utils/base64.test.ts | 10 - packages/pl-fe/src/utils/chats.test.ts | 64 - packages/pl-fe/src/utils/colors.test.ts | 22 - packages/pl-fe/src/utils/comparators.test.ts | 7 - packages/pl-fe/src/utils/config-db.test.ts | 14 - packages/pl-fe/src/utils/emoji-reacts.test.ts | 82 - packages/pl-fe/src/utils/emoji.test.ts | 39 - packages/pl-fe/src/utils/html.test.ts | 10 - packages/pl-fe/src/utils/input.test.ts | 7 - packages/pl-fe/src/utils/media.test.ts | 15 - packages/pl-fe/src/utils/numbers.test.tsx | 108 - packages/pl-fe/src/utils/numbers.tsx | 4 - packages/pl-fe/src/utils/queries.test.ts | 109 - packages/pl-fe/src/utils/redirect.ts | 18 +- packages/pl-fe/src/utils/status.test.ts | 34 - packages/pl-fe/src/utils/status.ts | 15 - packages/pl-fe/src/utils/tailwind.test.ts | 263 - packages/pl-fe/src/utils/tailwind.ts | 2 - packages/pl-fe/src/utils/timelines.test.ts | 73 - packages/pl-fe/tailwind/colors.test.ts | 50 - packages/pl-fe/tailwind/colors.ts | 2 +- packages/pl-fe/tsconfig.json | 1 - packages/pl-fe/vite.config.ts | 6 - pnpm-lock.yaml | 717 --- 184 files changed, 7 insertions(+), 28073 deletions(-) delete mode 100644 packages/pl-fe/src/__fixtures__/account-moved.json delete mode 100644 packages/pl-fe/src/__fixtures__/account-with-emojis.json delete mode 100644 packages/pl-fe/src/__fixtures__/accounts.json delete mode 100644 packages/pl-fe/src/__fixtures__/accounts_counter_follow.json delete mode 100644 packages/pl-fe/src/__fixtures__/accounts_counter_initial.json delete mode 100644 packages/pl-fe/src/__fixtures__/accounts_counter_unfollow.json delete mode 100644 packages/pl-fe/src/__fixtures__/admin_api_frontend_config.json delete mode 100644 packages/pl-fe/src/__fixtures__/akkoma-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/announcements.json delete mode 100644 packages/pl-fe/src/__fixtures__/app.json delete mode 100644 packages/pl-fe/src/__fixtures__/blocks.json delete mode 100644 packages/pl-fe/src/__fixtures__/config_db.json delete mode 100644 packages/pl-fe/src/__fixtures__/fedibird-account.json delete mode 100644 packages/pl-fe/src/__fixtures__/fedibird-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/fedibird-quote-of-quote-post.json delete mode 100644 packages/pl-fe/src/__fixtures__/fedibird-quote-post.json delete mode 100644 packages/pl-fe/src/__fixtures__/friendica-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/friendica-status.json delete mode 100644 packages/pl-fe/src/__fixtures__/gotosocial-account.json delete mode 100644 packages/pl-fe/src/__fixtures__/gotosocial-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/gotosocial-status.json delete mode 100644 packages/pl-fe/src/__fixtures__/group-truthsocial.json delete mode 100644 packages/pl-fe/src/__fixtures__/intlMessages.json delete mode 100644 packages/pl-fe/src/__fixtures__/lain.json delete mode 100644 packages/pl-fe/src/__fixtures__/markers.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon-3.0.0-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon-account.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon-instance-rc.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon-reply-to-self.json delete mode 100644 packages/pl-fe/src/__fixtures__/mastodon_initial_state.json delete mode 100644 packages/pl-fe/src/__fixtures__/mitra-context.json delete mode 100644 packages/pl-fe/src/__fixtures__/mitra-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/mitra-status-with-attachments.json delete mode 100644 packages/pl-fe/src/__fixtures__/mk.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-favourite.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-follow.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-follow_request.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-mention.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-move.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-pleroma-chat_mention.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-pleroma-emoji_reaction.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-poll.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification-reblog.json delete mode 100644 packages/pl-fe/src/__fixtures__/notification.json delete mode 100644 packages/pl-fe/src/__fixtures__/notifications.json delete mode 100644 packages/pl-fe/src/__fixtures__/patron-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/patron-user.json delete mode 100644 packages/pl-fe/src/__fixtures__/pixelfed-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/pl-fe.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-2.2.2-account.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-account.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-admin-config.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-instance.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-notification-move.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-quote-post.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-status-deleted.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-status-reply-with-mentions.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma-status-with-attachments.json delete mode 100644 packages/pl-fe/src/__fixtures__/pleroma_initial_results.json delete mode 100644 packages/pl-fe/src/__fixtures__/relationship.json delete mode 100644 packages/pl-fe/src/__fixtures__/rules.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-custom-emoji.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-cw.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-quotes.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-unordered-mentions.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-with-card.json delete mode 100644 packages/pl-fe/src/__fixtures__/status-with-poll.json delete mode 100644 packages/pl-fe/src/__fixtures__/user.json delete mode 100644 packages/pl-fe/src/actions/accounts.test.ts delete mode 100644 packages/pl-fe/src/actions/compose.test.ts delete mode 100644 packages/pl-fe/src/actions/me.test.ts delete mode 100644 packages/pl-fe/src/actions/notifications.test.ts delete mode 100644 packages/pl-fe/src/actions/preload.test.ts delete mode 100644 packages/pl-fe/src/actions/statuses.test.ts delete mode 100644 packages/pl-fe/src/api/__mocks__/index.ts delete mode 100644 packages/pl-fe/src/api/hooks/groups/use-group.test.ts delete mode 100644 packages/pl-fe/src/api/hooks/groups/use-groups.test.ts delete mode 100644 packages/pl-fe/src/components/account.test.tsx delete mode 100644 packages/pl-fe/src/components/autosuggest-emoji.test.tsx delete mode 100644 packages/pl-fe/src/components/badge.test.tsx delete mode 100644 packages/pl-fe/src/components/polls/poll-footer.test.tsx delete mode 100644 packages/pl-fe/src/components/quoted-status.test.tsx delete mode 100644 packages/pl-fe/src/components/scroll-top-button.test.tsx delete mode 100644 packages/pl-fe/src/components/status.test.tsx delete mode 100644 packages/pl-fe/src/components/statuses/sensitive-content-overlay.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/avatar.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/button/index.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/card.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/column.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/divider.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/emoji.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/form-actions.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/form-group.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/form.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/modal.test.tsx delete mode 100644 packages/pl-fe/src/components/ui/svg-icon.test.tsx delete mode 100644 packages/pl-fe/src/entity-store/reducer.test.ts delete mode 100644 packages/pl-fe/src/features/auth-login/components/captcha.test.tsx delete mode 100644 packages/pl-fe/src/features/auth-login/components/login-form.test.tsx delete mode 100644 packages/pl-fe/src/features/auth-login/components/otp-auth-form.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-list-item.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-message-list.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-pane-header.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-pane/chat-pane.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-search/chat-search.test.tsx delete mode 100644 packages/pl-fe/src/features/chats/components/chat-widget.test.tsx delete mode 100644 packages/pl-fe/src/features/compose/components/polls/duration-selector.test.tsx delete mode 100644 packages/pl-fe/src/features/emoji/index.test.ts delete mode 100644 packages/pl-fe/src/features/emoji/search.test.ts delete mode 100644 packages/pl-fe/src/features/group/components/group-action-button.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-header.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-member-count.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-member-list-item.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-options-button.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-privacy.test.tsx delete mode 100644 packages/pl-fe/src/features/group/components/group-relationship.test.tsx delete mode 100644 packages/pl-fe/src/features/groups/components/discover/group-list-item.test.tsx delete mode 100644 packages/pl-fe/src/features/notifications/components/notifications.test.tsx delete mode 100644 packages/pl-fe/src/features/ui/components/compose-button.test.tsx delete mode 100644 packages/pl-fe/src/features/ui/components/panels/sign-up-panel.test.tsx delete mode 100644 packages/pl-fe/src/features/ui/components/panels/trends-panel.test.tsx delete mode 100644 packages/pl-fe/src/features/ui/components/subscribe-button.test.tsx delete mode 100644 packages/pl-fe/src/hooks/__mocks__/resize-observer.ts delete mode 100644 packages/pl-fe/src/hooks/use-dimensions.test.ts delete mode 100644 packages/pl-fe/src/hooks/use-dimensions.ts delete mode 100644 packages/pl-fe/src/jest/factory.ts delete mode 100644 packages/pl-fe/src/jest/fixtures/chats.json delete mode 100644 packages/pl-fe/src/jest/mock-stores.tsx delete mode 100644 packages/pl-fe/src/jest/test-helpers.tsx delete mode 100644 packages/pl-fe/src/jest/test-setup.ts delete mode 100644 packages/pl-fe/src/modals/unauthorized-modal.test.tsx delete mode 100644 packages/pl-fe/src/pages/auth/login.test.tsx delete mode 100644 packages/pl-fe/src/queries/__mocks__/client.ts delete mode 100644 packages/pl-fe/src/queries/chats.test.ts delete mode 100644 packages/pl-fe/src/queries/trends.test.ts delete mode 100644 packages/pl-fe/src/reducers/admin.test.ts delete mode 100644 packages/pl-fe/src/reducers/auth.test.ts delete mode 100644 packages/pl-fe/src/reducers/compose.test.ts delete mode 100644 packages/pl-fe/src/reducers/contexts.test.ts delete mode 100644 packages/pl-fe/src/reducers/conversations.test.ts delete mode 100644 packages/pl-fe/src/reducers/filters.test.ts delete mode 100644 packages/pl-fe/src/reducers/index.test.ts delete mode 100644 packages/pl-fe/src/reducers/instance.test.ts delete mode 100644 packages/pl-fe/src/reducers/me.test.ts delete mode 100644 packages/pl-fe/src/reducers/meta.test.ts delete mode 100644 packages/pl-fe/src/reducers/push-notifications.test.ts delete mode 100644 packages/pl-fe/src/reducers/statuses.test.ts delete mode 100644 packages/pl-fe/src/reducers/timelines.test.ts delete mode 100644 packages/pl-fe/src/toast.test.tsx delete mode 100644 packages/pl-fe/src/utils/badges.test.ts delete mode 100644 packages/pl-fe/src/utils/base64.test.ts delete mode 100644 packages/pl-fe/src/utils/chats.test.ts delete mode 100644 packages/pl-fe/src/utils/colors.test.ts delete mode 100644 packages/pl-fe/src/utils/comparators.test.ts delete mode 100644 packages/pl-fe/src/utils/config-db.test.ts delete mode 100644 packages/pl-fe/src/utils/emoji-reacts.test.ts delete mode 100644 packages/pl-fe/src/utils/emoji.test.ts delete mode 100644 packages/pl-fe/src/utils/html.test.ts delete mode 100644 packages/pl-fe/src/utils/input.test.ts delete mode 100644 packages/pl-fe/src/utils/media.test.ts delete mode 100644 packages/pl-fe/src/utils/numbers.test.tsx delete mode 100644 packages/pl-fe/src/utils/queries.test.ts delete mode 100644 packages/pl-fe/src/utils/status.test.ts delete mode 100644 packages/pl-fe/src/utils/tailwind.test.ts delete mode 100644 packages/pl-fe/src/utils/timelines.test.ts delete mode 100644 packages/pl-fe/tailwind/colors.test.ts diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 5d3b81e87..53242f48c 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -23,9 +23,6 @@ "preview": "npx vite preview", "audit:fix": "npx yarn-audit-fix", "i18n": "npx formatjs extract 'src/**/*.{ts,tsx}' --ignore '**/*.d.ts' --out-file build/messages.json && npx formatjs compile build/messages.json --out-file src/locales/en.json", - "test": "npx vitest", - "test:coverage": "${npm_execpath} run test --coverage", - "test:all": "${npm_execpath} run test:coverage && ${npm_execpath} run lint", "lint": "${npm_execpath} run lint:js && ${npm_execpath} run lint:sass", "lint:js": "npx eslint --ext .js,.jsx,.cjs,.mjs,.ts,.tsx . --cache", "lint:sass": "npx stylelint src/styles/**/*.scss", @@ -93,7 +90,6 @@ "fuzzysort": "^3.1.0", "graphemesplit": "^2.4.4", "html-react-parser": "^5.2.11", - "immutable": "^5.0.3", "intersection-observer": "^0.12.2", "intl-messageformat": "^10.7.18", "intl-pluralrules": "^2.0.1", @@ -116,7 +112,6 @@ "react-color": "^2.19.3", "react-datepicker": "^8.3.0", "react-dom": "^19.2.3", - "react-error-boundary": "^4.1.2", "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.6.0", "react-inlinesvg": "^4.1.8", @@ -132,8 +127,6 @@ "resize-observer": "^1.0.4", "sass-embedded": "^1.93.3", "stringz": "^2.1.0", - "tabbable": "^6.4.0", - "tiny-queue": "^0.2.1", "use-mutative": "^1.3.1", "util": "^0.12.5", "valibot": "^1.2.0", @@ -142,13 +135,8 @@ }, "devDependencies": { "@formatjs/cli": "^6.9.0", - "@jedmao/redux-mock-store": "^3.0.5", "@sentry/types": "^8.47.0", "@stylistic/eslint-plugin": "^3.1.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.1.0", - "@testing-library/react-hooks": "^8.0.1", - "@testing-library/user-event": "^14.5.2", "@types/dom-chromium-ai": "^0.0.11", "@types/leaflet": "^1.9.15", "@types/lodash": "^4.17.13", @@ -159,7 +147,6 @@ "@types/react-router-dom": "^5.3.3", "@types/react-sparklines": "^1.7.5", "@types/react-swipeable-views": "^0.13.6", - "@types/redux-mock-store": "^1.5.0", "@typescript-eslint/eslint-plugin": "^8.24.1", "@typescript-eslint/parser": "^8.24.0", "@vitejs/plugin-react": "^5.1.3", @@ -174,9 +161,7 @@ "eslint-plugin-react": "^7.37.3", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-tailwindcss": "^3.17.5", - "fake-indexeddb": "^6.0.0", "globals": "^15.14.0", - "jsdom": "^25.0.1", "rollup-plugin-bundle-stats": "^4.21.10", "stylelint": "^16.12.0", "stylelint-config-standard-scss": "^12.0.0", @@ -190,8 +175,7 @@ "vite-plugin-html": "^3.2.2", "vite-plugin-pwa": "^1.2.0", "vite-plugin-require": "^1.2.14", - "vite-plugin-static-copy": "^3.2.0", - "vitest": "^2.1.9" + "vite-plugin-static-copy": "^3.2.0" }, "lint-staged": { "*.{js,cjs,mjs,ts,tsx}": "eslint --cache", diff --git a/packages/pl-fe/src/__fixtures__/account-moved.json b/packages/pl-fe/src/__fixtures__/account-moved.json deleted file mode 100644 index dbb194916..000000000 --- a/packages/pl-fe/src/__fixtures__/account-moved.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "id": "106801667066418367", - "username": "benis911", - "acct": "benis911", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2021-08-22T00:00:00.000Z", - "note": "", - "url": "https://mastodon.social/@benis911", - "avatar": "https://mastodon.social/avatars/original/missing.png", - "avatar_static": "https://mastodon.social/avatars/original/missing.png", - "header": "https://mastodon.social/headers/original/missing.png", - "header_static": "https://mastodon.social/headers/original/missing.png", - "followers_count": 0, - "following_count": 0, - "statuses_count": 5, - "last_status_at": "2022-02-23", - "moved": { - "id": "107945464165013501", - "username": "alex", - "acct": "alex@fedibird.com", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": false, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://mastodon.social/avatars/original/missing.png", - "avatar_static": "https://mastodon.social/avatars/original/missing.png", - "header": "https://mastodon.social/headers/original/missing.png", - "header_static": "https://mastodon.social/headers/original/missing.png", - "followers_count": 1, - "following_count": 1, - "statuses_count": 5, - "last_status_at": null, - "emojis": [], - "fields": [] - }, - "emojis": [], - "fields": [] -} diff --git a/packages/pl-fe/src/__fixtures__/account-with-emojis.json b/packages/pl-fe/src/__fixtures__/account-with-emojis.json deleted file mode 100644 index 19025e150..000000000 --- a/packages/pl-fe/src/__fixtures__/account-with-emojis.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason 😂 :soapbox: :ablobcatrainbow:", - "emojis": [ - { - "shortcode": "ablobcatrainbow", - "static_url": "https://gleasonator.com/emoji/blobcat/ablobcatrainbow.png", - "url": "https://gleasonator.com/emoji/blobcat/ablobcatrainbow.png", - "visible_in_picker": false - }, - { - "shortcode": "soapbox", - "static_url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png", - "url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png", - "visible_in_picker": false - } - ], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox :ablobcatrainbow:", - "value": "https://soapbox.pub :soapbox:" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2476, - "following_count": 1584, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-03-12T16:35:10", - "locked": false, - "note": "I create Fediverse software that empowers people online. :soapbox:

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox :ablobcatrainbow:", - "value": "https://soapbox.pub :soapbox:" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online. :soapbox:\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23674, - "url": "https://gleasonator.com/users/alex", - "username": "alex" -} diff --git a/packages/pl-fe/src/__fixtures__/accounts.json b/packages/pl-fe/src/__fixtures__/accounts.json deleted file mode 100644 index f10880171..000000000 --- a/packages/pl-fe/src/__fixtures__/accounts.json +++ /dev/null @@ -1,182 +0,0 @@ -{ - "9w1HhmenIAKBHJiUs4":{ - "header_static":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "display_name_html":"Alex Gleason", - "bot":false, - "display_name":"Alex Gleason", - "created_at":"2020-06-12T21:47:28.000Z", - "locked":false, - "emojis":[ - - ], - "header":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "url":"https://gleasonator.com/users/alex", - "note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "acct":"alex@gleasonator.com", - "avatar_static":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "username":"alex", - "avatar":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "fields":[ - { - "name":"Website", - "value":"https://alexgleason.me", - "name_emojified":"Website", - "value_emojified":"https://alexgleason.me", - "value_plain":"https://alexgleason.me" - }, - { - "name":"Pleroma+Soapbox", - "value":"https://soapbox.pub", - "name_emojified":"Pleroma+Soapbox", - "value_emojified":"https://soapbox.pub", - "value_plain":"https://soapbox.pub" - }, - { - "name":"Email", - "value":"alex@alexgleason.me", - "name_emojified":"Email", - "value_emojified":"alex@alexgleason.me", - "value_plain":"alex@alexgleason.me" - }, - { - "name":"Gender identity", - "value":"Soyboy", - "name_emojified":"Gender identity", - "value_emojified":"Soyboy", - "value_plain":"Soyboy" - } - ], - "pleroma":{ - "hide_follows":false, - "hide_followers_count":false, - "background_image":null, - "confirmation_pending":false, - "is_moderator":false, - "hide_follows_count":false, - "hide_followers":false, - "relationship":{ - "showing_reblogs":true, - "followed_by":false, - "subscribing":false, - "blocked_by":false, - "requested":false, - "domain_blocking":false, - "following":false, - "endorsed":false, - "blocking":false, - "muting":false, - "id":"9w1HhmenIAKBHJiUs4", - "muting_notifications":false - }, - "tags":[ - - ], - "hide_favorites":true, - "is_admin":false, - "skip_thread_containment":false - }, - "source":{ - "fields":[ - - ], - "note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma":{ - "actor_type":"Person", - "discoverable":false - }, - "sensitive":false - }, - "id":"9w1HhmenIAKBHJiUs4", - "note_emojified":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements." - }, - "9w1HhmenIAKBHJiUs5":{ - "header_static":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "display_name_html":"Alex Gleason", - "bot":false, - "display_name":"Alex Gleason", - "created_at":"2020-06-12T21:47:28.000Z", - "locked":false, - "emojis":[ - - ], - "header":"https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "url":"https://gleasonator.com/users/alex", - "note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "acct":"alex@gleasonator.com", - "avatar_static":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "username":"alex", - "avatar":"https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "fields":[ - { - "name":"Website", - "value":"https://alexgleason.me", - "name_emojified":"Website", - "value_emojified":"https://alexgleason.me", - "value_plain":"https://alexgleason.me" - }, - { - "name":"Pleroma+Soapbox", - "value":"https://soapbox.pub", - "name_emojified":"Pleroma+Soapbox", - "value_emojified":"https://soapbox.pub", - "value_plain":"https://soapbox.pub" - }, - { - "name":"Email", - "value":"alex@alexgleason.me", - "name_emojified":"Email", - "value_emojified":"alex@alexgleason.me", - "value_plain":"alex@alexgleason.me" - }, - { - "name":"Gender identity", - "value":"Soyboy", - "name_emojified":"Gender identity", - "value_emojified":"Soyboy", - "value_plain":"Soyboy" - } - ], - "pleroma":{ - "hide_follows":false, - "hide_followers_count":false, - "background_image":null, - "confirmation_pending":false, - "is_moderator":false, - "hide_follows_count":false, - "hide_followers":false, - "relationship":{ - "showing_reblogs":true, - "followed_by":false, - "subscribing":false, - "blocked_by":false, - "requested":false, - "domain_blocking":false, - "following":false, - "endorsed":false, - "blocking":false, - "muting":false, - "id":"9w1HhmenIAKBHJiUs5", - "muting_notifications":false - }, - "tags":[ - - ], - "hide_favorites":true, - "is_admin":false, - "skip_thread_containment":false - }, - "source":{ - "fields":[ - - ], - "note":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma":{ - "actor_type":"Person", - "discoverable":false - }, - "sensitive":false - }, - "id":"9w1HhmenIAKBHJiUs5", - "note_emojified":"Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements." - } -} diff --git a/packages/pl-fe/src/__fixtures__/accounts_counter_follow.json b/packages/pl-fe/src/__fixtures__/accounts_counter_follow.json deleted file mode 100644 index 52bccc97b..000000000 --- a/packages/pl-fe/src/__fixtures__/accounts_counter_follow.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "9vMAje101ngtjlMj7w": { - "followers_count": 2, - "following_count": 3, - "statuses_count": 2 - } -} diff --git a/packages/pl-fe/src/__fixtures__/accounts_counter_initial.json b/packages/pl-fe/src/__fixtures__/accounts_counter_initial.json deleted file mode 100644 index ce9b3279e..000000000 --- a/packages/pl-fe/src/__fixtures__/accounts_counter_initial.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "9vMAje101ngtjlMj7w": { - "followers_count": 2, - "following_count": 2, - "statuses_count": 2 - } -} diff --git a/packages/pl-fe/src/__fixtures__/accounts_counter_unfollow.json b/packages/pl-fe/src/__fixtures__/accounts_counter_unfollow.json deleted file mode 100644 index 98bbaaafb..000000000 --- a/packages/pl-fe/src/__fixtures__/accounts_counter_unfollow.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "9vMAje101ngtjlMj7w": { - "followers_count": 2, - "following_count": 1, - "statuses_count": 2 - } -} diff --git a/packages/pl-fe/src/__fixtures__/admin_api_frontend_config.json b/packages/pl-fe/src/__fixtures__/admin_api_frontend_config.json deleted file mode 100644 index 311cb3d95..000000000 --- a/packages/pl-fe/src/__fixtures__/admin_api_frontend_config.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "configs": [ - { - "group": ":pleroma", - "key": ":frontend_configurations", - "value": [ - { - "tuple": [ - ":pl_fe", - { - "logo": "blob:http://localhost:3036/0cdfa863-6889-4199-b870-4942cedd364f", - "banner": "blob:http://localhost:3036/a835afed-6078-45bd-92b4-7ffd858c3eca", - "brandColor": "#254f92", - "customCss": [ - "/instance/static/custom.css" - ], - "promoPanel": { - "items": [ - { - "icon": "globe", - "text": "blog", - "url": "https://teci.world/blog" - }, - { - "icon": "globe", - "text": "book", - "url": "https://teci.world/book" - } - ] - }, - "extensions": { - "patron": false - }, - "defaultSettings": { - "autoPlayGif": false - }, - "navlinks": { - "homeFooter": [ - { - "title": "about", - "url": "/instance/about/index.html" - }, - { - "title": "tos", - "url": "/instance/about/tos.html" - } - ] - } - } - ] - } - ] - } - ] -} diff --git a/packages/pl-fe/src/__fixtures__/akkoma-instance.json b/packages/pl-fe/src/__fixtures__/akkoma-instance.json deleted file mode 100644 index a4da0dc94..000000000 --- a/packages/pl-fe/src/__fixtures__/akkoma-instance.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "approval_required": false, - "avatar_upload_limit": 2000000, - "background_image": "https://fe.disroot.org/images/city.jpg", - "background_upload_limit": 4000000, - "banner_upload_limit": 4000000, - "description": "FEDIsroot - Federated social network powered by Pleroma (open beta)", - "description_limit": 5000, - "email": "admin@example.lan", - "languages": [ - "en" - ], - "max_toot_chars": 5000, - "pleroma": { - "metadata": { - "account_activation_required": false, - "features": [ - "pleroma_api", - "akkoma_api", - "mastodon_api", - "mastodon_api_streaming", - "polls", - "v2_suggestions", - "pleroma_explicit_addressing", - "shareable_emoji_packs", - "multifetch", - "pleroma:api/v1/notifications:include_types_filter", - "editing", - "media_proxy", - "relay", - "pleroma_emoji_reactions", - "exposable_reactions", - "profile_directory", - "custom_emoji_reactions", - "pleroma:get:main/ostatus" - ], - "federation": { - "enabled": true, - "exclusions": false, - "mrf_hashtag": { - "federated_timeline_removal": [], - "reject": [], - "sensitive": [ - "nsfw" - ] - }, - "mrf_object_age": { - "actions": [ - "delist", - "strip_followers" - ], - "threshold": 604800 - }, - "mrf_policies": [ - "ObjectAgePolicy", - "TagPolicy", - "HashtagPolicy", - "InlineQuotePolicy" - ], - "quarantined_instances": [], - "quarantined_instances_info": { - "quarantined_instances": {} - } - }, - "fields_limits": { - "max_fields": 10, - "max_remote_fields": 20, - "name_length": 512, - "value_length": 2048 - }, - "post_formats": [ - "text/plain", - "text/html", - "text/markdown", - "text/bbcode", - "text/x.misskeymarkdown" - ], - "privileged_staff": false - }, - "stats": { - "mau": 83 - }, - "vapid_public_key": null - }, - "poll_limits": { - "max_expiration": 31536000, - "max_option_chars": 200, - "max_options": 20, - "min_expiration": 0 - }, - "registrations": false, - "stats": { - "domain_count": 6972, - "status_count": 8081, - "user_count": 357 - }, - "thumbnail": "https://fe.disroot.org/instance/thumbnail.jpeg", - "title": "FEDIsroot", - "upload_limit": 16000000, - "uri": "https://fe.disroot.org", - "urls": { - "streaming_api": "wss://fe.disroot.org" - }, - "version": "2.7.2 (compatible; Akkoma 3.3.1-0-gaf90a4e51)" -} diff --git a/packages/pl-fe/src/__fixtures__/announcements.json b/packages/pl-fe/src/__fixtures__/announcements.json deleted file mode 100644 index 20e1960d0..000000000 --- a/packages/pl-fe/src/__fixtures__/announcements.json +++ /dev/null @@ -1,44 +0,0 @@ -[ - { - "id": "1", - "content": "

Updated to Soapbox v3.

", - "starts_at": null, - "ends_at": null, - "all_day": false, - "published_at": "2022-06-15T18:47:14.190Z", - "updated_at": "2022-06-15T18:47:18.339Z", - "read": true, - "mentions": [], - "statuses": [], - "tags": [], - "emojis": [], - "reactions": [ - { - "name": "📈", - "count": 476, - "me": true - } - ] - }, - { - "id": "2", - "content": "

Rolled back to Soapbox v2 for now.

", - "starts_at": null, - "ends_at": null, - "all_day": false, - "published_at": "2022-07-13T11:11:50.628Z", - "updated_at": "2022-07-13T11:11:50.628Z", - "read": true, - "mentions": [], - "statuses": [], - "tags": [], - "emojis": [], - "reactions": [ - { - "name": "📉", - "count": 420, - "me": false - } - ] - } -] \ No newline at end of file diff --git a/packages/pl-fe/src/__fixtures__/app.json b/packages/pl-fe/src/__fixtures__/app.json deleted file mode 100644 index 18b5ba2b3..000000000 --- a/packages/pl-fe/src/__fixtures__/app.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "vapid_key": "BHczIFh4Wn3Q_7wDgehaB8Ti3Uu8BoyOgXxkOVuEJRuEqxtd9TAno8K9ycz4myiQ1ruiyVfG6xT1JLeXtpxDzUs", - "token_type": "Bearer", - "client_secret": "cm_8Zip_UYyYq1DPQ-CRFUolrz894MmWYUC0aeVcklM", - "redirect_uri": "urn:ietf:wg:oauth:2.0:oob", - "created_at": 1594764335, - "name": "SoapboxFE_2020-07-14T22:05:17.054Z", - "client_id": "bjiy8AxGKXXesfZcyp_iN-uQVE6Cnl03efWoSdOPh9M", - "expires_in": 600, - "scope": "read write follow push admin", - "refresh_token": "IXoCKCsZi3ZCuCjIkeadvEoHRdqOYHklZmv9jvkJ5VA", - "website": null, - "id": "134", - "access_token": "XSkQFSV1R_IvycQmw_uD5z6hQmNyuhh9PtMQbv8TgG8" -} diff --git a/packages/pl-fe/src/__fixtures__/blocks.json b/packages/pl-fe/src/__fixtures__/blocks.json deleted file mode 100644 index 42e8753c5..000000000 --- a/packages/pl-fe/src/__fixtures__/blocks.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "id": "22", - "username": "twoods", - "acct": "twoods", - "display_name": "Tiger Woods" - } -] diff --git a/packages/pl-fe/src/__fixtures__/config_db.json b/packages/pl-fe/src/__fixtures__/config_db.json deleted file mode 100644 index 10e20a3f5..000000000 --- a/packages/pl-fe/src/__fixtures__/config_db.json +++ /dev/null @@ -1,2735 +0,0 @@ -{ - "configs": [ - { - "group": ":phoenix", - "key": ":format_encoders", - "value": [ - { - "tuple": [ - ":json", - "Jason" - ] - } - ] - }, - { - "group": ":phoenix", - "key": ":json_library", - "value": "Jason" - }, - { - "group": ":phoenix", - "key": ":filter_parameters", - "value": [ - "password", - "confirm" - ] - }, - { - "group": ":phoenix", - "key": ":stacktrace_depth", - "value": 20 - }, - { - "group": ":logger", - "key": ":ex_syslogger", - "value": [ - { - "tuple": [ - ":level", - ":debug" - ] - }, - { - "tuple": [ - ":ident", - "pleroma" - ] - }, - { - "tuple": [ - ":format", - "$metadata[$level] $message" - ] - }, - { - "tuple": [ - ":metadata", - [ - ":request_id" - ] - ] - } - ] - }, - { - "group": ":logger", - "key": ":console", - "value": [ - { - "tuple": [ - ":level", - ":debug" - ] - }, - { - "tuple": [ - ":metadata", - [ - ":request_id" - ] - ] - }, - { - "tuple": [ - ":format", - "[$level] $message\n" - ] - } - ] - }, - { - "group": ":floki", - "key": ":html_parser", - "value": "Floki.HTMLParser.FastHtml" - }, - { - "group": ":tzdata", - "key": ":http_client", - "value": "Pleroma.HTTP.Tzdata" - }, - { - "group": ":http_signatures", - "key": ":adapter", - "value": "Pleroma.Signature" - }, - { - "group": ":prometheus", - "key": "Pleroma.Web.Endpoint.MetricsExporter", - "value": [ - { - "tuple": [ - ":path", - "/api/pleroma/app_metrics" - ] - } - ] - }, - { - "group": ":ueberauth", - "key": "Ueberauth", - "value": [ - { - "tuple": [ - ":base_path", - "/oauth" - ] - }, - { - "tuple": [ - ":providers", - [] - ] - } - ] - }, - { - "group": ":esshd", - "key": ":enabled", - "value": false - }, - { - "group": ":cors_plug", - "key": ":max_age", - "value": 86400 - }, - { - "group": ":cors_plug", - "key": ":methods", - "value": [ - "POST", - "PUT", - "DELETE", - "GET", - "PATCH", - "OPTIONS" - ] - }, - { - "group": ":cors_plug", - "key": ":expose", - "value": [ - "Link", - "X-RateLimit-Reset", - "X-RateLimit-Limit", - "X-RateLimit-Remaining", - "X-Request-Id", - "Idempotency-Key" - ] - }, - { - "group": ":cors_plug", - "key": ":credentials", - "value": true - }, - { - "group": ":cors_plug", - "key": ":headers", - "value": [ - "Authorization", - "Content-Type", - "Idempotency-Key" - ] - }, - { - "group": ":mime", - "key": ":types", - "value": { - "application/activity+json": [ - "activity+json" - ], - "application/jrd+json": [ - "jrd+json" - ], - "application/ld+json": [ - "activity+json" - ], - "application/xml": [ - "xml" - ], - "application/xrd+xml": [ - "xrd+xml" - ] - } - }, - { - "group": ":quack", - "key": ":level", - "value": ":warn" - }, - { - "group": ":quack", - "key": ":meta", - "value": [ - ":all" - ] - }, - { - "group": ":quack", - "key": ":webhook_url", - "value": "https://hooks.slack.com/services/YOUR-KEY-HERE" - }, - { - "db": [ - ":subject", - ":public_key", - ":private_key" - ], - "group": ":web_push_encryption", - "key": ":vapid_details", - "value": [ - { - "tuple": [ - ":subject", - "mailto:alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":public_key", - "BAlKFlwdC-9z36ObeNyiIRdGT0luMx-SDEQzrsIRLWvcspqMU7oIhT9HbgTo2gNt8lhtKoOyiQEH9IQqUxwmBp0" - ] - }, - { - "tuple": [ - ":private_key", - "o6y0A1DtjJGURKJ2RH4BLAHuqG8RcD1rDqxrUOo8wIw" - ] - } - ] - }, - { - "group": ":ex_aws", - "key": ":http_client", - "value": "Pleroma.HTTP.ExAws" - }, - { - "db": [ - ":access_key_id", - ":secret_access_key", - ":scheme", - ":host", - ":region" - ], - "group": ":ex_aws", - "key": ":s3", - "value": [ - { - "tuple": [ - ":access_key_id", - "3WJHLX5DH6LQT5NKXKU2" - ] - }, - { - "tuple": [ - ":secret_access_key", - "6Zdlw6XKtmlvvj1to1B25YlEpBAG5ahEs2ExaEqBG4k" - ] - }, - { - "tuple": [ - ":scheme", - "https://" - ] - }, - { - "tuple": [ - ":host", - "sfo2.digitaloceanspaces.com" - ] - }, - { - "tuple": [ - ":region", - "sfo2" - ] - } - ] - }, - { - "db": [ - ":default_signer" - ], - "group": ":joken", - "key": ":default_signer", - "value": "AvRdJr2XiCKeLDrU33rsKA1nTzu1aHypRDpRDCmN00oSHM8+f7Z9BkilF6nWwwv6" - }, - { - "group": ":pleroma", - "key": ":ecto_repos", - "value": [ - "Pleroma.Repo" - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Captcha", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":seconds_valid", - 300 - ] - }, - { - "tuple": [ - ":method", - "Pleroma.Captcha.Native" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Captcha.Kocaptcha", - "value": [ - { - "tuple": [ - ":endpoint", - "https://captcha.kotobank.ch" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":emoji", - "value": [ - { - "tuple": [ - ":shortcode_globs", - [ - "/emoji/custom/**/*.png" - ] - ] - }, - { - "tuple": [ - ":pack_extensions", - [ - ".png", - ".gif" - ] - ] - }, - { - "tuple": [ - ":groups", - [ - { - "tuple": [ - ":Custom", - [ - "/emoji/*.png", - "/emoji/**/*.png" - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":default_manifest", - "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" - ] - }, - { - "tuple": [ - ":shared_pack_cache_seconds_per_file", - 60 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":uri_schemes", - "value": [ - { - "tuple": [ - ":valid_schemes", - [ - "https", - "http", - "dat", - "dweb", - "gopher", - "hyper", - "ipfs", - "ipns", - "irc", - "ircs", - "magnet", - "mailto", - "mumble", - "ssb", - "xmpp" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":http", - "value": [ - { - "tuple": [ - ":proxy_url", - null - ] - }, - { - "tuple": [ - ":send_user_agent", - true - ] - }, - { - "tuple": [ - ":user_agent", - ":default" - ] - }, - { - "tuple": [ - ":adapter", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":welcome", - "value": [ - { - "tuple": [ - ":direct_message", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender_nickname", - null - ] - }, - { - "tuple": [ - ":message", - null - ] - } - ] - ] - }, - { - "tuple": [ - ":chat_message", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender_nickname", - null - ] - }, - { - "tuple": [ - ":message", - null - ] - } - ] - ] - }, - { - "tuple": [ - ":email", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender", - null - ] - }, - { - "tuple": [ - ":subject", - "Welcome to <%= instance_name %>" - ] - }, - { - "tuple": [ - ":html", - "Welcome to <%= instance_name %>" - ] - }, - { - "tuple": [ - ":text", - "Welcome to <%= instance_name %>" - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":feed", - "value": [ - { - "tuple": [ - ":post_title", - { - ":max_length": 100, - ":omission": "..." - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":markup", - "value": [ - { - "tuple": [ - ":allow_inline_images", - true - ] - }, - { - "tuple": [ - ":allow_headings", - false - ] - }, - { - "tuple": [ - ":allow_tables", - false - ] - }, - { - "tuple": [ - ":allow_fonts", - false - ] - }, - { - "tuple": [ - ":scrub_policy", - [ - "Pleroma.HTML.Scrubber.Default", - "Pleroma.HTML.Transform.MediaProxy" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":assets", - "value": [ - { - "tuple": [ - ":mascots", - [ - { - "tuple": [ - ":pleroma_fox_tan", - { - ":mime_type": "image/png", - ":url": "/images/pleroma-fox-tan-smol.png" - } - ] - }, - { - "tuple": [ - ":pleroma_fox_tan_shy", - { - ":mime_type": "image/png", - ":url": "/images/pleroma-fox-tan-shy.png" - } - ] - } - ] - ] - }, - { - "tuple": [ - ":default_mascot", - ":pleroma_fox_tan" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":manifest", - "value": [ - { - "tuple": [ - ":icons", - [ - { - ":src": "/static/logo.png", - ":type": "image/png" - } - ] - ] - }, - { - "tuple": [ - ":theme_color", - "#282c37" - ] - }, - { - "tuple": [ - ":background_color", - "#191b22" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":activitypub", - "value": [ - { - "tuple": [ - ":unfollow_blocked", - true - ] - }, - { - "tuple": [ - ":outgoing_blocks", - true - ] - }, - { - "tuple": [ - ":follow_handshake_timeout", - 500 - ] - }, - { - "tuple": [ - ":note_replies_output_limit", - 5 - ] - }, - { - "tuple": [ - ":sign_object_fetches", - true - ] - }, - { - "tuple": [ - ":authorized_fetch_mode", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":streamer", - "value": [ - { - "tuple": [ - ":workers", - 3 - ] - }, - { - "tuple": [ - ":overflow_workers", - 2 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":user", - "value": [ - { - "tuple": [ - ":deny_follow_blocked", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_normalize_markup", - "value": [ - { - "tuple": [ - ":scrub_policy", - "Pleroma.HTML.Scrubber.Default" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_rejectnonpublic", - "value": [ - { - "tuple": [ - ":allow_followersonly", - false - ] - }, - { - "tuple": [ - ":allow_direct", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_hellthread", - "value": [ - { - "tuple": [ - ":delist_threshold", - 10 - ] - }, - { - "tuple": [ - ":reject_threshold", - 20 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_simple", - "value": [ - { - "tuple": [ - ":media_removal", - [] - ] - }, - { - "tuple": [ - ":media_nsfw", - [] - ] - }, - { - "tuple": [ - ":federated_timeline_removal", - [] - ] - }, - { - "tuple": [ - ":report_removal", - [] - ] - }, - { - "tuple": [ - ":reject", - [] - ] - }, - { - "tuple": [ - ":followers_only", - [] - ] - }, - { - "tuple": [ - ":accept", - [] - ] - }, - { - "tuple": [ - ":avatar_removal", - [] - ] - }, - { - "tuple": [ - ":banner_removal", - [] - ] - }, - { - "tuple": [ - ":reject_deletes", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_keyword", - "value": [ - { - "tuple": [ - ":reject", - [] - ] - }, - { - "tuple": [ - ":federated_timeline_removal", - [] - ] - }, - { - "tuple": [ - ":replace", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_subchain", - "value": [ - { - "tuple": [ - ":match_actor", - {} - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_activity_expiration", - "value": [ - { - "tuple": [ - ":days", - 365 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_vocabulary", - "value": [ - { - "tuple": [ - ":accept", - [] - ] - }, - { - "tuple": [ - ":reject", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_object_age", - "value": [ - { - "tuple": [ - ":threshold", - 604800 - ] - }, - { - "tuple": [ - ":actions", - [ - ":delist", - ":strip_followers" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.MediaProxy.Invalidation.Http", - "value": [ - { - "tuple": [ - ":method", - ":purge" - ] - }, - { - "tuple": [ - ":headers", - [] - ] - }, - { - "tuple": [ - ":options", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.MediaProxy.Invalidation.Script", - "value": [ - { - "tuple": [ - ":script_path", - null - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":chat", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":gopher", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":ip", - { - "tuple": [ - 0, - 0, - 0, - 0 - ] - } - ] - }, - { - "tuple": [ - ":port", - 9999 - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Metadata", - "value": [ - { - "tuple": [ - ":providers", - [ - "Pleroma.Web.Metadata.Providers.OpenGraph", - "Pleroma.Web.Metadata.Providers.TwitterCard", - "Pleroma.Web.Metadata.Providers.RelMe", - "Pleroma.Web.Metadata.Providers.Feed" - ] - ] - }, - { - "tuple": [ - ":unfurl_nsfw", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Preload", - "value": [ - { - "tuple": [ - ":providers", - [ - "Pleroma.Web.Preload.Providers.Instance" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":http_security", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":sts", - false - ] - }, - { - "tuple": [ - ":sts_max_age", - 31536000 - ] - }, - { - "tuple": [ - ":ct_max_age", - 2592000 - ] - }, - { - "tuple": [ - ":referrer_policy", - "same-origin" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.User", - "value": [ - { - "tuple": [ - ":restricted_nicknames", - [ - ".well-known", - "~", - "about", - "activities", - "api", - "auth", - "check_password", - "dev", - "friend-requests", - "inbox", - "internal", - "main", - "media", - "nodeinfo", - "notice", - "oauth", - "objects", - "ostatus_subscribe", - "pleroma", - "proxy", - "push", - "registration", - "relay", - "settings", - "status", - "tag", - "user-search", - "user_exists", - "users", - "web", - "verify_credentials", - "update_credentials", - "relationships", - "search", - "confirmation_resend", - "mfa" - ] - ] - }, - { - "tuple": [ - ":email_blacklist", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Oban", - "value": [ - { - "tuple": [ - ":repo", - "Pleroma.Repo" - ] - }, - { - "tuple": [ - ":log", - false - ] - }, - { - "tuple": [ - ":queues", - [ - { - "tuple": [ - ":activity_expiration", - 10 - ] - }, - { - "tuple": [ - ":federator_incoming", - 50 - ] - }, - { - "tuple": [ - ":federator_outgoing", - 50 - ] - }, - { - "tuple": [ - ":web_push", - 50 - ] - }, - { - "tuple": [ - ":mailer", - 10 - ] - }, - { - "tuple": [ - ":transmogrifier", - 20 - ] - }, - { - "tuple": [ - ":scheduled_activities", - 10 - ] - }, - { - "tuple": [ - ":background", - 5 - ] - }, - { - "tuple": [ - ":remote_fetcher", - 2 - ] - }, - { - "tuple": [ - ":attachments_cleanup", - 5 - ] - }, - { - "tuple": [ - ":new_users_digest", - 1 - ] - } - ] - ] - }, - { - "tuple": [ - ":plugins", - [ - "Oban.Plugins.Pruner" - ] - ] - }, - { - "tuple": [ - ":crontab", - [ - { - "tuple": [ - "0 0 * * *", - "Pleroma.Workers.Cron.ClearOauthTokenWorker" - ] - }, - { - "tuple": [ - "0 * * * *", - "Pleroma.Workers.Cron.StatsWorker" - ] - }, - { - "tuple": [ - "* * * * *", - "Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker" - ] - }, - { - "tuple": [ - "0 0 * * 0", - "Pleroma.Workers.Cron.DigestEmailsWorker" - ] - }, - { - "tuple": [ - "0 0 * * *", - "Pleroma.Workers.Cron.NewUsersDigestWorker" - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":workers", - "value": [ - { - "tuple": [ - ":retries", - [ - { - "tuple": [ - ":federator_incoming", - 5 - ] - }, - { - "tuple": [ - ":federator_outgoing", - 5 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Formatter", - "value": [ - { - "tuple": [ - ":class", - false - ] - }, - { - "tuple": [ - ":rel", - "ugc" - ] - }, - { - "tuple": [ - ":new_window", - false - ] - }, - { - "tuple": [ - ":truncate", - false - ] - }, - { - "tuple": [ - ":strip_prefix", - false - ] - }, - { - "tuple": [ - ":extra", - true - ] - }, - { - "tuple": [ - ":validate_tld", - ":no_scheme" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":ldap", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":host", - "localhost" - ] - }, - { - "tuple": [ - ":port", - 389 - ] - }, - { - "tuple": [ - ":ssl", - false - ] - }, - { - "tuple": [ - ":sslopts", - [] - ] - }, - { - "tuple": [ - ":tls", - false - ] - }, - { - "tuple": [ - ":tlsopts", - [] - ] - }, - { - "tuple": [ - ":base", - "dc=example,dc=com" - ] - }, - { - "tuple": [ - ":uid", - "cn" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":auth", - "value": [ - { - "tuple": [ - ":enforce_oauth_admin_scope_usage", - true - ] - }, - { - "tuple": [ - ":oauth_consumer_strategies", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.UserEmail", - "value": [ - { - "tuple": [ - ":logo", - null - ] - }, - { - "tuple": [ - ":styling", - { - ":background_color": "#2C3645", - ":content_background_color": "#1B2635", - ":header_color": "#d8a070", - ":link_color": "#d8a070", - ":text_color": "#b9b9ba", - ":text_muted_color": "#b9b9ba" - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.NewUsersDigestEmail", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.ScheduledActivity", - "value": [ - { - "tuple": [ - ":daily_user_limit", - 25 - ] - }, - { - "tuple": [ - ":total_user_limit", - 300 - ] - }, - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":email_notifications", - "value": [ - { - "tuple": [ - ":digest", - { - ":active": false, - ":inactivity_threshold": 7, - ":interval": 7 - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":oauth2", - "value": [ - { - "tuple": [ - ":token_expires_in", - 600 - ] - }, - { - "tuple": [ - ":issue_new_refresh_token", - true - ] - }, - { - "tuple": [ - ":clean_expired_tokens", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":rate_limit", - "value": [ - { - "tuple": [ - ":authentication", - { - "tuple": [ - 60000, - 15 - ] - } - ] - }, - { - "tuple": [ - ":timeline", - { - "tuple": [ - 500, - 3 - ] - } - ] - }, - { - "tuple": [ - ":search", - [ - { - "tuple": [ - 1000, - 10 - ] - }, - { - "tuple": [ - 1000, - 30 - ] - } - ] - ] - }, - { - "tuple": [ - ":app_account_creation", - { - "tuple": [ - 1800000, - 25 - ] - } - ] - }, - { - "tuple": [ - ":relations_actions", - { - "tuple": [ - 10000, - 10 - ] - } - ] - }, - { - "tuple": [ - ":relation_id_action", - { - "tuple": [ - 60000, - 2 - ] - } - ] - }, - { - "tuple": [ - ":statuses_actions", - { - "tuple": [ - 10000, - 15 - ] - } - ] - }, - { - "tuple": [ - ":status_id_action", - { - "tuple": [ - 60000, - 3 - ] - } - ] - }, - { - "tuple": [ - ":password_reset", - { - "tuple": [ - 1800000, - 5 - ] - } - ] - }, - { - "tuple": [ - ":account_confirmation_resend", - { - "tuple": [ - 8640000, - 5 - ] - } - ] - }, - { - "tuple": [ - ":ap_routes", - { - "tuple": [ - 60000, - 15 - ] - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.ActivityExpiration", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Plugs.RemoteIp", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":web_cache_ttl", - "value": [ - { - "tuple": [ - ":activity_pub", - null - ] - }, - { - "tuple": [ - ":activity_pub_question", - 30000 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":modules", - "value": [ - { - "tuple": [ - ":runtime_dir", - "instance/modules" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":connections_pool", - "value": [ - { - "tuple": [ - ":reclaim_multiplier", - 0.1 - ] - }, - { - "tuple": [ - ":connection_acquisition_wait", - 250 - ] - }, - { - "tuple": [ - ":connection_acquisition_retries", - 5 - ] - }, - { - "tuple": [ - ":max_connections", - 250 - ] - }, - { - "tuple": [ - ":max_idle_time", - 30000 - ] - }, - { - "tuple": [ - ":retry", - 0 - ] - }, - { - "tuple": [ - ":await_up_timeout", - 5000 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":pools", - "value": [ - { - "tuple": [ - ":federation", - [ - { - "tuple": [ - ":size", - 50 - ] - }, - { - "tuple": [ - ":max_waiting", - 10 - ] - } - ] - ] - }, - { - "tuple": [ - ":media", - [ - { - "tuple": [ - ":size", - 50 - ] - }, - { - "tuple": [ - ":max_waiting", - 10 - ] - } - ] - ] - }, - { - "tuple": [ - ":upload", - [ - { - "tuple": [ - ":size", - 25 - ] - }, - { - "tuple": [ - ":max_waiting", - 5 - ] - } - ] - ] - }, - { - "tuple": [ - ":default", - [ - { - "tuple": [ - ":size", - 10 - ] - }, - { - "tuple": [ - ":max_waiting", - 2 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":hackney_pools", - "value": [ - { - "tuple": [ - ":federation", - [ - { - "tuple": [ - ":max_connections", - 50 - ] - }, - { - "tuple": [ - ":timeout", - 150000 - ] - } - ] - ] - }, - { - "tuple": [ - ":media", - [ - { - "tuple": [ - ":max_connections", - 50 - ] - }, - { - "tuple": [ - ":timeout", - 150000 - ] - } - ] - ] - }, - { - "tuple": [ - ":upload", - [ - { - "tuple": [ - ":max_connections", - 25 - ] - }, - { - "tuple": [ - ":timeout", - 300000 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":restrict_unauthenticated", - "value": [ - { - "tuple": [ - ":timelines", - { - ":federated": ":if_instance_is_private", - ":local": ":if_instance_is_private" - } - ] - }, - { - "tuple": [ - ":profiles", - { - ":local": ":if_instance_is_private", - ":remote": ":if_instance_is_private" - } - ] - }, - { - "tuple": [ - ":activities", - { - ":local": ":if_instance_is_private", - ":remote": ":if_instance_is_private" - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf", - "value": [ - { - "tuple": [ - ":policies", - "Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy" - ] - }, - { - "tuple": [ - ":transparency", - true - ] - }, - { - "tuple": [ - ":transparency_exclusions", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":instances_favicons", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Auth.Authenticator", - "value": "Pleroma.Web.Auth.PleromaAuthenticator" - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.Mailer", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":adapter", - "Swoosh.Adapters.Local" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.ApiSpec.CastAndValidate", - "value": [ - { - "tuple": [ - ":strict", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Uploaders.S3", - "value": [ - { - "tuple": [ - ":streaming_enabled", - true - ] - }, - { - "tuple": [ - ":public_endpoint", - "https://media.gleasonator.com" - ] - }, - { - "tuple": [ - ":bucket", - "gleasonator-media" - ] - } - ] - }, - { - "db": [ - ":enabled" - ], - "group": ":pleroma", - "key": ":static_fe", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "db": [ - ":enabled", - ":redirect_on_failure" - ], - "group": ":pleroma", - "key": ":media_proxy", - "value": [ - { - "tuple": [ - ":invalidation", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":provider", - "Pleroma.Web.MediaProxy.Invalidation.Script" - ] - } - ] - ] - }, - { - "tuple": [ - ":proxy_opts", - [ - { - "tuple": [ - ":redirect_on_failure", - false - ] - }, - { - "tuple": [ - ":max_body_length", - 26214400 - ] - }, - { - "tuple": [ - ":http", - [ - { - "tuple": [ - ":follow_redirect", - true - ] - }, - { - "tuple": [ - ":pool", - ":media" - ] - } - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":whitelist", - [] - ] - }, - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":redirect_on_failure", - true - ] - } - ] - }, - { - "db": [ - ":name", - ":email", - ":notify_email", - ":limit", - ":registrations_open", - ":rewrite_policy", - ":max_pinned_statuses", - ":federating", - ":static_dir" - ], - "group": ":pleroma", - "key": ":instance", - "value": [ - { - "tuple": [ - ":description", - "Pleroma: An efficient and flexible fediverse server" - ] - }, - { - "tuple": [ - ":background_image", - "/images/city.jpg" - ] - }, - { - "tuple": [ - ":instance_thumbnail", - "/instance/thumbnail.jpeg" - ] - }, - { - "tuple": [ - ":description_limit", - 5000 - ] - }, - { - "tuple": [ - ":chat_limit", - 5000 - ] - }, - { - "tuple": [ - ":remote_limit", - 100000 - ] - }, - { - "tuple": [ - ":upload_limit", - 16000000 - ] - }, - { - "tuple": [ - ":avatar_upload_limit", - 2000000 - ] - }, - { - "tuple": [ - ":background_upload_limit", - 4000000 - ] - }, - { - "tuple": [ - ":banner_upload_limit", - 4000000 - ] - }, - { - "tuple": [ - ":poll_limits", - { - ":max_expiration": 31536000, - ":max_option_chars": 200, - ":max_options": 20, - ":min_expiration": 0 - } - ] - }, - { - "tuple": [ - ":invites_enabled", - false - ] - }, - { - "tuple": [ - ":account_activation_required", - false - ] - }, - { - "tuple": [ - ":account_approval_required", - false - ] - }, - { - "tuple": [ - ":federation_incoming_replies_max_depth", - 100 - ] - }, - { - "tuple": [ - ":federation_reachability_timeout_days", - 7 - ] - }, - { - "tuple": [ - ":federation_publisher_modules", - [ - "Pleroma.Web.ActivityPub.Publisher" - ] - ] - }, - { - "tuple": [ - ":allow_relay", - true - ] - }, - { - "tuple": [ - ":public", - true - ] - }, - { - "tuple": [ - ":quarantined_instances", - [] - ] - }, - { - "tuple": [ - ":managed_config", - true - ] - }, - { - "tuple": [ - ":allowed_post_formats", - [ - "text/plain", - "text/html", - "text/markdown", - "text/bbcode" - ] - ] - }, - { - "tuple": [ - ":autofollowed_nicknames", - [] - ] - }, - { - "tuple": [ - ":attachment_links", - false - ] - }, - { - "tuple": [ - ":max_report_comment_size", - 1000 - ] - }, - { - "tuple": [ - ":safe_dm_mentions", - false - ] - }, - { - "tuple": [ - ":healthcheck", - false - ] - }, - { - "tuple": [ - ":remote_post_retention_days", - 90 - ] - }, - { - "tuple": [ - ":skip_thread_containment", - true - ] - }, - { - "tuple": [ - ":limit_to_local_content", - ":unauthenticated" - ] - }, - { - "tuple": [ - ":user_bio_length", - 5000 - ] - }, - { - "tuple": [ - ":user_name_length", - 100 - ] - }, - { - "tuple": [ - ":max_account_fields", - 10 - ] - }, - { - "tuple": [ - ":max_remote_account_fields", - 20 - ] - }, - { - "tuple": [ - ":account_field_name_length", - 512 - ] - }, - { - "tuple": [ - ":account_field_value_length", - 2048 - ] - }, - { - "tuple": [ - ":registration_reason_length", - 500 - ] - }, - { - "tuple": [ - ":external_user_synchronization", - true - ] - }, - { - "tuple": [ - ":extended_nickname_format", - true - ] - }, - { - "tuple": [ - ":cleanup_attachments", - false - ] - }, - { - "tuple": [ - ":multi_factor_authentication", - [ - { - "tuple": [ - ":totp", - [ - { - "tuple": [ - ":digits", - 6 - ] - }, - { - "tuple": [ - ":period", - 30 - ] - } - ] - ] - }, - { - "tuple": [ - ":backup_codes", - [ - { - "tuple": [ - ":number", - 5 - ] - }, - { - "tuple": [ - ":length", - 16 - ] - } - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":show_reactions", - true - ] - }, - { - "tuple": [ - ":name", - "Soapbox FE Demo" - ] - }, - { - "tuple": [ - ":email", - "alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":notify_email", - "alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":limit", - 5000 - ] - }, - { - "tuple": [ - ":registrations_open", - true - ] - }, - { - "tuple": [ - ":rewrite_policy", - "Pleroma.Web.ActivityPub.MRF.SimplePolicy" - ] - }, - { - "tuple": [ - ":max_pinned_statuses", - 10 - ] - }, - { - "tuple": [ - ":federating", - false - ] - }, - { - "tuple": [ - ":static_dir", - "instance/static" - ] - } - ] - }, - { - "db": [ - ":uploads" - ], - "group": ":pleroma", - "key": "Pleroma.Uploaders.Local", - "value": [ - { - "tuple": [ - ":uploads", - "uploads" - ] - } - ] - }, - { - "db": [ - ":parsers" - ], - "group": ":pleroma", - "key": ":rich_media", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":ignore_hosts", - [] - ] - }, - { - "tuple": [ - ":ignore_tld", - [ - "local", - "localdomain", - "lan" - ] - ] - }, - { - "tuple": [ - ":ttl_setters", - [ - "Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl" - ] - ] - }, - { - "tuple": [ - ":parsers", - [ - "Pleroma.Web.RichMedia.Parsers.OEmbed", - "Pleroma.Web.RichMedia.Parsers.TwitterCard" - ] - ] - } - ] - }, - { - "db": [ - ":uploader" - ], - "group": ":pleroma", - "key": "Pleroma.Upload", - "value": [ - { - "tuple": [ - ":filters", - [ - "Pleroma.Upload.Filter.Dedupe" - ] - ] - }, - { - "tuple": [ - ":link_name", - false - ] - }, - { - "tuple": [ - ":proxy_remote", - false - ] - }, - { - "tuple": [ - ":proxy_opts", - [ - { - "tuple": [ - ":redirect_on_failure", - false - ] - }, - { - "tuple": [ - ":max_body_length", - 26214400 - ] - }, - { - "tuple": [ - ":http", - [ - { - "tuple": [ - ":follow_redirect", - true - ] - }, - { - "tuple": [ - ":pool", - ":upload" - ] - } - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":filename_display_max_length", - 30 - ] - }, - { - "tuple": [ - ":uploader", - "Pleroma.Uploaders.Local" - ] - } - ] - }, - { - "db": [ - ":pl_fe" - ], - "group": ":pleroma", - "key": ":frontend_configurations", - "value": [ - { - "tuple": [ - ":pleroma_fe", - { - ":alwaysShowSubjectInput": true, - ":background": "/images/city.jpg", - ":collapseMessageWithSubject": false, - ":disableChat": false, - ":greentext": false, - ":hideFilteredStatuses": false, - ":hideMutedPosts": false, - ":hidePostStats": false, - ":hideSitename": false, - ":hideUserStats": false, - ":loginMethod": "password", - ":logo": "/static/logo.png", - ":logoMargin": ".1em", - ":logoMask": true, - ":minimalScopesMode": false, - ":noAttachmentLinks": false, - ":nsfwCensorImage": "", - ":postContentType": "text/plain", - ":redirectRootLogin": "/main/friends", - ":redirectRootNoLogin": "/main/all", - ":scopeCopy": true, - ":showFeaturesPanel": true, - ":showInstanceSpecificPanel": false, - ":sidebarRight": false, - ":subjectLineBehavior": "email", - ":theme": "pleroma-dark", - ":webPushNotifications": false - } - ] - }, - { - "tuple": [ - ":masto_fe", - { - ":showInstanceSpecificPanel": true - } - ] - }, - { - "tuple": [ - ":pl_fe", - { - "brandColor": "#0e9066", - "copyright": "♥2020. Copying is an act of love. Please copy and share.", - "customCss": [], - "navlinks": { - "homeFooter": [] - }, - "promoPanel": { - "items": [] - } - } - ] - } - ] - } - ], - "need_reboot": false -} diff --git a/packages/pl-fe/src/__fixtures__/fedibird-account.json b/packages/pl-fe/src/__fixtures__/fedibird-account.json deleted file mode 100644 index 07bbd7057..000000000 --- a/packages/pl-fe/src/__fixtures__/fedibird-account.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "cat": false, - "discoverable": false, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 1, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 5, - "last_status_at": "2022-02-20", - "emojis": [], - "fields": [], - "other_settings": { - "birthday": "1993-07-03", - "location": "Texas, USA", - "noindex": false, - "hide_network": false, - "hide_statuses_count": false, - "hide_following_count": false, - "hide_followers_count": false, - "enable_reaction": true - } -} diff --git a/packages/pl-fe/src/__fixtures__/fedibird-instance.json b/packages/pl-fe/src/__fixtures__/fedibird-instance.json deleted file mode 100644 index 31e17e34e..000000000 --- a/packages/pl-fe/src/__fixtures__/fedibird-instance.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "uri": "fedibird.com", - "title": "Fedibird", - "short_description": "多くの独自機能を備えた、連合志向の汎用Mastodonサーバです。Fediverseの活動拠点としてご利用ください。", - "description": "多くの独自機能を備えた、連合志向の汎用Mastodonサーバです。Fediverseの活動拠点としてご利用ください。", - "email": "support@fedibird.com", - "version": "3.4.1", - "urls": { - "streaming_api": "wss://fedibird.com" - }, - "stats": { - "user_count": 1964, - "status_count": 4590304, - "domain_count": 9024 - }, - "thumbnail": "https://s3.fedibird.com/site_uploads/files/000/000/001/original/fedibird_hero_image.png", - "languages": [ - "ja" - ], - "registrations": true, - "approval_required": false, - "invites_enabled": true, - "configuration": { - "statuses": { - "max_characters": 500, - "max_media_attachments": 4, - "characters_reserved_per_url": 23, - "min_expiration": 60, - "max_expiration": 37152000, - "supported_expires_actions": [ - "delete", - "mark" - ] - }, - "media_attachments": { - "supported_mime_types": [ - "image/jpeg", - "image/png", - "image/gif", - "image/webp", - "image/heif", - "image/heic", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/ogg", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ], - "image_size_limit": 10485760, - "image_matrix_limit": 16777216, - "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 2304000 - }, - "polls": { - "max_options": 4, - "max_characters_per_option": 50, - "min_expiration": 300, - "max_expiration": 2629746 - }, - "emoji_reactions": { - "max_reactions": 20 - } - }, - "feature_quote": true, - "fedibird_capabilities": [ - "favourite_hashtag", - "favourite_domain", - "favourite_list", - "status_expire", - "follow_no_delivery", - "follow_hashtag", - "subscribe_account", - "subscribe_domain", - "subscribe_keyword", - "timeline_home_visibility", - "timeline_no_local", - "timeline_domain", - "timeline_group", - "timeline_group_directory", - "visibility_mutual", - "visibility_limited", - "emoji_reaction", - "misskey_birthday", - "misskey_location" - ], - "contact_account": { - "id": "1", - "username": "noellabo", - "acct": "noellabo", - "display_name": "のえる", - "locked": false, - "bot": false, - "cat": false, - "discoverable": true, - "group": false, - "created_at": "2019-08-15T00:00:00.000Z", - "note": "

主に、Fediverseへの関心に基づいた投稿を行うアカウントです。DTP・印刷に関する話をしたり、同人の話をしたり、カレーをブーストしたりします。

Mastodonサーバ『Fedibird』の管理者アカウントでもあります。ご連絡は当アカウントへ、サーバインフォメーションについては https://fedibird.com/about/more@info を参照してください。

", - "url": "https://fedibird.com/@noellabo", - "avatar": "https://s3.fedibird.com/accounts/avatars/000/000/001/original/6ef3b7f18f726755.png", - "avatar_static": "https://s3.fedibird.com/accounts/avatars/000/000/001/original/6ef3b7f18f726755.png", - "header": "https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg", - "header_static": "https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg", - "followers_count": 1560, - "following_count": 758, - "subscribing_count": 121, - "statuses_count": 61325, - "last_status_at": "2022-02-24", - "emojis": [ - { - "shortcode": "liberapay", - "url": "https://s3.fedibird.com/custom_emojis/images/000/025/634/original/5b8620742973f844.png", - "static_url": "https://s3.fedibird.com/custom_emojis/images/000/025/634/static/5b8620742973f844.png", - "visible_in_picker": true - }, - { - "shortcode": "mastodon", - "url": "https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png", - "static_url": "https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png", - "visible_in_picker": true - } - ], - "fields": [ - { - "name": ":liberapay: Liberapay", - "value": "https://liberapay.com/noellabo", - "verified_at": "2020-10-22T03:04:43.206+00:00" - }, - { - "name": ":mastodon: DTP-Mstdn.jp", - "value": "https://dtp-mstdn.jp/@noellabo", - "verified_at": "2020-05-23T00:14:02.232+00:00" - }, - { - "name": "別宅", - "value": "https://gorone.xyz/@noellabo", - "verified_at": "2021-08-11T07:48:53.479+00:00" - }, - { - "name": "bluesky community", - "value": "https://mastodon.blueskycommunity.net/@noellabo", - "verified_at": "2021-11-13T04:28:30.593+00:00" - } - ], - "other_settings": { - "birthday": null, - "location": "埼玉県", - "cat_ears_color": "#d5c5c0", - "noindex": false, - "hide_network": false, - "hide_statuses_count": false, - "hide_following_count": false, - "hide_followers_count": false, - "enable_reaction": true - } - }, - "rules": [ - { - "id": "2", - "text": "日本の法律と社会規範に従った行動を心がけてください" - }, - { - "id": "3", - "text": "不快や脅威に対してはブロック・ミュート・フィルターで距離をとってください" - }, - { - "id": "1", - "text": "投稿する際は、適切な公開範囲・CW・閲覧注意を使用してください" - } - ] -} diff --git a/packages/pl-fe/src/__fixtures__/fedibird-quote-of-quote-post.json b/packages/pl-fe/src/__fixtures__/fedibird-quote-of-quote-post.json deleted file mode 100644 index c00c81860..000000000 --- a/packages/pl-fe/src/__fixtures__/fedibird-quote-of-quote-post.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "id": "107673570598783346", - "created_at": "2022-01-23T20:05:01.372Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "https://fedibird.com/users/alex/statuses/107673570598783346", - "url": "https://fedibird.com/@alex/107673570598783346", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "emoji_reactions_count": 0, - "emoji_reactions": [], - "content": "

test quote of a quote
QT: https://fedibird.com/@alex/107673570082615319

", - "quote_id": "107673570082615319", - "reblog": null, - "application": { - "name": "Web", - "website": null - }, - "account": { - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 0, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 3, - "last_status_at": "2022-01-23", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null, - "quote": { - "id": "107673570082615319", - "created_at": "2022-01-23T20:04:53.494Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "https://fedibird.com/users/alex/statuses/107673570082615319", - "url": "https://fedibird.com/@alex/107673570082615319", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "emoji_reactions_count": 0, - "emoji_reactions": [], - "content": "

test quote
QT: https://fedibird.com/@alex/107673569214329435

", - "quote_id": "107673569214329435", - "quote": null, - "reblog": null, - "application": { - "name": "Web", - "website": null - }, - "account": { - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 0, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 3, - "last_status_at": "2022-01-23", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null - } -} diff --git a/packages/pl-fe/src/__fixtures__/fedibird-quote-post.json b/packages/pl-fe/src/__fixtures__/fedibird-quote-post.json deleted file mode 100644 index 610ab45c6..000000000 --- a/packages/pl-fe/src/__fixtures__/fedibird-quote-post.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "id": "107673570082615319", - "created_at": "2022-01-23T20:04:53.494Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "https://fedibird.com/users/alex/statuses/107673570082615319", - "url": "https://fedibird.com/@alex/107673570082615319", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "emoji_reactions_count": 0, - "emoji_reactions": [], - "content": "

test quote
QT: https://fedibird.com/@alex/107673569214329435

", - "quote_id": "107673569214329435", - "reblog": null, - "application": { - "name": "Web", - "website": null - }, - "account": { - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 0, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 3, - "last_status_at": "2022-01-23", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null, - "quote": { - "id": "107673569214329435", - "created_at": "2022-01-23T20:04:40.249Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "https://fedibird.com/users/alex/statuses/107673569214329435", - "url": "https://fedibird.com/@alex/107673569214329435", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "emoji_reactions_count": 0, - "emoji_reactions": [], - "content": "

test post

", - "quote": null, - "reblog": null, - "application": { - "name": "Web", - "website": null - }, - "account": { - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 0, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 3, - "last_status_at": "2022-01-23", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null - } -} diff --git a/packages/pl-fe/src/__fixtures__/friendica-instance.json b/packages/pl-fe/src/__fixtures__/friendica-instance.json deleted file mode 100644 index cb6902d1f..000000000 --- a/packages/pl-fe/src/__fixtures__/friendica-instance.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "uri": "https://ica.mkljczk.pl", - "title": "Friendica Social Network", - "short_description": "", - "description": "", - "email": "me@mkljczk.pl", - "version": "2022.05-dev", - "urls": null, - "stats": { - "user_count": 0, - "status_count": 0, - "domain_count": 0 - }, - "thumbnail": "https://ica.mkljczk.plimages/friendica-32.png", - "languages": [ - "pl" - ], - "max_toot_chars": 200000, - "registrations": true, - "approval_required": false, - "invites_enabled": false, - "contact_account": { - "id": "2", - "username": "nofriend", - "acct": "nofriend", - "display_name": "marcin mikołajczak", - "locked": true, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2022-02-19T14:51:00.000Z", - "note": "", - "url": "https://ica.mkljczk.pl/profile/nofriend", - "avatar": "https://ica.mkljczk.pl/photo/contact/300/68a16c11-1262-1103-d40b-806159848009?ts=1645292106", - "avatar_static": "https://ica.mkljczk.pl/photo/contact/300/68a16c11-1262-1103-d40b-806159848009?ts=1645292106", - "header": "https://ica.mkljczk.pl/photo/header/68a16c11-1262-1103-d40b-806159848009?ts=1645292106", - "header_static": "https://ica.mkljczk.pl/photo/header/68a16c11-1262-1103-d40b-806159848009?ts=1645292106", - "followers_count": 0, - "following_count": 1, - "statuses_count": 0, - "last_status_at": "2022-02-20", - "emojis": [], - "fields": [] - }, - "rules": [] -} diff --git a/packages/pl-fe/src/__fixtures__/friendica-status.json b/packages/pl-fe/src/__fixtures__/friendica-status.json deleted file mode 100644 index fc64e430e..000000000 --- a/packages/pl-fe/src/__fixtures__/friendica-status.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "id": "106", - "created_at": "2022-02-19T18:19:40.000Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "fa", - "uri": "https://ica.mkljczk.pl/objects/68a16c11-4262-1134-bc4e-0db298374337", - "url": "https://ica.mkljczk.pl/display/68a16c11-4262-1134-bc4e-0db298374337", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "favourited": false, - "reblogged": false, - "muted": false, - "bookmarked": true, - "content": "Hello to Friendica from fe.soapbox.pub!", - "reblog": null, - "application": { - "name": "Soapbox FE" - }, - "account": { - "id": "95", - "username": "alex", - "acct": "alex", - "display_name": "Alex Gleason", - "locked": true, - "bot": false, - "discoverable": false, - "group": false, - "created_at": "2022-02-19T18:17:43.000Z", - "note": "", - "url": "https://ica.mkljczk.pl/profile/alex", - "avatar": "https://ica.mkljczk.pl/photo/contact/300/68a16c11-1862-1134-4779-f98088458845?ts=1645294804", - "avatar_static": "https://ica.mkljczk.pl/photo/contact/300/68a16c11-1862-1134-4779-f98088458845?ts=1645294804", - "header": "https://ica.mkljczk.pl/photo/header/68a16c11-1862-1134-4779-f98088458845?ts=1645294804", - "header_static": "https://ica.mkljczk.pl/photo/header/68a16c11-1862-1134-4779-f98088458845?ts=1645294804", - "followers_count": 0, - "following_count": 0, - "statuses_count": 2, - "last_status_at": "2022-02-19", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null -} diff --git a/packages/pl-fe/src/__fixtures__/gotosocial-account.json b/packages/pl-fe/src/__fixtures__/gotosocial-account.json deleted file mode 100644 index 3700bc473..000000000 --- a/packages/pl-fe/src/__fixtures__/gotosocial-account.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "00YSECR4P7E64BD5MBA639PRVT", - "username": "alex", - "acct": "alex", - "display_name": "Alex Gleason", - "locked": false, - "bot": false, - "created_at": "2022-02-23T22:43:55Z", - "note": "

My GoToSocial profile

", - "url": "http://localhost/@alex", - "avatar": "", - "avatar_static": "", - "header": "", - "header_static": "", - "followers_count": 0, - "following_count": 0, - "statuses_count": 1, - "last_status_at": "2022-02-23T22:54:14Z", - "emojis": [], - "fields": [], - "source": { - "privacy": "unlisted", - "language": "en", - "note": "

My GoToSocial profile

", - "fields": [] - } -} diff --git a/packages/pl-fe/src/__fixtures__/gotosocial-instance.json b/packages/pl-fe/src/__fixtures__/gotosocial-instance.json deleted file mode 100644 index fdaf4c96b..000000000 --- a/packages/pl-fe/src/__fixtures__/gotosocial-instance.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "uri": "http://localhost", - "title": "localhost", - "description": "", - "short_description": "", - "email": "", - "version": "0.2.0 31935ee", - "registrations": true, - "approval_required": true, - "invites_enabled": false, - "urls": { - "streaming_api": "wss://localhost" - }, - "stats": { - "domain_count": 0, - "status_count": 1, - "user_count": 1 - }, - "thumbnail": "", - "contact_account": { - "id": "", - "username": "", - "acct": "", - "display_name": "", - "locked": false, - "bot": false, - "created_at": "", - "note": "", - "url": "", - "avatar": "", - "avatar_static": "", - "header": "", - "header_static": "", - "followers_count": 0, - "following_count": 0, - "statuses_count": 0, - "last_status_at": "", - "emojis": null, - "fields": null - }, - "max_toot_chars": 5000 -} diff --git a/packages/pl-fe/src/__fixtures__/gotosocial-status.json b/packages/pl-fe/src/__fixtures__/gotosocial-status.json deleted file mode 100644 index 3546482b2..000000000 --- a/packages/pl-fe/src/__fixtures__/gotosocial-status.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "id": "01FWMCNM07GGDV8HF40NZ9YTGR", - "created_at": "2022-02-23T22:54:14Z", - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "http://localhost/users/alex/statuses/01FWMCNM07GGDV8HF40NZ9YTGR", - "url": "http://localhost/@alex/statuses/01FWMCNM07GGDV8HF40NZ9YTGR", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "favourited": false, - "reblogged": false, - "muted": false, - "bookmarked": false, - "content": "

Hello GoToSocial!

", - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "account": { - "id": "00YSECR4P7E64BD5MBA639PRVT", - "username": "alex", - "acct": "alex", - "display_name": "alex", - "locked": false, - "bot": false, - "created_at": "2022-02-23T22:43:55Z", - "note": "", - "url": "http://localhost/@alex", - "avatar": "", - "avatar_static": "", - "header": "", - "header_static": "", - "followers_count": 0, - "following_count": 0, - "statuses_count": 1, - "last_status_at": "2022-02-23T22:54:14Z", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null, - "text": "Hello GoToSocial!" -} diff --git a/packages/pl-fe/src/__fixtures__/group-truthsocial.json b/packages/pl-fe/src/__fixtures__/group-truthsocial.json deleted file mode 100644 index 63d8b14d5..000000000 --- a/packages/pl-fe/src/__fixtures__/group-truthsocial.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "avatar": "https://media.covfefe.social/groups/avatars/109/989/480/368/015/378/original/50b0d899bc5aae13.jpg", - "avatar_static": "https://media.covfefe.social/groups/avatars/109/989/480/368/015/378/original/50b0d899bc5aae13.jpg", - "created_at": "2023-03-08T00:00:00.000Z", - "discoverable": true, - "display_name": "PATRIOT PATRIOTS", - "domain": null, - "group_visibility": "everyone", - "header": "https://media.covfefe.social/groups/headers/109/989/480/368/015/378/original/c5063b59f919cd4a.png", - "header_static": "https://media.covfefe.social/groups/headers/109/989/480/368/015/378/original/c5063b59f919cd4a.png", - "id": "109989480368015378", - "members_count": 1, - "membership_required": true, - "note": "patriots 900000001", - "owner": { - "id": "424023483294040" - }, - "tags": [] -} \ No newline at end of file diff --git a/packages/pl-fe/src/__fixtures__/intlMessages.json b/packages/pl-fe/src/__fixtures__/intlMessages.json deleted file mode 100644 index e2bd3bd56..000000000 --- a/packages/pl-fe/src/__fixtures__/intlMessages.json +++ /dev/null @@ -1,962 +0,0 @@ -{ - "default": { - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", - "account.follows.empty": "This user doesn\"t follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide reposts from @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "account.login": "Log in", - "account.media": "Media", - "account.member_since": "Joined {date}", - "account.mention": "Mention", - "account.message": "Message", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Posts", - "account.posts_with_replies": "Posts and replies", - "account.profile": "Profile", - "account.register": "Sign up", - "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}\"s profile", - "account.show_reblogs": "Show reposts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unendorse": "Don\"t feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account_gallery.none": "No media to show.", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "audio.close": "Close audio", - "audio.expand": "Expand audio", - "audio.hide": "Hide audio", - "audio.mute": "Mute", - "audio.pause": "Pause", - "audio.play": "Play", - "audio.unmute": "Unmute", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this page.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this page.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.edit_profile": "Edit profile", - "column.filters": "Muted words", - "column.follow_requests": "Follow requests", - "column.groups": "Groups", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Alerts", - "column.preferences": "Preferences", - "column.public": "Federated timeline", - "column.security": "Security", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.show_settings": "Show settings", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This post will only be sent to the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This post won\"t be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What\"s on your mind?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", - "compose_form.poll.remove_option": "Delete", - "compose_form.poll.type.hint": "Click to toggle poll type. Radio button (default) is single. Checkbox is multiple.", - "compose_form.publish": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Mark media as sensitive", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.block_and_report": "Block & Report", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this post?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications.", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and reposts will be lost, and replies to the original post will be orphaned.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "donate": "Donate", - "edit_profile.fields.avatar_label": "Avatar", - "edit_profile.fields.bio_label": "Bio", - "edit_profile.fields.bot_label": "This is a bot account", - "edit_profile.fields.display_name_label": "Display name", - "edit_profile.fields.header_label": "Header", - "edit_profile.fields.locked_label": "Lock account", - "edit_profile.fields.meta_fields.content_placeholder": "Content", - "edit_profile.fields.meta_fields.label_placeholder": "Label", - "edit_profile.fields.meta_fields_label": "Profile metadata", - "edit_profile.hints.avatar": "PNG, GIF or JPG. Will be downscaled to {size}", - "edit_profile.hints.bot": "This account mainly performs automated actions and might not be monitored", - "edit_profile.hints.header": "PNG, GIF or JPG. Will be downscaled to {size}", - "edit_profile.hints.locked": "Requires you to manually approve followers", - "edit_profile.hints.meta_fields": "You can have up to {count, plural, one {# item} other {# items}} displayed as a table on your profile", - "edit_profile.save": "Save", - "embed.instructions": "Embed this post on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_timeline": "No posts here!", - "empty_column.account_unavailable": "Profile unavailable", - "empty_column.blocks": "You haven\"t blocked any users yet.", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don\"t have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don\"t have any liked posts yet. When you like one, it will show up here.", - "empty_column.favourites": "No one has liked this post yet. When someone does, they will show up here.", - "empty_column.filters": "You haven\"t created any muted words yet.", - "empty_column.follow_requests": "You don\"t have any follow requests yet. When you receive one, it will show up here.", - "empty_column.group": "There is nothing in this group yet. When members of this group make new posts, they will appear here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Or you can visit {public} to get started and meet other users.", - "empty_column.home.local_tab": "the {site_title} tab", - "empty_column.list": "There is nothing in this list yet. When members of this list create new posts, they will appear here.", - "empty_column.lists": "You don\"t have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven\"t muted any users yet.", - "empty_column.notifications": "You don\"t have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "fediverse_tab.explanation_box.explanation": "{site_title} is part of the Fediverse, a social network made up of thousands of independent social media sites (aka 'servers'). The posts you see here are from 3rd-party servers. You have the freedom to engage with them, or to block any server you don\"t like. Pay attention to the full username after the second @ symbol to know which server a post is from. To see only {site_title} posts, visit {local}.", - "fediverse_tab.explanation_box.title": "What is the Fediverse?", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.heading": "Getting started", - "getting_started.open_source_notice": "{code_name} is open source software. You can contribute or report issues at {code_link} (v{code_version}).", - "group.members.empty": "This group does not has any members.", - "group.removed_accounts.empty": "This group does not has any removed accounts.", - "groups.card.join": "Join", - "groups.card.members": "Members", - "groups.card.roles.admin": "You\"re an admin", - "groups.card.roles.member": "You\"re a member", - "groups.card.view": "View", - "groups.create": "Create group", - "groups.form.coverImage": "Upload new banner image (optional)", - "groups.form.coverImageChange": "Banner image selected", - "groups.form.create": "Create group", - "groups.form.description": "Description", - "groups.form.title": "Title", - "groups.form.update": "Update group", - "groups.removed_accounts": "Removed Accounts", - "groups.tab_admin": "Manage", - "groups.tab_featured": "Featured", - "groups.tab_member": "Member", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "home.column_settings.basic": "Basic", - "home.column_settings.show_reblogs": "Show reposts", - "home.column_settings.show_replies": "Show replies", - "home_column.lists": "Lists", - "home_column_header.fediverse": "Fediverse", - "home_column_header.home": "Home", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to repost", - "keyboard_shortcuts.column": "to focus a post in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open post", - "keyboard_shortcuts.favourite": "to like", - "keyboard_shortcuts.favourites": "to open likes list", - "keyboard_shortcuts.heading": "Keyboard shortcuts", - "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned posts list", - "keyboard_shortcuts.profile": "to open author\"s profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.start": "to open 'get started' column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.toot": "to start a new post", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", - "lightbox.close": "Close", - "lightbox.next": "Next", - "lightbox.previous": "Previous", - "lightbox.view_context": "View context", - "list.click_to_add": "Click here to add people", - "list_adder.header_title": "Add or Remove from Lists", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.edit.submit": "Change title", - "lists.new.create": "Add list", - "lists.new.create_title": "Add list", - "lists.new.save_title": "Save Title", - "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "lists.view_all": "View all lists", - "loading_indicator.label": "Loading...", - "login.fields.password_placeholder": "Password", - "login.fields.username_placeholder": "Username", - "login.log_in": "Log in", - "login.reset_password_hint": "Trouble logging in?", - "media_gallery.toggle_visible": "Hide", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "morefollows.followers_label": "…and {count} more {count, plural, one {follower} other {followers}} on remote sites.", - "morefollows.following_label": "…and {count} more {count, plural, one {follow} other {follows}} on remote sites.", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.admin_settings": "Admin settings", - "navigation_bar.plfe_config": "Soapbox config", - "navigation_bar.blocks": "Blocked users", - "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new post", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Likes", - "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "About this server", - "navigation_bar.keyboard_shortcuts": "Hotkeys", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.messages": "Messages", - "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned posts", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", - "notification.pleroma:emoji_reaction": "{name} reacted to your post", - "notification.favourite": "{name} liked your post", - "notification.follow": "{name} followed you", - "notification.mention": "{name} mentioned you", - "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} reposted your post", - "notifications.clear": "Clear notifications", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Likes:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.poll": "Poll results:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.reblog": "Reposts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Reposts", - "notifications.filter.favourites": "Likes", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", - "notifications.group": "{count} notifications", - "notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}", - "pinned_statuses.none": "No pins to show.", - "poll.closed": "Closed", - "poll.refresh": "Refresh", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", - "preferences.fields.auto_play_gif_label": "Auto-play animated GIFs", - "preferences.fields.auto_play_video_label": "Auto-play videos", - "preferences.fields.boost_modal_label": "Show confirmation dialog before reposting", - "preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post", - "preferences.fields.demetricator_label": "Use Demetricator", - "preferences.fields.dyslexic_font_label": "Dyslexic mode", - "preferences.fields.expand_spoilers_label": "Always expand posts marked with content warnings", - "preferences.fields.language_label": "Language", - "preferences.fields.privacy_label": "Post privacy", - "preferences.fields.reduce_motion_label": "Reduce motion in animations", - "preferences.fields.system_font_label": "Use system\"s default font", - "preferences.fields.theme_label": "Theme", - "preferences.fields.unfollow_modal_label": "Show confirmation dialog before unfollowing someone", - "preferences.hints.demetricator": "Decrease social media anxiety by hiding all numbers from the site.", - "preferences.hints.privacy_followers_only": "Only show to followers", - "preferences.hints.privacy_public": "Everyone can see", - "preferences.hints.privacy_unlisted": "Everyone can see, but not listed on public timelines", - "preferences.options.privacy_followers_only": "Followers-only", - "preferences.options.privacy_public": "Public", - "preferences.options.privacy_unlisted": "Unlisted", - "preferences.options.theme_dark": "Dark", - "preferences.options.theme_light": "Light", - "privacy.change": "Adjust post privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Post to public timelines", - "privacy.public.short": "Public", - "privacy.unlisted.long": "Do not post to public timelines", - "privacy.unlisted.short": "Unlisted", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", - "registration.agreement": "I agree to the {tos}.", - "registration.fields.confirm_placeholder": "Password (again)", - "registration.fields.email_placeholder": "E-Mail address", - "registration.fields.password_placeholder": "Password", - "registration.fields.username_placeholder": "Username", - "registration.lead": "With an account on {instance} you\"ll be able to follow people on any server in the fediverse.", - "registration.sign_up": "Sign up", - "registration.tos": "Terms of Service", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", - "relative_time.just_now": "now", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", - "report.block": "Block {target}", - "report.block_hint": "Do you also want to block this account?", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send a copy of the report there as well?", - "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", - "report.submit": "Submit", - "report.target": "Reporting {target}", - "search.placeholder": "Search", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns posts you have written, favorited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "post", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Posts", - "search_results.top": "Top", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "security.fields.email.label": "Email address", - "security.fields.new_password.label": "New password", - "security.fields.old_password.label": "Current password", - "security.fields.password.label": "Password", - "security.fields.password_confirmation.label": "New password (again)", - "security.headers.tokens": "Sessions", - "security.headers.update_email": "Change Email", - "security.headers.update_password": "Change Password", - "security.submit": "Save changes", - "security.tokens.revoke": "Revoke", - "security.update_email.fail": "Update email failed.", - "security.update_email.success": "Email successfully updated.", - "security.update_password.fail": "Update password failed.", - "security.update_password.success": "Password successfully updated.", - "signup_panel.subtitle": "Sign up now to discuss what's happening.", - "signup_panel.title": "New to {site_title}?", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this post in the moderation interface", - "status.block": "Block @{name}", - "status.cancel_reblog_private": "Un-repost", - "status.cannot_reblog": "This post cannot be reposted", - "status.copy": "Copy link to post", - "status.delete": "Delete", - "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", - "status.favourite": "Like", - "status.filtered": "Filtered", - "status.load_more": "Load more", - "status.media_hidden": "Media hidden", - "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", - "status.open": "Expand this post", - "status.pin": "Pin on profile", - "status.pinned": "Pinned post", - "status.read_more": "Read more", - "status.reblog": "Repost", - "status.reblog_private": "Repost to original audience", - "status.reblogged_by": "{name} reposted", - "status.reblogs.empty": "No one has reposted this post yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.remove_account_from_group": "Remove account from group", - "status.remove_post_from_group": "Remove post from group", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", - "status.report": "Report @{name}", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "status_list.queue_label": "Click to see {count} new {count, plural, one {post} other {posts}}", - "suggestions.dismiss": "Dismiss suggestion", - "tabs_bar.apps": "Apps", - "tabs_bar.home": "Home", - "tabs_bar.news": "News", - "tabs_bar.notifications": "Alerts", - "tabs_bar.post": "Post", - "tabs_bar.search": "Search", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.title": "Trends", - "ui.beforeunload": "Your draft will be lost if you leave.", - "unauthorized_modal.footer": "Already have an account? {login}.", - "unauthorized_modal.text": "You need to be logged in to do that.", - "unauthorized_modal.title": "Sign up for {site_title}", - "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media attachment", - "upload_error.limit": "File upload limit exceeded.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Change preview", - "upload_form.undo": "Delete", - "upload_progress.label": "Uploading...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound", - "who_to_follow.title": "Who To Follow" - }, - "account.add_or_remove_from_list": "Add or Remove from lists", - "account.badges.bot": "Bot", - "account.block": "Block @{name}", - "account.block_domain": "Hide everything from {domain}", - "account.blocked": "Blocked", - "account.direct": "Direct message @{name}", - "account.domain_blocked": "Domain hidden", - "account.edit_profile": "Edit profile", - "account.endorse": "Feature on profile", - "account.follow": "Follow", - "account.followers": "Followers", - "account.followers.empty": "No one follows this user yet.", - "account.follows": "Follows", - "account.follows.empty": "This user doesn\"t follow anyone yet.", - "account.follows_you": "Follows you", - "account.hide_reblogs": "Hide reposts from @{name}", - "account.link_verified_on": "Ownership of this link was checked on {date}", - "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.", - "account.login": "Log in", - "account.media": "Media", - "account.member_since": "Joined {date}", - "account.mention": "Mention", - "account.message": "Message", - "account.moved_to": "{name} has moved to:", - "account.mute": "Mute @{name}", - "account.mute_notifications": "Mute notifications from @{name}", - "account.muted": "Muted", - "account.posts": "Posts", - "account.posts_with_replies": "Posts and replies", - "account.profile": "Profile", - "account.register": "Sign up", - "account.report": "Report @{name}", - "account.requested": "Awaiting approval. Click to cancel follow request", - "account.share": "Share @{name}\"s profile", - "account.show_reblogs": "Show reposts from @{name}", - "account.unblock": "Unblock @{name}", - "account.unblock_domain": "Unhide {domain}", - "account.unendorse": "Don\"t feature on profile", - "account.unfollow": "Unfollow", - "account.unmute": "Unmute @{name}", - "account.unmute_notifications": "Unmute notifications from @{name}", - "account_gallery.none": "No media to show.", - "alert.unexpected.message": "An unexpected error occurred.", - "alert.unexpected.title": "Oops!", - "audio.close": "Close audio", - "audio.expand": "Expand audio", - "audio.hide": "Hide audio", - "audio.mute": "Mute", - "audio.pause": "Pause", - "audio.play": "Play", - "audio.unmute": "Unmute", - "boost_modal.combo": "You can press {combo} to skip this next time", - "bundle_column_error.body": "Something went wrong while loading this page.", - "bundle_column_error.retry": "Try again", - "bundle_column_error.title": "Network error", - "bundle_modal_error.close": "Close", - "bundle_modal_error.message": "Something went wrong while loading this page.", - "bundle_modal_error.retry": "Try again", - "column.blocks": "Blocked users", - "column.community": "Local timeline", - "column.direct": "Direct messages", - "column.domain_blocks": "Hidden domains", - "column.edit_profile": "Edit profile", - "column.filters": "Muted words", - "column.follow_requests": "Follow requests", - "column.groups": "Groups", - "column.home": "Home", - "column.lists": "Lists", - "column.mutes": "Muted users", - "column.notifications": "Alerts", - "column.preferences": "Preferences", - "column.public": "Federated timeline", - "column.security": "Security", - "column_back_button.label": "Back", - "column_header.hide_settings": "Hide settings", - "column_header.show_settings": "Show settings", - "column_subheading.settings": "Settings", - "community.column_settings.media_only": "Media Only", - "compose_form.direct_message_warning": "This post will only be sent to the mentioned users.", - "compose_form.direct_message_warning_learn_more": "Learn more", - "compose_form.hashtag_warning": "This post won\"t be listed under any hashtag as it is unlisted. Only public posts can be searched by hashtag.", - "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.", - "compose_form.lock_disclaimer.lock": "locked", - "compose_form.placeholder": "What\"s on your mind?", - "compose_form.poll.add_option": "Add a choice", - "compose_form.poll.duration": "Poll duration", - "compose_form.poll.option_placeholder": "Choice {number}", - "compose_form.poll.remove_option": "Delete", - "compose_form.poll.type.hint": "Click to toggle poll type. Radio button (default) is single. Checkbox is multiple.", - "compose_form.publish": "Publish", - "compose_form.publish_loud": "{publish}!", - "compose_form.sensitive.hide": "Mark media as sensitive", - "compose_form.sensitive.marked": "Media is marked as sensitive", - "compose_form.sensitive.unmarked": "Media is not marked as sensitive", - "compose_form.spoiler.marked": "Text is hidden behind warning", - "compose_form.spoiler.unmarked": "Text is not hidden", - "compose_form.spoiler_placeholder": "Write your warning here", - "confirmation_modal.cancel": "Cancel", - "confirmations.block.block_and_report": "Block & Report", - "confirmations.block.confirm": "Block", - "confirmations.block.message": "Are you sure you want to block {name}?", - "confirmations.delete.confirm": "Delete", - "confirmations.delete.message": "Are you sure you want to delete this post?", - "confirmations.delete_list.confirm": "Delete", - "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?", - "confirmations.domain_block.confirm": "Hide entire domain", - "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications.", - "confirmations.mute.confirm": "Mute", - "confirmations.mute.message": "Are you sure you want to mute {name}?", - "confirmations.redraft.confirm": "Delete & redraft", - "confirmations.redraft.message": "Are you sure you want to delete this post and re-draft it? Favorites and reposts will be lost, and replies to the original post will be orphaned.", - "confirmations.reply.confirm": "Reply", - "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?", - "confirmations.unfollow.confirm": "Unfollow", - "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?", - "donate": "Donate", - "edit_profile.fields.avatar_label": "Avatar", - "edit_profile.fields.bio_label": "Bio", - "edit_profile.fields.bot_label": "This is a bot account", - "edit_profile.fields.display_name_label": "Display name", - "edit_profile.fields.header_label": "Header", - "edit_profile.fields.locked_label": "Lock account", - "edit_profile.fields.meta_fields.content_placeholder": "Content", - "edit_profile.fields.meta_fields.label_placeholder": "Label", - "edit_profile.fields.meta_fields_label": "Profile metadata", - "edit_profile.hints.avatar": "PNG, GIF or JPG. Will be downscaled to {size}", - "edit_profile.hints.bot": "This account mainly performs automated actions and might not be monitored", - "edit_profile.hints.header": "PNG, GIF or JPG. Will be downscaled to {size}", - "edit_profile.hints.locked": "Requires you to manually approve followers", - "edit_profile.hints.meta_fields": "You can have up to {count, plural, one {# item} other {# items}} displayed as a table on your profile", - "edit_profile.save": "Save", - "embed.instructions": "Embed this post on your website by copying the code below.", - "embed.preview": "Here is what it will look like:", - "emoji_button.activity": "Activity", - "emoji_button.custom": "Custom", - "emoji_button.flags": "Flags", - "emoji_button.food": "Food & Drink", - "emoji_button.label": "Insert emoji", - "emoji_button.nature": "Nature", - "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻", - "emoji_button.objects": "Objects", - "emoji_button.people": "People", - "emoji_button.recent": "Frequently used", - "emoji_button.search": "Search...", - "emoji_button.search_results": "Search results", - "emoji_button.symbols": "Symbols", - "emoji_button.travel": "Travel & Places", - "empty_column.account_timeline": "No posts here!", - "empty_column.account_unavailable": "Profile unavailable", - "empty_column.blocks": "You haven\"t blocked any users yet.", - "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!", - "empty_column.direct": "You don\"t have any direct messages yet. When you send or receive one, it will show up here.", - "empty_column.domain_blocks": "There are no hidden domains yet.", - "empty_column.favourited_statuses": "You don\"t have any liked posts yet. When you like one, it will show up here.", - "empty_column.favourites": "No one has liked this post yet. When someone does, they will show up here.", - "empty_column.filters": "You haven\"t created any muted words yet.", - "empty_column.follow_requests": "You don\"t have any follow requests yet. When you receive one, it will show up here.", - "empty_column.group": "There is nothing in this group yet. When members of this group make new posts, they will appear here.", - "empty_column.hashtag": "There is nothing in this hashtag yet.", - "empty_column.home": "Or you can visit {public} to get started and meet other users.", - "empty_column.home.local_tab": "the {site_title} tab", - "empty_column.list": "There is nothing in this list yet. When members of this list create new posts, they will appear here.", - "empty_column.lists": "You don\"t have any lists yet. When you create one, it will show up here.", - "empty_column.mutes": "You haven\"t muted any users yet.", - "empty_column.notifications": "You don\"t have any notifications yet. Interact with others to start the conversation.", - "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up", - "fediverse_tab.explanation_box.explanation": "{site_title} is part of the Fediverse, a social network made up of thousands of independent social media sites (aka 'servers'). The posts you see here are from 3rd-party servers. You have the freedom to engage with them, or to block any server you don\"t like. Pay attention to the full username after the second @ symbol to know which server a post is from. To see only {site_title} posts, visit {local}.", - "fediverse_tab.explanation_box.title": "What is the Fediverse?", - "follow_request.authorize": "Authorize", - "follow_request.reject": "Reject", - "getting_started.heading": "Getting started", - "getting_started.open_source_notice": "{code_name} is open source software. You can contribute or report issues at {code_link} (v{code_version}).", - "group.members.empty": "This group does not has any members.", - "group.removed_accounts.empty": "This group does not has any removed accounts.", - "groups.card.join": "Join", - "groups.card.members": "Members", - "groups.card.roles.admin": "You\"re an admin", - "groups.card.roles.member": "You\"re a member", - "groups.card.view": "View", - "groups.create": "Create group", - "groups.form.coverImage": "Upload new banner image (optional)", - "groups.form.coverImageChange": "Banner image selected", - "groups.form.create": "Create group", - "groups.form.description": "Description", - "groups.form.title": "Title", - "groups.form.update": "Update group", - "groups.removed_accounts": "Removed Accounts", - "groups.tab_admin": "Manage", - "groups.tab_featured": "Featured", - "groups.tab_member": "Member", - "hashtag.column_header.tag_mode.all": "and {additional}", - "hashtag.column_header.tag_mode.any": "or {additional}", - "hashtag.column_header.tag_mode.none": "without {additional}", - "home.column_settings.basic": "Basic", - "home.column_settings.show_reblogs": "Show reposts", - "home.column_settings.show_replies": "Show replies", - "home_column.lists": "Lists", - "home_column_header.fediverse": "Fediverse", - "home_column_header.home": "Home", - "intervals.full.days": "{number, plural, one {# day} other {# days}}", - "intervals.full.hours": "{number, plural, one {# hour} other {# hours}}", - "intervals.full.minutes": "{number, plural, one {# minute} other {# minutes}}", - "keyboard_shortcuts.back": "to navigate back", - "keyboard_shortcuts.blocked": "to open blocked users list", - "keyboard_shortcuts.boost": "to repost", - "keyboard_shortcuts.column": "to focus a post in one of the columns", - "keyboard_shortcuts.compose": "to focus the compose textarea", - "keyboard_shortcuts.direct": "to open direct messages column", - "keyboard_shortcuts.down": "to move down in the list", - "keyboard_shortcuts.enter": "to open post", - "keyboard_shortcuts.favourite": "to like", - "keyboard_shortcuts.favourites": "to open likes list", - "keyboard_shortcuts.heading": "Keyboard shortcuts", - "keyboard_shortcuts.home": "to open home timeline", - "keyboard_shortcuts.hotkey": "Hotkey", - "keyboard_shortcuts.legend": "to display this legend", - "keyboard_shortcuts.mention": "to mention author", - "keyboard_shortcuts.muted": "to open muted users list", - "keyboard_shortcuts.my_profile": "to open your profile", - "keyboard_shortcuts.notifications": "to open notifications column", - "keyboard_shortcuts.pinned": "to open pinned posts list", - "keyboard_shortcuts.profile": "to open author\"s profile", - "keyboard_shortcuts.reply": "to reply", - "keyboard_shortcuts.requests": "to open follow requests list", - "keyboard_shortcuts.search": "to focus search", - "keyboard_shortcuts.start": "to open 'get started' column", - "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW", - "keyboard_shortcuts.toggle_sensitivity": "to show/hide media", - "keyboard_shortcuts.toot": "to start a new post", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", - "lightbox.close": "Close", - "lightbox.next": "Next", - "lightbox.previous": "Previous", - "lightbox.view_context": "View context", - "list.click_to_add": "Click here to add people", - "list_adder.header_title": "Add or Remove from Lists", - "lists.account.add": "Add to list", - "lists.account.remove": "Remove from list", - "lists.delete": "Delete list", - "lists.edit": "Edit list", - "lists.edit.submit": "Change title", - "lists.new.create": "Add list", - "lists.new.create_title": "Add list", - "lists.new.save_title": "Save Title", - "lists.new.title_placeholder": "New list title", - "lists.search": "Search among people you follow", - "lists.subheading": "Your lists", - "lists.view_all": "View all lists", - "loading_indicator.label": "Loading...", - "login.fields.password_placeholder": "Password", - "login.fields.username_placeholder": "Username", - "login.log_in": "Log in", - "login.reset_password_hint": "Trouble logging in?", - "media_gallery.toggle_visible": "Hide", - "missing_indicator.label": "Not found", - "missing_indicator.sublabel": "This resource could not be found", - "morefollows.followers_label": "…and {count} more {count, plural, one {follower} other {followers}} on remote sites.", - "morefollows.following_label": "…and {count} more {count, plural, one {follow} other {follows}} on remote sites.", - "mute_modal.hide_notifications": "Hide notifications from this user?", - "navigation_bar.admin_settings": "Admin settings", - "navigation_bar.plfe_config": "Soapbox config", - "navigation_bar.blocks": "Blocked users", - "navigation_bar.community_timeline": "Local timeline", - "navigation_bar.compose": "Compose new post", - "navigation_bar.direct": "Direct messages", - "navigation_bar.discover": "Discover", - "navigation_bar.domain_blocks": "Hidden domains", - "navigation_bar.edit_profile": "Edit profile", - "navigation_bar.favourites": "Likes", - "navigation_bar.filters": "Muted words", - "navigation_bar.follow_requests": "Follow requests", - "navigation_bar.info": "About this server", - "navigation_bar.keyboard_shortcuts": "Hotkeys", - "navigation_bar.lists": "Lists", - "navigation_bar.logout": "Logout", - "navigation_bar.messages": "Messages", - "navigation_bar.mutes": "Muted users", - "navigation_bar.personal": "Personal", - "navigation_bar.pins": "Pinned posts", - "navigation_bar.preferences": "Preferences", - "navigation_bar.public_timeline": "Federated timeline", - "navigation_bar.security": "Security", - "notification.pleroma:emoji_reaction": "{name} reacted to your post", - "notification.favourite": "{name} liked your post", - "notification.follow": "{name} followed you", - "notification.mention": "{name} mentioned you", - "notification.poll": "A poll you have voted in has ended", - "notification.reblog": "{name} reposted your post", - "notifications.clear": "Clear notifications", - "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?", - "notifications.column_settings.alert": "Desktop notifications", - "notifications.column_settings.favourite": "Likes:", - "notifications.column_settings.filter_bar.advanced": "Display all categories", - "notifications.column_settings.filter_bar.category": "Quick filter bar", - "notifications.column_settings.filter_bar.show": "Show", - "notifications.column_settings.follow": "New followers:", - "notifications.column_settings.mention": "Mentions:", - "notifications.column_settings.poll": "Poll results:", - "notifications.column_settings.push": "Push notifications", - "notifications.column_settings.reblog": "Reposts:", - "notifications.column_settings.show": "Show in column", - "notifications.column_settings.sound": "Play sound", - "notifications.filter.all": "All", - "notifications.filter.boosts": "Reposts", - "notifications.filter.favourites": "Likes", - "notifications.filter.follows": "Follows", - "notifications.filter.mentions": "Mentions", - "notifications.filter.polls": "Poll results", - "notifications.group": "{count} notifications", - "notifications.queue_label": "Click to see {count} new {count, plural, one {notification} other {notifications}}", - "pinned_statuses.none": "No pins to show.", - "poll.closed": "Closed", - "poll.refresh": "Refresh", - "poll.total_votes": "{count, plural, one {# vote} other {# votes}}", - "poll.vote": "Vote", - "poll_button.add_poll": "Add a poll", - "poll_button.remove_poll": "Remove poll", - "preferences.fields.auto_play_gif_label": "Auto-play animated GIFs", - "preferences.fields.boost_modal_label": "Show confirmation dialog before reposting", - "preferences.fields.delete_modal_label": "Show confirmation dialog before deleting a post", - "preferences.fields.demetricator_label": "Use Demetricator", - "preferences.fields.dyslexic_font_label": "Dyslexic mode", - "preferences.fields.expand_spoilers_label": "Always expand posts marked with content warnings", - "preferences.fields.language_label": "Language", - "preferences.fields.privacy_label": "Post privacy", - "preferences.fields.reduce_motion_label": "Reduce motion in animations", - "preferences.fields.system_font_label": "Use system\"s default font", - "preferences.fields.theme_label": "Theme", - "preferences.fields.unfollow_modal_label": "Show confirmation dialog before unfollowing someone", - "preferences.hints.demetricator": "Decrease social media anxiety by hiding all numbers from the site.", - "preferences.hints.privacy_followers_only": "Only show to followers", - "preferences.hints.privacy_public": "Everyone can see", - "preferences.hints.privacy_unlisted": "Everyone can see, but not listed on public timelines", - "preferences.options.privacy_followers_only": "Followers-only", - "preferences.options.privacy_public": "Public", - "preferences.options.privacy_unlisted": "Unlisted", - "preferences.options.theme_dark": "Dark", - "preferences.options.theme_light": "Light", - "privacy.change": "Adjust post privacy", - "privacy.direct.long": "Post to mentioned users only", - "privacy.direct.short": "Direct", - "privacy.private.long": "Post to followers only", - "privacy.private.short": "Followers-only", - "privacy.public.long": "Post to public timelines", - "privacy.public.short": "Public", - "privacy.unlisted.long": "Do not post to public timelines", - "privacy.unlisted.short": "Unlisted", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", - "registration.agreement": "I agree to the {tos}.", - "registration.fields.confirm_placeholder": "Password (again)", - "registration.fields.email_placeholder": "E-Mail address", - "registration.fields.password_placeholder": "Password", - "registration.fields.username_placeholder": "Username", - "registration.lead": "With an account on {instance} you\"ll be able to follow people on any server in the fediverse.", - "registration.sign_up": "Sign up", - "registration.tos": "Terms of Service", - "registration.privacy": "Privacy Policy", - "registration.acceptance": "By registering, you agree to the {terms} and {privacy}.", - "registration.reason": "Reason for Joining", - "relative_time.days": "{number}d", - "relative_time.hours": "{number}h", - "relative_time.just_now": "now", - "relative_time.minutes": "{number}m", - "relative_time.seconds": "{number}s", - "reply_indicator.cancel": "Cancel", - "report.block": "Block {target}", - "report.block_hint": "Do you also want to block this account?", - "report.forward": "Forward to {target}", - "report.forward_hint": "The account is from another server. Send a copy of the report there as well?", - "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:", - "report.placeholder": "Additional comments", - "report.submit": "Submit", - "report.target": "Reporting {target}", - "search.placeholder": "Search", - "search_popout.search_format": "Advanced search format", - "search_popout.tips.full_text": "Simple text returns posts you have written, favorited, reposted, or have been mentioned in, as well as matching usernames, display names, and hashtags.", - "search_popout.tips.hashtag": "hashtag", - "search_popout.tips.status": "post", - "search_popout.tips.user": "user", - "search_results.accounts": "People", - "search_results.hashtags": "Hashtags", - "search_results.statuses": "Posts", - "search_results.top": "Top", - "search_results.total": "{count, number} {count, plural, one {result} other {results}}", - "security.fields.email.label": "Email address", - "security.fields.new_password.label": "New password", - "security.fields.old_password.label": "Current password", - "security.fields.password.label": "Password", - "security.fields.password_confirmation.label": "New password (again)", - "security.headers.tokens": "Sessions", - "security.headers.update_email": "Change Email", - "security.headers.update_password": "Change Password", - "security.submit": "Save changes", - "security.tokens.revoke": "Revoke", - "security.update_email.fail": "Update email failed.", - "security.update_email.success": "Email successfully updated.", - "security.update_password.fail": "Update password failed.", - "security.update_password.success": "Password successfully updated.", - "signup_panel.subtitle": "Sign up now to discuss what's happening.", - "signup_panel.title": "New to {site_title}?", - "status.admin_account": "Open moderation interface for @{name}", - "status.admin_status": "Open this post in the moderation interface", - "status.block": "Block @{name}", - "status.cancel_reblog_private": "Un-repost", - "status.cannot_reblog": "This post cannot be reposted", - "status.copy": "Copy link to post", - "status.delete": "Delete", - "status.detailed_status": "Detailed conversation view", - "status.direct": "Direct message @{name}", - "status.embed": "Embed", - "status.favourite": "Like", - "status.filtered": "Filtered", - "status.load_more": "Load more", - "status.media_hidden": "Media hidden", - "status.mention": "Mention @{name}", - "status.more": "More", - "status.mute": "Mute @{name}", - "status.mute_conversation": "Mute conversation", - "status.open": "Expand this post", - "status.pin": "Pin on profile", - "status.pinned": "Pinned post", - "status.read_more": "Read more", - "status.reblog": "Repost", - "status.reblog_private": "Repost to original audience", - "status.reblogged_by": "{name} reposted", - "status.reblogs.empty": "No one has reposted this post yet. When someone does, they will show up here.", - "status.redraft": "Delete & re-draft", - "status.remove_account_from_group": "Remove account from group", - "status.remove_post_from_group": "Remove post from group", - "status.reply": "Reply", - "status.replyAll": "Reply to thread", - "status.report": "Report @{name}", - "status.sensitive_warning": "Sensitive content", - "status.share": "Share", - "status.show_less": "Show less", - "status.show_less_all": "Show less for all", - "status.show_more": "Show more", - "status.show_more_all": "Show more for all", - "status.show_thread": "Show thread", - "status.unmute_conversation": "Unmute conversation", - "status.unpin": "Unpin from profile", - "status_list.queue_label": "Click to see {count} new {count, plural, one {post} other {posts}}", - "suggestions.dismiss": "Dismiss suggestion", - "tabs_bar.apps": "Apps", - "tabs_bar.home": "Home", - "tabs_bar.news": "News", - "tabs_bar.notifications": "Alerts", - "tabs_bar.post": "Post", - "tabs_bar.search": "Search", - "time_remaining.days": "{number, plural, one {# day} other {# days}} left", - "time_remaining.hours": "{number, plural, one {# hour} other {# hours}} left", - "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left", - "time_remaining.moments": "Moments remaining", - "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left", - "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking", - "trends.title": "Trends", - "ui.beforeunload": "Your draft will be lost if you leave.", - "unauthorized_modal.footer": "Already have an account? {login}.", - "unauthorized_modal.text": "You need to be logged in to do that.", - "unauthorized_modal.title": "Sign up for {site_title}", - "upload_area.title": "Drag & drop to upload", - "upload_button.label": "Add media attachment", - "upload_error.limit": "File upload limit exceeded.", - "upload_error.poll": "File upload not allowed with polls.", - "upload_form.description": "Describe for the visually impaired", - "upload_form.focus": "Change preview", - "upload_form.undo": "Delete", - "upload_progress.label": "Uploading...", - "video.close": "Close video", - "video.exit_fullscreen": "Exit full screen", - "video.expand": "Expand video", - "video.fullscreen": "Full screen", - "video.hide": "Hide video", - "video.mute": "Mute sound", - "video.pause": "Pause", - "video.play": "Play", - "video.unmute": "Unmute sound", - "who_to_follow.title": "Who To Follow" -} diff --git a/packages/pl-fe/src/__fixtures__/lain.json b/packages/pl-fe/src/__fixtures__/lain.json deleted file mode 100644 index ab27af48e..000000000 --- a/packages/pl-fe/src/__fixtures__/lain.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "acct": "lain@lain.com", - "avatar": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "avatar_static": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "bot": false, - "created_at": "2020-01-10T17:30:10.000Z", - "display_name": "Avalokiteshvara", - "emojis": [], - "fields": [], - "followers_count": 807, - "following_count": 223, - "header": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "header_static": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "id": "9v5bqYwY2jfmvPNhTM", - "locked": false, - "note": "No more hiding", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bqYwY2jfmvPNhTM", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "No more hiding", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 21107, - "url": "https://lain.com/users/lain", - "username": "lain" -} diff --git a/packages/pl-fe/src/__fixtures__/markers.json b/packages/pl-fe/src/__fixtures__/markers.json deleted file mode 100644 index ba3f5f882..000000000 --- a/packages/pl-fe/src/__fixtures__/markers.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "notifications": { - "last_read_id": "35098814", - "version": 361, - "updated_at": "2019-11-26T22:37:25.239Z", - "pleroma": { - "unread_count": 3 - } - }, - "home": { - "last_read_id": "103206604258487607", - "version": 468, - "updated_at": "2019-11-26T22:37:25.235Z", - "pleroma": { - "unread_count": 32 - } - } -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon-3.0.0-instance.json b/packages/pl-fe/src/__fixtures__/mastodon-3.0.0-instance.json deleted file mode 100644 index f1d0a5e6d..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon-3.0.0-instance.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "uri": "animalliberation.social", - "title": "Animal Liberation Network", - "short_description": "", - "description": "Animal Liberation Network is a community for animal activists on the Fediverse. You can connect with other activists through the local timeline, as well as spread your activism to the outside world with the federated timeline.", - "email": "alex@alexgleason.me", - "version": "3.0.0", - "urls": { - "streaming_api": "wss://animalliberation.social" - }, - "stats": { - "user_count": 662, - "status_count": 2904, - "domain_count": 4003 - }, - "thumbnail": "https://animalliberation.social/packs/media/images/preview-9a17d32fc48369e8ccd910a75260e67d.jpg", - "languages": [ - "en" - ], - "registrations": true, - "approval_required": false, - "contact_account": { - "id": "1", - "username": "alex", - "acct": "alex", - "display_name": "Alex Gleason", - "locked": false, - "bot": false, - "created_at": "2016-11-30T22:19:42.956Z", - "note": "

Animal liberation free software Communist

", - "url": "https://animalliberation.social/@alex", - "avatar": "https://media.animalliberation.social/accounts/avatars/000/000/001/original/media.jpg", - "avatar_static": "https://media.animalliberation.social/accounts/avatars/000/000/001/original/media.jpg", - "header": "https://media.animalliberation.social/accounts/headers/000/000/001/original/09887023017e02c9.jpg", - "header_static": "https://media.animalliberation.social/accounts/headers/000/000/001/original/09887023017e02c9.jpg", - "followers_count": 236, - "following_count": 83, - "statuses_count": 357, - "last_status_at": "2021-02-20T19:28:24.353Z", - "emojis": [], - "fields": [] - } -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon-account.json b/packages/pl-fe/src/__fixtures__/mastodon-account.json deleted file mode 100644 index 7a00340bf..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon-account.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "106801667066418367", - "username": "benis911", - "acct": "benis911", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2021-08-22T00:00:00.000Z", - "note": "", - "url": "https://mastodon.social/@benis911", - "avatar": "https://mastodon.social/avatars/original/missing.png", - "avatar_static": "https://mastodon.social/avatars/original/missing.png", - "header": "https://mastodon.social/headers/original/missing.png", - "header_static": "https://mastodon.social/headers/original/missing.png", - "followers_count": 1, - "following_count": 0, - "statuses_count": 5, - "last_status_at": "2022-02-23", - "emojis": [], - "fields": [] -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon-instance-rc.json b/packages/pl-fe/src/__fixtures__/mastodon-instance-rc.json deleted file mode 100644 index 277839d14..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon-instance-rc.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "uri": "mastodon.social", - "title": "Mastodon", - "short_description": "Server run by the main developers of the project \"🐘\" It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!", - "description": "Server run by the main developers of the project \"🐘\" It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!", - "email": "staff@mastodon.social", - "version": "3.5.0rc1", - "urls": { - "streaming_api": "wss://mastodon.social" - }, - "stats": { - "user_count": 635078, - "status_count": 34700866, - "domain_count": 21989 - }, - "thumbnail": "https://files.mastodon.social/site_uploads/files/000/000/001/original/vlcsnap-2018-08-27-16h43m11s127.png", - "languages": [ - "en" - ], - "registrations": true, - "approval_required": false, - "invites_enabled": true, - "configuration": { - "statuses": { - "max_characters": 500, - "max_media_attachments": 4, - "characters_reserved_per_url": 23 - }, - "media_attachments": { - "supported_mime_types": [ - "image/jpeg", - "image/png", - "image/gif", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/ogg", - "audio/vorbis", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ], - "image_size_limit": 10485760, - "image_matrix_limit": 16777216, - "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 2304000 - }, - "polls": { - "max_options": 4, - "max_characters_per_option": 50, - "min_expiration": 300, - "max_expiration": 2629746 - } - }, - "contact_account": { - "id": "1", - "username": "Gargron", - "acct": "Gargron", - "display_name": "Eugen", - "locked": false, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2016-03-16T00:00:00.000Z", - "note": "

Founder, CEO and lead developer @Mastodon, Germany.

", - "url": "https://mastodon.social/@Gargron", - "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png", - "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png", - "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "followers_count": 99760, - "following_count": 274, - "statuses_count": 71657, - "last_status_at": "2022-03-17", - "emojis": [], - "fields": [ - { - "name": "Patreon", - "value": "https://www.patreon.com/mastodon", - "verified_at": null - } - ] - }, - "rules": [ - { - "id": "1", - "text": "Sexually explicit or violent media must be marked as sensitive when posting" - }, - { - "id": "2", - "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" - }, - { - "id": "3", - "text": "No incitement of violence or promotion of violent ideologies" - }, - { - "id": "4", - "text": "No harassment, dogpiling or doxxing of other users" - }, - { - "id": "5", - "text": "No content illegal in Germany" - }, - { - "id": "7", - "text": "Do not share intentionally false or misleading information" - } - ] -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon-instance.json b/packages/pl-fe/src/__fixtures__/mastodon-instance.json deleted file mode 100644 index 3c8a2f9d3..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon-instance.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "uri": "mastodon.social", - "title": "Mastodon", - "short_description": "Server run by the main developers of the project \"🐘\" It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!", - "description": "Server run by the main developers of the project \"🐘\" It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!", - "email": "staff@mastodon.social", - "version": "3.4.3", - "urls": { - "streaming_api": "wss://mastodon.social" - }, - "stats": { - "user_count": 619022, - "status_count": 33914684, - "domain_count": 21524 - }, - "thumbnail": "https://files.mastodon.social/site_uploads/files/000/000/001/original/vlcsnap-2018-08-27-16h43m11s127.png", - "languages": [ - "en" - ], - "registrations": true, - "approval_required": false, - "invites_enabled": true, - "configuration": { - "statuses": { - "max_characters": 500, - "max_media_attachments": 4, - "characters_reserved_per_url": 23 - }, - "media_attachments": { - "supported_mime_types": [ - "image/jpeg", - "image/png", - "image/gif", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/ogg", - "audio/vorbis", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ], - "image_size_limit": 10485760, - "image_matrix_limit": 16777216, - "video_size_limit": 41943040, - "video_frame_rate_limit": 60, - "video_matrix_limit": 2304000 - }, - "polls": { - "max_options": 4, - "max_characters_per_option": 50, - "min_expiration": 300, - "max_expiration": 2629746 - } - }, - "contact_account": { - "id": "1", - "username": "Gargron", - "acct": "Gargron", - "display_name": "Eugen 🎄", - "locked": false, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2016-03-16T00:00:00.000Z", - "note": "

Founder, CEO and lead developer @Mastodon, Germany.

", - "url": "https://mastodon.social/@Gargron", - "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png", - "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png", - "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg", - "followers_count": 98343, - "following_count": 271, - "statuses_count": 71288, - "last_status_at": "2022-01-31", - "emojis": [], - "fields": [ - { - "name": "Patreon", - "value": "https://www.patreon.com/mastodon", - "verified_at": null - }, - { - "name": "Homepage", - "value": "https://zeonfederated.com", - "verified_at": "2019-07-15T18:29:57.191+00:00" - } - ] - }, - "rules": [ - { - "id": "1", - "text": "Sexually explicit or violent media must be marked as sensitive when posting" - }, - { - "id": "2", - "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" - }, - { - "id": "3", - "text": "No incitement of violence or promotion of violent ideologies" - }, - { - "id": "4", - "text": "No harassment, dogpiling or doxxing of other users" - }, - { - "id": "5", - "text": "No content illegal in Germany" - }, - { - "id": "6", - "text": "No spam, advertising or bot accounts" - } - ] -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon-reply-to-self.json b/packages/pl-fe/src/__fixtures__/mastodon-reply-to-self.json deleted file mode 100644 index 7cfc756f3..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon-reply-to-self.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "id": "107828148293766288", - "created_at": "2022-02-20T03:16:09.812Z", - "in_reply_to_id": "107828147870368566", - "in_reply_to_account_id": "106801667066418367", - "sensitive": false, - "spoiler_text": "", - "visibility": "public", - "language": "en", - "uri": "https://mastodon.social/users/benis911/statuses/107828148293766288", - "url": "https://mastodon.social/@benis911/107828148293766288", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "edited_at": null, - "content": "

test reply to self

", - "reblog": null, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "account": { - "id": "106801667066418367", - "username": "benis911", - "acct": "benis911", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2021-08-22T00:00:00.000Z", - "note": "

", - "url": "https://mastodon.social/@benis911", - "avatar": "https://mastodon.social/avatars/original/missing.png", - "avatar_static": "https://mastodon.social/avatars/original/missing.png", - "header": "https://mastodon.social/headers/original/missing.png", - "header_static": "https://mastodon.social/headers/original/missing.png", - "followers_count": 0, - "following_count": 0, - "statuses_count": 3, - "last_status_at": "2022-02-20", - "emojis": [], - "fields": [] - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null -} diff --git a/packages/pl-fe/src/__fixtures__/mastodon_initial_state.json b/packages/pl-fe/src/__fixtures__/mastodon_initial_state.json deleted file mode 100644 index 521285683..000000000 --- a/packages/pl-fe/src/__fixtures__/mastodon_initial_state.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "meta": { - "streaming_api_base_url": "wss://mastodon.social", - "access_token": "Nh15V9JWyY5Fshf2OJ_feNvOIkTV7YGVfEJFr0Y0D6Q", - "locale": "en", - "domain": "mastodon.social", - "title": "Mastodon", - "admin": "1", - "search_enabled": true, - "repository": "mastodon/mastodon", - "source_url": "https://github.com/mastodon/mastodon", - "version": "3.4.1", - "invites_enabled": true, - "limited_federation_mode": false, - "mascot": null, - "profile_directory": true, - "trends": true, - "me": "106801667066418367", - "unfollow_modal": false, - "boost_modal": false, - "delete_modal": true, - "auto_play_gif": false, - "display_media": "default", - "expand_spoilers": false, - "reduce_motion": false, - "disable_swiping": false, - "advanced_layout": false, - "use_blurhash": true, - "use_pending_items": false, - "is_staff": false, - "crop_images": true - }, - "compose": { - "me": "106801667066418367", - "default_privacy": "public", - "default_sensitive": false, - "text": "" - }, - "accounts": { - "1": { - "id": "1", - "username": "Gargron", - "acct": "Gargron", - "display_name": "Eugen", - "locked": false, - "bot": false, - "discoverable": true, - "group": false, - "created_at": "2016-03-16T00:00:00.000Z", - "note": "\\u003cp\\u003eDeveloper of Mastodon and administrator of mastodon.social. I post service announcements, development updates, and personal stuff.\\u003c/p\\u003e", - "url": "https://mastodon.social/@Gargron", - "avatar": "https://files.mastodon.social/accounts/avatars/000/000/001/original/d96d39a0abb45b92.jpg", - "avatar_static": "https://files.mastodon.social/accounts/avatars/000/000/001/original/d96d39a0abb45b92.jpg", - "header": "https://files.mastodon.social/accounts/headers/000/000/001/original/c91b871f294ea63e.png", - "header_static": "https://files.mastodon.social/accounts/headers/000/000/001/original/c91b871f294ea63e.png", - "followers_count": 469426, - "following_count": 459, - "statuses_count": 70336, - "last_status_at": "2021-09-15", - "emojis": [], - "fields": [ - { - "name": "Patreon", - "value": "\\u003ca href=\"https://www.patreon.com/mastodon\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"\\u003e\\u003cspan class=\"invisible\"\\u003ehttps://www.\\u003c/span\\u003e\\u003cspan class=\"\"\\u003epatreon.com/mastodon\\u003c/span\\u003e\\u003cspan class=\"invisible\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e", - "verified_at": null - }, - { - "name": "Homepage", - "value": "\\u003ca href=\"https://zeonfederated.com\" rel=\"me nofollow noopener noreferrer\" target=\"_blank\"\\u003e\\u003cspan class=\"invisible\"\\u003ehttps://\\u003c/span\\u003e\\u003cspan class=\"\"\\u003ezeonfederated.com\\u003c/span\\u003e\\u003cspan class=\"invisible\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e", - "verified_at": "2019-07-15T18:29:57.191+00:00" - } - ] - }, - "106801667066418367": { - "id": "106801667066418367", - "username": "benis911", - "acct": "benis911", - "display_name": "", - "locked": false, - "bot": false, - "discoverable": null, - "group": false, - "created_at": "2021-08-22T00:00:00.000Z", - "note": "\\u003cp\\u003e\\u003c/p\\u003e", - "url": "https://mastodon.social/@benis911", - "avatar": "https://mastodon.social/avatars/original/missing.png", - "avatar_static": "https://mastodon.social/avatars/original/missing.png", - "header": "https://mastodon.social/headers/original/missing.png", - "header_static": "https://mastodon.social/headers/original/missing.png", - "followers_count": 0, - "following_count": 0, - "statuses_count": 0, - "last_status_at": null, - "emojis": [], - "fields": [] - } - }, - "media_attachments": { - "accept_content_types": [ - ".jpg", - ".jpeg", - ".png", - ".gif", - ".webm", - ".mp4", - ".m4v", - ".mov", - ".ogg", - ".oga", - ".mp3", - ".wav", - ".flac", - ".opus", - ".aac", - ".m4a", - ".3gp", - ".wma", - "image/jpeg", - "image/png", - "image/gif", - "video/webm", - "video/mp4", - "video/quicktime", - "video/ogg", - "audio/wave", - "audio/wav", - "audio/x-wav", - "audio/x-pn-wave", - "audio/ogg", - "audio/mpeg", - "audio/mp3", - "audio/webm", - "audio/flac", - "audio/aac", - "audio/m4a", - "audio/x-m4a", - "audio/mp4", - "audio/3gpp", - "video/x-ms-asf" - ] - }, - "settings": { - "known_fediverse": false, - "notifications": { - "alerts": { - "follow": false, - "follow_request": false, - "favourite": false, - "reblog": false, - "mention": false, - "poll": false, - "status": false - }, - "quickFilter": { - "active": "all", - "show": true, - "advanced": false - }, - "dismissPermissionBanner": false, - "showUnread": true, - "shows": { - "follow": true, - "follow_request": false, - "favourite": true, - "reblog": true, - "mention": true, - "poll": true, - "status": true - }, - "sounds": { - "follow": true, - "follow_request": false, - "favourite": true, - "reblog": true, - "mention": true, - "poll": true, - "status": true - } - }, - "public": { - "regex": { - "body": "" - } - }, - "direct": { - "regex": { - "body": "" - } - }, - "community": { - "regex": { - "body": "" - } - }, - "skinTone": 1, - "trends": { - "show": true - }, - "columns": [ - { - "id": "COMPOSE", - "uuid": "b6dce3ed-c6cc-4446-8981-f08f8461ae8d", - "params": {} - }, - { - "id": "HOME", - "uuid": "e89b270b-6e79-4956-98fb-e8bf0aff098c", - "params": {} - }, - { - "id": "NOTIFICATIONS", - "uuid": "d359cdfa-e074-44ba-bde5-f46867a3bca6", - "params": {} - } - ], - "introductionVersion": 20181216044202, - "home": { - "shows": { - "reblog": true, - "reply": true - }, - "regex": { - "body": "" - } - } - }, - "push_subscription": null -} diff --git a/packages/pl-fe/src/__fixtures__/mitra-context.json b/packages/pl-fe/src/__fixtures__/mitra-context.json deleted file mode 100644 index 91b48420c..000000000 --- a/packages/pl-fe/src/__fixtures__/mitra-context.json +++ /dev/null @@ -1,107 +0,0 @@ -[ - { - "id": "017ed503-bc96-301a-e871-2c23b30ddd05", - "uri": "https://mitra.social/objects/017ed503-bc96-301a-e871-2c23b30ddd05", - "created_at": "2022-02-07T16:28:18.966874Z", - "account": { - "id": "017ed4f9-c121-2ae6-0805-15516cce02c3", - "username": "alex", - "acct": "alex", - "url": "https://mitra.social/users/alex", - "display_name": null, - "created_at": "2022-02-07T16:17:24.769229Z", - "note": null, - "avatar": null, - "header": null, - "fields": [], - "followers_count": 1, - "following_count": 1, - "statuses_count": 3, - "source": null, - "wallet_address": null - }, - "content": "@silverpill sup!", - "in_reply_to_id": null, - "reblog": null, - "visibility": "public", - "replies_count": 1, - "favourites_count": 0, - "reblogs_count": 0, - "media_attachments": [], - "mentions": [ - { - "id": "dd4ebc18-269d-4c7b-a310-03d29c6ab551", - "username": "silverpill", - "acct": "silverpill", - "url": "https://mitra.social/users/silverpill" - } - ], - "tags": [], - "favourited": false, - "reblogged": false, - "ipfs_cid": null, - "token_id": null, - "token_tx_id": null - }, - { - "id": "017ed505-5926-392f-256a-f86d5075df70", - "uri": "https://mitra.social/objects/017ed505-5926-392f-256a-f86d5075df70", - "created_at": "2022-02-07T16:30:04.582771Z", - "account": { - "id": "dd4ebc18-269d-4c7b-a310-03d29c6ab551", - "username": "silverpill", - "acct": "silverpill", - "url": "https://mitra.social/users/silverpill", - "display_name": "silverpill", - "created_at": "2021-11-06T21:08:57.441927Z", - "note": "Admin of mitra.social instance. It is running experimental ActivityPub server Mitra.", - "avatar": "https://mitra.social/media/6a785bf7dd05f61c3590e8935aa49156a499ac30fd1e402f79e7e164adb36e2c.png", - "header": null, - "fields": [ - { - "name": "Matrix", - "value": "@silverpill:poa.st" - }, - { - "name": "Alt", - "value": "@silverpill@poa.st" - }, - { - "name": "Code", - "value": "https://codeberg.org/silverpill/" - }, - { - "name": "$XMR", - "value": "884y9LmsWY7PQNsyR7bJy1dvj91tuF5spVabyCnPk4KfQtSuzFbQobTFC7xSemJgVW1FWAwnJbjTZX5zZWbBrfkv62DB62d" - } - ], - "followers_count": 27, - "following_count": 15, - "statuses_count": 110, - "source": null, - "wallet_address": null - }, - "content": "@alex welcome", - "in_reply_to_id": "017ed503-bc96-301a-e871-2c23b30ddd05", - "reblog": null, - "visibility": "public", - "replies_count": 0, - "favourites_count": 1, - "reblogs_count": 0, - "media_attachments": [], - "mentions": [ - { - "id": "017ed4f9-c121-2ae6-0805-15516cce02c3", - "username": "alex", - "acct": "alex", - "url": "https://mitra.social/users/alex" - } - ], - "tags": [], - "favourited": true, - "reblogged": false, - "ipfs_cid": null, - "token_id": null, - "token_tx_id": null - } -] diff --git a/packages/pl-fe/src/__fixtures__/mitra-instance.json b/packages/pl-fe/src/__fixtures__/mitra-instance.json deleted file mode 100644 index 2c476ba30..000000000 --- a/packages/pl-fe/src/__fixtures__/mitra-instance.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "uri": "mitra.social", - "title": "Mitra", - "short_description": "Federated social network with smart contracts", - "description": "This is an instance of [Mitra](https://codeberg.org/silverpill/mitra), federated social network built on [ActivityPub](https://activitypub.rocks/) protocol.\nRegistration is invitation-only.\nAdmin:\n - [@silverpill@mitra.social](https://mitra.social/profile/dd4ebc18-269d-4c7b-a310-03d29c6ab551)\n - Matrix: @silverpill:poa.st\n", - "version": "3.0.0 (compatible; Mitra 0.4.0)", - "registrations": false, - "login_message": "Sign this message to log in to https://mitra.social. Do not sign this message on other sites!", - "post_character_limit": 5000, - "blockchain_explorer_url": null, - "blockchain_contract_address": null, - "ipfs_gateway_url": "https://ipfs.mitra.social" -} diff --git a/packages/pl-fe/src/__fixtures__/mitra-status-with-attachments.json b/packages/pl-fe/src/__fixtures__/mitra-status-with-attachments.json deleted file mode 100644 index 689e4d3bb..000000000 --- a/packages/pl-fe/src/__fixtures__/mitra-status-with-attachments.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "id": "017eeb0e-e5e7-98fe-6b2b-ad02349251fb", - "uri": "https://gleasonator.com/objects/aa5e66c9-0a10-4167-9c80-f40d9574aaec", - "created_at": "2022-02-11T23:11:59.891770Z", - "account": { - "id": "8fe4d6ed-3a99-43e1-a7d4-66b4e635f756", - "username": "alex", - "acct": "alex@gleasonator.com", - "url": "https://gleasonator.com/users/alex", - "display_name": "Alex Gleason", - "created_at": "2021-11-14T17:01:17.446307Z", - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "avatar": "https://mitra.social/media/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "header": "https://mitra.social/media/bdfb009adac0e31257e9fe527d3844a7234cc71f6e06dff2bec94354639555dd.png", - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2, - "following_count": 2, - "statuses_count": 970, - "source": null, - "wallet_address": null - }, - "content": "

Test

", - "in_reply_to_id": null, - "reblog": null, - "visibility": "public", - "replies_count": 0, - "favourites_count": 0, - "reblogs_count": 0, - "media_attachments": [ - { - "id": "017eeb0e-e5df-30a4-77a7-a929145cb836", - "type": "image", - "url": "https://mitra.social/media/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png" - }, - { - "id": "017eeb0e-e5e4-2a48-2889-afdebf368a54", - "type": "unknown", - "url": "https://mitra.social/media/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac" - }, - { - "id": "017eeb0e-e5e5-79fd-6054-8b6869b1db49", - "type": "unknown", - "url": "https://mitra.social/media/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.oga" - }, - { - "id": "017eeb0e-e5e6-c416-a444-21e560c47839", - "type": "unknown", - "url": "https://mitra.social/media/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0" - } - ], - "mentions": [], - "tags": [], - "favourited": false, - "reblogged": false, - "ipfs_cid": null, - "token_id": null, - "token_tx_id": null -} diff --git a/packages/pl-fe/src/__fixtures__/mk.json b/packages/pl-fe/src/__fixtures__/mk.json deleted file mode 100644 index a7c841f1e..000000000 --- a/packages/pl-fe/src/__fixtures__/mk.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "acct": "mk", - "avatar": "https://media.spinster.xyz/4043b9fb3f9d468aa48a8d68294f338914d9d54b2816aa1c789f548efe6c6239.jpg", - "avatar_static": "https://media.spinster.xyz/4043b9fb3f9d468aa48a8d68294f338914d9d54b2816aa1c789f548efe6c6239.jpg", - "bot": false, - "created_at": "2019-08-01T22:06:30.000Z", - "display_name": "M. K. Fain", - "emojis": [ - { - "shortcode": "4w", - "static_url": "https://spinster.xyz/emoji/custom/4w.png", - "url": "https://spinster.xyz/emoji/custom/4w.png", - "visible_in_picker": false - }, - { - "shortcode": "spinster", - "static_url": "https://spinster.xyz/emoji/custom/spinster.png", - "url": "https://spinster.xyz/emoji/custom/spinster.png", - "visible_in_picker": false - } - ], - "fields": [ - { - "name": "Website", - "value": "https://marykatefain.com" - }, - { - "name": "Twitter", - "value": "https://twitter.com/mkay_fain" - }, - { - "name": "Patreon", - "value": "https://www.patreon.com/mkfain" - }, - { - "name": "Paypal", - "value": "https://www.paypal.com/donate?hosted_button_id=NYXHYFQ6CRWJJ" - }, - { - "name": "Facebook", - "value": "https://www.facebook.com/M-K-Fain-102559968375112" - }, - { - "name": "Dog Pics", - "value": "https://www.instagram.com/mmkaayyy92" - }, - { - "name": "$BTC", - "value": "bc1q7fp347muhnuxrtu0pft6eswn0e7pldhssdg8py" - } - ], - "followers_count": 5687, - "following_count": 18017, - "fqn": "mk@spinster.xyz", - "header": "https://media.spinster.xyz/3a5f9d5ef06940d0c319f8f0135b1153a8a42cefd10eace97378875c0347da71.png", - "header_static": "https://media.spinster.xyz/3a5f9d5ef06940d0c319f8f0135b1153a8a42cefd10eace97378875c0347da71.png", - "id": "9y4BZYXEDuQ6K1zW9g", - "last_status_at": "2022-02-27T01:58:21", - "locked": false, - "note": ":spinster: Admin of @spinster
:4w: Editor of @4WPub

Sorry I didn't reply to you.

Boost ≠ agree. All opinions my own.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://spinster.xyz/users/mk", - "background_image": null, - "favicon": "https://spinster.xyz/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [ - "verified" - ] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://marykatefain.com" - }, - { - "name": "Twitter", - "value": "https://twitter.com/mkay_fain" - }, - { - "name": "Patreon", - "value": "https://www.patreon.com/mkfain" - }, - { - "name": "Paypal", - "value": "https://www.paypal.com/donate?hosted_button_id=NYXHYFQ6CRWJJ" - }, - { - "name": "Facebook", - "value": "https://www.facebook.com/M-K-Fain-102559968375112" - }, - { - "name": "Dog Pics", - "value": "https://www.instagram.com/mmkaayyy92" - }, - { - "name": "$BTC", - "value": "bc1q7fp347muhnuxrtu0pft6eswn0e7pldhssdg8py" - } - ], - "note": ":spinster: Admin of @spinster\r\n:4w: Editor of @4WPub\r\n\r\nSorry I didn't reply to you.\r\n\r\nBoost ≠ agree. All opinions my own.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 9580, - "url": "https://spinster.xyz/users/mk", - "username": "mk" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-favourite.json b/packages/pl-fe/src/__fixtures__/notification-favourite.json deleted file mode 100644 index 00da9c8f9..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-favourite.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "account": { - "acct": "Hollahollara@spinster.xyz", - "avatar": "https://gleasonator.com/proxy/LArKQiIrW265rGIJGwdgX7rRsao/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvYXZhdGFycy8wMDAvMTQxLzI5NC9vcmlnaW5hbC9lNjA1NjljMjBjNGY3ODNjLnBuZw/e60569c20c4f783c.png", - "avatar_static": "https://gleasonator.com/proxy/LArKQiIrW265rGIJGwdgX7rRsao/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvYXZhdGFycy8wMDAvMTQxLzI5NC9vcmlnaW5hbC9lNjA1NjljMjBjNGY3ODNjLnBuZw/e60569c20c4f783c.png", - "bot": false, - "created_at": "2020-05-29T03:15:59.000Z", - "display_name": "Hollahollara", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "fqn": "Hollahollara@spinster.xyz", - "header": "https://gleasonator.com/proxy/XSANC57uDBL3tM0LBLEer7yMyaA/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvaGVhZGVycy8wMDAvMTQxLzI5NC9vcmlnaW5hbC84NTMzMWEzMjJkMTIyN2Q0LnBuZw/85331a322d1227d4.png", - "header_static": "https://gleasonator.com/proxy/XSANC57uDBL3tM0LBLEer7yMyaA/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvaGVhZGVycy8wMDAvMTQxLzI5NC9vcmlnaW5hbC84NTMzMWEzMjJkMTIyN2Q0LnBuZw/85331a322d1227d4.png", - "id": "9vWfJdLwuJSyJXqCeG", - "last_status_at": "2022-04-16T20:33:32", - "locked": true, - "note": "Adult human female. Artist. Evil terv. Millennial, killing all the things. Public Universal Friend.

www.jenniferaldridge.com


", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://spinster.xyz/users/Hollahollara", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/owo6QgsHm_0ogz5enHyvD68wDUA/aHR0cHM6Ly9zcGluc3Rlci54eXovZmF2aWNvbi5wbmc/favicon.png", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 7191, - "url": "https://spinster.xyz/users/Hollahollara", - "username": "Hollahollara" - }, - "created_at": "2022-04-14T20:36:52.000Z", - "id": "427825", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "follow_requests_count": 0, - "followers_count": 2602, - "following_count": 1603, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-04-16T19:23:50", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "accepts_email_list": true, - "allow_following_move": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "email": "alex@alexgleason.me", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": "Texas", - "notification_settings": { - "block_from_strangers": false, - "hide_notification_contents": false - }, - "relationship": {}, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 392, - "unread_notifications_count": 2 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_birthday": true, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 24050, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "", - "created_at": "2022-04-12T01:31:00.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 11, - "id": "AIMEslRcKrcu02D3HU", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [ - { - "blurhash": "etMZzVWq%1%1o#_NayWCofae_Ns:R*kDjYS5a{jYoJj]V@a}WBbGof", - "description": "", - "id": "AIMEqtBeZtvpQvqfIG", - "meta": { - "original": { - "aspect": 0.9726443768996961, - "height": 658, - "width": 640 - } - }, - "pleroma": { - "mime_type": "image/jpeg" - }, - "preview_url": "https://media.gleasonator.com/6c0a1d878b7c9d1d737f415645cf34cdacdf6438c468348f4fa7534a15798023.jpg", - "remote_url": "https://media.gleasonator.com/6c0a1d878b7c9d1d737f415645cf34cdacdf6438c468348f4fa7534a15798023.jpg", - "text_url": "https://media.gleasonator.com/6c0a1d878b7c9d1d737f415645cf34cdacdf6438c468348f4fa7534a15798023.jpg", - "type": "image", - "url": "https://media.gleasonator.com/6c0a1d878b7c9d1d737f415645cf34cdacdf6438c468348f4fa7534a15798023.jpg" - } - ], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "" - }, - "content_type": null, - "conversation_id": "AIMEslPqRSCzuXNdWC", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 4, - "me": false, - "name": "😆" - }, - { - "count": 1, - "me": false, - "name": "🤢" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 4, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/7953f9fb-d3d7-4f50-b9d8-27e311ac1f5e", - "url": "https://gleasonator.com/notice/AIMEslRcKrcu02D3HU", - "visibility": "public" - }, - "type": "favourite" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-follow.json b/packages/pl-fe/src/__fixtures__/notification-follow.json deleted file mode 100644 index f563646ad..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-follow.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "account": { - "acct": "neko@rdrama.cc", - "avatar": "https://gleasonator.com/proxy/QJ3einzsXdobgWPsyZowxnor1zY/aHR0cHM6Ly9yZHJhbWEuY2MvbWVkaWEvODcyNDhjYjctZWYwNC00ZThjLWEwYzEtNTYxNWMyNWM0MTk1L2Jsb2I/blob", - "avatar_static": "https://gleasonator.com/proxy/QJ3einzsXdobgWPsyZowxnor1zY/aHR0cHM6Ly9yZHJhbWEuY2MvbWVkaWEvODcyNDhjYjctZWYwNC00ZThjLWEwYzEtNTYxNWMyNWM0MTk1L2Jsb2I/blob", - "bot": false, - "created_at": "2022-04-16T20:23:16.000Z", - "display_name": "Nekobit", - "emojis": [], - "fields": [], - "followers_count": 19, - "following_count": 357, - "fqn": "neko@rdrama.cc", - "header": "https://gleasonator.com/proxy/ojpBSVKfePvLnb7pwqepQspzIko/aHR0cHM6Ly9yZHJhbWEuY2MvbWVkaWEvNjBkMTJjOWYtOTNkNi00ODBmLThhMGUtMTE3M2ZkNjg5MzhmL3dhbGxwYXBlcmZsYXJlLmNvbV93YWxscGFwZXItd2ViLmpwZw/wallpaperflare.com_wallpaper-web.jpg", - "header_static": "https://gleasonator.com/proxy/ojpBSVKfePvLnb7pwqepQspzIko/aHR0cHM6Ly9yZHJhbWEuY2MvbWVkaWEvNjBkMTJjOWYtOTNkNi00ODBmLThhMGUtMTE3M2ZkNjg5MzhmL3dhbGxwYXBlcmZsYXJlLmNvbV93YWxscGFwZXItd2ViLmpwZw/wallpaperflare.com_wallpaper-web.jpg", - "id": "AIW9zGESDwdT27vk0W", - "last_status_at": "2022-04-16T21:49:29", - "locked": false, - "note": "New instance, hello!

Please follow if you followed my desuposter.club alt", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://rdrama.cc/users/neko", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/dbCdmChqVRi0vjYTCpRj5lDLtNM/aHR0cHM6Ly9yZHJhbWEuY2MvZmF2aWNvbi5wbmc/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 6, - "url": "https://rdrama.cc/users/neko", - "username": "neko" - }, - "created_at": "2022-04-16T20:24:03.000Z", - "id": "429280", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "type": "follow" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-follow_request.json b/packages/pl-fe/src/__fixtures__/notification-follow_request.json deleted file mode 100644 index 391dfec50..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-follow_request.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "account": { - "acct": "alex@spinster.xyz", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2020-01-08T03:08:22.000Z", - "display_name": "**MOVED**", - "emojis": [], - "fields": [], - "followers_count": 1005, - "following_count": 724, - "fqn": "alex@spinster.xyz", - "header": "https://gleasonator.com/proxy/yxa7ucolLFAsmBHYJzksSh_zoao/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvaGVhZGVycy8wMDAvMDAwLzAwMS9vcmlnaW5hbC83ZmE4MWY5ZmZiYWVjZDk3LnBuZw/7fa81f9ffbaecd97.png", - "header_static": "https://gleasonator.com/proxy/yxa7ucolLFAsmBHYJzksSh_zoao/aHR0cHM6Ly9tZWRpYS5zcGluc3Rlci54eXovYWNjb3VudHMvaGVhZGVycy8wMDAvMDAwLzAwMS9vcmlnaW5hbC83ZmE4MWY5ZmZiYWVjZDk3LnBuZw/7fa81f9ffbaecd97.png", - "id": "9v5bmXkCYkqU30gp9s", - "last_status_at": null, - "locked": true, - "note": "Moved to https://spinster.xyz/@alex@gleasonator.com", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://spinster.xyz/users/alex", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/owo6QgsHm_0ogz5enHyvD68wDUA/aHR0cHM6Ly9zcGluc3Rlci54eXovZmF2aWNvbi5wbmc/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": false, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 2687, - "url": "https://spinster.xyz/users/alex", - "username": "alex" - }, - "created_at": "2020-12-30T02:23:35.000Z", - "id": "87967", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "type": "follow_request" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-mention.json b/packages/pl-fe/src/__fixtures__/notification-mention.json deleted file mode 100644 index d2ad0a265..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-mention.json +++ /dev/null @@ -1,226 +0,0 @@ -{ - "account": { - "acct": "silverpill@mitra.social", - "avatar": "https://gleasonator.com/proxy/ZbLqy9s8Hxn9I5K23y2mffsL6iY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvbWVkaWEvNmE3ODViZjdkZDA1ZjYxYzM1OTBlODkzNWFhNDkxNTZhNDk5YWMzMGZkMWU0MDJmNzllN2UxNjRhZGIzNmUyYy5wbmc/6a785bf7dd05f61c3590e8935aa49156a499ac30fd1e402f79e7e164adb36e2c.png", - "avatar_static": "https://gleasonator.com/proxy/ZbLqy9s8Hxn9I5K23y2mffsL6iY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvbWVkaWEvNmE3ODViZjdkZDA1ZjYxYzM1OTBlODkzNWFhNDkxNTZhNDk5YWMzMGZkMWU0MDJmNzllN2UxNjRhZGIzNmUyYy5wbmc/6a785bf7dd05f61c3590e8935aa49156a499ac30fd1e402f79e7e164adb36e2c.png", - "bot": false, - "created_at": "2021-11-11T22:31:51.000Z", - "display_name": "silverpill", - "emojis": [], - "fields": [ - { - "name": "Matrix", - "value": "@silverpill:poa.st" - }, - { - "name": "Alt", - "value": "@silverpill@poa.st" - }, - { - "name": "Code", - "value": "https://codeberg.org/silverpill/" - }, - { - "name": "$XMR", - "value": "884y9LmsWY7PQNsyR7bJy1dvj91tuF5spVabyCnPk4KfQtSuzFbQobTFC7xSemJgVW1FWAwnJbjTZX5zZWbBrfkv62DB62d" - } - ], - "followers_count": 0, - "following_count": 0, - "fqn": "silverpill@mitra.social", - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "ADIzJ7q9gExPvDKBCS", - "last_status_at": "2022-04-15T11:27:33", - "locked": false, - "note": "", - "pleroma": { - "accepts_chat_messages": false, - "also_known_as": [], - "ap_id": "https://mitra.social/users/silverpill", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/XSE9_kQbQyYcSFWszWx2GgCbBuY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvZmF2aWNvbi5pY28/favicon.ico", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 135, - "url": "https://mitra.social/users/silverpill", - "username": "silverpill" - }, - "created_at": "2022-04-15T11:27:33.000Z", - "id": "428172", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "status": { - "account": { - "acct": "silverpill@mitra.social", - "avatar": "https://gleasonator.com/proxy/ZbLqy9s8Hxn9I5K23y2mffsL6iY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvbWVkaWEvNmE3ODViZjdkZDA1ZjYxYzM1OTBlODkzNWFhNDkxNTZhNDk5YWMzMGZkMWU0MDJmNzllN2UxNjRhZGIzNmUyYy5wbmc/6a785bf7dd05f61c3590e8935aa49156a499ac30fd1e402f79e7e164adb36e2c.png", - "avatar_static": "https://gleasonator.com/proxy/ZbLqy9s8Hxn9I5K23y2mffsL6iY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvbWVkaWEvNmE3ODViZjdkZDA1ZjYxYzM1OTBlODkzNWFhNDkxNTZhNDk5YWMzMGZkMWU0MDJmNzllN2UxNjRhZGIzNmUyYy5wbmc/6a785bf7dd05f61c3590e8935aa49156a499ac30fd1e402f79e7e164adb36e2c.png", - "bot": false, - "created_at": "2021-11-11T22:31:51.000Z", - "display_name": "silverpill", - "emojis": [], - "fields": [ - { - "name": "Matrix", - "value": "@silverpill:poa.st" - }, - { - "name": "Alt", - "value": "@silverpill@poa.st" - }, - { - "name": "Code", - "value": "https://codeberg.org/silverpill/" - }, - { - "name": "$XMR", - "value": "884y9LmsWY7PQNsyR7bJy1dvj91tuF5spVabyCnPk4KfQtSuzFbQobTFC7xSemJgVW1FWAwnJbjTZX5zZWbBrfkv62DB62d" - } - ], - "followers_count": 0, - "following_count": 0, - "fqn": "silverpill@mitra.social", - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "ADIzJ7q9gExPvDKBCS", - "last_status_at": "2022-04-15T11:27:33", - "locked": false, - "note": "", - "pleroma": { - "accepts_chat_messages": false, - "also_known_as": [], - "ap_id": "https://mitra.social/users/silverpill", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/XSE9_kQbQyYcSFWszWx2GgCbBuY/aHR0cHM6Ly9taXRyYS5zb2NpYWwvZmF2aWNvbi5pY28/favicon.ico", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 135, - "url": "https://mitra.social/users/silverpill", - "username": "silverpill" - }, - "application": null, - "bookmarked": true, - "card": { - "author_name": "", - "author_url": "", - "blurhash": null, - "description": "The ActivityPub protocol is a decentralized social networking protocol\n based upon the [ActivityStreams] 2.0 data format.\n It provides a client to server API for creating, updating and deleting\n content, as well as a federated server to server API for delivering\n notifications and content.", - "embed_url": "", - "height": 0, - "html": "", - "image": null, - "provider_name": "www.w3.org", - "provider_url": "https://www.w3.org", - "title": "ActivityPub", - "type": "link", - "url": "https://www.w3.org/TR/activitypub/#retrieving-objects", - "width": 0 - }, - "content": "@alex @lain The second one is suggested by ActivityPub spec: https://www.w3.org/TR/activitypub/#retrieving-objects
\nThe first one is likely a legacy of earlier ActivityStreams standards, I'm not sure", - "created_at": "2022-04-15T11:27:28.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 2, - "id": "AITJf9Wpr0msWChNBI", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "AISPFI5nnPaS7J94rI", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - { - "acct": "lain@lain.com", - "id": "9v5bqYwY2jfmvPNhTM", - "url": "https://lain.com/users/lain", - "username": "lain" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "@alex @lain The second one is suggested by ActivityPub spec: https://www.w3.org/TR/activitypub/#retrieving-objects\nThe first one is likely a legacy of earlier ActivityStreams standards, I'm not sure" - }, - "content_type": null, - "conversation_id": "AISPFI2bzH2DxPeWsy", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "parent_visible": true, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://mitra.social/objects/01802cfa-633c-1c2c-e9cf-e6e0ffef0afe", - "url": "https://mitra.social/objects/01802cfa-633c-1c2c-e9cf-e6e0ffef0afe", - "visibility": "public" - }, - "type": "mention" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-move.json b/packages/pl-fe/src/__fixtures__/notification-move.json deleted file mode 100644 index 4bffd1906..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-move.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "account": { - "acct": "alex@fedibird.com", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2022-01-24T21:25:37.000Z", - "display_name": "alex@fedibird.com", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 2, - "fqn": "alex@fedibird.com", - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "AFmHQ18XZ7Lco68MW8", - "last_status_at": "2022-03-16T22:07:53", - "locked": false, - "note": "

", - "pleroma": { - "accepts_chat_messages": null, - "also_known_as": [], - "ap_id": "https://fedibird.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/HzfsidHss3CuA7aM2zxXN-tAjF8/aHR0cHM6Ly9mZWRpYmlyZC5jb20vZmF2aWNvbi5pY28/favicon.ico", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": "Texas", - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 5, - "url": "https://fedibird.com/@alex", - "username": "alex" - }, - "created_at": "2022-03-17T00:08:48.000Z", - "id": "406814", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "target": { - "acct": "benis911", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2021-03-26T20:42:11.000Z", - "display_name": "benis911", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "fqn": "benis911@gleasonator.com", - "header": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "header_static": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "id": "A5c5LK7EJTFR0u26Pg", - "last_status_at": "2022-03-19T22:33:38", - "locked": false, - "note": "hello world 2", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://gleasonator.com/users/alex", - "https://poa.st/users/alex", - "https://fedibird.com/users/alex" - ], - "ap_id": "https://gleasonator.com/users/benis911", - "background_image": null, - "birthday": "2000-01-25", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": true, - "hide_follows": true, - "hide_follows_count": true, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "hello world 2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 174, - "url": "https://gleasonator.com/users/benis911", - "username": "benis911" - }, - "type": "move" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-pleroma-chat_mention.json b/packages/pl-fe/src/__fixtures__/notification-pleroma-chat_mention.json deleted file mode 100644 index c90cc7bb9..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-pleroma-chat_mention.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "account": { - "acct": "dave", - "avatar": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "avatar_static": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "bot": false, - "created_at": "2020-02-01T07:28:46.000Z", - "display_name": "Elden Beedle 🇺🇦 🇫🇷", - "emojis": [], - "fields": [], - "followers_count": 490, - "following_count": 367, - "fqn": "dave@gleasonator.com", - "header": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "header_static": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "id": "9v5c0Pkz3MT5KTfam8", - "last_status_at": "2022-04-16T19:57:10", - "locked": false, - "note": "Beedle is back, baby!

Mostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/dave", - "background_image": null, - "birthday": "1990-01-01", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Beedle is back, baby!\r\n\r\nMostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 16758, - "url": "https://gleasonator.com/users/dave", - "username": "dave" - }, - "chat_message": { - "account_id": "9v5c0Pkz3MT5KTfam8", - "attachment": null, - "card": null, - "chat_id": "9yX4Q9DiC2te6lvk5g", - "content": "Cool, it works, I'll keep letting you know when I find broken stuff", - "created_at": "2022-04-16T19:22:54.000Z", - "emojis": [], - "id": "AIW4bHoICoZ9CsRTW4", - "unread": false - }, - "created_at": "2022-04-16T19:22:55.000Z", - "id": "429247", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "type": "pleroma:chat_mention" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-pleroma-emoji_reaction.json b/packages/pl-fe/src/__fixtures__/notification-pleroma-emoji_reaction.json deleted file mode 100644 index cc988d3a3..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-pleroma-emoji_reaction.json +++ /dev/null @@ -1,301 +0,0 @@ -{ - "account": { - "acct": "dave", - "avatar": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "avatar_static": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "bot": false, - "created_at": "2020-02-01T07:28:46.000Z", - "display_name": "Elden Beedle 🇺🇦 🇫🇷", - "emojis": [], - "fields": [], - "followers_count": 490, - "following_count": 367, - "fqn": "dave@gleasonator.com", - "header": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "header_static": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "id": "9v5c0Pkz3MT5KTfam8", - "last_status_at": "2022-04-16T19:57:10", - "locked": false, - "note": "Beedle is back, baby!

Mostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/dave", - "background_image": null, - "birthday": "1990-01-01", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Beedle is back, baby!\r\n\r\nMostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 16758, - "url": "https://gleasonator.com/users/dave", - "username": "dave" - }, - "created_at": "2022-04-16T16:52:15.000Z", - "emoji": "😮", - "id": "429071", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "follow_requests_count": 0, - "followers_count": 2602, - "following_count": 1603, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-04-16T19:23:50", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "accepts_email_list": true, - "allow_following_move": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "email": "alex@alexgleason.me", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": "Texas", - "notification_settings": { - "block_from_strangers": false, - "hide_notification_contents": false - }, - "relationship": {}, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 392, - "unread_notifications_count": 0 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_birthday": true, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 24050, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": { - "author_name": "Kaze Emanuar", - "author_url": "https://www.youtube.com/c/KazeEmanuar", - "blurhash": null, - "description": "", - "embed_url": null, - "height": 113, - "html": "", - "image": "https://gleasonator.com/proxy/mI004Vq00johZtAUmMp0fC_XAuM/aHR0cHM6Ly9pLnl0aW1nLmNvbS92aS90X3J6WW5YRVFsRS9ocWRlZmF1bHQuanBn/hqdefault.jpg", - "provider_name": "YouTube", - "provider_url": "https://www.youtube.com/", - "title": "FIXING the ENTIRE SM64 Source Code (INSANE N64 performance)", - "type": "video", - "url": "https://youtu.be/t_rzYnXEQlE", - "width": 200 - }, - "content": "

Bruh. This guy rewrote the reversed engineered Super Mario 64 code for 10x performance. Games need to be open source. https://youtu.be/t_rzYnXEQlE

", - "created_at": "2022-04-16T16:40:28.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 11, - "id": "AIVq6SrJg5yb8eGVsm", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Bruh. This guy rewrote the reversed engineered Super Mario 64 code for 10x performance. Games need to be open source. https://youtu.be/t_rzYnXEQlE" - }, - "content_type": null, - "conversation_id": "AIVq6SqFk37r5LlfE0", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": false, - "name": "❤️" - }, - { - "count": 2, - "me": false, - "name": "😮" - }, - { - "count": 1, - "me": false, - "name": "😆" - }, - { - "count": 1, - "me": false, - "name": "👍🏻" - }, - { - "count": 1, - "me": false, - "name": "🔥" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 7, - "replies_count": 2, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/160dcbb2-73bc-4cd2-971e-e7f6a38602a0", - "url": "https://gleasonator.com/notice/AIVq6SrJg5yb8eGVsm", - "visibility": "public" - }, - "type": "pleroma:emoji_reaction" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-poll.json b/packages/pl-fe/src/__fixtures__/notification-poll.json deleted file mode 100644 index fe582f249..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-poll.json +++ /dev/null @@ -1,202 +0,0 @@ -{ - "account": { - "acct": "dave", - "avatar": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "avatar_static": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "bot": false, - "created_at": "2020-02-01T07:28:46.000Z", - "display_name": "Elden Beedle 🇺🇦 🇫🇷", - "emojis": [], - "fields": [], - "followers_count": 490, - "following_count": 367, - "fqn": "dave@gleasonator.com", - "header": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "header_static": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "id": "9v5c0Pkz3MT5KTfam8", - "last_status_at": "2022-04-16T19:57:10", - "locked": false, - "note": "Beedle is back, baby!

Mostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/dave", - "background_image": null, - "birthday": "1990-01-01", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Beedle is back, baby!\r\n\r\nMostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 16758, - "url": "https://gleasonator.com/users/dave", - "username": "dave" - }, - "created_at": "2022-04-14T01:12:27.000Z", - "id": "427339", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "status": { - "account": { - "acct": "dave", - "avatar": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "avatar_static": "https://media.gleasonator.com/68c29c30c18f30dd2898f85466bf1670312dda816617e6d31421c7e4c30a8265.png", - "bot": false, - "created_at": "2020-02-01T07:28:46.000Z", - "display_name": "Elden Beedle 🇺🇦 🇫🇷", - "emojis": [], - "fields": [], - "followers_count": 490, - "following_count": 367, - "fqn": "dave@gleasonator.com", - "header": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "header_static": "https://media.gleasonator.com/47e8907c322a0e55d12b211846aa27c6b386e947326fe14bb09c89ef7317901d.jpg", - "id": "9v5c0Pkz3MT5KTfam8", - "last_status_at": "2022-04-16T19:57:10", - "locked": false, - "note": "Beedle is back, baby!

Mostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/dave", - "background_image": null, - "birthday": "1990-01-01", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Beedle is back, baby!\r\n\r\nMostly just crosspost memes and stuff I find on the internet", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 16758, - "url": "https://gleasonator.com/users/dave", - "username": "dave" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

Focusing on just the look, what do you guys think?

", - "created_at": "2022-04-13T01:12:26.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "AIOHjtGEaqUHoXGVf6", - "in_reply_to_account_id": "9v5c0Pkz3MT5KTfam8", - "in_reply_to_id": "AIOFTLqQrljhdNBNHE", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "dave", - "id": "9v5c0Pkz3MT5KTfam8", - "url": "https://gleasonator.com/users/dave", - "username": "dave" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Focusing on just the look, what do you guys think?" - }, - "content_type": null, - "conversation_id": "AIOFTLp0x2bNYyWF4C", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "dave", - "local": true, - "parent_visible": true, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": { - "emojis": [], - "expired": true, - "expires_at": "2022-04-14T01:12:26.000Z", - "id": "AIOHjtAuucEZY2mGNE", - "multiple": false, - "options": [ - { - "title": "Looks good, looking forward to wider deployment", - "votes_count": 10 - }, - { - "title": "Not a fan, l'll stick to the current UI thanks", - "votes_count": 1 - }, - { - "title": "Hard to say, need to actually try to decide honestly", - "votes_count": 1 - } - ], - "own_votes": [ - 0 - ], - "voted": true, - "voters_count": 12, - "votes_count": 12 - }, - "reblog": null, - "reblogged": false, - "reblogs_count": 1, - "replies_count": 1, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/a8465271-a48d-4c39-a0a9-d3eda3ab2735", - "url": "https://gleasonator.com/notice/AIOHjtGEaqUHoXGVf6", - "visibility": "public" - }, - "type": "poll" -} diff --git a/packages/pl-fe/src/__fixtures__/notification-reblog.json b/packages/pl-fe/src/__fixtures__/notification-reblog.json deleted file mode 100644 index 94638b8cd..000000000 --- a/packages/pl-fe/src/__fixtures__/notification-reblog.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "account": { - "acct": "rob@nicecrew.digital", - "avatar": "https://gleasonator.com/proxy/RcEgR4-0InIpw_sCpDWV-XrAbmY/aHR0cHM6Ly9uaWNlY3Jldy5kaWdpdGFsL21lZGlhL2M0MTllMTk1Nzg0MmEzMTY5M2MzNDExNTZlMTBhNmQwMTY2ZTM5YzQzM2ExZTczMmVmYWNlYmJkYjAyMDYzZjEucG5n/c419e1957842a31693c341156e10a6d0166e39c433a1e732efacebbdb02063f1.png", - "avatar_static": "https://gleasonator.com/proxy/RcEgR4-0InIpw_sCpDWV-XrAbmY/aHR0cHM6Ly9uaWNlY3Jldy5kaWdpdGFsL21lZGlhL2M0MTllMTk1Nzg0MmEzMTY5M2MzNDExNTZlMTBhNmQwMTY2ZTM5YzQzM2ExZTczMmVmYWNlYmJkYjAyMDYzZjEucG5n/c419e1957842a31693c341156e10a6d0166e39c433a1e732efacebbdb02063f1.png", - "bot": false, - "created_at": "2022-03-10T12:30:41.000Z", - "display_name": "Rob Colbert", - "emojis": [], - "fields": [ - { - "name": "Shing.tv", - "value": "https://shing.tv" - }, - { - "name": "LibertyLinks", - "value": "https://libertylinks.io" - }, - { - "name": "GiveSendGo", - "value": "https://givesendgo.com/dtp" - } - ], - "followers_count": 0, - "following_count": 0, - "fqn": "rob@nicecrew.digital", - "header": "https://gleasonator.com/proxy/t4--aro68-XZlasaR2bYiuiZMcA/aHR0cHM6Ly9uaWNlY3Jldy5kaWdpdGFsL21lZGlhL2E5ODYzYWE4YjEzM2QwMzkxNmU1N2MzNDgzMzBhZmE5MTM5MDFlNGZiMDEwYjk1Y2FiZjlmYmZiZTA4N2QxODMucG5n/a9863aa8b133d03916e57c348330afa913901e4fb010b95cabf9fbfbe087d183.png", - "header_static": "https://gleasonator.com/proxy/t4--aro68-XZlasaR2bYiuiZMcA/aHR0cHM6Ly9uaWNlY3Jldy5kaWdpdGFsL21lZGlhL2E5ODYzYWE4YjEzM2QwMzkxNmU1N2MzNDgzMzBhZmE5MTM5MDFlNGZiMDEwYjk1Y2FiZjlmYmZiZTA4N2QxODMucG5n/a9863aa8b133d03916e57c348330afa913901e4fb010b95cabf9fbfbe087d183.png", - "id": "AHGmnebARD1aa1IiBc", - "last_status_at": "2022-04-16T21:08:35", - "locked": false, - "note": "Creator and CTO of the Digital Telepresence Platform and DTP Technologies, LLC.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://nicecrew.digital/users/rob", - "background_image": null, - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/gb2NPo0Kv_svADN1_J9_9iSwlrY/aHR0cHM6Ly9uaWNlY3Jldy5kaWdpdGFsL2Zhdmljb24ucG5n/favicon.png", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 761, - "url": "https://nicecrew.digital/users/rob", - "username": "rob" - }, - "created_at": "2022-04-16T03:43:24.000Z", - "id": "428608", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "follow_requests_count": 0, - "followers_count": 2602, - "following_count": 1603, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-04-16T19:23:50", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "accepts_email_list": true, - "allow_following_move": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "email": "alex@alexgleason.me", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": "Texas", - "notification_settings": { - "block_from_strangers": false, - "hide_notification_contents": false - }, - "relationship": {}, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 392, - "unread_notifications_count": 0 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_birthday": true, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 24050, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

The @fsf needs to give out an award to every American who has never downloaded TikTok.

", - "created_at": "2022-04-16T03:42:50.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 15, - "id": "AIUihbqUEe5Uvv7P9s", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "fsf@status.fsf.org", - "id": "9v5boQSsaxVc3AU8u0", - "url": "https://status.fsf.org/fsf", - "username": "fsf" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "The @fsf needs to give out an award to every American who has never downloaded TikTok." - }, - "content_type": null, - "conversation_id": "AIUihbp4JuxArWSGwq", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 2, - "me": false, - "name": "🔥" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 8, - "replies_count": 4, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/6be95787-fb9c-41cd-96cf-9652b2680863", - "url": "https://gleasonator.com/notice/AIUihbqUEe5Uvv7P9s", - "visibility": "public" - }, - "type": "reblog" -} diff --git a/packages/pl-fe/src/__fixtures__/notification.json b/packages/pl-fe/src/__fixtures__/notification.json deleted file mode 100644 index 65f522bb8..000000000 --- a/packages/pl-fe/src/__fixtures__/notification.json +++ /dev/null @@ -1,250 +0,0 @@ -{ - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-10T02:51:05.000Z", - "id": "10743", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.

Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.

I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.", - "created_at": "2020-06-10T01:29:20.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 4, - "id": "9vvNxoo5EFbbnfdXQu", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus." - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba", - "url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu", - "visibility": "public" - }, - "type": "favourite" -} diff --git a/packages/pl-fe/src/__fixtures__/notifications.json b/packages/pl-fe/src/__fixtures__/notifications.json deleted file mode 100644 index fd99490c8..000000000 --- a/packages/pl-fe/src/__fixtures__/notifications.json +++ /dev/null @@ -1,4461 +0,0 @@ -[ - { - "account": { - "acct": "seanking", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2020-05-24T01:46:12.000Z", - "display_name": "Sean King", - "emojis": [], - "fields": [], - "followers_count": 8, - "following_count": 4, - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "9vMAje101ngtjlMj7w", - "locked": false, - "note": "Hi, I'm Sean King, Founder and President of Sandia Mesa. I'll be here to try out new features and help test out some with Soapbox FE.", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9vMAje101ngtjlMj7w", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Hi, I'm Sean King, Founder and President of Sandia Mesa. I'll be here to try out new features and help test out some with Soapbox FE.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 15, - "url": "https://gleasonator.com/users/seanking", - "username": "seanking" - }, - "created_at": "2020-06-10T02:54:39.000Z", - "emoji": "😢", - "id": "10744", - "pleroma": { - "is_seen": false - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.

Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.

I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.", - "created_at": "2020-06-10T01:29:20.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 4, - "id": "9vvNxoo5EFbbnfdXQu", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus." - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba", - "url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu", - "visibility": "public" - }, - "type": "pleroma:emoji_reaction" - }, - { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-10T02:51:05.000Z", - "id": "10743", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.

Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.

I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.", - "created_at": "2020-06-10T01:29:20.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 4, - "id": "9vvNxoo5EFbbnfdXQu", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus." - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba", - "url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "niggaflamebuttholeaids@husk.site", - "avatar": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "avatar_static": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "bot": false, - "created_at": "2020-05-03T01:39:47.000Z", - "display_name": ":brain3: Steven :alexjonesflexing:", - "emojis": [ - { - "shortcode": "alexjonesflexing", - "static_url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "visible_in_picker": false - }, - { - "shortcode": "brain3", - "static_url": "https://husk.site/emoji/custom/brain3.png", - "url": "https://husk.site/emoji/custom/brain3.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 90, - "following_count": 67, - "header": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "header_static": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "id": "9v5cKMOPGqPcgfcWp6", - "locked": false, - "note": "Professional Liar", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5cKMOPGqPcgfcWp6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Professional Liar", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 5350, - "url": "https://husk.site/users/niggaflamebuttholeaids", - "username": "niggaflamebuttholeaids" - }, - "created_at": "2020-06-10T02:05:06.000Z", - "id": "10741", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.

Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.

I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.", - "created_at": "2020-06-10T01:29:20.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 4, - "id": "9vvNxoo5EFbbnfdXQu", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus." - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba", - "url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "dielan@shitposter.club", - "avatar": "https://shitposter.club/media/99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif?name=99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif", - "avatar_static": "https://shitposter.club/media/99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif?name=99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif", - "bot": false, - "created_at": "2020-01-09T13:21:37.000Z", - "display_name": ":8b_d:‍:8b_i:‍:8b_e:‍:8b_l:‍:8b_a:‍:8b_n:", - "emojis": [ - { - "shortcode": "8b_a", - "static_url": "https://shitposter.club/emoji/stolen/8b_a.png", - "url": "https://shitposter.club/emoji/stolen/8b_a.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_d", - "static_url": "https://shitposter.club/emoji/stolen/8b_d.png", - "url": "https://shitposter.club/emoji/stolen/8b_d.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_e", - "static_url": "https://shitposter.club/emoji/stolen/8b_e.png", - "url": "https://shitposter.club/emoji/stolen/8b_e.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_i", - "static_url": "https://shitposter.club/emoji/stolen/8b_i.png", - "url": "https://shitposter.club/emoji/stolen/8b_i.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_l", - "static_url": "https://shitposter.club/emoji/stolen/8b_l.png", - "url": "https://shitposter.club/emoji/stolen/8b_l.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_n", - "static_url": "https://shitposter.club/emoji/stolen/8b_n.png", - "url": "https://shitposter.club/emoji/stolen/8b_n.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 855, - "following_count": 962, - "header": "https://shitposter.club/media/8c063a5c6625df7fca6b2c201b4473c524ac8dd29b227a86e1ad93ead4abc5f5.png?name=MQFDMQIO15X8.png", - "header_static": "https://shitposter.club/media/8c063a5c6625df7fca6b2c201b4473c524ac8dd29b227a86e1ad93ead4abc5f5.png?name=MQFDMQIO15X8.png", - "id": "9v5bpF8QCmRpCUJ1ay", - "locked": false, - "note": "The Botfather

















Podcast: @podcast@melonmancy.net
Waifu: @ironee212@shitposter.club", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bpF8QCmRpCUJ1ay", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "The Botfather\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPodcast: @podcast@melonmancy.net \nWaifu: @ironee212@shitposter.club", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 5474, - "url": "https://shitposter.club/users/dielan", - "username": "dielan" - }, - "created_at": "2020-06-10T01:32:59.000Z", - "id": "10740", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "dielan@shitposter.club", - "avatar": "https://shitposter.club/media/99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif?name=99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif", - "avatar_static": "https://shitposter.club/media/99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif?name=99884dfe7d89658f00c7454cfd9d3cc932a650384a69963b8499fc89284464b5.gif", - "bot": false, - "created_at": "2020-01-09T13:21:37.000Z", - "display_name": ":8b_d:‍:8b_i:‍:8b_e:‍:8b_l:‍:8b_a:‍:8b_n:", - "emojis": [ - { - "shortcode": "8b_a", - "static_url": "https://shitposter.club/emoji/stolen/8b_a.png", - "url": "https://shitposter.club/emoji/stolen/8b_a.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_d", - "static_url": "https://shitposter.club/emoji/stolen/8b_d.png", - "url": "https://shitposter.club/emoji/stolen/8b_d.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_e", - "static_url": "https://shitposter.club/emoji/stolen/8b_e.png", - "url": "https://shitposter.club/emoji/stolen/8b_e.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_i", - "static_url": "https://shitposter.club/emoji/stolen/8b_i.png", - "url": "https://shitposter.club/emoji/stolen/8b_i.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_l", - "static_url": "https://shitposter.club/emoji/stolen/8b_l.png", - "url": "https://shitposter.club/emoji/stolen/8b_l.png", - "visible_in_picker": false - }, - { - "shortcode": "8b_n", - "static_url": "https://shitposter.club/emoji/stolen/8b_n.png", - "url": "https://shitposter.club/emoji/stolen/8b_n.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 855, - "following_count": 962, - "header": "https://shitposter.club/media/8c063a5c6625df7fca6b2c201b4473c524ac8dd29b227a86e1ad93ead4abc5f5.png?name=MQFDMQIO15X8.png", - "header_static": "https://shitposter.club/media/8c063a5c6625df7fca6b2c201b4473c524ac8dd29b227a86e1ad93ead4abc5f5.png?name=MQFDMQIO15X8.png", - "id": "9v5bpF8QCmRpCUJ1ay", - "locked": false, - "note": "The Botfather

















Podcast: @podcast@melonmancy.net
Waifu: @ironee212@shitposter.club", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bpF8QCmRpCUJ1ay", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "The Botfather\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nPodcast: @podcast@melonmancy.net \nWaifu: @ironee212@shitposter.club", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 5474, - "url": "https://shitposter.club/users/dielan", - "username": "dielan" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex you dont need to write tests when your community builds a social framework that flags people not using your software as bad people. They have no choice but to eat it up bugs in all", - "created_at": "2020-06-10T01:32:58.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "9vvOI4du3rkuhoX8wS", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vvNxoo5EFbbnfdXQu", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex you dont need to write tests when your community builds a social framework that flags people not using your software as bad people. They have no choice but to eat it up bugs in all" - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": true, - "name": "😆" - } - ], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://shitposter.club/objects/3e7565f6-13f2-432c-a316-7d4034f91d79", - "url": "https://shitposter.club/objects/3e7565f6-13f2-432c-a316-7d4034f91d79", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "tk@bbs.kawa-kun.com", - "avatar": "https://bbs.kawa-kun.com/media/66c8ef028f985b01c41f173f868a84a49f8ab60b4e919b4231366963953ad75e.png?name=noface_avatar.png", - "avatar_static": "https://bbs.kawa-kun.com/media/66c8ef028f985b01c41f173f868a84a49f8ab60b4e919b4231366963953ad75e.png?name=noface_avatar.png", - "bot": false, - "created_at": "2020-01-28T22:21:12.000Z", - "display_name": "竹下憲二✔️", - "emojis": [], - "fields": [], - "followers_count": 204, - "following_count": 205, - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "9v5bzD24sOZtZm5gVU", - "locked": false, - "note": "The monotony is bad enough on its own, but the scarcity of groceries makes the roll of this situation even worse.

The Great Wall of Mastodon is ever-expanding.

XMPP: tk@msg.kawa-kun.com
Telegram: Ask

Flickr: https://www.flickr.com/photos/105592384@N07/

#cycling #linux #pchardware", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bzD24sOZtZm5gVU", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "The monotony is bad enough on its own, but the scarcity of groceries makes the roll of this situation even worse.\n\nThe Great Wall of Mastodon is ever-expanding.\n\nXMPP: tk@msg.kawa-kun.com\nTelegram: Ask\n\nFlickr: https://www.flickr.com/photos/105592384@N07/\n\n#cycling #linux #pchardware", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 10393, - "url": "https://bbs.kawa-kun.com/users/tk", - "username": "tk" - }, - "created_at": "2020-06-10T01:30:44.000Z", - "id": "10739", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.

Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.

I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus.", - "created_at": "2020-06-10T01:29:20.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 4, - "id": "9vvNxoo5EFbbnfdXQu", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "At 10.72% test coverage, Soapbox FE now has 2x more than MastoFE, which only has 4.21%.Pleroma FE doesn't seem to report coverage, but I suspect it's better than both of these combined.I don't know how Mastodon got away with not writing tests for so long, but I feel like there could be an entire release dedicated only to going back and writing missing tests... jesus." - }, - "conversation_id": 1168229, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/aa294f83-5a6c-4d2b-ba20-2b8bf69a82ba", - "url": "https://gleasonator.com/notice/9vvNxoo5EFbbnfdXQu", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "cy@verge.info.tm", - "avatar": "https://verge.info.tm/media/906c5ecab609712291859dfd56c4c8df746d5f71737745fcb70e7e8d8a93fae0.jpg", - "avatar_static": "https://verge.info.tm/media/906c5ecab609712291859dfd56c4c8df746d5f71737745fcb70e7e8d8a93fae0.jpg", - "bot": false, - "created_at": "2020-05-31T02:52:45.000Z", - "display_name": "cy", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "header": "https://verge.info.tm/media/58d7a0358697dd90e76b55f068341d6d314c4954081b67a8a78355d2912f15bf.jpg", - "header_static": "https://verge.info.tm/media/58d7a0358697dd90e76b55f068341d6d314c4954081b67a8a78355d2912f15bf.jpg", - "id": "9vamGqGoKW9uQAWG7k", - "locked": false, - "note": "Just someone near #Portland, #Oregon, living in west #Hillsboro. The sidewalks are empty. I know not who lives down the street. I'm all alone. Plz send hugs
PGP: dsa3072/E4F606A10AC7DA56
Tox: 2F22EF2948934B65812827248FB6B2142F4AA9725C8599D02AFC7D3103B94B191A43C2E6DCF6", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9vamGqGoKW9uQAWG7k", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Just someone near #Portland, #Oregon, living in west #Hillsboro. The sidewalks are empty. I know not who lives down the street. I'm all alone. Plz send hugs\nPGP: dsa3072/E4F606A10AC7DA56\nTox: 2F22EF2948934B65812827248FB6B2142F4AA9725C8599D02AFC7D3103B94B191A43C2E6DCF6", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 77, - "url": "https://verge.info.tm/users/cy", - "username": "cy" - }, - "created_at": "2020-06-09T20:36:39.000Z", - "id": "10731", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "cy@verge.info.tm", - "avatar": "https://verge.info.tm/media/906c5ecab609712291859dfd56c4c8df746d5f71737745fcb70e7e8d8a93fae0.jpg", - "avatar_static": "https://verge.info.tm/media/906c5ecab609712291859dfd56c4c8df746d5f71737745fcb70e7e8d8a93fae0.jpg", - "bot": false, - "created_at": "2020-05-31T02:52:45.000Z", - "display_name": "cy", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "header": "https://verge.info.tm/media/58d7a0358697dd90e76b55f068341d6d314c4954081b67a8a78355d2912f15bf.jpg", - "header_static": "https://verge.info.tm/media/58d7a0358697dd90e76b55f068341d6d314c4954081b67a8a78355d2912f15bf.jpg", - "id": "9vamGqGoKW9uQAWG7k", - "locked": false, - "note": "Just someone near #Portland, #Oregon, living in west #Hillsboro. The sidewalks are empty. I know not who lives down the street. I'm all alone. Plz send hugs
PGP: dsa3072/E4F606A10AC7DA56
Tox: 2F22EF2948934B65812827248FB6B2142F4AA9725C8599D02AFC7D3103B94B191A43C2E6DCF6", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9vamGqGoKW9uQAWG7k", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Just someone near #Portland, #Oregon, living in west #Hillsboro. The sidewalks are empty. I know not who lives down the street. I'm all alone. Plz send hugs\nPGP: dsa3072/E4F606A10AC7DA56\nTox: 2F22EF2948934B65812827248FB6B2142F4AA9725C8599D02AFC7D3103B94B191A43C2E6DCF6", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 77, - "url": "https://verge.info.tm/users/cy", - "username": "cy" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "

@alex The first step to getting people to commit inhumane acts is to convince them that they are incapable of doing so.

", - "created_at": "2020-06-09T20:36:38.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 2, - "id": "9vuxqLdmfiHiVXb2tU", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vtSW9UapzWfImEAPw", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex The first step to getting people to commit inhumane acts is to convince them that they are incapable of doing so." - }, - "conversation_id": 1117237, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://verge.info.tm/objects/3901aa21-5e89-447b-842e-1721e2e7309f", - "url": "https://verge.info.tm/objects/3901aa21-5e89-447b-842e-1721e2e7309f", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "seanking", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2020-05-24T01:46:12.000Z", - "display_name": "Sean King", - "emojis": [], - "fields": [], - "followers_count": 8, - "following_count": 4, - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "9vMAje101ngtjlMj7w", - "locked": false, - "note": "Hi, I'm Sean King, Founder and President of Sandia Mesa. I'll be here to try out new features and help test out some with Soapbox FE.", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9vMAje101ngtjlMj7w", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Hi, I'm Sean King, Founder and President of Sandia Mesa. I'll be here to try out new features and help test out some with Soapbox FE.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 15, - "url": "https://gleasonator.com/users/seanking", - "username": "seanking" - }, - "created_at": "2020-06-09T18:53:51.000Z", - "id": "10729", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881", - "created_at": "2020-06-09T18:08:42.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 3, - "id": "9vukdh0qbKoPch1GVM", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881" - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 1, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/945e75ad-e6ce-4f07-be69-23027e153100", - "url": "https://gleasonator.com/notice/9vukdh0qbKoPch1GVM", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "lain@lain.com", - "avatar": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "avatar_static": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "bot": false, - "created_at": "2020-01-10T17:30:10.000Z", - "display_name": "Avalokiteshvara", - "emojis": [], - "fields": [], - "followers_count": 807, - "following_count": 223, - "header": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "header_static": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "id": "9v5bqYwY2jfmvPNhTM", - "locked": false, - "note": "No more hiding", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bqYwY2jfmvPNhTM", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "No more hiding", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 20907, - "url": "https://lain.com/users/lain", - "username": "lain" - }, - "created_at": "2020-06-09T18:47:58.000Z", - "id": "10728", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "lain@lain.com", - "avatar": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "avatar_static": "https://lain.com/media/0b7eb9eee68845f94dd1c7bd10d9bae90a2420cf6704de5485179c441eb0e6e0.jpg", - "bot": false, - "created_at": "2020-01-10T17:30:10.000Z", - "display_name": "Avalokiteshvara", - "emojis": [], - "fields": [], - "followers_count": 807, - "following_count": 223, - "header": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "header_static": "https://lain.com/media/fb0768dfa331ad730de32189d2e89b99fe51eebe1782a16cf076d7693394e4f9.png", - "id": "9v5bqYwY2jfmvPNhTM", - "locked": false, - "note": "No more hiding", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bqYwY2jfmvPNhTM", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "No more hiding", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 20907, - "url": "https://lain.com/users/lain", - "username": "lain" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex @crockwave well, the preliminary state of the issue is not "no it's not happening", but rather " let's find a way to make this possible in the generic case", so we'll see what can be done. I think a wrapper is definitely possible but also probably expensive to maintain.", - "created_at": "2020-06-09T18:47:56.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 3, - "id": "9vuo8zWu6ZHTtNd5qy", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vun9P6euZhNGLzDsG", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - { - "acct": "crockwave", - "id": "9v5c6xSEgAi3Zu1Lv6", - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex @crockwave well, the preliminary state of the issue is not \"no it's not happening\", but rather \" let's find a way to make this possible in the generic case\", so we'll see what can be done. I think a wrapper is definitely possible but also probably expensive to maintain." - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://lain.com/objects/d4f12540-1988-4609-8830-923da784cbbc", - "url": "https://lain.com/objects/d4f12540-1988-4609-8830-923da784cbbc", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-09T18:38:07.000Z", - "id": "10724", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@crockwave I think we can achieve both those things (funding goal on homepage, Patron badge) by exposing API endpoints from fosspay.

I agree a wrapper service could provide many future benefits, but I've done that exact thing before (see: Mastodon Engine: https://gitlab.com/soapbox-pub/mastodon-engine ) and it was experimental, back-breaking, and required a DEEP understanding of the underlying tech. I just don't have the time or energy to dive that deep into Phoenix right now, especially not having a strong grasp of Elixir.", - "created_at": "2020-06-09T18:36:50.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "9vun9P6euZhNGLzDsG", - "in_reply_to_account_id": "9v5c6xSEgAi3Zu1Lv6", - "in_reply_to_id": "9vumx07RzIPCI7RUqO", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "crockwave", - "id": "9v5c6xSEgAi3Zu1Lv6", - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@crockwave I think we can achieve both those things (funding goal on homepage, Patron badge) by exposing API endpoints from fosspay.I agree a wrapper service could provide many future benefits, but I've done that exact thing before (see: Mastodon Engine: https://gitlab.com/soapbox-pub/mastodon-engine ) and it was experimental, back-breaking, and required a DEEP understanding of the underlying tech. I just don't have the time or energy to dive that deep into Phoenix right now, especially not having a strong grasp of Elixir." - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "crockwave", - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 2, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/0260c269-09ba-46b8-a59d-710c00bbb674", - "url": "https://gleasonator.com/notice/9vun9P6euZhNGLzDsG", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "realcaseyrollins", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/023/720/original/1dbd625cbe9113c4.png", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/023/720/original/1dbd625cbe9113c4.png", - "bot": false, - "created_at": "2020-01-31T05:03:54.000Z", - "display_name": "Queso", - "emojis": [], - "fields": [], - "followers_count": 49, - "following_count": 81, - "header": "https://media.gleasonator.com/accounts/headers/000/023/720/original/9dfdc7a027af0e9e.jpg", - "header_static": "https://media.gleasonator.com/accounts/headers/000/023/720/original/9dfdc7a027af0e9e.jpg", - "id": "9v5bzlc4J5ZMpFBuKG", - "locked": false, - "note": "

Hey I'm just tryin' out Soapbox

", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bzlc4J5ZMpFBuKG", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Hey I'm just tryin' out Soapbox", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 72, - "url": "https://gleasonator.com/users/realcaseyrollins", - "username": "realcaseyrollins" - }, - "created_at": "2020-06-09T18:37:27.000Z", - "emoji": "😢", - "id": "10722", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.

Working on automated tests today.", - "created_at": "2020-06-09T18:34:26.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "9vumw53EAK9vIW1oqe", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today." - }, - "conversation_id": 1150963, - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": false, - "name": "😢" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/30bde29e-c456-41ce-b767-bf562513285b", - "url": "https://gleasonator.com/notice/9vumw53EAK9vIW1oqe", - "visibility": "public" - }, - "type": "pleroma:emoji_reaction" - }, - { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-09T18:37:26.000Z", - "id": "10721", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex Can you create some automated test templates, then outsource the drudgerous portion of the effort to your support team?", - "created_at": "2020-06-09T18:37:26.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 1, - "id": "9vunChQZFapwxAs0EC", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vumw53EAK9vIW1oqe", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex Can you create some automated test templates, then outsource the drudgerous portion of the effort to your support team?" - }, - "conversation_id": 1150963, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 1, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/c3b656ca-616d-4241-9c30-bc1ac92848bd", - "url": "https://gleasonator.com/notice/9vunChQZFapwxAs0EC", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "PFreak@panthermodern.net", - "avatar": "https://pool.jortage.com/panthermodernnet/accounts/avatars/000/129/877/original/8250b48cca8b4980.jpg", - "avatar_static": "https://pool.jortage.com/panthermodernnet/accounts/avatars/000/129/877/original/8250b48cca8b4980.jpg", - "bot": false, - "created_at": "2020-02-27T17:25:04.000Z", - "display_name": "PFreak@panthermodern.net", - "emojis": [], - "fields": [ - { - "name": "pgp", - "value": "just ask :)" - }, - { - "name": "pronouns", - "value": "she/her || they/them" - }, - { - "name": "groks?", - "value": "groks" - } - ], - "followers_count": 2, - "following_count": 15, - "header": "https://pool.jortage.com/panthermodernnet/accounts/headers/000/129/877/original/f509a4a560064193.png", - "header_static": "https://pool.jortage.com/panthermodernnet/accounts/headers/000/129/877/original/f509a4a560064193.png", - "id": "9v5c7DOvOFZH2Gavyq", - "locked": true, - "note": "

Some creature with an internet connection...
Computers were my first friends in life.

#NoBot

", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c7DOvOFZH2Gavyq", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Some creature with an internet connection...\nComputers were my first friends in life.#NoBot", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 253, - "url": "https://social.panthermodern.net/@PFreak", - "username": "PFreak" - }, - "created_at": "2020-06-09T18:36:20.000Z", - "id": "10718", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "PFreak@panthermodern.net", - "avatar": "https://pool.jortage.com/panthermodernnet/accounts/avatars/000/129/877/original/8250b48cca8b4980.jpg", - "avatar_static": "https://pool.jortage.com/panthermodernnet/accounts/avatars/000/129/877/original/8250b48cca8b4980.jpg", - "bot": false, - "created_at": "2020-02-27T17:25:04.000Z", - "display_name": "PFreak@panthermodern.net", - "emojis": [], - "fields": [ - { - "name": "pgp", - "value": "just ask :)" - }, - { - "name": "pronouns", - "value": "she/her || they/them" - }, - { - "name": "groks?", - "value": "groks" - } - ], - "followers_count": 2, - "following_count": 15, - "header": "https://pool.jortage.com/panthermodernnet/accounts/headers/000/129/877/original/f509a4a560064193.png", - "header_static": "https://pool.jortage.com/panthermodernnet/accounts/headers/000/129/877/original/f509a4a560064193.png", - "id": "9v5c7DOvOFZH2Gavyq", - "locked": true, - "note": "

Some creature with an internet connection...
Computers were my first friends in life.

#NoBot

", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c7DOvOFZH2Gavyq", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Some creature with an internet connection...\nComputers were my first friends in life.#NoBot", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 253, - "url": "https://social.panthermodern.net/@PFreak", - "username": "PFreak" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "

@alex it's good to be thorough, and is useful if that code ever changes down the line.

", - "created_at": "2020-06-09T18:36:19.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 1, - "id": "9vun6Z45Qh45HPQgQi", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vufIbN3slCeH1X984", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex it's good to be thorough, and is useful if that code ever changes down the line." - }, - "conversation_id": 1147390, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://social.panthermodern.net/users/PFreak/statuses/104315471735910922", - "url": "https://social.panthermodern.net/@PFreak/104315471735910922", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "hackerjunkie@quey.org", - "avatar": "https://media.quey.org/quey-media/accounts/avatars/000/215/311/original/5339ce3b70ea8c04.png", - "avatar_static": "https://media.quey.org/quey-media/accounts/avatars/000/215/311/original/5339ce3b70ea8c04.png", - "bot": false, - "created_at": "2020-02-11T19:13:34.000Z", - "display_name": "Thaha Jemni", - "emojis": [], - "fields": [ - { - "name": "Country", - "value": "The Netherlands" - }, - { - "name": "Fav. OS", - "value": "Linux" - } - ], - "followers_count": 38, - "following_count": 48, - "header": "https://media.quey.org/quey-media/accounts/headers/000/215/311/original/f9dcebd451487a6c.png", - "header_static": "https://media.quey.org/quey-media/accounts/headers/000/215/311/original/f9dcebd451487a6c.png", - "id": "9v5c3Y0cpOFdnATp5c", - "locked": false, - "note": "

Lover of tech. Supporter of freedom.

Be nice, I will be nice back.

Boosts ≠ endorsement.

", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c3Y0cpOFdnATp5c", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Lover of tech. Supporter of freedom.Be nice, I will be nice back.Boosts ≠ endorsement.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 642, - "url": "https://quey.org/@hackerjunkie", - "username": "hackerjunkie" - }, - "created_at": "2020-06-09T18:36:14.000Z", - "id": "10717", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "hackerjunkie@quey.org", - "avatar": "https://media.quey.org/quey-media/accounts/avatars/000/215/311/original/5339ce3b70ea8c04.png", - "avatar_static": "https://media.quey.org/quey-media/accounts/avatars/000/215/311/original/5339ce3b70ea8c04.png", - "bot": false, - "created_at": "2020-02-11T19:13:34.000Z", - "display_name": "Thaha Jemni", - "emojis": [], - "fields": [ - { - "name": "Country", - "value": "The Netherlands" - }, - { - "name": "Fav. OS", - "value": "Linux" - } - ], - "followers_count": 38, - "following_count": 48, - "header": "https://media.quey.org/quey-media/accounts/headers/000/215/311/original/f9dcebd451487a6c.png", - "header_static": "https://media.quey.org/quey-media/accounts/headers/000/215/311/original/f9dcebd451487a6c.png", - "id": "9v5c3Y0cpOFdnATp5c", - "locked": false, - "note": "

Lover of tech. Supporter of freedom.

Be nice, I will be nice back.

Boosts ≠ endorsement.

", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c3Y0cpOFdnATp5c", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Lover of tech. Supporter of freedom.Be nice, I will be nice back.Boosts ≠ endorsement.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 642, - "url": "https://quey.org/@hackerjunkie", - "username": "hackerjunkie" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "

@alex whatever you do: KEEP GOING ALMOST THERE YOU CAN DO IT!

", - "created_at": "2020-06-09T18:36:14.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 1, - "id": "9vun65zpVRQd7oDNGi", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vumw53EAK9vIW1oqe", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex whatever you do: KEEP GOING ALMOST THERE YOU CAN DO IT!" - }, - "conversation_id": 1150963, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 3, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://quey.org/users/hackerjunkie/statuses/104315471432969831", - "url": "https://quey.org/@hackerjunkie/104315471432969831", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "niggaflamebuttholeaids@husk.site", - "avatar": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "avatar_static": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "bot": false, - "created_at": "2020-05-03T01:39:47.000Z", - "display_name": ":brain3: Steven :alexjonesflexing:", - "emojis": [ - { - "shortcode": "alexjonesflexing", - "static_url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "visible_in_picker": false - }, - { - "shortcode": "brain3", - "static_url": "https://husk.site/emoji/custom/brain3.png", - "url": "https://husk.site/emoji/custom/brain3.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 90, - "following_count": 67, - "header": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "header_static": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "id": "9v5cKMOPGqPcgfcWp6", - "locked": false, - "note": "Professional Liar", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5cKMOPGqPcgfcWp6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Professional Liar", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 5350, - "url": "https://husk.site/users/niggaflamebuttholeaids", - "username": "niggaflamebuttholeaids" - }, - "created_at": "2020-06-09T18:35:23.000Z", - "id": "10716", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.

Working on automated tests today.", - "created_at": "2020-06-09T18:34:26.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "9vumw53EAK9vIW1oqe", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "Been feeling like I'm losing my mind a bit the past few days. I feel like I'm pushing heavy weights up a steep hill and it's never-ending. Can't wait to get to the top so I can sail down.Working on automated tests today." - }, - "conversation_id": 1150963, - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": false, - "name": "😢" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/30bde29e-c456-41ce-b767-bf562513285b", - "url": "https://gleasonator.com/notice/9vumw53EAK9vIW1oqe", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "niggaflamebuttholeaids@husk.site", - "avatar": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "avatar_static": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "bot": false, - "created_at": "2020-05-03T01:39:47.000Z", - "display_name": ":brain3: Steven :alexjonesflexing:", - "emojis": [ - { - "shortcode": "alexjonesflexing", - "static_url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "visible_in_picker": false - }, - { - "shortcode": "brain3", - "static_url": "https://husk.site/emoji/custom/brain3.png", - "url": "https://husk.site/emoji/custom/brain3.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 90, - "following_count": 67, - "header": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "header_static": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "id": "9v5cKMOPGqPcgfcWp6", - "locked": false, - "note": "Professional Liar", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5cKMOPGqPcgfcWp6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Professional Liar", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 5350, - "url": "https://husk.site/users/niggaflamebuttholeaids", - "username": "niggaflamebuttholeaids" - }, - "created_at": "2020-06-09T18:35:09.000Z", - "id": "10715", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "niggaflamebuttholeaids@husk.site", - "avatar": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "avatar_static": "https://husk.site/media/063a8f97e9b5d2f04e01e8ce98f71a201f82e86e53b78e66b121b774a3ca565d.png", - "bot": false, - "created_at": "2020-05-03T01:39:47.000Z", - "display_name": ":brain3: Steven :alexjonesflexing:", - "emojis": [ - { - "shortcode": "alexjonesflexing", - "static_url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "url": "https://husk.site/emoji/custom/alexjonesflexing.png", - "visible_in_picker": false - }, - { - "shortcode": "brain3", - "static_url": "https://husk.site/emoji/custom/brain3.png", - "url": "https://husk.site/emoji/custom/brain3.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 90, - "following_count": 67, - "header": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "header_static": "https://husk.site/media/8af4afad13e7940333df2680b1ade653bb6e63b76d58d583ed8cffe85292dc16.png", - "id": "9v5cKMOPGqPcgfcWp6", - "locked": false, - "note": "Professional Liar", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5cKMOPGqPcgfcWp6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "Professional Liar", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 5350, - "url": "https://husk.site/users/niggaflamebuttholeaids", - "username": "niggaflamebuttholeaids" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex You're close to a finish line 🌈", - "created_at": "2020-06-09T18:35:08.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 1, - "id": "9vun03Vlpd9xgHH5UW", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vumw53EAK9vIW1oqe", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex You're close to a finish line 🌈" - }, - "conversation_id": 1150963, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://husk.site/objects/9d3eb87b-978c-4ff2-8fb7-22fe22adcbd7", - "url": "https://husk.site/objects/9d3eb87b-978c-4ff2-8fb7-22fe22adcbd7", - "visibility": "unlisted" - }, - "type": "mention" - }, - { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-09T18:34:36.000Z", - "id": "10713", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex I think a wrapper service can provide many future benefits, if the complications are manageable. It would allow you to stay well ahead of the features development curve. There is also great value in displaying funding goals status on the home page. The Patron tag is also highly valuable from a social community standpoint.", - "created_at": "2020-06-09T18:34:36.000Z", - "emojis": [], - "favourited": true, - "favourites_count": 2, - "id": "9vumx07RzIPCI7RUqO", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vukdh0qbKoPch1GVM", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex I think a wrapper service can provide many future benefits, if the complications are manageable. It would allow you to stay well ahead of the features development curve. There is also great value in displaying funding goals status on the home page. The Patron tag is also highly valuable from a social community standpoint." - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/33384000-c19e-4df3-a5ea-b1d5a8dc4c3c", - "url": "https://gleasonator.com/notice/9vumx07RzIPCI7RUqO", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "crockwave", - "avatar": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "avatar_static": "https://media.gleasonator.com/d6dcd2779bdb63ef8b8a5f127743f5ad757046943c4b4a8867215c15a72c5e55.png", - "bot": false, - "created_at": "2020-02-26T16:31:25.000Z", - "display_name": "Curtis Rock", - "emojis": [], - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "followers_count": 13, - "following_count": 11, - "header": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "header_static": "https://media.gleasonator.com/82720af49afb0daa2a700f4371db9848cd7efb38eaca09d47898e8e7b527e0b4.png", - "id": "9v5c6xSEgAi3Zu1Lv6", - "locked": false, - "note": "soapbox development team test test2", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c6xSEgAi3Zu1Lv6", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Web Site/Book", - "value": "https://teci.world/a-users-guide-to-the-great-awakening" - }, - { - "name": "Gab", - "value": "https://gab.com/crockwave" - }, - { - "name": "Twitter", - "value": "https://twitter.com/GAP_Great" - }, - { - "name": "MeWe", - "value": "https://mewe.com/i/curtisrock" - } - ], - "note": "soapbox development team test test2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 212, - "url": "https://gleasonator.com/users/crockwave", - "username": "crockwave" - }, - "created_at": "2020-06-09T18:31:42.000Z", - "id": "10712", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881", - "created_at": "2020-06-09T18:08:42.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 3, - "id": "9vukdh0qbKoPch1GVM", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881" - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 1, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/945e75ad-e6ce-4f07-be69-23027e153100", - "url": "https://gleasonator.com/notice/9vukdh0qbKoPch1GVM", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "judgedread@freespeechextremist.com", - "avatar": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "avatar_static": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "bot": false, - "created_at": "2020-01-08T09:47:11.000Z", - "display_name": "Dread :verified:", - "emojis": [ - { - "shortcode": "verified", - "static_url": "https://freespeechextremist.com/emoji/custom/verified.png", - "url": "https://freespeechextremist.com/emoji/custom/verified.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 463, - "following_count": 52, - "header": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "header_static": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "id": "9v5bn9xIUVtqYd6oqW", - "locked": false, - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bn9xIUVtqYd6oqW", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 2967, - "url": "https://freespeechextremist.com/users/judgedread", - "username": "judgedread" - }, - "created_at": "2020-06-09T18:25:58.000Z", - "id": "10711", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@lain Yeah I have no clue what the reasoning was for that one. 😆 It's crazy how "words" are such an ongoing issue in FOSS.

A seasoned programmer once told me she's had the deepest programming debates about "naming things." It's true that names are important in programming, but at the end of the day it's just code.", - "created_at": "2020-06-09T06:12:44.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 2, - "id": "9vtik6wOifKqi1uXFA", - "in_reply_to_account_id": "9v5bqYwY2jfmvPNhTM", - "in_reply_to_id": "9vtiLkS2gRq20c5yHw", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "lain@lain.com", - "id": "9v5bqYwY2jfmvPNhTM", - "url": "https://lain.com/users/lain", - "username": "lain" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@lain Yeah I have no clue what the reasoning was for that one. 😆 It's crazy how \"words\" are such an ongoing issue in FOSS.A seasoned programmer once told me she's had the deepest programming debates about \"naming things.\" It's true that names are important in programming, but at the end of the day it's just code." - }, - "conversation_id": 1122858, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "lain@lain.com", - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/e26ed039-136a-4d48-a599-7e4dc4960147", - "url": "https://gleasonator.com/notice/9vtik6wOifKqi1uXFA", - "visibility": "public" - }, - "type": "favourite" - }, - { - "account": { - "acct": "judgedread@freespeechextremist.com", - "avatar": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "avatar_static": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "bot": false, - "created_at": "2020-01-08T09:47:11.000Z", - "display_name": "Dread :verified:", - "emojis": [ - { - "shortcode": "verified", - "static_url": "https://freespeechextremist.com/emoji/custom/verified.png", - "url": "https://freespeechextremist.com/emoji/custom/verified.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 463, - "following_count": 52, - "header": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "header_static": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "id": "9v5bn9xIUVtqYd6oqW", - "locked": false, - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bn9xIUVtqYd6oqW", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 2967, - "url": "https://freespeechextremist.com/users/judgedread", - "username": "judgedread" - }, - "created_at": "2020-06-09T18:25:51.000Z", - "id": "10710", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "judgedread@freespeechextremist.com", - "avatar": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "avatar_static": "https://freespeechextremist.com/media/208ebb008b0c4e1ba3eb1ac42523883cd0eaf00b37d329051e5ed36ab709ffbc.png?name=dreddavi2019.png", - "bot": false, - "created_at": "2020-01-08T09:47:11.000Z", - "display_name": "Dread :verified:", - "emojis": [ - { - "shortcode": "verified", - "static_url": "https://freespeechextremist.com/emoji/custom/verified.png", - "url": "https://freespeechextremist.com/emoji/custom/verified.png", - "visible_in_picker": false - } - ], - "fields": [], - "followers_count": 463, - "following_count": 52, - "header": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "header_static": "https://freespeechextremist.com/media/4f58807e934a28d718052cb47c38c4af955dbd4d0e1c15b26a47bb7e32f5efba.png?name=magasanta.png", - "id": "9v5bn9xIUVtqYd6oqW", - "locked": false, - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "background_image": null, - "confirmation_pending": true, - "deactivated": false, - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": false, - "hide_follows": true, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5bn9xIUVtqYd6oqW", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "IN MAGA CITY ONE I AM THE LAW", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 2967, - "url": "https://freespeechextremist.com/users/judgedread", - "username": "judgedread" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "@alex @lain The Peter Principle has a chapter on this.

The less significant the decision the more people feel qualified to have an opinion on it.", - "created_at": "2020-06-09T18:25:50.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 0, - "id": "9vumAbQUUZUho8GpNY", - "in_reply_to_account_id": "9v5bmRalQvjOy0ECcC", - "in_reply_to_id": "9vtik6wOifKqi1uXFA", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - { - "acct": "lain@lain.com", - "id": "9v5bqYwY2jfmvPNhTM", - "url": "https://lain.com/users/lain", - "username": "lain" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "@alex @lain The Peter Principle has a chapter on this.The less significant the decision the more people feel qualified to have an opinion on it." - }, - "conversation_id": 1122858, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "alex", - "local": false, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://freespeechextremist.com/objects/f66b52ad-733d-4f39-b1e0-5894620da68f", - "url": "https://freespeechextremist.com/objects/f66b52ad-733d-4f39-b1e0-5894620da68f", - "visibility": "public" - }, - "type": "mention" - }, - { - "account": { - "acct": "realcaseyrollins@gameliberty.club", - "avatar": "https://gameliberty.club/system/accounts/avatars/000/152/185/original/5ebd1445396f1cfc.png?1587331139", - "avatar_static": "https://gameliberty.club/system/accounts/avatars/000/152/185/original/5ebd1445396f1cfc.png?1587331139", - "bot": false, - "created_at": "2020-06-09T05:19:42.000Z", - "display_name": "DON'T RIOT 🔵 :verified:", - "emojis": [ - { - "shortcode": "verified", - "static_url": "https://gameliberty.club/system/custom_emojis/images/000/013/521/original/759328de266b47aa.png?1552490515", - "url": "https://gameliberty.club/system/custom_emojis/images/000/013/521/original/759328de266b47aa.png?1552490515", - "visible_in_picker": false - } - ], - "fields": [ - { - "name": "Gender Identity", - "value": "Cisgender Heterosexual Male Human" - }, - { - "name": "Counter Points Media", - "value": "https://www.bitchute.com/channel/M4vBArMe72x0/" - }, - { - "name": "SFW Account", - "value": "@realcaseyrollins" - }, - { - "name": "My clone", - "value": "@notcaseyrollins" - } - ], - "followers_count": 0, - "following_count": 0, - "header": "https://gameliberty.club/system/accounts/headers/000/152/185/original/41ff3762439e7b4a.png?1582765040", - "header_static": "https://gameliberty.club/system/accounts/headers/000/152/185/original/41ff3762439e7b4a.png?1582765040", - "id": "9v5c73UwD2R6K1Kaxs", - "locked": false, - "note": "

"Ugly homophobe!" - @HernanHenry
"Morally defunct" - @freemo
"Racist! I look down on you." - @pennyzhangsan
"Confirmed Nazi." - @p

This used to be way longer. TL;DR, I'm Christian, have a grudge against Gab but like some of the users, am on the #ADHD spectrum, don't like racism, hate groupthink and tribalism, and oh yeah, I have a podcast right here:

https://bitbucket.org/caseyrollins/countercast/raw/master/rss2.xml

Two favorite Bible verses:

Jesus replied: “‘Love the Lord your God with all your heart and with all your soul and with all your mind.’ This is the first and greatest commandment. And the second is like it: ‘Love your neighbor as yourself.’ (Matthew 22:37-39)

Rejoice in the Lord always. I will say it again: Rejoice! (Phillipians 4:4)

Headspace indicators (inspired by pizza@goblin.camp):
🔵 = I'm in a good headspace.
⚪ = Not doing great, but still ok.
🔴 = Terrible headspace, feel free to ask me how I'm doing. May react angrier than usual to insults.

", - "pleroma": { - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": true, - "following": true, - "id": "9v5c73UwD2R6K1Kaxs", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": ""Ugly homophobe!" - @HernanHenry\n"Morally defunct" - @freemo\n"Racist! I look down on you." - @pennyzhangsan\n"Confirmed Nazi." - @pThis used to be way longer. TL;DR, I'm Christian, have a grudge against Gab but like some of the users, am on the #ADHD spectrum, don't like racism, hate groupthink and tribalism, and oh yeah, I have a podcast right here:https://bitbucket.org/caseyrollins/countercast/raw/master/rss2.xmlTwo favorite Bible verses:Jesus replied: “‘Love the Lord your God with all your heart and with all your soul and with all your mind.’ This is the first and greatest commandment. And the second is like it: ‘Love your neighbor as yourself.’ (Matthew 22:37-39)Rejoice in the Lord always. I will say it again: Rejoice! (Phillipians 4:4)Headspace indicators (inspired by pizza@goblin.camp):\n🔵 = I'm in a good headspace.\n⚪ = Not doing great, but still ok.\n🔴 = Terrible headspace, feel free to ask me how I'm doing. May react angrier than usual to insults.", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 49, - "url": "https://gameliberty.club/@realcaseyrollins", - "username": "realcaseyrollins" - }, - "created_at": "2020-06-09T18:09:39.000Z", - "id": "10709", - "pleroma": { - "is_seen": true - }, - "status": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "avatar_static": "https://media.gleasonator.com/accounts/avatars/000/000/001/original/1a630e4c4c64c948.jpg", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "follow_requests_count": 0, - "followers_count": 474, - "following_count": 1083, - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "locked": false, - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "allow_following_move": true, - "background_image": null, - "confirmation_pending": false, - "deactivated": false, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_moderator": false, - "notification_settings": { - "followers": true, - "follows": true, - "non_followers": true, - "non_follows": true, - "privacy_option": false - }, - "relationship": { - "blocked_by": false, - "blocking": false, - "domain_blocking": false, - "endorsed": false, - "followed_by": false, - "following": false, - "id": "9v5bmRalQvjOy0ECcC", - "muting": false, - "muting_notifications": false, - "requested": false, - "showing_reblogs": true, - "subscribing": false - }, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 25 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - } - ], - "note": "Fediverse developer. I come in peace. #vegan #freeculture #atheist #antiporn #gendercritical. Boosts ≠ endorsements.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 4857, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Web", - "website": null - }, - "bookmarked": false, - "card": null, - "content": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881", - "created_at": "2020-06-09T18:08:42.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 3, - "id": "9vukdh0qbKoPch1GVM", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text_plain": "Pleroma Recurring Donations update: looking into other solutions, possibly working from fosspay instead: https://git.pleroma.social/pleroma/pleroma/-/issues/1853#note_62881" - }, - "conversation_id": 1149840, - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "spoiler_text": { - "text_plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 1, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "uri": "https://gleasonator.com/objects/945e75ad-e6ce-4f07-be69-23027e153100", - "url": "https://gleasonator.com/notice/9vukdh0qbKoPch1GVM", - "visibility": "public" - }, - "type": "reblog" - } -] diff --git a/packages/pl-fe/src/__fixtures__/patron-instance.json b/packages/pl-fe/src/__fixtures__/patron-instance.json deleted file mode 100644 index e8b82196c..000000000 --- a/packages/pl-fe/src/__fixtures__/patron-instance.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "funding": { - "amount": 3500, - "patrons": 3, - "currency": "usd", - "interval": "monthly" - }, - "goals": [ - { - "amount": 20000, - "currency": "usd", - "interval": "monthly", - "text": "I'll be able to afford an avocado." - } - ], - "url": "https://patron.gleasonator.com" -} diff --git a/packages/pl-fe/src/__fixtures__/patron-user.json b/packages/pl-fe/src/__fixtures__/patron-user.json deleted file mode 100644 index 95d36674c..000000000 --- a/packages/pl-fe/src/__fixtures__/patron-user.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "is_patron": true, - "url": "https://gleasonator.com/users/dave" -} diff --git a/packages/pl-fe/src/__fixtures__/pixelfed-instance.json b/packages/pl-fe/src/__fixtures__/pixelfed-instance.json deleted file mode 100644 index 41830e0e4..000000000 --- a/packages/pl-fe/src/__fixtures__/pixelfed-instance.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "uri": "pixelfed.social", - "title": "pixelfed", - "short_description": "Pixelfed is an image sharing platform, an ethical alternative to centralized platforms", - "description": "Pixelfed is an image sharing platform, an ethical alternative to centralized platforms", - "email": "hello@pixelfed.org", - "version": "2.7.2 (compatible; Pixelfed 0.11.2)", - "urls": { - "streaming_api": "wss://pixelfed.social" - }, - "stats": { - "user_count": 45061, - "status_count": 301357, - "domain_count": 5028 - }, - "thumbnail": "https://pixelfed.social/img/pixelfed-icon-color.png", - "languages": [ - "en" - ], - "registrations": true, - "approval_required": false, - "contact_account": { - "id": "1", - "username": "admin", - "acct": "admin", - "display_name": "Admin", - "discoverable": true, - "locked": false, - "followers_count": 419, - "following_count": 2, - "statuses_count": 6, - "note": "pixelfed.social Admin. Managed by @dansup", - "url": "https://pixelfed.social/admin", - "avatar": "https://pixelfed.social/storage/avatars/000/000/000/001/LSHNCgwbby7wu3iCYV6H_avatar.png?v=4", - "created_at": "2018-06-01T03:54:08.000000Z", - "avatar_static": "https://pixelfed.social/storage/avatars/000/000/000/001/LSHNCgwbby7wu3iCYV6H_avatar.png?v=4", - "bot": false, - "emojis": [], - "fields": [], - "header": "https://pixelfed.social/storage/headers/missing.png", - "header_static": "https://pixelfed.social/storage/headers/missing.png", - "last_status_at": null - }, - "rules": [ - { - "id": "1", - "text": "Sexually explicit or violent media must be marked as sensitive when posting" - }, - { - "id": "2", - "text": "No racism, sexism, homophobia, transphobia, xenophobia, or casteism" - }, - { - "id": "3", - "text": "No incitement of violence or promotion of violent ideologies" - }, - { - "id": "4", - "text": "No harassment, dogpiling or doxxing of other users" - }, - { - "id": "5", - "text": "No content illegal in United States" - } - ] -} diff --git a/packages/pl-fe/src/__fixtures__/pl-fe.json b/packages/pl-fe/src/__fixtures__/pl-fe.json deleted file mode 100644 index 6208b855b..000000000 --- a/packages/pl-fe/src/__fixtures__/pl-fe.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "logo": "blob:http://localhost:3036/0cdfa863-6889-4199-b870-4942cedd364f", - "banner": "blob:http://localhost:3036/a835afed-6078-45bd-92b4-7ffd858c3eca", - "brandColor": "#254f92", - "customCss": [ - "/instance/static/custom.css" - ], - "promoPanel": { - "items": [ - { - "icon": "globe", - "text": "blog", - "url": "https://teci.world/blog" - }, - { - "icon": "globe", - "text": "book", - "url": "https://teci.world/book" - } - ] - }, - "extensions": { - "patron": false - }, - "defaultSettings": { - "autoPlayGif": false - }, - "navlinks": { - "homeFooter": [ - { - "title": "about", - "url": "/instance/about/index.html" - }, - { - "title": "tos", - "url": "/instance/about/tos.html" - } - ] - } -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-2.2.2-account.json b/packages/pl-fe/src/__fixtures__/pleroma-2.2.2-account.json deleted file mode 100644 index 7df005d65..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-2.2.2-account.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "acct": "alex", - "avatar": "https://freespeechextremist.com/images/avi.png", - "avatar_static": "https://freespeechextremist.com/images/avi.png", - "bot": false, - "created_at": "2022-02-28T01:55:05.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "header": "https://freespeechextremist.com/images/banner.png", - "header_static": "https://freespeechextremist.com/images/banner.png", - "id": "AGv8wCadU7DqWgMqNk", - "locked": false, - "note": "I'm testing out compatibility with an older Pleroma version", - "pleroma": { - "accepts_chat_messages": true, - "ap_id": "https://freespeechextremist.com/users/alex", - "background_image": null, - "confirmation_pending": false, - "favicon": null, - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_moderator": false, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "I'm testing out compatibility with an older Pleroma version", - "pleroma": { - "actor_type": "Person", - "discoverable": true - }, - "sensitive": false - }, - "statuses_count": 0, - "url": "https://freespeechextremist.com/users/alex", - "username": "alex" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-account.json b/packages/pl-fe/src/__fixtures__/pleroma-account.json deleted file mode 100644 index 022978fde..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-account.json +++ /dev/null @@ -1,127 +0,0 @@ -{ - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2378, - "following_count": 1571, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-02-20T04:14:49", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23477, - "url": "https://gleasonator.com/users/alex", - "username": "alex" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-admin-config.json b/packages/pl-fe/src/__fixtures__/pleroma-admin-config.json deleted file mode 100644 index 8e17d1e7b..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-admin-config.json +++ /dev/null @@ -1,3120 +0,0 @@ -{ - "configs": [ - { - "group": ":pleroma", - "key": ":ecto_repos", - "value": [ - "Pleroma.Repo" - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Captcha", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":seconds_valid", - 300 - ] - }, - { - "tuple": [ - ":method", - "Pleroma.Captcha.Native" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Captcha.Kocaptcha", - "value": [ - { - "tuple": [ - ":endpoint", - "https://captcha.kotobank.ch" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Uploaders.S3", - "value": [ - { - "tuple": [ - ":bucket", - null - ] - }, - { - "tuple": [ - ":bucket_namespace", - null - ] - }, - { - "tuple": [ - ":truncated_namespace", - null - ] - }, - { - "tuple": [ - ":streaming_enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":emoji", - "value": [ - { - "tuple": [ - ":shortcode_globs", - [ - "/emoji/custom/**/*.png" - ] - ] - }, - { - "tuple": [ - ":pack_extensions", - [ - ".png", - ".gif" - ] - ] - }, - { - "tuple": [ - ":groups", - [ - { - "tuple": [ - ":Custom", - [ - "/emoji/*.png", - "/emoji/**/*.png" - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":default_manifest", - "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" - ] - }, - { - "tuple": [ - ":shared_pack_cache_seconds_per_file", - 60 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":uri_schemes", - "value": [ - { - "tuple": [ - ":valid_schemes", - [ - "https", - "http", - "dat", - "dweb", - "gopher", - "hyper", - "ipfs", - "ipns", - "irc", - "ircs", - "magnet", - "mailto", - "mumble", - "ssb", - "xmpp" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":http", - "value": [ - { - "tuple": [ - ":proxy_url", - null - ] - }, - { - "tuple": [ - ":send_user_agent", - true - ] - }, - { - "tuple": [ - ":user_agent", - ":default" - ] - }, - { - "tuple": [ - ":adapter", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":welcome", - "value": [ - { - "tuple": [ - ":direct_message", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender_nickname", - null - ] - }, - { - "tuple": [ - ":message", - null - ] - } - ] - ] - }, - { - "tuple": [ - ":chat_message", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender_nickname", - null - ] - }, - { - "tuple": [ - ":message", - null - ] - } - ] - ] - }, - { - "tuple": [ - ":email", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":sender", - null - ] - }, - { - "tuple": [ - ":subject", - "Welcome to <%= instance_name %>" - ] - }, - { - "tuple": [ - ":html", - "Welcome to <%= instance_name %>" - ] - }, - { - "tuple": [ - ":text", - "Welcome to <%= instance_name %>" - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":feed", - "value": [ - { - "tuple": [ - ":post_title", - { - ":max_length": 100, - ":omission": "..." - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":markup", - "value": [ - { - "tuple": [ - ":allow_inline_images", - true - ] - }, - { - "tuple": [ - ":allow_headings", - false - ] - }, - { - "tuple": [ - ":allow_tables", - false - ] - }, - { - "tuple": [ - ":allow_fonts", - false - ] - }, - { - "tuple": [ - ":scrub_policy", - [ - "Pleroma.HTML.Scrubber.Default", - "Pleroma.HTML.Transform.MediaProxy" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":frontend_configurations", - "value": [ - { - "tuple": [ - ":pleroma_fe", - { - ":alwaysShowSubjectInput": true, - ":background": "/images/city.jpg", - ":collapseMessageWithSubject": false, - ":disableChat": false, - ":greentext": false, - ":hideFilteredStatuses": false, - ":hideMutedPosts": false, - ":hidePostStats": false, - ":hideSitename": false, - ":hideUserStats": false, - ":loginMethod": "password", - ":logo": "/static/logo.svg", - ":logoMargin": ".1em", - ":logoMask": true, - ":minimalScopesMode": false, - ":noAttachmentLinks": false, - ":nsfwCensorImage": "", - ":postContentType": "text/plain", - ":redirectRootLogin": "/main/friends", - ":redirectRootNoLogin": "/main/all", - ":scopeCopy": true, - ":showFeaturesPanel": true, - ":showInstanceSpecificPanel": false, - ":sidebarRight": false, - ":subjectLineBehavior": "email", - ":theme": "pleroma-dark", - ":webPushNotifications": false - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":assets", - "value": [ - { - "tuple": [ - ":mascots", - [ - { - "tuple": [ - ":pleroma_fox_tan", - { - ":mime_type": "image/png", - ":url": "/images/pleroma-fox-tan-smol.png" - } - ] - }, - { - "tuple": [ - ":pleroma_fox_tan_shy", - { - ":mime_type": "image/png", - ":url": "/images/pleroma-fox-tan-shy.png" - } - ] - } - ] - ] - }, - { - "tuple": [ - ":default_mascot", - ":pleroma_fox_tan" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":manifest", - "value": [ - { - "tuple": [ - ":icons", - [ - { - ":src": "/static/logo.svg", - ":type": "image/svg+xml" - } - ] - ] - }, - { - "tuple": [ - ":theme_color", - "#282c37" - ] - }, - { - "tuple": [ - ":background_color", - "#191b22" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":streamer", - "value": [ - { - "tuple": [ - ":workers", - 3 - ] - }, - { - "tuple": [ - ":overflow_workers", - 2 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":user", - "value": [ - { - "tuple": [ - ":deny_follow_blocked", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_normalize_markup", - "value": [ - { - "tuple": [ - ":scrub_policy", - "Pleroma.HTML.Scrubber.Default" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_rejectnonpublic", - "value": [ - { - "tuple": [ - ":allow_followersonly", - false - ] - }, - { - "tuple": [ - ":allow_direct", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_simple", - "value": [ - { - "tuple": [ - ":media_removal", - [] - ] - }, - { - "tuple": [ - ":media_nsfw", - [] - ] - }, - { - "tuple": [ - ":federated_timeline_removal", - [] - ] - }, - { - "tuple": [ - ":report_removal", - [] - ] - }, - { - "tuple": [ - ":reject", - [] - ] - }, - { - "tuple": [ - ":followers_only", - [] - ] - }, - { - "tuple": [ - ":accept", - [] - ] - }, - { - "tuple": [ - ":avatar_removal", - [] - ] - }, - { - "tuple": [ - ":banner_removal", - [] - ] - }, - { - "tuple": [ - ":reject_deletes", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_keyword", - "value": [ - { - "tuple": [ - ":reject", - [] - ] - }, - { - "tuple": [ - ":federated_timeline_removal", - [] - ] - }, - { - "tuple": [ - ":replace", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_hashtag", - "value": [ - { - "tuple": [ - ":sensitive", - [ - "nsfw" - ] - ] - }, - { - "tuple": [ - ":reject", - [] - ] - }, - { - "tuple": [ - ":federated_timeline_removal", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_subchain", - "value": [ - { - "tuple": [ - ":match_actor", - {} - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_activity_expiration", - "value": [ - { - "tuple": [ - ":days", - 365 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_vocabulary", - "value": [ - { - "tuple": [ - ":accept", - [] - ] - }, - { - "tuple": [ - ":reject", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_object_age", - "value": [ - { - "tuple": [ - ":threshold", - 604800 - ] - }, - { - "tuple": [ - ":actions", - [ - ":delist", - ":strip_followers" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_nsfw_api", - "value": [ - { - "tuple": [ - ":url", - "http://127.0.0.1:5000/" - ] - }, - { - "tuple": [ - ":threshold", - 0.7 - ] - }, - { - "tuple": [ - ":mark_sensitive", - true - ] - }, - { - "tuple": [ - ":unlist", - false - ] - }, - { - "tuple": [ - ":reject", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_follow_bot", - "value": [ - { - "tuple": [ - ":follower_nickname", - null - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_inline_quote", - "value": [ - { - "tuple": [ - ":prefix", - "RT" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":rich_media", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":ignore_hosts", - [] - ] - }, - { - "tuple": [ - ":ignore_tld", - [ - "local", - "localdomain", - "lan" - ] - ] - }, - { - "tuple": [ - ":parsers", - [ - "Pleroma.Web.RichMedia.Parsers.OEmbed", - "Pleroma.Web.RichMedia.Parsers.TwitterCard" - ] - ] - }, - { - "tuple": [ - ":oembed_providers_enabled", - true - ] - }, - { - "tuple": [ - ":failure_backoff", - 60000 - ] - }, - { - "tuple": [ - ":ttl_setters", - [ - "Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.MediaProxy.Invalidation.Http", - "value": [ - { - "tuple": [ - ":method", - ":purge" - ] - }, - { - "tuple": [ - ":headers", - [] - ] - }, - { - "tuple": [ - ":options", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.MediaProxy.Invalidation.Script", - "value": [ - { - "tuple": [ - ":script_path", - null - ] - }, - { - "tuple": [ - ":url_format", - null - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":media_preview_proxy", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":thumbnail_max_width", - 600 - ] - }, - { - "tuple": [ - ":thumbnail_max_height", - 600 - ] - }, - { - "tuple": [ - ":image_quality", - 85 - ] - }, - { - "tuple": [ - ":min_content_length", - 102400 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":shout", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":limit", - 5000 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":gopher", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":ip", - { - "tuple": [ - 0, - 0, - 0, - 0 - ] - } - ] - }, - { - "tuple": [ - ":port", - 9999 - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Metadata", - "value": [ - { - "tuple": [ - ":providers", - [ - "Pleroma.Web.Metadata.Providers.OpenGraph", - "Pleroma.Web.Metadata.Providers.TwitterCard" - ] - ] - }, - { - "tuple": [ - ":unfurl_nsfw", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Preload", - "value": [ - { - "tuple": [ - ":providers", - [ - "Pleroma.Web.Preload.Providers.Instance" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":http_security", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":sts", - false - ] - }, - { - "tuple": [ - ":sts_max_age", - 31536000 - ] - }, - { - "tuple": [ - ":ct_max_age", - 2592000 - ] - }, - { - "tuple": [ - ":referrer_policy", - "same-origin" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.User", - "value": [ - { - "tuple": [ - ":restricted_nicknames", - [ - ".well-known", - "~", - "about", - "activities", - "api", - "auth", - "check_password", - "dev", - "friend-requests", - "inbox", - "internal", - "main", - "media", - "nodeinfo", - "notice", - "oauth", - "objects", - "ostatus_subscribe", - "pleroma", - "proxy", - "push", - "registration", - "relay", - "settings", - "status", - "tag", - "user-search", - "user_exists", - "users", - "web", - "verify_credentials", - "update_credentials", - "relationships", - "search", - "confirmation_resend", - "mfa" - ] - ] - }, - { - "tuple": [ - ":email_blacklist", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Oban", - "value": [ - { - "tuple": [ - ":repo", - "Pleroma.Repo" - ] - }, - { - "tuple": [ - ":log", - false - ] - }, - { - "tuple": [ - ":queues", - [ - { - "tuple": [ - ":activity_expiration", - 10 - ] - }, - { - "tuple": [ - ":token_expiration", - 5 - ] - }, - { - "tuple": [ - ":filter_expiration", - 1 - ] - }, - { - "tuple": [ - ":backup", - 1 - ] - }, - { - "tuple": [ - ":federator_incoming", - 50 - ] - }, - { - "tuple": [ - ":federator_outgoing", - 50 - ] - }, - { - "tuple": [ - ":ingestion_queue", - 50 - ] - }, - { - "tuple": [ - ":web_push", - 50 - ] - }, - { - "tuple": [ - ":mailer", - 10 - ] - }, - { - "tuple": [ - ":transmogrifier", - 20 - ] - }, - { - "tuple": [ - ":scheduled_activities", - 10 - ] - }, - { - "tuple": [ - ":poll_notifications", - 10 - ] - }, - { - "tuple": [ - ":background", - 5 - ] - }, - { - "tuple": [ - ":remote_fetcher", - 2 - ] - }, - { - "tuple": [ - ":attachments_cleanup", - 1 - ] - }, - { - "tuple": [ - ":new_users_digest", - 1 - ] - }, - { - "tuple": [ - ":mute_expire", - 5 - ] - } - ] - ] - }, - { - "tuple": [ - ":plugins", - [ - "Oban.Plugins.Pruner" - ] - ] - }, - { - "tuple": [ - ":crontab", - [ - { - "tuple": [ - "0 0 * * 0", - "Pleroma.Workers.Cron.DigestEmailsWorker" - ] - }, - { - "tuple": [ - "0 0 * * *", - "Pleroma.Workers.Cron.NewUsersDigestWorker" - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":workers", - "value": [ - { - "tuple": [ - ":retries", - [ - { - "tuple": [ - ":federator_incoming", - 5 - ] - }, - { - "tuple": [ - ":federator_outgoing", - 5 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Formatter", - "value": [ - { - "tuple": [ - ":class", - false - ] - }, - { - "tuple": [ - ":rel", - "ugc" - ] - }, - { - "tuple": [ - ":new_window", - false - ] - }, - { - "tuple": [ - ":truncate", - false - ] - }, - { - "tuple": [ - ":strip_prefix", - false - ] - }, - { - "tuple": [ - ":extra", - true - ] - }, - { - "tuple": [ - ":validate_tld", - ":no_scheme" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":ldap", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":host", - "localhost" - ] - }, - { - "tuple": [ - ":port", - 389 - ] - }, - { - "tuple": [ - ":ssl", - false - ] - }, - { - "tuple": [ - ":sslopts", - [] - ] - }, - { - "tuple": [ - ":tls", - false - ] - }, - { - "tuple": [ - ":tlsopts", - [] - ] - }, - { - "tuple": [ - ":base", - "dc=example,dc=com" - ] - }, - { - "tuple": [ - ":uid", - "cn" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":auth", - "value": [ - { - "tuple": [ - ":oauth_consumer_strategies", - [] - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.UserEmail", - "value": [ - { - "tuple": [ - ":logo", - null - ] - }, - { - "tuple": [ - ":styling", - { - ":background_color": "#2C3645", - ":content_background_color": "#1B2635", - ":header_color": "#d8a070", - ":link_color": "#d8a070", - ":text_color": "#b9b9ba", - ":text_muted_color": "#b9b9ba" - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.NewUsersDigestEmail", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.ScheduledActivity", - "value": [ - { - "tuple": [ - ":daily_user_limit", - 25 - ] - }, - { - "tuple": [ - ":total_user_limit", - 300 - ] - }, - { - "tuple": [ - ":enabled", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":email_notifications", - "value": [ - { - "tuple": [ - ":digest", - { - ":active": false, - ":inactivity_threshold": 7, - ":interval": 7 - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":oauth2", - "value": [ - { - "tuple": [ - ":token_expires_in", - 3153600000 - ] - }, - { - "tuple": [ - ":issue_new_refresh_token", - true - ] - }, - { - "tuple": [ - ":clean_expired_tokens", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":features", - "value": [ - { - "tuple": [ - ":improved_hashtag_timeline", - ":auto" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":populate_hashtags_table", - "value": [ - { - "tuple": [ - ":fault_rate_allowance", - 0.01 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":rate_limit", - "value": [ - { - "tuple": [ - ":authentication", - { - "tuple": [ - 60000, - 15 - ] - } - ] - }, - { - "tuple": [ - ":timeline", - { - "tuple": [ - 500, - 3 - ] - } - ] - }, - { - "tuple": [ - ":search", - [ - { - "tuple": [ - 1000, - 10 - ] - }, - { - "tuple": [ - 1000, - 30 - ] - } - ] - ] - }, - { - "tuple": [ - ":app_account_creation", - { - "tuple": [ - 1800000, - 25 - ] - } - ] - }, - { - "tuple": [ - ":relations_actions", - { - "tuple": [ - 10000, - 10 - ] - } - ] - }, - { - "tuple": [ - ":relation_id_action", - { - "tuple": [ - 60000, - 2 - ] - } - ] - }, - { - "tuple": [ - ":statuses_actions", - { - "tuple": [ - 10000, - 15 - ] - } - ] - }, - { - "tuple": [ - ":status_id_action", - { - "tuple": [ - 60000, - 3 - ] - } - ] - }, - { - "tuple": [ - ":password_reset", - { - "tuple": [ - 1800000, - 5 - ] - } - ] - }, - { - "tuple": [ - ":account_confirmation_resend", - { - "tuple": [ - 8640000, - 5 - ] - } - ] - }, - { - "tuple": [ - ":ap_routes", - { - "tuple": [ - 60000, - 15 - ] - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Workers.PurgeExpiredActivity", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":min_lifetime", - 600 - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Plugs.RemoteIp", - "value": [ - { - "tuple": [ - ":enabled", - true - ] - }, - { - "tuple": [ - ":headers", - [ - "x-forwarded-for" - ] - ] - }, - { - "tuple": [ - ":proxies", - [] - ] - }, - { - "tuple": [ - ":reserved", - [ - "127.0.0.0/8", - "::1/128", - "fc00::/7", - "10.0.0.0/8", - "172.16.0.0/12", - "192.168.0.0/16" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":static_fe", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":web_cache_ttl", - "value": [ - { - "tuple": [ - ":activity_pub", - null - ] - }, - { - "tuple": [ - ":activity_pub_question", - 30000 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":modules", - "value": [ - { - "tuple": [ - ":runtime_dir", - "instance/modules" - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":connections_pool", - "value": [ - { - "tuple": [ - ":reclaim_multiplier", - 0.1 - ] - }, - { - "tuple": [ - ":connection_acquisition_wait", - 250 - ] - }, - { - "tuple": [ - ":connection_acquisition_retries", - 5 - ] - }, - { - "tuple": [ - ":max_connections", - 250 - ] - }, - { - "tuple": [ - ":max_idle_time", - 30000 - ] - }, - { - "tuple": [ - ":retry", - 0 - ] - }, - { - "tuple": [ - ":connect_timeout", - 5000 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":pools", - "value": [ - { - "tuple": [ - ":federation", - [ - { - "tuple": [ - ":size", - 50 - ] - }, - { - "tuple": [ - ":max_waiting", - 10 - ] - }, - { - "tuple": [ - ":recv_timeout", - 10000 - ] - } - ] - ] - }, - { - "tuple": [ - ":media", - [ - { - "tuple": [ - ":size", - 50 - ] - }, - { - "tuple": [ - ":max_waiting", - 20 - ] - }, - { - "tuple": [ - ":recv_timeout", - 15000 - ] - } - ] - ] - }, - { - "tuple": [ - ":upload", - [ - { - "tuple": [ - ":size", - 25 - ] - }, - { - "tuple": [ - ":max_waiting", - 5 - ] - }, - { - "tuple": [ - ":recv_timeout", - 15000 - ] - } - ] - ] - }, - { - "tuple": [ - ":default", - [ - { - "tuple": [ - ":size", - 10 - ] - }, - { - "tuple": [ - ":max_waiting", - 2 - ] - }, - { - "tuple": [ - ":recv_timeout", - 5000 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":hackney_pools", - "value": [ - { - "tuple": [ - ":federation", - [ - { - "tuple": [ - ":max_connections", - 50 - ] - }, - { - "tuple": [ - ":timeout", - 150000 - ] - } - ] - ] - }, - { - "tuple": [ - ":media", - [ - { - "tuple": [ - ":max_connections", - 50 - ] - }, - { - "tuple": [ - ":timeout", - 150000 - ] - } - ] - ] - }, - { - "tuple": [ - ":upload", - [ - { - "tuple": [ - ":max_connections", - 25 - ] - }, - { - "tuple": [ - ":timeout", - 300000 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":majic_pool", - "value": [ - { - "tuple": [ - ":size", - 2 - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":restrict_unauthenticated", - "value": [ - { - "tuple": [ - ":timelines", - { - ":federated": ":if_instance_is_private", - ":local": ":if_instance_is_private" - } - ] - }, - { - "tuple": [ - ":profiles", - { - ":local": ":if_instance_is_private", - ":remote": ":if_instance_is_private" - } - ] - }, - { - "tuple": [ - ":activities", - { - ":local": ":if_instance_is_private", - ":remote": ":if_instance_is_private" - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":instances_favicons", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.Auth.Authenticator", - "value": "Pleroma.Web.Auth.PleromaAuthenticator" - }, - { - "group": ":pleroma", - "key": "Pleroma.User.Backup", - "value": [ - { - "tuple": [ - ":purge_after_days", - 30 - ] - }, - { - "tuple": [ - ":limit_days", - 7 - ] - }, - { - "tuple": [ - ":dir", - null - ] - } - ] - }, - { - "group": ":pleroma", - "key": "ConcurrentLimiter", - "value": [ - { - "tuple": [ - "Pleroma.Web.RichMedia.Helpers", - [ - { - "tuple": [ - ":max_running", - 5 - ] - }, - { - "tuple": [ - ":max_waiting", - 5 - ] - } - ] - ] - }, - { - "tuple": [ - "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy", - [ - { - "tuple": [ - ":max_running", - 5 - ] - }, - { - "tuple": [ - ":max_waiting", - 5 - ] - } - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":activitypub", - "value": [ - { - "tuple": [ - ":unfollow_blocked", - true - ] - }, - { - "tuple": [ - ":outgoing_blocks", - true - ] - }, - { - "tuple": [ - ":follow_handshake_timeout", - 500 - ] - }, - { - "tuple": [ - ":note_replies_output_limit", - 5 - ] - }, - { - "tuple": [ - ":sign_object_fetches", - true - ] - }, - { - "tuple": [ - ":authorized_fetch_mode", - false - ] - }, - { - "tuple": [ - ":blockers_visible", - false - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":frontends", - "value": [ - { - "tuple": [ - ":available", - { - "admin-fe": { - "build_url": "https://git.pleroma.social/pleroma/admin-fe/-/jobs/artifacts/${ref}/download?job=build", - "git": "https://git.pleroma.social/pleroma/admin-fe", - "name": "admin-fe", - "ref": "develop" - }, - "fedi-fe": { - "build_url": "https://git.pleroma.social/pleroma/fedi-fe/-/jobs/artifacts/${ref}/download?job=build", - "custom-http-headers": [ - { - "tuple": [ - "service-worker-allowed", - "/" - ] - } - ], - "git": "https://git.pleroma.social/pleroma/fedi-fe", - "name": "fedi-fe", - "ref": "master" - }, - "kenoma": { - "build_url": "https://git.pleroma.social/lambadalambda/kenoma/-/jobs/artifacts/${ref}/download?job=build", - "git": "https://git.pleroma.social/lambadalambda/kenoma", - "name": "kenoma", - "ref": "master" - }, - "pleroma-fe": { - "build_url": "https://git.pleroma.social/pleroma/pleroma-fe/-/jobs/artifacts/${ref}/download?job=build", - "git": "https://git.pleroma.social/pleroma/pleroma-fe", - "name": "pleroma-fe", - "ref": "develop" - }, - "soapbox-fe": { - "build_dir": "static", - "build_url": "https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/${ref}/download?job=build-production", - "git": "https://gitlab.com/soapbox-pub/soapbox-fe", - "name": "soapbox-fe", - "ref": "develop" - } - } - ] - }, - { - "tuple": [ - ":primary", - { - "name": "landing-fe", - "ref": "vendor" - } - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Upload", - "value": [ - { - "tuple": [ - ":uploader", - "Pleroma.Uploaders.Local" - ] - }, - { - "tuple": [ - ":link_name", - false - ] - }, - { - "tuple": [ - ":proxy_remote", - false - ] - }, - { - "tuple": [ - ":filename_display_max_length", - 30 - ] - }, - { - "tuple": [ - ":default_description", - null - ] - }, - { - "tuple": [ - ":base_url", - null - ] - }, - { - "tuple": [ - ":filters", - [ - "Pleroma.Upload.Filter.AnalyzeMetadata", - "Pleroma.Upload.Filter.Dedupe", - "Pleroma.Upload.Filter.Exiftool" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf", - "value": [ - { - "tuple": [ - ":transparency", - true - ] - }, - { - "tuple": [ - ":transparency_exclusions", - [] - ] - }, - { - "tuple": [ - ":policies", - [ - "Pleroma.Web.ActivityPub.MRF.SimplePolicy", - "Pleroma.Web.ActivityPub.MRF.HellthreadPolicy", - "Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy", - "Pleroma.Web.ActivityPub.MRF.TagPolicy", - "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy" - ] - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":dangerzone", - "value": [ - { - "tuple": [ - ":override_repo_pool_size", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":mrf_hellthread", - "value": [ - { - "tuple": [ - ":delist_threshold", - 15 - ] - }, - { - "tuple": [ - ":reject_threshold", - 100 - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Emails.Mailer", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":adapter", - "Swoosh.Adapters.Local" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Web.ApiSpec.CastAndValidate", - "value": [ - { - "tuple": [ - ":strict", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":media_proxy", - "value": [ - { - "tuple": [ - ":invalidation", - [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":provider", - "Pleroma.Web.MediaProxy.Invalidation.Script" - ] - } - ] - ] - }, - { - "tuple": [ - ":proxy_opts", - [ - { - "tuple": [ - ":redirect_on_failure", - false - ] - }, - { - "tuple": [ - ":max_body_length", - 26214400 - ] - }, - { - "tuple": [ - ":max_read_duration", - 30000 - ] - }, - { - "tuple": [ - ":http", - [ - { - "tuple": [ - ":follow_redirect", - true - ] - }, - { - "tuple": [ - ":pool", - ":media" - ] - } - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":whitelist", - [] - ] - }, - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":redirect_on_failure", - true - ] - } - ] - }, - { - "group": ":pleroma", - "key": ":instance", - "value": [ - { - "tuple": [ - ":background_image", - "/images/city.jpg" - ] - }, - { - "tuple": [ - ":description_limit", - 5000 - ] - }, - { - "tuple": [ - ":remote_limit", - 100000 - ] - }, - { - "tuple": [ - ":upload_limit", - 16000000 - ] - }, - { - "tuple": [ - ":avatar_upload_limit", - 2000000 - ] - }, - { - "tuple": [ - ":background_upload_limit", - 4000000 - ] - }, - { - "tuple": [ - ":banner_upload_limit", - 4000000 - ] - }, - { - "tuple": [ - ":poll_limits", - { - ":max_expiration": 31536000, - ":max_option_chars": 200, - ":max_options": 20, - ":min_expiration": 0 - } - ] - }, - { - "tuple": [ - ":invites_enabled", - false - ] - }, - { - "tuple": [ - ":account_activation_required", - false - ] - }, - { - "tuple": [ - ":account_approval_required", - false - ] - }, - { - "tuple": [ - ":federating", - true - ] - }, - { - "tuple": [ - ":federation_incoming_replies_max_depth", - 100 - ] - }, - { - "tuple": [ - ":federation_reachability_timeout_days", - 7 - ] - }, - { - "tuple": [ - ":federation_publisher_modules", - [ - "Pleroma.Web.ActivityPub.Publisher" - ] - ] - }, - { - "tuple": [ - ":allow_relay", - true - ] - }, - { - "tuple": [ - ":public", - true - ] - }, - { - "tuple": [ - ":quarantined_instances", - [] - ] - }, - { - "tuple": [ - ":allowed_post_formats", - [ - "text/plain", - "text/html", - "text/markdown", - "text/bbcode" - ] - ] - }, - { - "tuple": [ - ":autofollowed_nicknames", - [] - ] - }, - { - "tuple": [ - ":autofollowing_nicknames", - [] - ] - }, - { - "tuple": [ - ":max_pinned_statuses", - 1 - ] - }, - { - "tuple": [ - ":attachment_links", - false - ] - }, - { - "tuple": [ - ":max_report_comment_size", - 1000 - ] - }, - { - "tuple": [ - ":safe_dm_mentions", - false - ] - }, - { - "tuple": [ - ":healthcheck", - false - ] - }, - { - "tuple": [ - ":remote_post_retention_days", - 90 - ] - }, - { - "tuple": [ - ":skip_thread_containment", - true - ] - }, - { - "tuple": [ - ":limit_to_local_content", - ":unauthenticated" - ] - }, - { - "tuple": [ - ":user_bio_length", - 5000 - ] - }, - { - "tuple": [ - ":user_name_length", - 100 - ] - }, - { - "tuple": [ - ":user_location_length", - 50 - ] - }, - { - "tuple": [ - ":max_account_fields", - 10 - ] - }, - { - "tuple": [ - ":max_remote_account_fields", - 20 - ] - }, - { - "tuple": [ - ":account_field_name_length", - 512 - ] - }, - { - "tuple": [ - ":account_field_value_length", - 2048 - ] - }, - { - "tuple": [ - ":registration_reason_length", - 500 - ] - }, - { - "tuple": [ - ":external_user_synchronization", - true - ] - }, - { - "tuple": [ - ":extended_nickname_format", - true - ] - }, - { - "tuple": [ - ":cleanup_attachments", - false - ] - }, - { - "tuple": [ - ":multi_factor_authentication", - [ - { - "tuple": [ - ":totp", - [ - { - "tuple": [ - ":digits", - 6 - ] - }, - { - "tuple": [ - ":period", - 30 - ] - } - ] - ] - }, - { - "tuple": [ - ":backup_codes", - [ - { - "tuple": [ - ":number", - 5 - ] - }, - { - "tuple": [ - ":length", - 16 - ] - } - ] - ] - } - ] - ] - }, - { - "tuple": [ - ":show_reactions", - true - ] - }, - { - "tuple": [ - ":password_reset_token_validity", - 86400 - ] - }, - { - "tuple": [ - ":profile_directory", - true - ] - }, - { - "tuple": [ - ":max_endorsed_users", - 20 - ] - }, - { - "tuple": [ - ":birthday_required", - false - ] - }, - { - "tuple": [ - ":birthday_min_age", - 0 - ] - }, - { - "tuple": [ - ":privileged_staff", - true - ] - }, - { - "tuple": [ - ":max_media_attachments", - 20 - ] - }, - { - "tuple": [ - ":description", - "Social media owned by you" - ] - }, - { - "tuple": [ - ":instance_thumbnail", - "/instance/thumbnail.png" - ] - }, - { - "tuple": [ - ":name", - "localhost" - ] - }, - { - "tuple": [ - ":email", - "alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":notify_email", - "alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":limit", - 5000 - ] - }, - { - "tuple": [ - ":registrations_open", - true - ] - }, - { - "tuple": [ - ":static_dir", - "/home/alex/Projects/soapbox-be/instance/static" - ] - } - ] - }, - { - "group": ":pleroma", - "key": "Pleroma.Uploaders.Local", - "value": [ - { - "tuple": [ - ":uploads", - "/home/alex/Projects/soapbox-be/uploads" - ] - } - ] - }, - { - "group": ":joken", - "key": ":default_signer", - "value": "KaehAYXaKzxCdcqSD35I6R9KRUMvgqb0DBMV6PIiqjoHbg0eppqH6nSpNp4fbbLT" - }, - { - "group": ":web_push_encryption", - "key": ":http_client", - "value": "Pleroma.HTTP.WebPush" - }, - { - "group": ":web_push_encryption", - "key": ":vapid_details", - "value": [ - { - "tuple": [ - ":subject", - "mailto:alex@alexgleason.me" - ] - }, - { - "tuple": [ - ":public_key", - "BCUFu4_-77t6dQ2XfZIyEE7k8H4r11s-a5doq7hZHDv9RqTUek-8yrE9nUN-rZYTxkjxuXF7IMcDdRgZ1fOCUy8" - ] - }, - { - "tuple": [ - ":private_key", - "KN3JU4Ug0e7_lsxhqOW_jQuQNeQTrr7QtOmdNIpUUbY" - ] - } - ] - }, - { - "group": ":phoenix", - "key": ":format_encoders", - "value": [ - { - "tuple": [ - ":json", - "Jason" - ] - }, - { - "tuple": [ - ":\"activity+json\"", - "Jason" - ] - } - ] - }, - { - "group": ":phoenix", - "key": ":json_library", - "value": "Jason" - }, - { - "group": ":phoenix", - "key": ":filter_parameters", - "value": [ - "password", - "confirm" - ] - }, - { - "group": ":phoenix", - "key": ":stacktrace_depth", - "value": 20 - }, - { - "group": ":phoenix", - "key": ":plug_init_mode", - "value": ":runtime" - }, - { - "group": ":logger", - "key": ":ex_syslogger", - "value": [ - { - "tuple": [ - ":level", - ":debug" - ] - }, - { - "tuple": [ - ":ident", - "pleroma" - ] - }, - { - "tuple": [ - ":format", - "$metadata[$level] $message" - ] - }, - { - "tuple": [ - ":metadata", - [ - ":request_id" - ] - ] - } - ] - }, - { - "group": ":logger", - "key": ":console", - "value": [ - { - "tuple": [ - ":level", - ":debug" - ] - }, - { - "tuple": [ - ":metadata", - [ - ":request_id" - ] - ] - }, - { - "tuple": [ - ":format", - "[$level] $message\n" - ] - } - ] - }, - { - "group": ":floki", - "key": ":html_parser", - "value": "Floki.HTMLParser.FastHtml" - }, - { - "group": ":ex_aws", - "key": ":s3", - "value": [ - { - "tuple": [ - ":access_key_id", - null - ] - }, - { - "tuple": [ - ":secret_access_key", - null - ] - }, - { - "tuple": [ - ":scheme", - "https://" - ] - } - ] - }, - { - "group": ":ex_aws", - "key": ":http_client", - "value": "Pleroma.HTTP.ExAws" - }, - { - "group": ":tzdata", - "key": ":http_client", - "value": "Pleroma.HTTP.Tzdata" - }, - { - "group": ":http_signatures", - "key": ":adapter", - "value": "Pleroma.Signature" - }, - { - "group": ":prometheus", - "key": "Pleroma.Web.Endpoint.MetricsExporter", - "value": [ - { - "tuple": [ - ":enabled", - false - ] - }, - { - "tuple": [ - ":auth", - false - ] - }, - { - "tuple": [ - ":ip_whitelist", - [] - ] - }, - { - "tuple": [ - ":path", - "/api/pleroma/app_metrics" - ] - }, - { - "tuple": [ - ":format", - ":text" - ] - } - ] - }, - { - "group": ":ueberauth", - "key": "Ueberauth", - "value": [ - { - "tuple": [ - ":base_path", - "/oauth" - ] - }, - { - "tuple": [ - ":providers", - [] - ] - } - ] - }, - { - "group": ":esshd", - "key": ":enabled", - "value": false - }, - { - "group": ":cors_plug", - "key": ":max_age", - "value": 86400 - }, - { - "group": ":cors_plug", - "key": ":methods", - "value": [ - "POST", - "PUT", - "DELETE", - "GET", - "PATCH", - "OPTIONS" - ] - }, - { - "group": ":cors_plug", - "key": ":expose", - "value": [ - "Link", - "X-RateLimit-Reset", - "X-RateLimit-Limit", - "X-RateLimit-Remaining", - "X-Request-Id", - "Idempotency-Key" - ] - }, - { - "group": ":cors_plug", - "key": ":credentials", - "value": true - }, - { - "group": ":cors_plug", - "key": ":headers", - "value": [ - "Authorization", - "Content-Type", - "Idempotency-Key" - ] - }, - { - "group": ":mime", - "key": ":types", - "value": { - "application/activity+json": [ - "activity+json" - ], - "application/jrd+json": [ - "jrd+json" - ], - "application/ld+json": [ - "activity+json" - ], - "application/xml": [ - "xml" - ], - "application/xrd+xml": [ - "xrd+xml" - ] - } - }, - { - "group": ":quack", - "key": ":level", - "value": ":warn" - }, - { - "group": ":quack", - "key": ":meta", - "value": [ - ":all" - ] - }, - { - "group": ":quack", - "key": ":webhook_url", - "value": "https://hooks.slack.com/services/YOUR-KEY-HERE" - } - ], - "need_reboot": false -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-instance.json b/packages/pl-fe/src/__fixtures__/pleroma-instance.json deleted file mode 100644 index b91376302..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-instance.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "approval_required": true, - "avatar_upload_limit": 2000000, - "background_image": "https://gleasonator.com/images/city.jpg", - "background_upload_limit": 4000000, - "banner_upload_limit": 4000000, - "description": "Building the next generation of the Fediverse. Speak freely.", - "description_limit": 5000, - "email": "alex@alexgleason.me", - "languages": [ - "en" - ], - "max_toot_chars": 5000, - "pleroma": { - "metadata": { - "account_activation_required": false, - "birthday_min_age": 0, - "birthday_required": false, - "features": [ - "pleroma_api", - "mastodon_api", - "mastodon_api_streaming", - "polls", - "v2_suggestions", - "pleroma_explicit_addressing", - "shareable_emoji_packs", - "multifetch", - "pleroma:api/v1/notifications:include_types_filter", - "quote_posting", - "media_proxy", - "relay", - "pleroma_emoji_reactions", - "pleroma_chat_messages", - "email_list", - "profile_directory" - ], - "federation": { - "enabled": true, - "exclusions": false, - "mrf_hashtag": { - "federated_timeline_removal": [], - "reject": [], - "sensitive": [ - "nsfw" - ] - }, - "mrf_policies": [ - "TagPolicy", - "SimplePolicy", - "InlineQuotePolicy", - "HashtagPolicy" - ], - "mrf_simple": { - "accept": [], - "avatar_removal": [ - "pawoo.net", - "sinblr.com", - "dajiaweibo.com", - "baraag.net" - ], - "banner_removal": [ - "pawoo.net", - "sinblr.com", - "dajiaweibo.com", - "baraag.net" - ], - "federated_timeline_removal": [], - "followers_only": [], - "media_nsfw": [], - "media_removal": [ - "pawoo.net", - "sinblr.com", - "dajiaweibo.com", - "baraag.net" - ], - "reject": [ - "solagg.com" - ], - "reject_deletes": [], - "report_removal": [] - }, - "mrf_simple_info": {}, - "quarantined_instances": [], - "quarantined_instances_info": { - "quarantined_instances": {} - } - }, - "fields_limits": { - "max_fields": 15, - "max_remote_fields": 20, - "name_length": 512, - "value_length": 2048 - }, - "post_formats": [ - "text/plain", - "text/html", - "text/markdown", - "text/bbcode" - ], - "privileged_staff": true - }, - "stats": { - "mau": 71 - }, - "vapid_public_key": "BLElLQVJVmY_e4F5JoYxI5jXiVOYNsJ9p-amkykc9NcI-jwa9T1Y2GIbDqbY-HqC6ayPkfW4K4o9vgBFKYmkuS4" - }, - "poll_limits": { - "max_expiration": 31536000, - "max_option_chars": 200, - "max_options": 20, - "min_expiration": 0 - }, - "registrations": true, - "shout_limit": 5000, - "soapbox": { - "version": "1.1.1" - }, - "stats": { - "domain_count": 8140, - "status_count": 101956, - "user_count": 421 - }, - "thumbnail": "https://media.gleasonator.com/c0d38bde6ef0b3baa483f574797662ebd83ef9e1a1162e8e4fcd930bb4b3c068.png", - "title": "Gleasonator", - "upload_limit": 100000000, - "uri": "https://gleasonator.com", - "urls": { - "streaming_api": "wss://gleasonator.com" - }, - "version": "2.7.2 (compatible; Pleroma 2.4.51-1129-gf2cfef09-gleasonator)" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-notification-move.json b/packages/pl-fe/src/__fixtures__/pleroma-notification-move.json deleted file mode 100644 index d7a763457..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-notification-move.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "account": { - "acct": "alex@fedibird.com", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2022-01-24T21:25:37.000Z", - "display_name": "alex@fedibird.com", - "emojis": [], - "fields": [], - "followers_count": 2, - "following_count": 1, - "fqn": "alex@fedibird.com", - "header": "https://gleasonator.com/images/banner.png", - "header_static": "https://gleasonator.com/images/banner.png", - "id": "AFmHQ18XZ7Lco68MW8", - "last_status_at": "2022-03-16T22:07:53", - "locked": false, - "note": "

", - "pleroma": { - "accepts_chat_messages": null, - "also_known_as": [], - "ap_id": "https://fedibird.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "favicon": "https://gleasonator.com/proxy/HzfsidHss3CuA7aM2zxXN-tAjF8/aHR0cHM6Ly9mZWRpYmlyZC5jb20vZmF2aWNvbi5pY28/favicon.ico", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": "Texas, USA", - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 5, - "url": "https://fedibird.com/@alex", - "username": "alex" - }, - "created_at": "2022-03-17T00:08:48.000Z", - "id": "406814", - "pleroma": { - "is_muted": false, - "is_seen": true - }, - "target": { - "acct": "benis911", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2021-03-26T20:42:11.000Z", - "display_name": "benis911", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "fqn": "benis911@gleasonator.com", - "header": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "header_static": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "id": "A5c5LK7EJTFR0u26Pg", - "last_status_at": "2022-03-16T22:01:57", - "locked": false, - "note": "hello world 2", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://gleasonator.com/users/alex", - "https://poa.st/users/alex", - "https://fedibird.com/users/alex" - ], - "ap_id": "https://gleasonator.com/users/benis911", - "background_image": null, - "birthday": "2000-01-25", - "deactivated": false, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": true, - "hide_follows": true, - "hide_follows_count": true, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "hello world 2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 172, - "url": "https://gleasonator.com/users/benis911", - "username": "benis911" - }, - "type": "move" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-quote-post.json b/packages/pl-fe/src/__fixtures__/pleroma-quote-post.json deleted file mode 100644 index 994671ce4..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-quote-post.json +++ /dev/null @@ -1,364 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2220, - "following_count": 1544, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-01-24T21:02:44", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23004, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

Quote post

", - "created_at": "2022-01-24T21:02:34.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 0, - "id": "AFmFMSpITT9xcOJKcK", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Quote post" - }, - "conversation_id": "AFmFMSnWa3k3WtTur2", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": false, - "name": "👍" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": { - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2220, - "following_count": 1544, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-01-24T21:02:44", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23004, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

Test post

", - "created_at": "2022-01-24T21:02:25.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 0, - "id": "AFmFLcd6XYVdjWCrOS", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Test post" - }, - "conversation_id": "AFmFLcaGi6EzaisayO", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/4f35159c-3794-4037-9269-a7c84f7137c7", - "url": "https://gleasonator.com/notice/AFmFLcd6XYVdjWCrOS", - "visibility": "public" - }, - "quote_url": "https://gleasonator.com/objects/4f35159c-3794-4037-9269-a7c84f7137c7", - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/54d93075-7d04-4016-a128-81f3843bca79", - "url": "https://gleasonator.com/notice/AFmFMSpITT9xcOJKcK", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-status-deleted.json b/packages/pl-fe/src/__fixtures__/pleroma-status-deleted.json deleted file mode 100644 index 2d37af257..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-status-deleted.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "follow_requests_count": 0, - "followers_count": 2489, - "following_count": 1586, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-03-16T21:57:17", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "accepts_email_list": true, - "allow_following_move": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "deactivated": false, - "email": "alex@alexgleason.me", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "notification_settings": { - "block_from_strangers": false, - "hide_notification_contents": false - }, - "relationship": {}, - "skip_thread_containment": false, - "tags": [], - "unread_conversation_count": 392, - "unread_notifications_count": 2 - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false, - "no_rich_text": false, - "show_birthday": true, - "show_role": true - }, - "privacy": "public", - "sensitive": false - }, - "statuses_count": 23695, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

I am going to delete this post for testing purposes

", - "created_at": "2022-03-16T21:57:16.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 3, - "id": "AHU2RrX0wdcwzCYjFQ", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [ - { - "blurhash": "eWGlL@?b~q%MRj4nt7IUof%M%MIURjRjIUM{IUM{Rjayxut7j[j[xu", - "description": "", - "id": "508107650", - "meta": { - "original": { - "aspect": 1, - "height": 1024, - "width": 1024 - } - }, - "pleroma": { - "mime_type": "image/png" - }, - "preview_url": "https://media.gleasonator.com/2b9ddcd8b27cad786fd34bc2cfe02c1b63aa1b8e7b8d72379b5c9375fb61f199.png", - "remote_url": "https://media.gleasonator.com/2b9ddcd8b27cad786fd34bc2cfe02c1b63aa1b8e7b8d72379b5c9375fb61f199.png", - "text_url": "https://media.gleasonator.com/2b9ddcd8b27cad786fd34bc2cfe02c1b63aa1b8e7b8d72379b5c9375fb61f199.png", - "type": "image", - "url": "https://media.gleasonator.com/2b9ddcd8b27cad786fd34bc2cfe02c1b63aa1b8e7b8d72379b5c9375fb61f199.png" - } - ], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "I am going to delete this post for testing purposes" - }, - "content_type": "text/markdown", - "conversation_id": "AHU2RrUB7BMIqPESpM", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 1, - "me": false, - "name": "😭" - }, - { - "count": 1, - "me": false, - "name": "❔" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 1, - "replies_count": 2, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": "I am going to delete this post for testing purposes", - "uri": "https://gleasonator.com/objects/205ec868-d28d-4668-a56a-33321f7e285e", - "url": "https://gleasonator.com/notice/AHU2RrX0wdcwzCYjFQ", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-status-reply-with-mentions.json b/packages/pl-fe/src/__fixtures__/pleroma-status-reply-with-mentions.json deleted file mode 100644 index 21caf17e0..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-status-reply-with-mentions.json +++ /dev/null @@ -1,207 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2536, - "following_count": 1587, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-03-26T15:13:42", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "location": null, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23825, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

DMs are definitely only federated to the servers of the recipients tho. So if I DM a kfcc user, the kfcc admins can see it, but no other instance admins can.

", - "created_at": "2022-03-21T05:04:45.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 5, - "id": "AHcweewcCh0iPUtMdk", - "in_reply_to_account_id": "9v5bo8xPghEnkedGzo", - "in_reply_to_id": "AHcwFrnbH1Xb2RqxhQ", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "crunklord420@kiwifarms.cc", - "id": "9v5bo8xPghEnkedGzo", - "url": "https://kiwifarms.cc/users/crunklord420", - "username": "crunklord420" - }, - { - "acct": "becassine@kiwifarms.cc", - "id": "A6W9i7UOhgpBBOkcEK", - "url": "https://kiwifarms.cc/users/becassine", - "username": "becassine" - }, - { - "acct": "King_Porgi@poa.st", - "id": "A5U7Z228z3h3dBdg6C", - "url": "https://poa.st/users/King_Porgi", - "username": "King_Porgi" - }, - { - "acct": "ademan@thebag.social", - "id": "A79wLvOahABnWFnwWm", - "url": "https://thebag.social/users/ademan", - "username": "ademan" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "DMs are definitely only federated to the servers of the recipients tho. So if I DM a kfcc user, the kfcc admins can see it, but no other instance admins can." - }, - "content_type": null, - "conversation_id": "AHcrQt04eG9qB87g3s", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "crunklord420@kiwifarms.cc", - "local": true, - "parent_visible": true, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 2, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/0981bab7-a086-4ed9-b938-adc3ed9d5f51", - "url": "https://gleasonator.com/notice/AHcweewcCh0iPUtMdk", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma-status-with-attachments.json b/packages/pl-fe/src/__fixtures__/pleroma-status-with-attachments.json deleted file mode 100644 index 75db8292f..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma-status-with-attachments.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2344, - "following_count": 1564, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-02-11T23:12:00", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Pleroma+Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23357, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "

Test

", - "created_at": "2022-02-11T23:11:59.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "AGNkA21auFR5lnEAHw", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [ - { - "blurhash": "emLqe9t7~q%M%M-;WBt7ofRj%Moft7ofoft7ayWBj[of-;j[ayofM{", - "description": "", - "id": "974611173", - "meta": { - "original": { - "aspect": 0.9944598337950139, - "height": 1444, - "width": 1436 - } - }, - "pleroma": { - "mime_type": "image/png" - }, - "preview_url": "https://media.gleasonator.com/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png", - "remote_url": "https://media.gleasonator.com/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png", - "text_url": "https://media.gleasonator.com/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png", - "type": "image", - "url": "https://media.gleasonator.com/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png" - }, - { - "blurhash": null, - "description": "", - "id": "-1764036199", - "pleroma": { - "mime_type": "application/x-nes-rom" - }, - "preview_url": "https://media.gleasonator.com/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac.nes", - "remote_url": "https://media.gleasonator.com/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac.nes", - "text_url": "https://media.gleasonator.com/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac.nes", - "type": "unknown", - "url": "https://media.gleasonator.com/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac.nes" - }, - { - "blurhash": null, - "description": "", - "id": "-636167741", - "pleroma": { - "mime_type": "audio/ogg" - }, - "preview_url": "https://media.gleasonator.com/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.ogg", - "remote_url": "https://media.gleasonator.com/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.ogg", - "text_url": "https://media.gleasonator.com/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.ogg", - "type": "audio", - "url": "https://media.gleasonator.com/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.ogg" - }, - { - "blurhash": null, - "description": "", - "id": "517941208", - "pleroma": { - "mime_type": "text/plain" - }, - "preview_url": "https://media.gleasonator.com/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0.LICENSE", - "remote_url": "https://media.gleasonator.com/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0.LICENSE", - "text_url": "https://media.gleasonator.com/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0.LICENSE", - "type": "unknown", - "url": "https://media.gleasonator.com/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0.LICENSE" - } - ], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Test" - }, - "conversation_id": "AGNkA1yP66srbtjcJc", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/aa5e66c9-0a10-4167-9c80-f40d9574aaec", - "url": "https://gleasonator.com/notice/AGNkA21auFR5lnEAHw", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/pleroma_initial_results.json b/packages/pl-fe/src/__fixtures__/pleroma_initial_results.json deleted file mode 100644 index 027b646e0..000000000 --- a/packages/pl-fe/src/__fixtures__/pleroma_initial_results.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "/api/pleroma/frontend_configurations": "eyJtYXN0b19mZSI6eyJzaG93SW5zdGFuY2VTcGVjaWZpY1BhbmVsIjp0cnVlfSwicGxlcm9tYV9mZSI6eyJhbHdheXNTaG93U3ViamVjdElucHV0Ijp0cnVlLCJiYWNrZ3JvdW5kIjoiL2ltYWdlcy9jaXR5LmpwZyIsImNvbGxhcHNlTWVzc2FnZVdpdGhTdWJqZWN0IjpmYWxzZSwiZGlzYWJsZUNoYXQiOmZhbHNlLCJncmVlbnRleHQiOmZhbHNlLCJoaWRlRmlsdGVyZWRTdGF0dXNlcyI6ZmFsc2UsImhpZGVNdXRlZFBvc3RzIjpmYWxzZSwiaGlkZVBvc3RTdGF0cyI6ZmFsc2UsImhpZGVTaXRlbmFtZSI6ZmFsc2UsImhpZGVVc2VyU3RhdHMiOmZhbHNlLCJsb2dpbk1ldGhvZCI6InBhc3N3b3JkIiwibG9nbyI6Ii9zdGF0aWMvbG9nby5zdmciLCJsb2dvTWFyZ2luIjoiLjFlbSIsImxvZ29NYXNrIjp0cnVlLCJtaW5pbWFsU2NvcGVzTW9kZSI6ZmFsc2UsIm5vQXR0YWNobWVudExpbmtzIjpmYWxzZSwibnNmd0NlbnNvckltYWdlIjoiIiwicG9zdENvbnRlbnRUeXBlIjoidGV4dC9wbGFpbiIsInJlZGlyZWN0Um9vdExvZ2luIjoiL21haW4vZnJpZW5kcyIsInJlZGlyZWN0Um9vdE5vTG9naW4iOiIvbWFpbi9hbGwiLCJzY29wZUNvcHkiOnRydWUsInNob3dGZWF0dXJlc1BhbmVsIjp0cnVlLCJzaG93SW5zdGFuY2VTcGVjaWZpY1BhbmVsIjpmYWxzZSwic2lkZWJhclJpZ2h0IjpmYWxzZSwic3ViamVjdExpbmVCZWhhdmlvciI6ImVtYWlsIiwidGhlbWUiOiJwbGVyb21hLWRhcmsiLCJ3ZWJQdXNoTm90aWZpY2F0aW9ucyI6ZmFsc2V9LCJzb2FwYm94X2ZlIjp7ImJyYW5kQ29sb3IiOiIjMWNhODJiIiwiY3J5cHRvQWRkcmVzc2VzIjpbeyJhZGRyZXNzIjoiYmMxcTljeDM1YWRwbTczYXEyZnc0MHllNnRzOGhmeHF6anI1dW53ZzBuIiwibm90ZSI6IiIsInRpY2tlciI6ImJ0YyJ9LHsiYWRkcmVzcyI6IjB4QWM5YUI1RmMwNERjMWNCMTc4OUFmNzViNTIzQmQyM0M3MEIyRDcxNyIsInRpY2tlciI6ImV0aCJ9LHsiYWRkcmVzcyI6IkQ1elZaczZqclJha2FQVkdpRXJrUWlIdDlzYXl6bTZWNUQiLCJ0aWNrZXIiOiJkb2dlIn0seyJhZGRyZXNzIjoiMHg1NDFhNDVjYjIxMmI1N2Y0MTM5MzQyN2ZiMTUzMzVmYzg5YzM1ODUxIiwidGlja2VyIjoidWJxIn0seyJhZGRyZXNzIjoiNDVKRENMcmpKNGJnVlVTYmJzMnlqeTltNU1mNFZMUFc4Zkc3anc5c3E1dTY5clhaWm9wUW9nWk5leVlrTUJuWHBrYWlwNHA0UXdhYUpOaGRUb3RQYTlnNDREQkN6ZEsiLCJub3RlIjoiIiwidGlja2VyIjoieG1yIn0seyJhZGRyZXNzIjoibHRjMXFkYTY0NWpkZjRqc3p3eGN2c24zMnlrZGhlbXZseDd5bDluNWd6OSIsIm5vdGUiOiIiLCJ0aWNrZXIiOiJsdGMifSx7ImFkZHJlc3MiOiJiaXRjb2luY2FzaDpxcGNmbm05dzh1ZW1heDM4eXFoeWc1OHpuMnB0cGY2c3p2a3IwbjQ4YTciLCJub3RlIjoiIiwidGlja2VyIjoiYmNoIn0seyJhZGRyZXNzIjoiWG5CNXA0SnZMM1NvOTFBMWMxTUVSb3paRWplTVNzQUQ3SiIsIm5vdGUiOiIiLCJ0aWNrZXIiOiJkYXNoIn0seyJhZGRyZXNzIjoidDFQSFpYNVpqWTd5NjFpQzE5QTk1OFc5aGR5SDNTaUxKdUYiLCJub3RlIjoiIiwidGlja2VyIjoiemVjIn0seyJhZGRyZXNzIjoiMHhCODFCQUVFMTBkMTYzNDA0YTFjNjAwNDVhODcyYTBkYTlFMjU4NDY1Iiwibm90ZSI6IiIsInRpY2tlciI6ImV0YyJ9LHsiYWRkcmVzcyI6IkFHVExSWGFwUFlweHQzUExkaVhFczh5NGtMdzZReTNDNHQiLCJub3RlIjoiIiwidGlja2VyIjoiYnRnIn0seyJhZGRyZXNzIjoiU2JRY0ZVRGk3a0t5eGttc2t6VzN3NzR4NjhINWVVcmc3NiIsIm5vdGUiOiIiLCJ0aWNrZXIiOiJkZ2IifSx7ImFkZHJlc3MiOiJON25vbXBVVnh6NUFUcnpSVlR6dzdDYUFKb1NpVnRFY1F4Iiwibm90ZSI6IiIsInRpY2tlciI6Im5tYyJ9LHsiYWRkcmVzcyI6IjNBUWNVZ0NiRjZ5bWlSNEhHQ1U4QU54OVNxYnpMNm54OHIiLCJub3RlIjoiIiwidGlja2VyIjoidnRjIn1dLCJjcnlwdG9Eb25hdGVQYW5lbCI6eyJsaW1pdCI6MX0sImRlZmF1bHRTZXR0aW5ncyI6eyJ0aGVtZU1vZGUiOiJsaWdodCJ9LCJleHRlbnNpb25zIjp7InBhdHJvbiI6eyJlbmFibGVkIjp0cnVlfX0sImdyZWVudGV4dCI6dHJ1ZSwibG9nbyI6Imh0dHBzOi8vbWVkaWEuZ2xlYXNvbmF0b3IuY29tLzBjNzYwYjNlY2RiYzk5M2JhNDdiNzg1ZDBhZGVjZjBlYzcxZmQ5YzU5ODA4ZTI3ZDA2NjViOWY3N2EzMmQ4ZGUucG5nIiwibmF2bGlua3MiOnsiaG9tZUZvb3RlciI6W3sidGl0bGUiOiJBYm91dCIsInVybCI6Ii9hYm91dCJ9LHsidGl0bGUiOiJUZXJtcyBvZiBTZXJ2aWNlIiwidXJsIjoiL2Fib3V0L3RvcyJ9LHsidGl0bGUiOiJQcml2YWN5IFBvbGljeSIsInVybCI6Ii9hYm91dC9wcml2YWN5In0seyJ0aXRsZSI6IkRNQ0EiLCJ1cmwiOiIvYWJvdXQvZG1jYSJ9LHsidGl0bGUiOiJTb3VyY2UgQ29kZSIsInVybCI6Ii9hYm91dCNvcGVuc291cmNlIn1dfSwicHJvbW9QYW5lbCI6eyJpdGVtcyI6W3siaWNvbiI6ImNvbW1lbnQtbyIsInRleHQiOiJHbGVhc29uYXRvciB0aGVtZSBzb25nIiwidXJsIjoiaHR0cHM6Ly9tZWRpYS5nbGVhc29uYXRvci5jb20vY3VzdG9tLzI2MTkwNV9nbGVhc29uYXRvcl9zb25nLm1wMyJ9XX0sInZlcmlmaWVkQ2FuRWRpdE5hbWUiOnRydWV9fQ==", - "/api/v1/instance": "eyJhcHByb3ZhbF9yZXF1aXJlZCI6dHJ1ZSwiYXZhdGFyX3VwbG9hZF9saW1pdCI6MjAwMDAwMCwiYmFja2dyb3VuZF9pbWFnZSI6Imh0dHBzOi8vZ2xlYXNvbmF0b3IuY29tL2ltYWdlcy9jaXR5LmpwZyIsImJhY2tncm91bmRfdXBsb2FkX2xpbWl0Ijo0MDAwMDAwLCJiYW5uZXJfdXBsb2FkX2xpbWl0Ijo0MDAwMDAwLCJjaGF0X2xpbWl0Ijo1MDAwLCJkZXNjcmlwdGlvbiI6IkJ1aWxkaW5nIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgdGhlIEZlZGl2ZXJzZS4gU3BlYWsgZnJlZWx5LiIsImRlc2NyaXB0aW9uX2xpbWl0Ijo1MDAwLCJlbWFpbCI6ImFsZXhAYWxleGdsZWFzb24ubWUiLCJsYW5ndWFnZXMiOlsiZW4iXSwibWF4X3Rvb3RfY2hhcnMiOjUwMDAsInBsZXJvbWEiOnsibWV0YWRhdGEiOnsiYWNjb3VudF9hY3RpdmF0aW9uX3JlcXVpcmVkIjpmYWxzZSwiZmVhdHVyZXMiOlsicGxlcm9tYV9hcGkiLCJtYXN0b2Rvbl9hcGkiLCJtYXN0b2Rvbl9hcGlfc3RyZWFtaW5nIiwicG9sbHMiLCJwbGVyb21hX2V4cGxpY2l0X2FkZHJlc3NpbmciLCJzaGFyZWFibGVfZW1vamlfcGFja3MiLCJtdWx0aWZldGNoIiwicGxlcm9tYTphcGkvdjEvbm90aWZpY2F0aW9uczppbmNsdWRlX3R5cGVzX2ZpbHRlciIsIm1lZGlhX3Byb3h5IiwicmVsYXkiLCJwbGVyb21hX2Vtb2ppX3JlYWN0aW9ucyIsInBsZXJvbWFfY2hhdF9tZXNzYWdlcyIsImVtYWlsX2xpc3QiXSwiZmVkZXJhdGlvbiI6eyJlbmFibGVkIjp0cnVlLCJleGNsdXNpb25zIjpmYWxzZSwibXJmX3BvbGljaWVzIjpbIlRhZ1BvbGljeSIsIlNpbXBsZVBvbGljeSJdLCJtcmZfc2ltcGxlIjp7ImFjY2VwdCI6W10sImF2YXRhcl9yZW1vdmFsIjpbInBhd29vLm5ldCIsInNpbmJsci5jb20iLCJkYWppYXdlaWJvLmNvbSJdLCJiYW5uZXJfcmVtb3ZhbCI6WyJwYXdvby5uZXQiLCJzaW5ibHIuY29tIiwiZGFqaWF3ZWliby5jb20iXSwiZmVkZXJhdGVkX3RpbWVsaW5lX3JlbW92YWwiOltdLCJmb2xsb3dlcnNfb25seSI6W10sIm1lZGlhX25zZnciOltdLCJtZWRpYV9yZW1vdmFsIjpbInBhd29vLm5ldCIsInNpbmJsci5jb20iLCJkYWppYXdlaWJvLmNvbSJdLCJyZWplY3QiOltdLCJyZWplY3RfZGVsZXRlcyI6W10sInJlcG9ydF9yZW1vdmFsIjpbXX0sInF1YXJhbnRpbmVkX2luc3RhbmNlcyI6W119LCJmaWVsZHNfbGltaXRzIjp7Im1heF9maWVsZHMiOjE1LCJtYXhfcmVtb3RlX2ZpZWxkcyI6MjAsIm5hbWVfbGVuZ3RoIjo1MTIsInZhbHVlX2xlbmd0aCI6MjA0OH0sInBvc3RfZm9ybWF0cyI6WyJ0ZXh0L3BsYWluIiwidGV4dC9odG1sIiwidGV4dC9tYXJrZG93biIsInRleHQvYmJjb2RlIl19LCJzdGF0cyI6eyJtYXUiOjU0fSwidmFwaWRfcHVibGljX2tleSI6IkJMRWxMUVZKVm1ZX2U0RjVKb1l4STVqWGlWT1lOc0o5cC1hbWt5a2M5TmNJLWp3YTlUMVkyR0liRHFiWS1IcUM2YXlQa2ZXNEs0bzl2Z0JGS1lta3VTNCJ9LCJwb2xsX2xpbWl0cyI6eyJtYXhfZXhwaXJhdGlvbiI6MzE1MzYwMDAsIm1heF9vcHRpb25fY2hhcnMiOjIwMCwibWF4X29wdGlvbnMiOjIwLCJtaW5fZXhwaXJhdGlvbiI6MH0sInJlZ2lzdHJhdGlvbnMiOnRydWUsInNvYXBib3giOnsidmVyc2lvbiI6IjEuMS4xIn0sInN0YXRzIjp7ImRvbWFpbl9jb3VudCI6NzIwMCwic3RhdHVzX2NvdW50Ijo3ODkwNiwidXNlcl9jb3VudCI6MzU3fSwidGh1bWJuYWlsIjoiaHR0cHM6Ly9nbGVhc29uYXRvci5jb21odHRwczovL21lZGlhLmdsZWFzb25hdG9yLmNvbS9jMGQzOGJkZTZlZjBiM2JhYTQ4M2Y1NzQ3OTc2NjJlYmQ4M2VmOWUxYTExNjJlOGU0ZmNkOTMwYmI0YjNjMDY4LnBuZyIsInRpdGxlIjoiR2xlYXNvbmF0b3IiLCJ1cGxvYWRfbGltaXQiOjEwMDAwMDAwMCwidXJpIjoiaHR0cHM6Ly9nbGVhc29uYXRvci5jb20iLCJ1cmxzIjp7InN0cmVhbWluZ19hcGkiOiJ3c3M6Ly9nbGVhc29uYXRvci5jb20ifSwidmVyc2lvbiI6IjIuNy4yIChjb21wYXRpYmxlOyBQbGVyb21hIDIuMy4wLTExMS1nYjQ3OGE4N2UtZGV2ZWxvcCkifQ==", - "/instance/panel.html": "IjxkaXYgc3R5bGU9XCJtYXJnaW4tbGVmdDoxMnB4OyBtYXJnaW4tcmlnaHQ6MTJweFwiPlxuPHA+V2VsY29tZSB0byA8YSBocmVmPVwiaHR0cHM6Ly9wbGVyb21hLnNvY2lhbFwiIHRhcmdldD1cIl9ibGFua1wiPlBsZXJvbWEhPC9hPjwvcD4gICAgXG48cD48YSBocmVmPVwiL21haW4vYWxsXCI+UGxlcm9tYSBGRTwvYT4gfCA8YSBocmVmPVwiL3dlYlwiPk1hc3RvZG9uIEZFPC9hPjwvcD5cbjwvZGl2PlxuXG4i", - "/nodeinfo/2.0.json": "eyJtZXRhZGF0YSI6eyJhY2NvdW50QWN0aXZhdGlvblJlcXVpcmVkIjpmYWxzZSwiZmVhdHVyZXMiOlsicGxlcm9tYV9hcGkiLCJtYXN0b2Rvbl9hcGkiLCJtYXN0b2Rvbl9hcGlfc3RyZWFtaW5nIiwicG9sbHMiLCJwbGVyb21hX2V4cGxpY2l0X2FkZHJlc3NpbmciLCJzaGFyZWFibGVfZW1vamlfcGFja3MiLCJtdWx0aWZldGNoIiwicGxlcm9tYTphcGkvdjEvbm90aWZpY2F0aW9uczppbmNsdWRlX3R5cGVzX2ZpbHRlciIsIm1lZGlhX3Byb3h5IiwicmVsYXkiLCJwbGVyb21hX2Vtb2ppX3JlYWN0aW9ucyIsInBsZXJvbWFfY2hhdF9tZXNzYWdlcyIsImVtYWlsX2xpc3QiXSwiZmVkZXJhdGlvbiI6eyJlbmFibGVkIjp0cnVlLCJleGNsdXNpb25zIjpmYWxzZSwibXJmX3BvbGljaWVzIjpbIlRhZ1BvbGljeSIsIlNpbXBsZVBvbGljeSJdLCJtcmZfc2ltcGxlIjp7ImFjY2VwdCI6W10sImF2YXRhcl9yZW1vdmFsIjpbInBhd29vLm5ldCIsInNpbmJsci5jb20iLCJkYWppYXdlaWJvLmNvbSJdLCJiYW5uZXJfcmVtb3ZhbCI6WyJwYXdvby5uZXQiLCJzaW5ibHIuY29tIiwiZGFqaWF3ZWliby5jb20iXSwiZmVkZXJhdGVkX3RpbWVsaW5lX3JlbW92YWwiOltdLCJmb2xsb3dlcnNfb25seSI6W10sIm1lZGlhX25zZnciOltdLCJtZWRpYV9yZW1vdmFsIjpbInBhd29vLm5ldCIsInNpbmJsci5jb20iLCJkYWppYXdlaWJvLmNvbSJdLCJyZWplY3QiOltdLCJyZWplY3RfZGVsZXRlcyI6W10sInJlcG9ydF9yZW1vdmFsIjpbXX0sInF1YXJhbnRpbmVkX2luc3RhbmNlcyI6W119LCJmaWVsZHNMaW1pdHMiOnsibWF4RmllbGRzIjoxNSwibWF4UmVtb3RlRmllbGRzIjoyMCwibmFtZUxlbmd0aCI6NTEyLCJ2YWx1ZUxlbmd0aCI6MjA0OH0sImludml0ZXNFbmFibGVkIjpmYWxzZSwibWFpbGVyRW5hYmxlZCI6dHJ1ZSwibm9kZURlc2NyaXB0aW9uIjoiQnVpbGRpbmcgdGhlIG5leHQgZ2VuZXJhdGlvbiBvZiB0aGUgRmVkaXZlcnNlLiBTcGVhayBmcmVlbHkuIiwibm9kZU5hbWUiOiJHbGVhc29uYXRvciIsInBvbGxMaW1pdHMiOnsibWF4X2V4cGlyYXRpb24iOjMxNTM2MDAwLCJtYXhfb3B0aW9uX2NoYXJzIjoyMDAsIm1heF9vcHRpb25zIjoyMCwibWluX2V4cGlyYXRpb24iOjB9LCJwb3N0Rm9ybWF0cyI6WyJ0ZXh0L3BsYWluIiwidGV4dC9odG1sIiwidGV4dC9tYXJrZG93biIsInRleHQvYmJjb2RlIl0sInByaXZhdGUiOmZhbHNlLCJyZXN0cmljdGVkTmlja25hbWVzIjpbIi53ZWxsLWtub3duIiwifiIsImFib3V0IiwiYWN0aXZpdGllcyIsImFwaSIsImF1dGgiLCJjaGVja19wYXNzd29yZCIsImRldiIsImZyaWVuZC1yZXF1ZXN0cyIsImluYm94IiwiaW50ZXJuYWwiLCJtYWluIiwibWVkaWEiLCJub2RlaW5mbyIsIm5vdGljZSIsIm9hdXRoIiwib2JqZWN0cyIsIm9zdGF0dXNfc3Vic2NyaWJlIiwicGxlcm9tYSIsInByb3h5IiwicHVzaCIsInJlZ2lzdHJhdGlvbiIsInJlbGF5Iiwic2V0dGluZ3MiLCJzdGF0dXMiLCJ0YWciLCJ1c2VyLXNlYXJjaCIsInVzZXJfZXhpc3RzIiwidXNlcnMiLCJ3ZWIiLCJ2ZXJpZnlfY3JlZGVudGlhbHMiLCJ1cGRhdGVfY3JlZGVudGlhbHMiLCJyZWxhdGlvbnNoaXBzIiwic2VhcmNoIiwiY29uZmlybWF0aW9uX3Jlc2VuZCIsIm1mYSJdLCJza2lwVGhyZWFkQ29udGFpbm1lbnQiOnRydWUsInN0YWZmQWNjb3VudHMiOlsiaHR0cHM6Ly9nbGVhc29uYXRvci5jb20vdXNlcnMvYWxleCJdLCJzdWdnZXN0aW9ucyI6eyJlbmFibGVkIjpmYWxzZX0sInVwbG9hZExpbWl0cyI6eyJhdmF0YXIiOjIwMDAwMDAsImJhY2tncm91bmQiOjQwMDAwMDAsImJhbm5lciI6NDAwMDAwMCwiZ2VuZXJhbCI6MTAwMDAwMDAwfX0sIm9wZW5SZWdpc3RyYXRpb25zIjp0cnVlLCJwcm90b2NvbHMiOlsiYWN0aXZpdHlwdWIiXSwic2VydmljZXMiOnsiaW5ib3VuZCI6W10sIm91dGJvdW5kIjpbXX0sInNvZnR3YXJlIjp7Im5hbWUiOiJwbGVyb21hIiwidmVyc2lvbiI6IjIuMy4wLTExMS1nYjQ3OGE4N2UtZGV2ZWxvcCJ9LCJ1c2FnZSI6eyJsb2NhbFBvc3RzIjo3ODkwNiwidXNlcnMiOnsidG90YWwiOjM1N319LCJ2ZXJzaW9uIjoiMi4wIn0=" -} diff --git a/packages/pl-fe/src/__fixtures__/relationship.json b/packages/pl-fe/src/__fixtures__/relationship.json deleted file mode 100644 index 179b8335e..000000000 --- a/packages/pl-fe/src/__fixtures__/relationship.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "showing_reblogs": true, - "followed_by": false, - "subscribing": false, - "blocked_by": false, - "requested": false, - "domain_blocking": false, - "following": false, - "endorsed": false, - "blocking": true, - "muting": false, - "id": "9vMAje101ngtjlMj7w", - "muting_notifications": true -} diff --git a/packages/pl-fe/src/__fixtures__/rules.json b/packages/pl-fe/src/__fixtures__/rules.json deleted file mode 100644 index f5f3756f9..000000000 --- a/packages/pl-fe/src/__fixtures__/rules.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "id": "1", - "text": "Illegal activity and behavior", - "subtext": "Content that depicts illegal or criminal acts, threats of violence." - }, - { - "id": "2", - "text": "Intellectual property infringement", - "subtext": "Impersonating another account or business, infringing on intellectual property rights." - } -] diff --git a/packages/pl-fe/src/__fixtures__/status-custom-emoji.json b/packages/pl-fe/src/__fixtures__/status-custom-emoji.json deleted file mode 100644 index ac3f184ee..000000000 --- a/packages/pl-fe/src/__fixtures__/status-custom-emoji.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "account": { - "acct": "benis911", - "avatar": "https://gleasonator.com/images/avi.png", - "avatar_static": "https://gleasonator.com/images/avi.png", - "bot": false, - "created_at": "2021-03-26T20:42:11.000Z", - "display_name": "benis911", - "emojis": [], - "fields": [], - "followers_count": 0, - "following_count": 0, - "fqn": "benis911@gleasonator.com", - "header": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "header_static": "https://media.gleasonator.com/fc595bbbcf5aabefecd1c2adfe5b7f5457db59847992881668653a0338ba25bd.jpg", - "id": "A5c5LK7EJTFR0u26Pg", - "last_status_at": "2022-02-23T17:31:08", - "locked": true, - "note": "hello world 2", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://gleasonator.com/users/alex", - "https://poa.st/users/alex" - ], - "ap_id": "https://gleasonator.com/users/benis911", - "background_image": null, - "birthday": "2000-01-25", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": true, - "hide_followers_count": true, - "hide_follows": true, - "hide_follows_count": true, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "hello world 2", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 152, - "url": "https://gleasonator.com/users/benis911", - "username": "benis911" - }, - "application": { - "name": "Soapbox FE", - "website": "https://soapbox.pub/" - }, - "bookmarked": false, - "card": null, - "content": "Hello :ablobcathyper: :ageblobcat: 😂 world 😋 test :blobcatphoto:", - "created_at": "2022-02-23T17:31:07.000Z", - "emojis": [ - { - "shortcode": "ablobcathyper", - "static_url": "https://gleasonator.com/emoji/blobcat/ablobcathyper.png", - "url": "https://gleasonator.com/emoji/blobcat/ablobcathyper.png", - "visible_in_picker": false - }, - { - "shortcode": "ageblobcat", - "static_url": "https://gleasonator.com/emoji/blobcat/ageblobcat.png", - "url": "https://gleasonator.com/emoji/blobcat/ageblobcat.png", - "visible_in_picker": false - }, - { - "shortcode": "blobcatphoto", - "static_url": "https://gleasonator.com/emoji/blobcat/blobcatphoto.png", - "url": "https://gleasonator.com/emoji/blobcat/blobcatphoto.png", - "visible_in_picker": false - } - ], - "favourited": false, - "favourites_count": 0, - "id": "AGm7uC9DaAIGUa4KYK", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "Hello :ablobcathyper: :ageblobcat: 😂 world 😋 test :blobcatphoto:" - }, - "conversation_id": "AGm7uC3BwZTOBtFW9w", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": null, - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/2dc79219-aed6-40c0-8818-0c2d26ed3436", - "url": "https://gleasonator.com/notice/AGm7uC9DaAIGUa4KYK", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/status-cw.json b/packages/pl-fe/src/__fixtures__/status-cw.json deleted file mode 100644 index af9978cfb..000000000 --- a/packages/pl-fe/src/__fixtures__/status-cw.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "id": "107831528995252317", - "created_at": "2022-02-20T17:35:55.224Z", - "in_reply_to_id": null, - "in_reply_to_account_id": null, - "sensitive": true, - "spoiler_text": "testing", - "visibility": "public", - "language": "en", - "uri": "https://fedibird.com/users/alex/statuses/107831528995252317", - "url": "https://fedibird.com/@alex/107831528995252317", - "replies_count": 0, - "reblogs_count": 0, - "favourites_count": 0, - "emoji_reactions_count": 0, - "emoji_reactions": [], - "content": "

hello world

", - "reblog": null, - "application": { - "name": "Web", - "website": null - }, - "account": { - "id": "66768", - "username": "alex", - "acct": "alex", - "display_name": "", - "locked": false, - "bot": false, - "cat": false, - "discoverable": null, - "group": false, - "created_at": "2020-01-27T00:00:00.000Z", - "note": "

", - "url": "https://fedibird.com/@alex", - "avatar": "https://fedibird.com/avatars/original/missing.png", - "avatar_static": "https://fedibird.com/avatars/original/missing.png", - "header": "https://fedibird.com/headers/original/missing.png", - "header_static": "https://fedibird.com/headers/original/missing.png", - "followers_count": 1, - "following_count": 1, - "subscribing_count": 0, - "statuses_count": 5, - "last_status_at": "2022-02-20", - "emojis": [], - "fields": [], - "other_settings": { - "noindex": false, - "hide_network": false, - "hide_statuses_count": false, - "hide_following_count": false, - "hide_followers_count": false, - "enable_reaction": true - } - }, - "media_attachments": [], - "mentions": [], - "tags": [], - "emojis": [], - "card": null, - "poll": null, - "quote": null -} diff --git a/packages/pl-fe/src/__fixtures__/status-quotes.json b/packages/pl-fe/src/__fixtures__/status-quotes.json deleted file mode 100644 index d74a149c9..000000000 --- a/packages/pl-fe/src/__fixtures__/status-quotes.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "account": { - "id": "ABDSjI3Q0R8aDaz1U0" - }, - "content": "quoast", - "id": "AJsajx9hY4Q7IKQXEe", - "pleroma": { - "quote": { - "content": "

10

", - "id": "AJmoVikzI3SkyITyim" - } - } - } -] diff --git a/packages/pl-fe/src/__fixtures__/status-unordered-mentions.json b/packages/pl-fe/src/__fixtures__/status-unordered-mentions.json deleted file mode 100644 index 40bdbe8b6..000000000 --- a/packages/pl-fe/src/__fixtures__/status-unordered-mentions.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "account": { - "acct": "apropos@freespeechextremist.com", - "avatar": "https://gleasonator.com/proxy/WVdkCbG7AOZ_eqMzskzXQoyjq8o/aHR0cHM6Ly9mcmVlc3BlZWNoZXh0cmVtaXN0LmNvbS9tZWRpYS8zN2I4MDMzZC03OGQ1LTQ0YmMtYmY5NC0xYTI2NzY5NTQwM2YvYmxvYi5wbmc_bmFtZT1ibG9iLnBuZw/blob.png", - "avatar_static": "https://gleasonator.com/proxy/WVdkCbG7AOZ_eqMzskzXQoyjq8o/aHR0cHM6Ly9mcmVlc3BlZWNoZXh0cmVtaXN0LmNvbS9tZWRpYS8zN2I4MDMzZC03OGQ1LTQ0YmMtYmY5NC0xYTI2NzY5NTQwM2YvYmxvYi5wbmc_bmFtZT1ibG9iLnBuZw/blob.png", - "bot": false, - "created_at": "2020-05-21T07:20:46.000Z", - "display_name": "of nothing", - "emojis": [], - "fields": [], - "followers_count": 87, - "following_count": 85, - "fqn": "apropos@freespeechextremist.com", - "header": "https://gleasonator.com/proxy/pIracLGWm_skCfOOgdwcCNqES5s/aHR0cHM6Ly9mcmVlc3BlZWNoZXh0cmVtaXN0LmNvbS9tZWRpYS8yZDEwYmRjZC01NDUwLTRjZjYtYWFhZS1hNTJjMzYwYjk2YjYvdHJhY2tzb25tYXJzLmpwZz9uYW1lPXRyYWNrc29ubWFycy5qcGc/tracksonmars.jpg", - "header_static": "https://gleasonator.com/proxy/pIracLGWm_skCfOOgdwcCNqES5s/aHR0cHM6Ly9mcmVlc3BlZWNoZXh0cmVtaXN0LmNvbS9tZWRpYS8yZDEwYmRjZC01NDUwLTRjZjYtYWFhZS1hNTJjMzYwYjk2YjYvdHJhY2tzb25tYXJzLmpwZz9uYW1lPXRyYWNrc29ubWFycy5qcGc/tracksonmars.jpg", - "id": "9vGR3IWmWVYRkKUZ4i", - "last_status_at": "2022-01-07T21:47:39", - "locked": false, - "note": "If you wait by the river long enough, the bodies of your enemies will float by.

Deo Vindice", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [], - "ap_id": "https://freespeechextremist.com/users/apropos", - "background_image": null, - "favicon": "https://gleasonator.com/proxy/EN7BSaEEYTRpmRj4lITIjgWp2sg/aHR0cHM6Ly9mcmVlc3BlZWNoZXh0cmVtaXN0LmNvbS9mYXZpY29uLnBuZw/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": false, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": false, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [], - "note": "", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 7087, - "url": "https://freespeechextremist.com/users/apropos", - "username": "apropos" - }, - "application": null, - "bookmarked": false, - "card": null, - "content": "@NEETzsche @alex @Lumeinshin @sneeden
>seething
'posting', just like you.", - "created_at": "2022-01-07T17:29:58.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 1, - "id": "AFChectaqZjmOVkXZ2", - "in_reply_to_account_id": "9v5bw7hEGBPc9nrpzc", - "in_reply_to_id": "AFChbnWqrAZ2VIlPJw", - "language": null, - "media_attachments": [], - "mentions": [ - { - "acct": "alex", - "id": "9v5bmRalQvjOy0ECcC", - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - { - "acct": "NEETzsche@iddqd.social", - "id": "9v5bw7hEGBPc9nrpzc", - "url": "https://iddqd.social/users/NEETzsche", - "username": "NEETzsche" - }, - { - "acct": "Lumeinshin@pleroma.skyshanty.xyz", - "id": "A3dFSwTkwgRfd998iG", - "url": "https://pleroma.skyshanty.xyz/users/Lumeinshin", - "username": "Lumeinshin" - }, - { - "acct": "sneeden@social.silkky.cloud", - "id": "ACrsPAbAOPh3GbKZhQ", - "url": "https://social.silkky.cloud/users/sneeden", - "username": "sneeden" - } - ], - "muted": false, - "pinned": false, - "pleroma": { - "content": { - "text/plain": "@NEETzsche @alex @Lumeinshin @sneeden >seething'posting', just like you." - }, - "conversation_id": "AFCYCBFN9SgOwoIWTg", - "direct_conversation_id": null, - "emoji_reactions": [], - "expires_at": null, - "in_reply_to_account_acct": "NEETzsche@iddqd.social", - "local": false, - "parent_visible": true, - "pinned_at": null, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 0, - "replies_count": 0, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://freespeechextremist.com/objects/714b0e04-bec4-4a2a-9514-312814380064", - "url": "https://freespeechextremist.com/objects/714b0e04-bec4-4a2a-9514-312814380064", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/status-with-card.json b/packages/pl-fe/src/__fixtures__/status-with-card.json deleted file mode 100644 index da2f83b94..000000000 --- a/packages/pl-fe/src/__fixtures__/status-with-card.json +++ /dev/null @@ -1,210 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [ - { - "shortcode": "soapbox", - "static_url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png", - "url": "https://gleasonator.com/emoji/Gleasonator/soapbox.png", - "visible_in_picker": false - } - ], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox :soapbox:", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2476, - "following_count": 1584, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-03-12T16:35:10", - "locked": false, - "note": "I create Fediverse software that empowers people online. :soapbox:

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox :soapbox:", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online. :soapbox:\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23674, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": null, - "bookmarked": false, - "card": { - "author_name": "Alex Gleason", - "author_url": "https://soapbox.pub/author/alex/", - "blurhash": null, - "description": "On cryptocurrency I’ve always believed integrated donations would be a necessary part of the Fediverse. Admins do all the heavy lifting; it’s a thankless job. Meanwhile users want to help secure their new online home, but feel powerless to do so. I have been running an experimental payment platform based on Stripe alongside my Soapbox […]", - "embed_url": null, - "height": 338, - "html": "", - "image": "https://gleasonator.com/proxy/L2kUi5uxMdoC6LYYrnAdlJviPGQ/aHR0cHM6Ly9tZWRpYS5zb2FwYm94LnB1Yi91cGxvYWRzLzIwMjEvMDcvdi0xLTMtdGh1bWIucG5n/v-1-3-thumb.png", - "provider_name": "Soapbox", - "provider_url": "https://soapbox.pub", - "title": "Soapbox FE v1.3: The Crypto Release - Soapbox", - "type": "link", - "url": "https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/", - "width": 600 - }, - "content": "

Soapbox FE v1.3 released. Read about it here: https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/

Enjoy!

", - "created_at": "2021-07-02T20:49:39.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 29, - "id": "A8tEMYF2GNnfPcL4dc", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": true, - "pleroma": { - "content": { - "text/plain": "Soapbox FE v1.3 released. Read about it here: https://soapbox.pub/blog/soapbox-fe-v1.3-cryptocurrency-release/Enjoy!" - }, - "conversation_id": "16496668", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 5, - "me": false, - "name": "❤️" - }, - { - "count": 1, - "me": false, - "name": "👍" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": "2021-11-23T01:38:44.000Z", - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": null, - "reblog": null, - "reblogged": false, - "reblogs_count": 16, - "replies_count": 7, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/objects/3eabaf63-47f4-4314-9ddb-ce7dbf46b393", - "url": "https://gleasonator.com/notice/A8tEMYF2GNnfPcL4dc", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/status-with-poll.json b/packages/pl-fe/src/__fixtures__/status-with-poll.json deleted file mode 100644 index 9dfd90d7e..000000000 --- a/packages/pl-fe/src/__fixtures__/status-with-poll.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "account": { - "acct": "alex", - "avatar": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "avatar_static": "https://media.gleasonator.com/6d64aecb17348b23aaff78db4687b9476cb0da1c07cc6a819c2e6ec7144c18b1.png", - "bot": false, - "created_at": "2020-01-08T01:25:43.000Z", - "display_name": "Alex Gleason", - "emojis": [], - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "followers_count": 2390, - "following_count": 1574, - "fqn": "alex@gleasonator.com", - "header": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "header_static": "https://media.gleasonator.com/accounts/headers/000/000/001/original/9d0e4dbf1c9dbc8f.png", - "id": "9v5bmRalQvjOy0ECcC", - "last_status_at": "2022-02-23T17:54:41", - "locked": false, - "note": "I create Fediverse software that empowers people online.

I'm vegan btw

Note: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "accepts_chat_messages": true, - "also_known_as": [ - "https://mitra.social/users/alex" - ], - "ap_id": "https://gleasonator.com/users/alex", - "background_image": null, - "birthday": "1993-07-03", - "favicon": "https://gleasonator.com/favicon.png", - "hide_favorites": true, - "hide_followers": false, - "hide_followers_count": false, - "hide_follows": false, - "hide_follows_count": false, - "is_admin": true, - "is_confirmed": true, - "is_moderator": false, - "is_suggested": true, - "relationship": {}, - "skip_thread_containment": false, - "tags": [] - }, - "source": { - "fields": [ - { - "name": "Website", - "value": "https://alexgleason.me" - }, - { - "name": "Soapbox", - "value": "https://soapbox.pub" - }, - { - "name": "Email", - "value": "alex@alexgleason.me" - }, - { - "name": "Gender identity", - "value": "Soyboy" - }, - { - "name": "Donate (PayPal)", - "value": "https://paypal.me/gleasonator" - }, - { - "name": "$BTC", - "value": "bc1q9cx35adpm73aq2fw40ye6ts8hfxqzjr5unwg0n" - }, - { - "name": "$ETH", - "value": "0xAc9aB5Fc04Dc1cB1789Af75b523Bd23C70B2D717" - }, - { - "name": "$DOGE", - "value": "D5zVZs6jrRakaPVGiErkQiHt9sayzm6V5D" - }, - { - "name": "$XMR", - "value": "45JDCLrjJ4bgVUSbbs2yjy9m5Mf4VLPW8fG7jw9sq5u69rXZZopQogZNeyYkMBnXpkaip4p4QwaaJNhdTotPa9g44DBCzdK" - } - ], - "note": "I create Fediverse software that empowers people online.\r\n\r\nI'm vegan btw\r\n\r\nNote: If you have a question for me, please tag me publicly. This gives the opportunity for others to chime in, and bystanders to learn.", - "pleroma": { - "actor_type": "Person", - "discoverable": false - }, - "sensitive": false - }, - "statuses_count": 23502, - "url": "https://gleasonator.com/users/alex", - "username": "alex" - }, - "application": null, - "bookmarked": false, - "card": null, - "content": "

What is tolerance?

", - "created_at": "2020-03-23T19:33:06.000Z", - "emojis": [], - "favourited": false, - "favourites_count": 47, - "id": "103874034847713213", - "in_reply_to_account_id": null, - "in_reply_to_id": null, - "language": null, - "media_attachments": [], - "mentions": [], - "muted": false, - "pinned": true, - "pleroma": { - "content": { - "text/plain": "What is tolerance?" - }, - "conversation_id": "3023268", - "direct_conversation_id": null, - "emoji_reactions": [ - { - "count": 3, - "me": false, - "name": "❤️" - } - ], - "expires_at": null, - "in_reply_to_account_acct": null, - "local": true, - "parent_visible": false, - "pinned_at": "2021-11-23T01:38:44.000Z", - "quote": null, - "quote_url": null, - "quote_visible": false, - "spoiler_text": { - "text/plain": "" - }, - "thread_muted": false - }, - "poll": { - "emojis": [], - "expired": true, - "expires_at": "2020-03-24T19:33:06.000Z", - "id": "4930", - "multiple": false, - "options": [ - { - "title": "Banning, censoring, and deplatforming anyone you disagree with", - "votes_count": 2 - }, - { - "title": "Promoting free speech, even for people and ideas you dislike", - "votes_count": 36 - } - ], - "voters_count": 2, - "votes_count": 38 - }, - "reblog": null, - "reblogged": false, - "reblogs_count": 26, - "replies_count": 14, - "sensitive": false, - "spoiler_text": "", - "tags": [], - "text": null, - "uri": "https://gleasonator.com/users/alex/statuses/103874034847713213", - "url": "https://gleasonator.com/notice/103874034847713213", - "visibility": "public" -} diff --git a/packages/pl-fe/src/__fixtures__/user.json b/packages/pl-fe/src/__fixtures__/user.json deleted file mode 100644 index 24617cc4a..000000000 --- a/packages/pl-fe/src/__fixtures__/user.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "access_token": "UVBP2e17b4pTpb_h8fImIm3F5a66IBVb-JkyZHs4gLE", - "expires_in": 600, - "me": "https://social.teci.world/users/curtis", - "refresh_token": "c2DpbVxYZBJDogNn-VBNFES72yXPNUYQCv0CrXGOplY", - "scope": "read write follow push admin", - "token_type": "Bearer" -} diff --git a/packages/pl-fe/src/actions/accounts.test.ts b/packages/pl-fe/src/actions/accounts.test.ts deleted file mode 100644 index 56db8af9a..000000000 --- a/packages/pl-fe/src/actions/accounts.test.ts +++ /dev/null @@ -1,466 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; - -import { __stub } from '@/api'; -import { buildInstance, buildRelationship } from '@/jest/factory'; -import { mockStore, rootState } from '@/jest/test-helpers'; - -import { - createAccount, - fetchAccount, - fetchAccountByUsername, - fetchRelationships, -} from './accounts'; - -let store: ReturnType; - -describe('createAccount()', () => { - const params = { - email: 'foo@bar.com', - }; - - describe('with a successful API request', () => { - beforeEach(() => { - const state = rootState; - store = mockStore(state); - - __stub((mock) => { - mock.onPost('/api/v1/accounts').reply(200, { token: '123 ' }); - }); - }); - - it('dispatches the correct actions', async() => { - const expectedActions = [ - { type: 'ACCOUNT_CREATE_REQUEST', params }, - { - type: 'ACCOUNT_CREATE_SUCCESS', - params, - token: { token: '123 ' }, - }, - ]; - await store.dispatch(createAccount(params)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); -}); - -describe('fetchAccount()', () => { - const id = '123'; - - describe('when the account has "should_refetch" set to false', () => { - beforeEach(() => { - const account = { - id, - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', - }; - - const state = { - ...rootState, - entities: { - 'ACCOUNTS': { - store: { - [id]: account, - }, - lists: {}, - }, - }, - }; - - store = mockStore(state); - - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${id}`).reply(200, account); - }); - }); - - it('should do nothing', async() => { - await store.dispatch(fetchAccount(id)); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('with a successful API request', async () => { - const account = await import('@/__fixtures__/pleroma-account.json'); - - beforeEach(() => { - const state = rootState; - store = mockStore(state); - - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${id}`).reply(200, account); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'ACCOUNT_FETCH_REQUEST', id: '123' }, - { type: 'ACCOUNTS_IMPORT', accounts: [account] }, - { - type: 'ACCOUNT_FETCH_SUCCESS', - account, - }, - ]; - - await store.dispatch(fetchAccount(id)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - const state = rootState; - store = mockStore(state); - - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${id}`).networkError(); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'ACCOUNT_FETCH_REQUEST', id: '123' }, - { - type: 'ACCOUNT_FETCH_FAIL', - id, - error: new Error('Network Error'), - skipAlert: true, - }, - ]; - - await store.dispatch(fetchAccount(id)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); -}); - -describe('fetchAccountByUsername()', () => { - const id = '123'; - const username = 'tiger'; - let state, account: any; - - beforeEach(() => { - account = { - id, - acct: username, - display_name: 'Tiger', - avatar: 'test.jpg', - birthday: undefined, - }; - - state = { - ...rootState, - entities: { - 'ACCOUNTS': { - store: { - [id]: account, - }, - lists: {}, - }, - }, - }; - - store = mockStore(state); - - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${id}`).reply(200, account); - }); - }); - - describe('when "accountByUsername" feature is enabled', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - instance: buildInstance({ - version: '2.7.2 (compatible; Pleroma 2.4.52-1337-g4779199e.gleasonator+soapbox)', - pleroma: { - metadata: { - features: [], - }, - }, - }), - }; - - store = mockStore(state); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${username}`).reply(200, account); - mock.onGet(`/api/v1/accounts/relationships?${[account.id].map(id => `id[]=${id}`).join('&')}`); - }); - }); - - it('should return dispatch the proper actions', async() => { - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions[0]).toEqual({ - type: 'RELATIONSHIPS_FETCH_REQUEST', - ids: ['123'], - }); - expect(actions[1].type).toEqual('ACCOUNTS_IMPORT'); - expect(actions[2].type).toEqual('ACCOUNT_FETCH_SUCCESS'); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${username}`).networkError(); - }); - }); - - it('should return dispatch the proper actions', async() => { - const expectedActions = [ - { - type: 'ACCOUNT_FETCH_FAIL', - id: null, - error: new Error('Network Error'), - skipAlert: true, - }, - { type: 'ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP', username: 'tiger' }, - ]; - - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); - - describe('when "accountLookup" feature is enabled', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - instance: buildInstance({ - version: '3.4.1 (compatible; TruthSocial 1.0.0)', - pleroma: { - metadata: { - features: [], - }, - }, - }), - }; - - store = mockStore(state); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/lookup').reply(200, account); - }); - }); - - it('should return dispatch the proper actions', async() => { - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions[0]).toEqual({ - type: 'ACCOUNT_LOOKUP_REQUEST', - acct: username, - }); - expect(actions[1].type).toEqual('ACCOUNTS_IMPORT'); - expect(actions[2].type).toEqual('ACCOUNT_LOOKUP_SUCCESS'); - expect(actions[3].type).toEqual('RELATIONSHIPS_FETCH_REQUEST'); - expect(actions[4].type).toEqual('ACCOUNT_FETCH_SUCCESS'); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/lookup').networkError(); - }); - }); - - it('should return dispatch the proper actions', async() => { - const expectedActions = [ - { type: 'ACCOUNT_LOOKUP_REQUEST', acct: 'tiger' }, - { type: 'ACCOUNT_LOOKUP_FAIL' }, - { - type: 'ACCOUNT_FETCH_FAIL', - id: null, - error: new Error('Network Error'), - skipAlert: true, - }, - { type: 'ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP', username }, - ]; - - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); - - describe('when using the accountSearch function', () => { - beforeEach(() => { - const state = { ...rootState, me: '123' }; - store = mockStore(state); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/search').reply(200, [account]); - }); - }); - - it('should return dispatch the proper actions', async() => { - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions[0]).toEqual({ - type: 'ACCOUNT_SEARCH_REQUEST', - params: { q: username, limit: 5, resolve: true }, - }); - expect(actions[1].type).toEqual('ACCOUNTS_IMPORT'); - expect(actions[2].type).toEqual('ACCOUNT_SEARCH_SUCCESS'); - expect(actions[3]).toEqual({ - type: 'RELATIONSHIPS_FETCH_REQUEST', - ids: [ '123' ], - }); - expect(actions[4].type).toEqual('ACCOUNT_FETCH_SUCCESS'); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/search').networkError(); - }); - }); - - it('should return dispatch the proper actions', async() => { - const expectedActions = [ - { - type: 'ACCOUNT_SEARCH_REQUEST', - params: { q: username, limit: 5, resolve: true }, - }, - { type: 'ACCOUNT_SEARCH_FAIL', skipAlert: true }, - { - type: 'ACCOUNT_FETCH_FAIL', - id: null, - error: new Error('Network Error'), - skipAlert: true, - }, - { type: 'ACCOUNT_FETCH_FAIL_FOR_USERNAME_LOOKUP', username }, - ]; - - await store.dispatch(fetchAccountByUsername(username)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); - -describe('fetchRelationships()', () => { - const id = '1'; - - describe('when logged out', () => { - beforeEach(() => { - const state = { ...rootState, me: null }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(fetchRelationships([id])); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('when logged in', () => { - beforeEach(() => { - const state = { ...rootState, me: '123' }; - store = mockStore(state); - }); - - describe('without newAccountIds', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - relationships: ImmutableMap({ [id]: buildRelationship() }), - }; - - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(fetchRelationships([id])); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('with a successful API request', () => { - beforeEach(() => { - const state = { - ...rootState, - me: '123', - relationships: ImmutableMap(), - }; - - store = mockStore(state); - - __stub((mock) => { - mock - .onGet(`/api/v1/accounts/relationships?${[id].map(id => `id[]=${id}`).join('&')}`) - .reply(200, []); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'RELATIONSHIPS_FETCH_REQUEST', ids: [id] }, - { type: 'RELATIONSHIPS_FETCH_SUCCESS', relationships: [] }, - ]; - await store.dispatch(fetchRelationships([id])); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock - .onGet(`/api/v1/accounts/relationships?${[id].map(id => `id[]=${id}`).join('&')}`) - .networkError(); - }); - }); - - it('should dispatch the correct actions', async() => { - const expectedActions = [ - { type: 'RELATIONSHIPS_FETCH_REQUEST', ids: [id] }, - { type: 'RELATIONSHIPS_FETCH_FAIL', error: new Error('Network Error') }, - ]; - await store.dispatch(fetchRelationships([id])); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/actions/compose.test.ts b/packages/pl-fe/src/actions/compose.test.ts deleted file mode 100644 index b7d905fe3..000000000 --- a/packages/pl-fe/src/actions/compose.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { OrderedSet as ImmutableOrderedSet } from 'immutable'; - -import { buildInstance } from '@/jest/factory'; -import { mockStore, rootState } from '@/jest/test-helpers'; -import { ReducerCompose } from '@/reducers/compose'; - -import { uploadCompose, submitCompose } from './compose'; -import { STATUS_CREATE_REQUEST } from './statuses'; - -import type { IntlShape } from 'react-intl'; - -describe('uploadCompose()', () => { - describe('with images', () => { - let files: FileList, store: ReturnType; - - beforeEach(() => { - const instance = buildInstance({ - configuration: { - statuses: { - max_media_attachments: 4, - }, - media_attachments: { - image_size_limit: 10, - }, - }, - }); - - const state = { - ...rootState, - me: '1234', - instance, - compose: rootState.compose.set('home', ReducerCompose()), - }; - - store = mockStore(state); - files = [{ - uri: 'image.png', - name: 'Image', - size: 15, - type: 'image/png', - }] as unknown as FileList; - }); - - it('creates an alert if exceeds max size', async() => { - const mockIntl = { - formatMessage: vi.fn().mockReturnValue('Image exceeds the current file size limit (10 Bytes)'), - } as unknown as IntlShape; - - const expectedActions = [ - { type: 'COMPOSE_UPLOAD_REQUEST', id: 'home' }, - { type: 'COMPOSE_UPLOAD_FAIL', id: 'home', error: true }, - ]; - - await store.dispatch(uploadCompose('home', files, mockIntl)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with videos', () => { - let files: FileList, store: ReturnType; - - beforeEach(() => { - const instance = buildInstance({ - configuration: { - statuses: { - max_media_attachments: 4, - }, - media_attachments: { - video_size_limit: 10, - }, - }, - }); - - const state = { - ...rootState, - me: '1234', - instance, - compose: rootState.compose.set('home', ReducerCompose()), - }; - - store = mockStore(state); - files = [{ - uri: 'video.mp4', - name: 'Video', - size: 15, - type: 'video/mp4', - }] as unknown as FileList; - }); - - it('creates an alert if exceeds max size', async() => { - const mockIntl = { - formatMessage: vi.fn().mockReturnValue('Video exceeds the current file size limit (10 Bytes)'), - } as unknown as IntlShape; - - const expectedActions = [ - { type: 'COMPOSE_UPLOAD_REQUEST', id: 'home' }, - { type: 'COMPOSE_UPLOAD_FAIL', id: 'home', error: true }, - ]; - - await store.dispatch(uploadCompose('home', files, mockIntl)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); -}); - -describe('submitCompose()', () => { - it('inserts mentions from text', async() => { - const state = { - ...rootState, - me: '1234', - compose: rootState.compose.set('home', ReducerCompose({ text: '@alex hello @mkljczk@pl.fediverse.pl @gg@汉语/漢語.com alex@alexgleason.me' })), - }; - - const store = mockStore(state); - await store.dispatch(submitCompose('home')); - const actions = store.getActions(); - - const statusCreateRequest = actions.find(action => action.type === STATUS_CREATE_REQUEST); - const to = statusCreateRequest!.params.to as ImmutableOrderedSet; - - const expected = [ - 'alex', - 'mkljczk@pl.fediverse.pl', - 'gg@汉语/漢語.com', - ]; - - expect(to.toJS()).toEqual(expected); - }); -}); diff --git a/packages/pl-fe/src/actions/importer.ts b/packages/pl-fe/src/actions/importer.ts index ae0274429..709bff183 100644 --- a/packages/pl-fe/src/actions/importer.ts +++ b/packages/pl-fe/src/actions/importer.ts @@ -8,7 +8,6 @@ import type { Account as BaseAccount, Group as BaseGroup, Poll as BasePoll, Rela const STATUS_IMPORT = 'STATUS_IMPORT' as const; const STATUSES_IMPORT = 'STATUSES_IMPORT' as const; -const POLLS_IMPORT = 'POLLS_IMPORT' as const; const isEmpty = (object: Record) => !Object.values(object).some(value => value); @@ -23,11 +22,6 @@ interface ImportStatusesAction { statuses: Array; } -interface ImportPollAction { - type: typeof POLLS_IMPORT; - polls: Array; -} - const importEntities = (entities: { accounts?: Array; groups?: Array; @@ -110,12 +104,11 @@ const importEntities = (entities: { if (!isEmpty(statuses)) dispatch({ type: STATUSES_IMPORT, statuses: Object.values(statuses) }); }; -type ImporterAction = ImportStatusAction | ImportStatusesAction | ImportPollAction; +type ImporterAction = ImportStatusAction | ImportStatusesAction; export { STATUS_IMPORT, STATUSES_IMPORT, - POLLS_IMPORT, importEntities, type ImporterAction, }; diff --git a/packages/pl-fe/src/actions/me.test.ts b/packages/pl-fe/src/actions/me.test.ts deleted file mode 100644 index 3eff9cc46..000000000 --- a/packages/pl-fe/src/actions/me.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; - -import { __stub } from '@/api'; -import { buildAccount } from '@/jest/factory'; -import { mockStore, rootState } from '@/jest/test-helpers'; -import { AuthUserRecord, ReducerRecord } from '@/reducers/auth'; - -import { fetchMe, patchMe } from './me'; - -vi.mock('../../storage/kv-store', () => ({ - __esModule: true, - default: { - getItemOrError: vi.fn().mockReturnValue(Promise.resolve({})), - }, -})); - -let store: ReturnType; - -describe('fetchMe()', () => { - describe('without a token', () => { - beforeEach(() => { - const state = rootState; - store = mockStore(state); - }); - - it('dispatches the correct actions', async() => { - const expectedActions = [{ type: 'ME_FETCH_SKIP' }]; - await store.dispatch(fetchMe()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with a token', () => { - const accountUrl = 'accountUrl'; - const token = '123'; - - beforeEach(() => { - const state = { - ...rootState, - auth: ReducerRecord({ - me: accountUrl, - users: ImmutableMap({ - [accountUrl]: AuthUserRecord({ - 'access_token': token, - }), - }), - }), - entities: { - 'ACCOUNTS': { - store: { - [accountUrl]: buildAccount({ url: accountUrl }), - }, - lists: {}, - }, - }, - }; - - store = mockStore(state); - }); - - describe('with a successful API response', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/verify_credentials').reply(200, {}); - }); - }); - - it('dispatches the correct actions', async() => { - const expectedActions = [ - { type: 'ME_FETCH_REQUEST' }, - { type: 'AUTH_ACCOUNT_REMEMBER_REQUEST', accountUrl }, - { type: 'ACCOUNTS_IMPORT', accounts: [] }, - { - type: 'AUTH_ACCOUNT_REMEMBER_SUCCESS', - account: {}, - accountUrl, - }, - { type: 'VERIFY_CREDENTIALS_REQUEST', token: '123' }, - { type: 'ACCOUNTS_IMPORT', accounts: [] }, - { type: 'VERIFY_CREDENTIALS_SUCCESS', token: '123', account: {} }, - ]; - await store.dispatch(fetchMe()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); - -describe('patchMe()', () => { - beforeEach(() => { - const state = rootState; - store = mockStore(state); - }); - - describe('with a successful API response', () => { - beforeEach(() => { - __stub((mock) => { - mock.onPatch('/api/v1/accounts/update_credentials').reply(200, {}); - }); - }); - - it('dispatches the correct actions', async() => { - const expectedActions = [ - { type: 'ME_PATCH_REQUEST' }, - { type: 'ACCOUNTS_IMPORT', accounts: [] }, - { - type: 'ME_PATCH_SUCCESS', - me: {}, - }, - ]; - await store.dispatch(patchMe({})); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); -}); diff --git a/packages/pl-fe/src/actions/notifications.test.ts b/packages/pl-fe/src/actions/notifications.test.ts deleted file mode 100644 index 9bf12d9c4..000000000 --- a/packages/pl-fe/src/actions/notifications.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { OrderedMap as ImmutableOrderedMap } from 'immutable'; - -import { __stub } from '@/api'; -import { mockStore, rootState } from '@/jest/test-helpers'; -import { normalizeNotification } from '@/normalizers/notification'; - -import { markReadNotifications } from './notifications'; - -describe('markReadNotifications()', () => { - it('fires off marker when top notification is newer than lastRead', async() => { - __stub((mock) => mock.onPost('/api/v1/markers').reply(200, {})); - - const items = ImmutableOrderedMap({ - '10': normalizeNotification({ id: '10' }), - }); - - const state = { - ...rootState, - me: '123', - notifications: rootState.notifications.merge({ - lastRead: '9', - items, - }), - }; - - const store = mockStore(state); - - const expectedActions = [{ - type: 'MARKER_SAVE_REQUEST', - marker: { - notifications: { - last_read_id: '10', - }, - }, - }]; - - store.dispatch(markReadNotifications()); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); -}); diff --git a/packages/pl-fe/src/actions/preload.test.ts b/packages/pl-fe/src/actions/preload.test.ts deleted file mode 100644 index 4cf6d6496..000000000 --- a/packages/pl-fe/src/actions/preload.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; - -import { __stub } from '@/api'; -import { mockStore } from '@/jest/test-helpers'; - -import { VERIFY_CREDENTIALS_REQUEST } from './auth'; -import { ACCOUNTS_IMPORT } from './importer'; -import { - MASTODON_PRELOAD_IMPORT, - preloadMastodon, -} from './preload'; - -describe('preloadMastodon()', () => { - it('creates the expected actions', async () => { - const data = await import('@/__fixtures__/mastodon_initial_state.json'); - - __stub(mock => { - mock.onGet('/api/v1/accounts/verify_credentials') - .reply(200, {}); - }); - - const store = mockStore(ImmutableMap()); - store.dispatch(preloadMastodon(data)); - const actions = store.getActions(); - - expect(actions[0].type).toEqual(ACCOUNTS_IMPORT); - expect(actions[0].accounts[0].username).toEqual('Gargron'); - expect(actions[0].accounts[1].username).toEqual('benis911'); - - expect(actions[1]).toEqual({ - type: VERIFY_CREDENTIALS_REQUEST, - token: 'Nh15V9JWyY5Fshf2OJ_feNvOIkTV7YGVfEJFr0Y0D6Q', - }); - - expect(actions[2]).toEqual({ type: MASTODON_PRELOAD_IMPORT, data }); - }); -}); diff --git a/packages/pl-fe/src/actions/preload.ts b/packages/pl-fe/src/actions/preload.ts index 83fcdba4e..353294295 100644 --- a/packages/pl-fe/src/actions/preload.ts +++ b/packages/pl-fe/src/actions/preload.ts @@ -70,6 +70,5 @@ export { pleromaDecoder, decodeFromMarkup, preload, - preloadMastodon, type PreloadAction, }; diff --git a/packages/pl-fe/src/actions/statuses.test.ts b/packages/pl-fe/src/actions/statuses.test.ts deleted file mode 100644 index e7331a357..000000000 --- a/packages/pl-fe/src/actions/statuses.test.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { fromJS, Map as ImmutableMap } from 'immutable'; - -import { STATUSES_IMPORT } from '@/actions/importer'; -import { __stub } from '@/api'; -import { mockStore, rootState } from '@/jest/test-helpers'; -import { normalizeStatus } from '@/normalizers/status'; - -import { deleteStatus, fetchContext } from './statuses'; - -describe('fetchContext()', () => { - it('handles Mitra context', async () => { - const statuses = await import('@/__fixtures__/mitra-context.json'); - - __stub(mock => { - mock.onGet('/api/v1/statuses/017ed505-5926-392f-256a-f86d5075df70/context') - .reply(200, statuses); - }); - - const store = mockStore(rootState); - await store.dispatch(fetchContext('017ed505-5926-392f-256a-f86d5075df70')); - const actions = store.getActions(); - - expect(actions[3].type).toEqual(STATUSES_IMPORT); - expect(actions[3].statuses[0].id).toEqual('017ed503-bc96-301a-e871-2c23b30ddd05'); - }); -}); - -describe('deleteStatus()', () => { - let store: ReturnType; - - describe('if logged out', () => { - beforeEach(() => { - const state = { ...rootState, me: null }; - store = mockStore(state); - }); - - it('should do nothing', async() => { - await store.dispatch(deleteStatus('1')); - const actions = store.getActions(); - - expect(actions).toEqual([]); - }); - }); - - describe('if logged in', () => { - const statusId = 'AHU2RrX0wdcwzCYjFQ'; - const cachedStatus = normalizeStatus({ - id: statusId, - }); - - beforeEach(() => { - const state = { - ...rootState, - me: '1234', - statuses: fromJS({ - [statusId]: cachedStatus, - }) as any, - }; - - store = mockStore(state); - }); - - describe('with a successful API request', () => { - let status: any; - - beforeEach(async () => { - status = await import('@/__fixtures__/pleroma-status-deleted.json'); - - __stub((mock) => { - mock.onDelete(`/api/v1/statuses/${statusId}`).reply(200, status); - }); - }); - - it('should delete the status from the API', async() => { - const expectedActions = [ - { - type: 'STATUS_DELETE_REQUEST', - params: cachedStatus, - }, - { type: 'STATUS_DELETE_SUCCESS', id: statusId }, - { - type: 'TIMELINE_DELETE', - id: statusId, - accountId: null, - references: ImmutableMap({}), - reblogOf: null, - }, - ]; - await store.dispatch(deleteStatus(statusId)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - - it('should handle redraft', async() => { - const expectedActions = [ - { - type: 'STATUS_DELETE_REQUEST', - params: cachedStatus, - }, - { type: 'STATUS_DELETE_SUCCESS', id: statusId }, - { - type: 'TIMELINE_DELETE', - id: statusId, - accountId: null, - references: ImmutableMap({}), - reblogOf: null, - }, - { - type: 'COMPOSE_SET_STATUS', - status: cachedStatus, - rawText: status.text, - explicitAddressing: false, - spoilerText: '', - contentType: 'text/markdown', - v: { - build: undefined, - compatVersion: '0.0.0', - software: 'Mastodon', - version: '0.0.0', - }, - withRedraft: true, - id: 'compose-modal', - }, - { type: 'MODAL_CLOSE', modalType: 'COMPOSE', modalProps: undefined }, - { type: 'MODAL_OPEN', modalType: 'COMPOSE', modalProps: undefined }, - ]; - await store.dispatch(deleteStatus(statusId, undefined, true)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - - describe('with an unsuccessful API request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onDelete(`/api/v1/statuses/${statusId}`).networkError(); - }); - }); - - it('should dispatch failed action', async() => { - const expectedActions = [ - { - type: 'STATUS_DELETE_REQUEST', - params: cachedStatus, - }, - { - type: 'STATUS_DELETE_FAIL', - params: cachedStatus, - error: new Error('Network Error'), - }, - ]; - await store.dispatch(deleteStatus(statusId, undefined, true)); - const actions = store.getActions(); - - expect(actions).toEqual(expectedActions); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/api/__mocks__/index.ts b/packages/pl-fe/src/api/__mocks__/index.ts deleted file mode 100644 index 3945260f6..000000000 --- a/packages/pl-fe/src/api/__mocks__/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -// import MockAdapter from 'axios-mock-adapter'; -import { vi } from 'vitest'; - -const api = await vi.importActual('../index') as Record; -let mocks: Array = []; - -const __stub = (func: (mock: any) => void) => mocks.push(func); -const __clear = (): Function[] => mocks = []; - -// const setupMock = (axios: AxiosInstance) => { -// const mock = new MockAdapter(axios, { onNoMatch: 'throwException' }); -// mocks.map(func => func(mock)); -// }; - -const staticClient = api.staticClient; - -const baseClient = (...params: any[]) => { - const axios = api.baseClient(...params); - // setupMock(axios); - return axios; -}; - -export default (...params: any[]) => { - const axios = api.default(...params); - // setupMock(axios); - return axios; -}; - -export { __stub, __clear, staticClient, baseClient }; diff --git a/packages/pl-fe/src/api/hooks/groups/use-group.test.ts b/packages/pl-fe/src/api/hooks/groups/use-group.test.ts deleted file mode 100644 index 24d794977..000000000 --- a/packages/pl-fe/src/api/hooks/groups/use-group.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { __stub } from '@/api'; -import { buildGroup } from '@/jest/factory'; -import { renderHook, waitFor } from '@/jest/test-helpers'; - -import { useGroup } from './use-group'; - -const group = buildGroup({ id: '1', display_name: 'soapbox' }); - -describe('useGroup hook', () => { - describe('with a successful request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/groups/${group.id}`).reply(200, group); - }); - }); - - it('is successful', async () => { - const { result } = renderHook(() => useGroup(group.id)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.group?.id).toBe(group.id); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/groups/${group.id}`).networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(() => useGroup(group.id)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.group).toBeUndefined(); - }); - }); -}); diff --git a/packages/pl-fe/src/api/hooks/groups/use-groups.test.ts b/packages/pl-fe/src/api/hooks/groups/use-groups.test.ts deleted file mode 100644 index 8ef89f79e..000000000 --- a/packages/pl-fe/src/api/hooks/groups/use-groups.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { instanceSchema } from 'pl-api'; -import * as v from 'valibot'; - -import { __stub } from '@/api'; -import { buildGroup } from '@/jest/factory'; -import { renderHook, waitFor } from '@/jest/test-helpers'; - -import { useGroups } from './use-groups'; - -const group = buildGroup({ id: '1', display_name: 'soapbox' }); -const store = { - instance: v.parse(instanceSchema, { - version: '3.4.1 (compatible; TruthSocial 1.0.0+unreleased)', - }), -}; - -describe('useGroups hook', () => { - describe('with a successful request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/groups').reply(200, [group]); - }); - }); - - it('is successful', async () => { - const { result } = renderHook(useGroups, undefined, store); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.groups).toHaveLength(1); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/groups').networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(useGroups, undefined, store); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.groups).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/components/account.test.tsx b/packages/pl-fe/src/components/account.test.tsx deleted file mode 100644 index 3a428a810..000000000 --- a/packages/pl-fe/src/components/account.test.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; - -import { buildAccount } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import Account from './account'; - -describe('', () => { - it('renders account name and username', () => { - const account = buildAccount({ - id: '1', - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', - }); - - const store = { - accounts: { - '1': account, - }, - }; - - render(, undefined, store); - expect(screen.getByTestId('account')).toHaveTextContent('Justin L'); - expect(screen.getByTestId('account')).toHaveTextContent(/justin-username/i); - }); - - describe('verification badge', () => { - it('renders verification badge', () => { - const account = buildAccount({ - id: '1', - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', - verified: true, - }); - - const store = { - accounts: { - '1': account, - }, - }; - - render(, undefined, store); - expect(screen.getByTestId('verified-badge')).toBeInTheDocument(); - }); - - it('does not render verification badge', () => { - const account = buildAccount({ - id: '1', - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', - verified: false, - }); - - const store = { - accounts: { - '1': account, - }, - }; - - render(, undefined, store); - expect(screen.queryAllByTestId('verified-badge')).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/components/autosuggest-emoji.test.tsx b/packages/pl-fe/src/components/autosuggest-emoji.test.tsx deleted file mode 100644 index 3f9150460..000000000 --- a/packages/pl-fe/src/components/autosuggest-emoji.test.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import AutosuggestEmoji from './autosuggest-emoji'; - -describe('', () => { - it('renders native emoji', () => { - const emoji = { - native: '💙', - colons: ':foobar:', - }; - - render(); - - expect(screen.getByTestId('emoji')).toHaveTextContent('foobar'); - expect(screen.getByRole('img').getAttribute('src')).not.toBe('http://example.com/emoji.png'); - }); - - it('renders emoji with custom url', () => { - const emoji = { - custom: true, - imageUrl: 'http://example.com/emoji.png', - native: 'foobar', - colons: ':foobar:', - }; - - render(); - - expect(screen.getByTestId('emoji')).toHaveTextContent('foobar'); - expect(screen.getByRole('img').getAttribute('src')).toBe('http://example.com/emoji.png'); - }); -}); diff --git a/packages/pl-fe/src/components/badge.test.tsx b/packages/pl-fe/src/components/badge.test.tsx deleted file mode 100644 index 57c851271..000000000 --- a/packages/pl-fe/src/components/badge.test.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import Badge from './badge'; - -describe('', () => { - it('renders correctly', () => { - render(); - - expect(screen.getByTestId('badge')).toHaveTextContent('Patron'); - }); -}); diff --git a/packages/pl-fe/src/components/polls/poll-footer.test.tsx b/packages/pl-fe/src/components/polls/poll-footer.test.tsx deleted file mode 100644 index 4e06e91e2..000000000 --- a/packages/pl-fe/src/components/polls/poll-footer.test.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; - -import { __stub } from '@/api'; -import { mockStore, render, screen, rootState } from '@/jest/test-helpers'; - -import PollFooter from './poll-footer'; - -import type { Poll } from 'pl-api'; - -let poll: Poll = { - id: '1', - options: [{ - title: 'Apples', - votes_count: 0, - title_emojified: 'Apples', - }, { - title: 'Oranges', - votes_count: 0, - title_emojified: 'Oranges', - }], - emojis: [], - expired: false, - expires_at: '2020-03-24T19:33:06.000Z', - multiple: true, - voters_count: 0, - votes_count: 0, - own_votes: null, - voted: false, -}; - -describe('', () => { - describe('with "showResults" enabled', () => { - it('renders the Refresh button', () => { - render(); - - expect(screen.getByTestId('poll-footer')).toHaveTextContent('Refresh'); - }); - - it('responds to the Refresh button', async() => { - __stub((mock) => { - mock.onGet('/api/v1/polls/1').reply(200, {}); - }); - - const user = userEvent.setup(); - const store = mockStore(rootState); - render( - - - - - , - ); - - await user.click(screen.getByTestId('poll-refresh')); - const actions = store.getActions(); - expect(actions).toEqual([ - { type: 'POLL_FETCH_REQUEST' }, - { type: 'POLLS_IMPORT', polls: [{}] }, - { type: 'POLL_FETCH_SUCCESS', poll: {} }, - ]); - }); - - it('does not render the Vote button', () => { - render(); - - expect(screen.queryAllByTestId('button')).toHaveLength(0); - }); - - describe('when the Poll has not expired', () => { - beforeEach(() => { - poll = { - ...poll, - expired: false, - }; - }); - - it('renders time remaining', () => { - render(); - - expect(screen.getByTestId('poll-expiration')).toHaveTextContent('Moments remaining'); - }); - }); - - describe('when the Poll has expired', () => { - beforeEach(() => { - poll = { - ...poll, - expired: true, - }; - }); - - it('renders closed', () => { - render(); - - expect(screen.getByTestId('poll-expiration')).toHaveTextContent('Closed'); - }); - }); - }); - - describe('with "showResults" disabled', () => { - it('does not render the Refresh button', () => { - render(); - - expect(screen.getByTestId('poll-footer')).not.toHaveTextContent('Refresh'); - }); - - describe('when the Poll is multiple', () => { - beforeEach(() => { - poll = { - ...poll, - multiple: true, - }; - }); - - it('renders the Vote button', () => { - render(); - - expect(screen.getByTestId('button')).toHaveTextContent('Vote'); - }); - }); - - describe('when the Poll is not multiple', () => { - beforeEach(() => { - poll = { - ...poll, - multiple: false, - }; - }); - - it('does not render the Vote button', () => { - render(); - - expect(screen.queryAllByTestId('button')).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/components/quoted-status.test.tsx b/packages/pl-fe/src/components/quoted-status.test.tsx deleted file mode 100644 index e394a1147..000000000 --- a/packages/pl-fe/src/components/quoted-status.test.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; - -import { render, screen, rootState } from '@/jest/test-helpers'; -import { normalizeStatus } from '@/normalizers/status'; - -import QuotedStatus from './quoted-status'; - -import type { ReducerStatus } from '@/reducers/statuses'; - -describe('', () => { - it('renders content', () => { - const account = { - id: '1', - acct: 'alex', - url: 'https://soapbox.test/users/alex', - }; - - const status = normalizeStatus({ - id: '1', - account, - content: 'hello world', - contentHtml: 'hello world', - }) as ReducerStatus; - - const state = rootState/*.accounts.set('1', account)*/; - - render(, undefined, state); - screen.getByText(/hello world/i); - expect(screen.getByTestId('quoted-status')).toHaveTextContent(/hello world/i); - }); -}); diff --git a/packages/pl-fe/src/components/scroll-top-button.test.tsx b/packages/pl-fe/src/components/scroll-top-button.test.tsx deleted file mode 100644 index 286d0a848..000000000 --- a/packages/pl-fe/src/components/scroll-top-button.test.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import React from 'react'; -import { defineMessages } from 'react-intl'; - -import { render, screen } from '@/jest/test-helpers'; - -import ScrollTopButton from './scroll-top-button'; - -const messages = defineMessages({ - queue: { id: 'status_list.queue_label', defaultMessage: 'Click to see {count} new {count, plural, one {post} other {posts}}' }, -}); - -describe('', () => { - it('renders correctly', async() => { - render( - {}} - count={0} - message={messages.queue} - />, - ); - expect(screen.queryAllByRole('link')).toHaveLength(0); - - render( - {}} - count={1} - message={messages.queue} - />, - ); - expect(screen.getByText('Click to see 1 new post')).toBeInTheDocument(); - - render( - {}} - count={9999999} - message={messages.queue} - />, - ); - expect(screen.getByText('Click to see 9999999 new posts')).toBeInTheDocument(); - }); -}); diff --git a/packages/pl-fe/src/components/status.test.tsx b/packages/pl-fe/src/components/status.test.tsx deleted file mode 100644 index 9c2bf40dc..000000000 --- a/packages/pl-fe/src/components/status.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; - -import { buildAccount } from '@/jest/factory'; -import { render, screen, rootState } from '@/jest/test-helpers'; -import { normalizeStatus } from '@/normalizers/status'; - -import Status from './status'; - -import type { ReducerStatus } from '@/reducers/statuses'; - -const account = buildAccount({ - id: '1', - acct: 'alex', -}); - -const status = normalizeStatus({ - id: '1', - account, - content: 'hello world', - contentHtml: 'hello world', -}) as ReducerStatus; - -describe('', () => { - const state = rootState/*.accounts.set('1', account)*/; - - it('renders content', () => { - render(, undefined, state); - screen.getByText(/hello world/i); - expect(screen.getByTestId('status')).toHaveTextContent(/hello world/i); - }); - - describe('the Status Action Bar', () => { - it('is rendered', () => { - render(, undefined, state); - expect(screen.getByTestId('status-action-bar')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/pl-fe/src/components/statuses/sensitive-content-overlay.test.tsx b/packages/pl-fe/src/components/statuses/sensitive-content-overlay.test.tsx deleted file mode 100644 index 4c0c7d667..000000000 --- a/packages/pl-fe/src/components/statuses/sensitive-content-overlay.test.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; -import React from 'react'; - -import { fireEvent, render, rootState, screen } from '@/jest/test-helpers'; -import { normalizeStatus } from '@/normalizers/status'; -import { ReducerStatus } from '@/reducers/statuses'; - -import SensitiveContentOverlay from './sensitive-content-overlay'; - -describe('', () => { - let status: ReducerStatus; - - describe('when the Status is marked as sensitive', () => { - beforeEach(() => { - status = normalizeStatus({ sensitive: true }) as ReducerStatus; - }); - - it('displays the "Sensitive content" warning', () => { - render(); - expect(screen.getByTestId('sensitive-overlay')).toHaveTextContent('Sensitive content'); - }); - - it('does not allow user to delete the status', () => { - render(); - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - - it('can be toggled', () => { - render(); - - fireEvent.click(screen.getByTestId('button')); - expect(screen.getByTestId('sensitive-overlay')).not.toHaveTextContent('Sensitive content'); - expect(screen.getByTestId('sensitive-overlay')).toHaveTextContent('Hide'); - - fireEvent.click(screen.getByTestId('button')); - expect(screen.getByTestId('sensitive-overlay')).toHaveTextContent('Sensitive content'); - expect(screen.getByTestId('sensitive-overlay')).not.toHaveTextContent('Hide'); - }); - }); - - describe('when the Status is marked as sensitive and displayMedia set to "show_all"', () => { - let store: any; - - beforeEach(() => { - status = normalizeStatus({ sensitive: true }) as ReducerStatus; - store = rootState - .set('settings', ImmutableMap({ - displayMedia: 'show_all', - })); - }); - - it('can be toggled', () => { - render(, undefined, store); - - fireEvent.click(screen.getByTestId('button')); - expect(screen.getByTestId('sensitive-overlay')).toHaveTextContent('Sensitive content'); - expect(screen.getByTestId('sensitive-overlay')).not.toHaveTextContent('Hide'); - - fireEvent.click(screen.getByTestId('button')); - expect(screen.getByTestId('sensitive-overlay')).not.toHaveTextContent('Sensitive content'); - expect(screen.getByTestId('sensitive-overlay')).toHaveTextContent('Hide'); - }); - }); -}); diff --git a/packages/pl-fe/src/components/ui/avatar.test.tsx b/packages/pl-fe/src/components/ui/avatar.test.tsx deleted file mode 100644 index c8a073d13..000000000 --- a/packages/pl-fe/src/components/ui/avatar.test.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import Avatar from './avatar'; - -const src = '/static/alice.jpg'; - -describe('', () => { - it('renders', () => { - render(); - - expect(screen.getByRole('img')).toBeInTheDocument(); - }); - - it('handles size props', () => { - render(); - - expect(screen.getByTestId('still-image-container').getAttribute('style')).toMatch(/50px/i); - }); -}); diff --git a/packages/pl-fe/src/components/ui/button/index.test.tsx b/packages/pl-fe/src/components/ui/button/index.test.tsx deleted file mode 100644 index d454814ac..000000000 --- a/packages/pl-fe/src/components/ui/button/index.test.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import React from 'react'; - -import { fireEvent, render, screen } from '@/jest/test-helpers'; - -import Button from '.'; - -describe('); - - expect(screen.getByRole('button')).toHaveTextContent('children'); - }); - - it('renders the props.text instead of children', () => { - const text = 'foo'; - const children =

children

; - render(); - - expect(screen.getByRole('button')).toHaveTextContent('foo'); - expect(screen.getByRole('button')).not.toHaveTextContent('children'); - }); - - it('handles click events using the given handler', () => { - const handler = vi.fn(); - render(); - - expect(screen.getByRole('link')).toBeInTheDocument(); - }); - - it('does not render a link', () => { - render(); - - expect(screen.queryAllByRole('link')).toHaveLength(0); - }); - }); - - describe('icon prop', () => { - it('renders an icon', () => { - render(); - - expect(screen.getByTestId('icon')).toBeInTheDocument(); - }); - - it('does not render an icon', () => { - render(); - - expect(screen.queryAllByTestId('icon')).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/components/ui/card.test.tsx b/packages/pl-fe/src/components/ui/card.test.tsx deleted file mode 100644 index 56d06bae4..000000000 --- a/packages/pl-fe/src/components/ui/card.test.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import { Card, CardBody, CardHeader, CardTitle } from './card'; - -describe('', () => { - it('renders the CardTitle and CardBody', () => { - render( - - - - - - - Card Body - - , - ); - - expect(screen.getByTestId('card-title')).toHaveTextContent('Card Title'); - expect(screen.getByTestId('card-body')).toHaveTextContent('Card Body'); - expect(screen.queryByTestId('back-button')).not.toBeInTheDocument(); - }); - - it('renders the Back Button', () => { - render( - - - - - , - ); - - expect(screen.getByTestId('back-button')).toBeInTheDocument(); - }); -}); diff --git a/packages/pl-fe/src/components/ui/column.test.tsx b/packages/pl-fe/src/components/ui/column.test.tsx deleted file mode 100644 index 4fd9ddd48..000000000 --- a/packages/pl-fe/src/components/ui/column.test.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import { Column } from './column'; - -describe('', () => { - it('renders correctly with minimal props', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Back'); - }); -}); diff --git a/packages/pl-fe/src/components/ui/divider.test.tsx b/packages/pl-fe/src/components/ui/divider.test.tsx deleted file mode 100644 index 426ee6be4..000000000 --- a/packages/pl-fe/src/components/ui/divider.test.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import Divider from './divider'; - -describe('', () => { - it('renders without text', () => { - render(); - - expect(screen.queryAllByTestId('divider-text')).toHaveLength(0); - }); - - it('renders text', () => { - const text = 'Hello'; - render(); - - expect(screen.getByTestId('divider-text')).toHaveTextContent(text); - }); -}); diff --git a/packages/pl-fe/src/components/ui/emoji.test.tsx b/packages/pl-fe/src/components/ui/emoji.test.tsx deleted file mode 100644 index 215d91c0f..000000000 --- a/packages/pl-fe/src/components/ui/emoji.test.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import Emoji from './emoji'; - -describe('', () => { - it('renders a simple emoji', () => { - render(); - - const img = screen.getByRole('img'); - expect(img.getAttribute('src')).toBe('/packs/emoji/1f600.svg'); - expect(img.getAttribute('alt')).toBe('😀'); - }); - - // https://emojipedia.org/emoji-flag-sequence/ - it('renders a sequence emoji', () => { - render(); - - const img = screen.getByRole('img'); - expect(img.getAttribute('src')).toBe('/packs/emoji/1f1fa-1f1f8.svg'); - expect(img.getAttribute('alt')).toBe('🇺🇸'); - }); -}); diff --git a/packages/pl-fe/src/components/ui/form-actions.test.tsx b/packages/pl-fe/src/components/ui/form-actions.test.tsx deleted file mode 100644 index 082fccbc6..000000000 --- a/packages/pl-fe/src/components/ui/form-actions.test.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import FormActions from './form-actions'; - -describe('', () => { - it('renders successfully', () => { - render(
child
); - - expect(screen.getByTestId('child')).toBeInTheDocument(); - }); -}); diff --git a/packages/pl-fe/src/components/ui/form-group.test.tsx b/packages/pl-fe/src/components/ui/form-group.test.tsx deleted file mode 100644 index ede420ffb..000000000 --- a/packages/pl-fe/src/components/ui/form-group.test.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import FormGroup from './form-group'; - -describe('', () => { - it('connects the label and input', () => { - render( - <> -
- - - -
- -
- - - -
- , - ); - - expect(screen.getByLabelText('My label')).toHaveAttribute('data-testid'); - expect(screen.getByLabelText('My other label')).not.toHaveAttribute('data-testid'); - expect(screen.queryByTestId('form-group-error')).not.toBeInTheDocument(); - }); - - it('renders errors', () => { - render( - - - , - ); - - expect(screen.getByTestId('form-group-error')).toHaveTextContent('is invalid'); - }); - - it('renders label', () => { - render( - - - , - ); - - expect(screen.getByTestId('form-group-label')).toHaveTextContent('My label'); - }); - - it('renders hint', () => { - render( - - - , - ); - - expect(screen.getByTestId('form-group-hint')).toHaveTextContent('My hint'); - }); -}); diff --git a/packages/pl-fe/src/components/ui/form.test.tsx b/packages/pl-fe/src/components/ui/form.test.tsx deleted file mode 100644 index c2ebb0205..000000000 --- a/packages/pl-fe/src/components/ui/form.test.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; - -import { fireEvent, render, screen } from '@/jest/test-helpers'; - -import Form from './form'; - -describe('
', () => { - it('renders children', () => { - const onSubmitMock = vi.fn(); - render( - children
, - ); - - expect(screen.getByTestId('form')).toHaveTextContent('children'); - }); - - it('handles onSubmit prop', () => { - const onSubmitMock = vi.fn(); - render( -
children
, - ); - - fireEvent.submit( - screen.getByTestId('form'), { - preventDefault: () => {}, - }, - ); - expect(onSubmitMock).toHaveBeenCalled(); - }); -}); diff --git a/packages/pl-fe/src/components/ui/modal.test.tsx b/packages/pl-fe/src/components/ui/modal.test.tsx deleted file mode 100644 index 10ae8a271..000000000 --- a/packages/pl-fe/src/components/ui/modal.test.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import Modal from './modal'; - -describe('', () => { - it('renders', () => { - render(); - expect(screen.getByTestId('modal')).toBeInTheDocument(); - }); - - it('renders children', () => { - render(
); - expect(screen.getByTestId('child')).toBeInTheDocument(); - }); - - it('focuses the primary action', () => { - render( - null} - confirmationText='Click me' - />, - ); - - expect(screen.getByRole('button')).toHaveFocus(); - }); - - describe('onClose prop', () => { - it('renders the Icon to close the modal', async() => { - const mockFn = vi.fn(); - const user = userEvent.setup(); - - render(); - expect(screen.getByTestId('icon-button')).toBeInTheDocument(); - - expect(mockFn).not.toBeCalled(); - await user.click(screen.getByTestId('icon-button')); - expect(mockFn).toBeCalled(); - }); - - it('does not render the Icon to close the modal', () => { - render(); - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - }); - - describe('confirmationAction prop', () => { - it('renders the confirmation button', async() => { - const mockFn = vi.fn(); - const user = userEvent.setup(); - - render( - , - ); - - expect(mockFn).not.toBeCalled(); - await user.click(screen.getByRole('button')); - expect(mockFn).toBeCalled(); - }); - - it('does not render the actions to', () => { - render(); - expect(screen.queryAllByTestId('modal-actions')).toHaveLength(0); - }); - - describe('with secondaryAction', () => { - it('renders the secondary button', async() => { - const confirmationAction = vi.fn(); - const secondaryAction = vi.fn(); - const user = userEvent.setup(); - - render( - , - ); - - await user.click(screen.getByText(/secondary/i)); - expect(secondaryAction).toBeCalled(); - expect(confirmationAction).not.toBeCalled(); - }); - - it('does not render the secondary action', () => { - render( - null} - confirmationText='Click me' - />, - ); - expect(screen.queryAllByRole('button')).toHaveLength(1); - }); - }); - - describe('with cancelAction', () => { - it('renders the cancel button', async() => { - const confirmationAction = vi.fn(); - const cancelAction = vi.fn(); - const user = userEvent.setup(); - - render( - , - ); - - await user.click(screen.getByText(/cancel/i)); - expect(cancelAction).toBeCalled(); - expect(confirmationAction).not.toBeCalled(); - }); - - it('does not render the cancel action', () => { - render( - null} - confirmationText='Click me' - />, - ); - expect(screen.queryAllByRole('button')).toHaveLength(1); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/components/ui/svg-icon.test.tsx b/packages/pl-fe/src/components/ui/svg-icon.test.tsx deleted file mode 100644 index 07bfcaa6c..000000000 --- a/packages/pl-fe/src/components/ui/svg-icon.test.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import IconCode from '@phosphor-icons/core/regular/code.svg'; -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import SvgIcon from './svg-icon'; - -describe('', () => { - it('renders loading element with default size', async () => { - render(); - - const svg = screen.getByTestId('svg-icon-loader'); - expect(svg.getAttribute('width')).toBe('24'); - expect(svg.getAttribute('height')).toBe('24'); - expect(svg.getAttribute('class')).toBe('text-primary-500'); - }); -}); diff --git a/packages/pl-fe/src/entity-store/actions.ts b/packages/pl-fe/src/entity-store/actions.ts index 1bdc7f269..1030829cd 100644 --- a/packages/pl-fe/src/entity-store/actions.ts +++ b/packages/pl-fe/src/entity-store/actions.ts @@ -3,7 +3,6 @@ import type { EntitiesTransaction, Entity, EntityListState, ImportPosition } fro const ENTITIES_IMPORT = 'ENTITIES_IMPORT' as const; const ENTITIES_DELETE = 'ENTITIES_DELETE' as const; const ENTITIES_DISMISS = 'ENTITIES_DISMISS' as const; -const ENTITIES_INCREMENT = 'ENTITIES_INCREMENT' as const; const ENTITIES_FETCH_REQUEST = 'ENTITIES_FETCH_REQUEST' as const; const ENTITIES_FETCH_SUCCESS = 'ENTITIES_FETCH_SUCCESS' as const; const ENTITIES_FETCH_FAIL = 'ENTITIES_FETCH_FAIL' as const; @@ -42,13 +41,6 @@ const dismissEntities = (ids: Iterable, entityType: string, listKey: str listKey, }); -const incrementEntities = (entityType: string, listKey: string, diff: number) => ({ - type: ENTITIES_INCREMENT, - entityType, - listKey, - diff, -}); - const entitiesFetchRequest = (entityType: string, listKey?: string) => ({ type: ENTITIES_FETCH_REQUEST, entityType, @@ -95,7 +87,6 @@ type EntityAction = ReturnType | ReturnType | ReturnType - | ReturnType | ReturnType | ReturnType | ReturnType @@ -108,7 +99,6 @@ export { ENTITIES_IMPORT, ENTITIES_DELETE, ENTITIES_DISMISS, - ENTITIES_INCREMENT, ENTITIES_FETCH_REQUEST, ENTITIES_FETCH_SUCCESS, ENTITIES_FETCH_FAIL, @@ -117,7 +107,6 @@ export { importEntities, deleteEntities, dismissEntities, - incrementEntities, entitiesFetchRequest, entitiesFetchSuccess, entitiesFetchFail, diff --git a/packages/pl-fe/src/entity-store/reducer.test.ts b/packages/pl-fe/src/entity-store/reducer.test.ts deleted file mode 100644 index 385a0002c..000000000 --- a/packages/pl-fe/src/entity-store/reducer.test.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { - deleteEntities, - dismissEntities, - entitiesFetchFail, - entitiesFetchRequest, - entitiesFetchSuccess, - importEntities, - incrementEntities, -} from './actions'; -import reducer, { State } from './reducer'; -import { createListState } from './utils'; - -import type { EntityCache } from './types'; - -interface TestEntity { - id: string; - msg: string; -} - -test('import entities', () => { - const entities: TestEntity[] = [ - { id: '1', msg: 'yolo' }, - { id: '2', msg: 'benis' }, - { id: '3', msg: 'boop' }, - ]; - - const action = importEntities(entities, 'TestEntity'); - const result = reducer(undefined, action); - const cache = result.TestEntity as EntityCache; - - expect(cache.store['1']!.msg).toBe('yolo'); - expect(Object.values(cache.lists).length).toBe(0); -}); - -test('import entities into a list', () => { - const entities: TestEntity[] = [ - { id: '1', msg: 'yolo' }, - { id: '2', msg: 'benis' }, - { id: '3', msg: 'boop' }, - ]; - - const action = importEntities(entities, 'TestEntity', 'thingies'); - const result = reducer(undefined, action); - const cache = result.TestEntity as EntityCache; - - expect(cache.store['2']!.msg).toBe('benis'); - expect(cache.lists.thingies!.ids.size).toBe(3); - expect(cache.lists.thingies!.state.totalCount).toBe(3); - - // Now try adding an additional item. - const entities2: TestEntity[] = [ - { id: '4', msg: 'hehe' }, - ]; - - const action2 = importEntities(entities2, 'TestEntity', 'thingies'); - const result2 = reducer(result, action2); - const cache2 = result2.TestEntity as EntityCache; - - expect(cache2.store['4']!.msg).toBe('hehe'); - expect(cache2.lists.thingies!.ids.size).toBe(4); - expect(cache2.lists.thingies!.state.totalCount).toBe(4); - - // Finally, update an item. - const entities3: TestEntity[] = [ - { id: '2', msg: 'yolofam' }, - ]; - - const action3 = importEntities(entities3, 'TestEntity', 'thingies'); - const result3 = reducer(result2, action3); - const cache3 = result3.TestEntity as EntityCache; - - expect(cache3.store['2']!.msg).toBe('yolofam'); - expect(cache3.lists.thingies!.ids.size).toBe(4); // unchanged - expect(cache3.lists.thingies!.state.totalCount).toBe(4); -}); - -test('fetching updates the list state', () => { - const action = entitiesFetchRequest('TestEntity', 'thingies'); - const result = reducer(undefined, action); - - expect(result.TestEntity!.lists.thingies!.state.fetching).toBe(true); -}); - -test('failure adds the error to the state', () => { - const error = new Error('whoopsie'); - - const action = entitiesFetchFail('TestEntity', 'thingies', error); - const result = reducer(undefined, action); - - expect(result.TestEntity!.lists.thingies!.state.error).toBe(error); -}); - -test('import entities with override', () => { - const state: State = { - TestEntity: { - store: { '1': { id: '1' }, '2': { id: '2' }, '3': { id: '3' } }, - lists: { - thingies: { - ids: new Set(['1', '2', '3']), - state: { ...createListState(), totalCount: 3 }, - }, - }, - }, - }; - - const entities: TestEntity[] = [ - { id: '4', msg: 'yolo' }, - { id: '5', msg: 'benis' }, - ]; - - const now = new Date(); - - const action = entitiesFetchSuccess(entities, 'TestEntity', 'thingies', 'end', { - next: undefined, - prev: undefined, - totalCount: 2, - error: null, - fetched: true, - fetching: false, - lastFetchedAt: now, - invalid: false, - }, true); - - const result = reducer(state, action); - const cache = result.TestEntity as EntityCache; - - expect([...cache.lists.thingies!.ids]).toEqual(['4', '5']); - expect(cache.lists.thingies!.state.lastFetchedAt).toBe(now); // Also check that newState worked -}); - -test('deleting items', () => { - const state: State = { - TestEntity: { - store: { '1': { id: '1' }, '2': { id: '2' }, '3': { id: '3' } }, - lists: { - '': { - ids: new Set(['1', '2', '3']), - state: { ...createListState(), totalCount: 3 }, - }, - }, - }, - }; - - const action = deleteEntities(['3', '1'], 'TestEntity'); - const result = reducer(state, action); - - expect(result.TestEntity!.store).toMatchObject({ '2': { id: '2' } }); - expect([...result.TestEntity!.lists['']!.ids]).toEqual(['2']); - expect(result.TestEntity!.lists['']!.state.totalCount).toBe(1); -}); - -test('dismiss items', () => { - const state: State = { - TestEntity: { - store: { '1': { id: '1' }, '2': { id: '2' }, '3': { id: '3' } }, - lists: { - yolo: { - ids: new Set(['1', '2', '3']), - state: { ...createListState(), totalCount: 3 }, - }, - }, - }, - }; - - const action = dismissEntities(['3', '1'], 'TestEntity', 'yolo'); - const result = reducer(state, action); - - expect(result.TestEntity!.store).toMatchObject(state.TestEntity!.store); - expect([...result.TestEntity!.lists.yolo!.ids]).toEqual(['2']); - expect(result.TestEntity!.lists.yolo!.state.totalCount).toBe(1); -}); - -test('increment items', () => { - const state: State = { - TestEntity: { - store: { '1': { id: '1' }, '2': { id: '2' }, '3': { id: '3' } }, - lists: { - thingies: { - ids: new Set(['1', '2', '3']), - state: { ...createListState(), totalCount: 3 }, - }, - }, - }, - }; - - const action = incrementEntities('TestEntity', 'thingies', 1); - const result = reducer(state, action); - - expect(result.TestEntity!.lists.thingies!.state.totalCount).toBe(4); -}); - -test('decrement items', () => { - const state: State = { - TestEntity: { - store: { '1': { id: '1' }, '2': { id: '2' }, '3': { id: '3' } }, - lists: { - thingies: { - ids: new Set(['1', '2', '3']), - state: { ...createListState(), totalCount: 3 }, - }, - }, - }, - }; - - const action = incrementEntities('TestEntity', 'thingies', -1); - const result = reducer(state, action); - - expect(result.TestEntity!.lists.thingies!.state.totalCount).toBe(2); -}); diff --git a/packages/pl-fe/src/entity-store/reducer.ts b/packages/pl-fe/src/entity-store/reducer.ts index 66e16667d..bc9cae717 100644 --- a/packages/pl-fe/src/entity-store/reducer.ts +++ b/packages/pl-fe/src/entity-store/reducer.ts @@ -8,7 +8,6 @@ import { ENTITIES_FETCH_SUCCESS, ENTITIES_FETCH_FAIL, ENTITIES_INVALIDATE_LIST, - ENTITIES_INCREMENT, ENTITIES_TRANSACTION, type EntityAction, type DeleteEntitiesOpts, @@ -114,21 +113,6 @@ const dismissEntities = ( } }; -const incrementEntities = ( - draft: Draft, - entityType: string, - listKey: string, - diff: number, -) => { - const cache = draft[entityType] ?? createCache(); - const list = cache.lists[listKey]; - - if (typeof list?.state?.totalCount === 'number') { - list.state.totalCount += diff; - draft[entityType] = cache; - } -}; - const setFetching = ( draft: Draft, entityType: string, @@ -175,8 +159,6 @@ const reducer = (state: Readonly = {}, action: EntityAction): State => { return create(state, draft => deleteEntities(draft, action.entityType, action.ids, action.opts)); case ENTITIES_DISMISS: return create(state, draft => dismissEntities(draft, action.entityType, action.ids, action.listKey)); - case ENTITIES_INCREMENT: - return create(state, draft => incrementEntities(draft, action.entityType, action.listKey, action.diff)); case ENTITIES_FETCH_SUCCESS: return create(state, draft => importEntities(draft, action.entityType, action.entities, action.listKey, action.pos, action.newState, action.overwrite), { enableAutoFreeze: true }); case ENTITIES_FETCH_REQUEST: @@ -192,4 +174,4 @@ const reducer = (state: Readonly = {}, action: EntityAction): State => { } }; -export { type State, reducer as default }; +export { reducer as default }; diff --git a/packages/pl-fe/src/entity-store/utils.ts b/packages/pl-fe/src/entity-store/utils.ts index 2568eb78d..fddd20012 100644 --- a/packages/pl-fe/src/entity-store/utils.ts +++ b/packages/pl-fe/src/entity-store/utils.ts @@ -52,5 +52,4 @@ export { updateList, createCache, createList, - createListState, }; diff --git a/packages/pl-fe/src/features/auth-login/components/captcha.test.tsx b/packages/pl-fe/src/features/auth-login/components/captcha.test.tsx deleted file mode 100644 index 4c2c8dcd1..000000000 --- a/packages/pl-fe/src/features/auth-login/components/captcha.test.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import CaptchaField, { NativeCaptchaField } from './captcha'; - -describe('', () => { - it('renders null by default', () => { - render(); - - expect(screen.queryAllByRole('textbox')).toHaveLength(0); - }); -}); - -describe('', () => { - it('renders correctly', () => { - const captcha = ImmutableMap({ - answer_data: 'QTEyOEdDTQ...', - token: 'CcDExJcv6qqOVw', - type: 'native', - url: 'data:image/png;base64,...', - }); - - render( - {}} - onClick={() => {}} - value='' - />, - ); - - expect(screen.queryAllByRole('textbox')).toHaveLength(1); - }); -}); diff --git a/packages/pl-fe/src/features/auth-login/components/captcha.tsx b/packages/pl-fe/src/features/auth-login/components/captcha.tsx index f9047227b..2507178a4 100644 --- a/packages/pl-fe/src/features/auth-login/components/captcha.tsx +++ b/packages/pl-fe/src/features/auth-login/components/captcha.tsx @@ -129,5 +129,4 @@ const NativeCaptchaField: React.FC = ({ captcha, onChange, export { CaptchaField as default, - NativeCaptchaField, }; diff --git a/packages/pl-fe/src/features/auth-login/components/login-form.test.tsx b/packages/pl-fe/src/features/auth-login/components/login-form.test.tsx deleted file mode 100644 index 54cde5bad..000000000 --- a/packages/pl-fe/src/features/auth-login/components/login-form.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { instanceSchema } from 'pl-api'; -import React from 'react'; -import * as v from 'valibot'; - -import { fireEvent, render, screen } from '@/jest/test-helpers'; - -import LoginForm from './login-form'; - -describe('', () => { - it('renders for Pleroma', () => { - const mockFn = vi.fn(); - const store = { - instance: v.parse(instanceSchema, { - version: '2.7.2 (compatible; Pleroma 2.3.0)', - }), - }; - - render(, undefined, store); - - expect(screen.getByRole('heading')).toHaveTextContent(/sign in/i); - }); - - it('renders for Mastodon', () => { - const mockFn = vi.fn(); - const store = { - instance: v.parse(instanceSchema, { - version: '3.0.0', - }), - }; - - render(, undefined, store); - - expect(screen.getByRole('heading')).toHaveTextContent(/sign in/i); - }); - - it('responds to the handleSubmit prop', () => { - const mockFn = vi.fn(); - render(); - fireEvent.submit(screen.getByTestId(/button/i)); - - expect(mockFn).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/pl-fe/src/features/auth-login/components/otp-auth-form.test.tsx b/packages/pl-fe/src/features/auth-login/components/otp-auth-form.test.tsx deleted file mode 100644 index b46120ef8..000000000 --- a/packages/pl-fe/src/features/auth-login/components/otp-auth-form.test.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import OtpAuthForm from './otp-auth-form'; - -describe('', () => { - it('renders correctly', () => { - render(); - - expect(screen.getByRole('heading')).toHaveTextContent('OTP Login'); - expect(screen.getByTestId('form')).toBeInTheDocument(); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-list-item.test.tsx b/packages/pl-fe/src/features/chats/components/chat-list-item.test.tsx deleted file mode 100644 index 3d9b33583..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-list-item.test.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; -import { IChat } from '@/queries/chats'; - -import ChatListItem from './chat-list-item'; - -const chat: any = { - id: '1', - unread: 5, - last_message: { - account_id: '2', - chat_id: '1', - content: 'hello world', - created_at: '2022-09-09T16:02:26.186Z', - id: '12332423234', - unread: true, - }, - created_at: '2022-09-09T16:02:26.186Z', - updated_at: '2022-09-09T16:02:26.186Z', - accepted: true, - account: { - acct: 'username', - display_name: 'johnnie', - }, -}; - -describe('', () => { - it('renders correctly', () => { - render(); - - expect(screen.getByTestId('chat-list-item')).toBeInTheDocument(); - expect(screen.getByTestId('chat-list-item')).toHaveTextContent(chat.account.display_name); - }); - - describe('last message content', () => { - it('renders the last message', () => { - render(); - - expect(screen.getByTestId('chat-last-message')).toBeInTheDocument(); - }); - - it('does not render the last message', () => { - const changedChat = { ...chat, last_message: null }; - render(); - - expect(screen.queryAllByTestId('chat-last-message')).toHaveLength(0); - }); - - describe('unread', () => { - it('renders the unread dot', () => { - render(); - - expect(screen.getByTestId('chat-unread-indicator')).toBeInTheDocument(); - }); - - it('does not render the unread dot', () => { - const changedChat = { ...chat, last_message: { ...chat.last_message, unread: false } }; - render(); - - expect(screen.queryAllByTestId('chat-unread-indicator')).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-message-list.test.tsx b/packages/pl-fe/src/features/chats/components/chat-message-list.test.tsx deleted file mode 100644 index 6d33c25e0..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-message-list.test.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; -import { VirtuosoMockContext } from 'react-virtuoso'; - -import { __stub } from '@/api'; -import { ChatContext } from '@/contexts/chat-context'; -import { buildAccount, buildInstance } from '@/jest/factory'; -import { queryClient, render, rootState, screen, waitFor } from '@/jest/test-helpers'; -import { normalizeChatMessage } from '@/normalizers/chat-message'; -import { IChat } from '@/queries/chats'; -import { ChatMessage } from '@/types/entities'; - -import ChatMessageList from './chat-message-list'; - -const chat: IChat = { - account: buildAccount({ - username: 'username', - verified: true, - id: '1', - acct: 'acct', - avatar: 'avatar', - avatar_static: 'avatar', - display_name: 'my name', - }), - created_at: '2020-06-10T02:05:06.000Z', - id: '14', - last_message: null, - unread: 5, -}; - -const chatMessages: ChatMessage[] = [ - normalizeChatMessage({ - account_id: '1', - chat_id: '14', - content: 'this is the first chat', - created_at: '2022-09-09T16:02:26.186Z', - id: '1', - unread: false, - pending: false, - }), - normalizeChatMessage({ - account_id: '2', - chat_id: '14', - content: 'this is the second chat', - created_at: '2022-09-09T16:04:26.186Z', - id: '2', - unread: true, - pending: false, - }), -]; - -// Mock scrollIntoView function. -window.HTMLElement.prototype.scrollIntoView = () => { }; -Object.assign(navigator, { - clipboard: { - writeText: () => { }, - }, -}); - -const store = { - ...rootState, - me: '1', - instance: buildInstance({ version: '3.4.1 (compatible; TruthSocial 1.0.0+unreleased)' }), -}; - -const renderComponentWithChatContext = () => render( - - - - - , - store, -); - -beforeEach(() => { - queryClient.clear(); -}); - -describe('', () => { - describe('when the query is loading', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}/messages`).reply(200, chatMessages, { - link: null, - }); - }); - }); - - it('displays the skeleton loader', async () => { - renderComponentWithChatContext(); - - expect(screen.queryAllByTestId('placeholder-chat-message')).toHaveLength(5); - - await waitFor(() => { - expect(screen.getByTestId('chat-message-list-intro')).toBeInTheDocument(); - expect(screen.queryAllByTestId('placeholder-chat-message')).toHaveLength(0); - }); - }); - }); - - describe('when the query is finished loading', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}/messages`).reply(200, chatMessages, { - link: null, - }); - }); - }); - - it('displays the intro', async () => { - renderComponentWithChatContext(); - - expect(screen.queryAllByTestId('chat-message-list-intro')).toHaveLength(0); - - await waitFor(() => { - expect(screen.getByTestId('chat-message-list-intro')).toBeInTheDocument(); - }); - }); - - it('displays the messages', async () => { - renderComponentWithChatContext(); - - expect(screen.queryAllByTestId('chat-message')).toHaveLength(0); - - await waitFor(() => { - expect(screen.queryAllByTestId('chat-message')).toHaveLength(chatMessages.length); - }); - }); - - it('displays the correct menu options depending on the owner of the message', async () => { - renderComponentWithChatContext(); - - await waitFor(() => { - expect(screen.queryAllByTestId('chat-message-menu')).toHaveLength(2); - }); - - // my message - await userEvent.click(screen.queryAllByTestId('chat-message-menu')[0].querySelector('button') as any); - - // other user message - await userEvent.click(screen.queryAllByTestId('chat-message-menu')[1].querySelector('button') as any); - }); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-pane-header.test.tsx b/packages/pl-fe/src/features/chats/components/chat-pane-header.test.tsx deleted file mode 100644 index 94dc1c046..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-pane-header.test.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import ChatPaneHeader from './chat-widget/chat-pane-header'; - -describe('', () => { - it('handles the onToggle prop', async () => { - const mockFn = vi.fn(); - render(); - - await userEvent.click(screen.getByTestId('icon-button')); - expect(mockFn).toHaveBeenCalled(); - }); - - describe('the "title" prop', () => { - describe('when it is a string', () => { - it('renders the title', () => { - const title = 'Messages'; - render(); - - expect(screen.getByTestId('title')).toHaveTextContent(title); - }); - }); - - describe('when it is a node', () => { - it('renders the title', () => { - const title = ( -

hello world

- ); - render(); - - expect(screen.getByTestId('title')).toHaveTextContent('hello world'); - }); - }); - }); - - describe('the "unreadCount" prop', () => { - describe('when present', () => { - it('renders the unread count', () => { - const count = 14; - render(); - - expect(screen.getByTestId('unread-count')).toHaveTextContent(String(count)); - }); - }); - - describe('when 0', () => { - it('does not render the unread count', () => { - const count = 0; - render(); - - expect(screen.queryAllByTestId('unread-count')).toHaveLength(0); - }); - }); - - describe('when unprovided', () => { - it('does not render the unread count', () => { - render(); - - expect(screen.queryAllByTestId('unread-count')).toHaveLength(0); - }); - }); - }); - - describe('secondaryAction prop', () => { - it('handles the secondaryAction callback', async () => { - const mockFn = vi.fn(); - render( - , - ); - - await userEvent.click(screen.queryAllByTestId('icon-button')[0]); - expect(mockFn).toBeCalled(); - }); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-pane/chat-pane.test.tsx b/packages/pl-fe/src/features/chats/components/chat-pane/chat-pane.test.tsx deleted file mode 100644 index 430b24ffd..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-pane/chat-pane.test.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; - -import { __stub } from '@/api'; -import { ChatContext } from '@/contexts/chat-context'; -import { StatProvider } from '@/contexts/stat-context'; -import chats from '@/jest/fixtures/chats.json'; -import { render, screen, waitFor } from '@/jest/test-helpers'; - -import ChatPane from './chat-pane'; - -const renderComponentWithChatContext = (store = {}) => render( - - - - - , - undefined, - store, -); - -describe('', () => { - // describe('when there are no chats', () => { - // let store: ReturnType; - - // beforeEach(() => { - // const state = rootState.setIn(['instance', 'version'], '2.7.2 (compatible; Pleroma 2.2.0)'); - // store = mockStore(state); - - // __stub((mock) => { - // mock.onGet('/api/v1/pleroma/chats').reply(200, [], { - // link: null, - // }); - // }); - // }); - - // it('renders the blankslate', async () => { - // renderComponentWithChatContext(store); - - // await waitFor(() => { - // expect(screen.getByTestId('chat-pane-blankslate')).toBeInTheDocument(); - // }); - // }); - // }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/pleroma/chats').reply(200, chats, { - link: '; rel=\'prev\'', - }); - }); - }); - - it('does not render the search input', async () => { - renderComponentWithChatContext(); - - await waitFor(() => { - expect(screen.queryAllByTestId('chat-search-input')).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-search/chat-search.test.tsx b/packages/pl-fe/src/features/chats/components/chat-search/chat-search.test.tsx deleted file mode 100644 index f217398f2..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-search/chat-search.test.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; - -import { __stub } from '@/api'; -import { ChatProvider } from '@/contexts/chat-context'; -import { render, screen, waitFor } from '@/jest/test-helpers'; - -import ChatSearch from './chat-search'; - -const renderComponent = () => render( - - - , -); - -describe('', () => { - beforeEach(async() => { - renderComponent(); - }); - - it('renders the search input', () => { - expect(screen.getByTestId('search')).toBeInTheDocument(); - }); - - describe('when searching', () => { - describe('with results', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/search').reply(200, [{ - id: '1', - avatar: 'url', - verified: false, - display_name: 'steve', - acct: 'sjobs', - }]); - }); - }); - - it('renders accounts', async() => { - const user = userEvent.setup(); - await user.type(screen.getByTestId('search'), 'ste'); - - await waitFor(() => { - expect(screen.queryAllByTestId('account')).toHaveLength(1); - }); - }); - }); - - describe('without results', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/accounts/search').reply(200, []); - }); - }); - - it('renders accounts', async() => { - const user = userEvent.setup(); - await user.type(screen.getByTestId('search'), 'ste'); - - await waitFor(() => { - expect(screen.getByTestId('no-results')).toBeInTheDocument(); - }); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/features/chats/components/chat-widget.test.tsx b/packages/pl-fe/src/features/chats/components/chat-widget.test.tsx deleted file mode 100644 index f7bfb8477..000000000 --- a/packages/pl-fe/src/features/chats/components/chat-widget.test.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React from 'react'; -import { Route, Switch } from 'react-router-dom'; - -import { buildAccount } from '@/jest/factory'; -import { render, rootState } from '@/jest/test-helpers'; - -import ChatWidget from './chat-widget/chat-widget'; - -const id = '1'; -const account = buildAccount({ - id, - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', -}); - -const store = { - ...rootState, - me: id, - entities: { - 'ACCOUNTS': { - store: { - [id]: account, - }, - lists: {}, - }, - }, -}; - -describe('', () => { - describe('when on the /chats endpoint', () => { - it('hides the widget', async () => { - const App = () => ( - - Chats page - Homepage - - ); - - const screen = render( - , - {}, - store, - { initialEntries: ['/chats'] }, - ); - - expect(screen.queryAllByTestId('pane')).toHaveLength(0); - }); - }); - - // describe('when the user has not onboarded chats', () => { - // it('hides the widget', async () => { - // const accountWithoutChats = buildAccount({ - // id, - // acct: 'justin-username', - // display_name: 'Justin L', - // avatar: 'test.jpg', - // source: { - // chats_onboarded: false, - // }, - // }); - // const newStore = store.set('entities', { - // 'ACCOUNTS': { - // store: { - // [id]: accountWithoutChats, - // }, - // lists: {}, - // }, - // }); - - // const screen = render( - // , - // {}, - // newStore, - // ); - - // expect(screen.queryAllByTestId('pane')).toHaveLength(0); - // }); - // }); - - describe('when the user is onboarded and the endpoint is not /chats', () => { - it('shows the widget', async () => { - const App = () => ( - - Chats page - Homepage - - ); - - const screen = render( - , - {}, - store, - { initialEntries: ['/'] }, - ); - - expect(screen.queryAllByTestId('pane')).toHaveLength(1); - }); - }); -}); diff --git a/packages/pl-fe/src/features/compose/components/polls/duration-selector.test.tsx b/packages/pl-fe/src/features/compose/components/polls/duration-selector.test.tsx deleted file mode 100644 index 37c4b8a94..000000000 --- a/packages/pl-fe/src/features/compose/components/polls/duration-selector.test.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import DurationSelector from './duration-selector'; - -describe('', () => { - it('defaults to 2 days', () => { - const handler = vi.fn(); - render(); - - expect(screen.getByTestId('duration-selector-days')).toHaveValue('2'); - expect(screen.getByTestId('duration-selector-hours')).toHaveValue('0'); - expect(screen.getByTestId('duration-selector-minutes')).toHaveValue('0'); - }); - - describe('when changing the day', () => { - it('calls the "onDurationChange" callback', async() => { - const handler = vi.fn(); - render(); - - await userEvent.selectOptions( - screen.getByTestId('duration-selector-days'), - screen.getByRole('option', { name: '1 day' }), - ); - - expect(handler.mock.calls[0][0]).toEqual(172800); // 2 days - expect(handler.mock.calls[1][0]).toEqual(86400); // 1 day - }); - - it('should disable the hour/minute select if 7 days selected', async() => { - const handler = vi.fn(); - render(); - - expect(screen.getByTestId('duration-selector-hours')).not.toBeDisabled(); - expect(screen.getByTestId('duration-selector-minutes')).not.toBeDisabled(); - - await userEvent.selectOptions( - screen.getByTestId('duration-selector-days'), - screen.getByRole('option', { name: '7 days' }), - ); - - expect(screen.getByTestId('duration-selector-hours')).toBeDisabled(); - expect(screen.getByTestId('duration-selector-minutes')).toBeDisabled(); - }); - }); - - describe('when changing the hour', () => { - it('calls the "onDurationChange" callback', async() => { - const handler = vi.fn(); - render(); - - await userEvent.selectOptions( - screen.getByTestId('duration-selector-hours'), - screen.getByRole('option', { name: '1 hour' }), - ); - - expect(handler.mock.calls[0][0]).toEqual(172800); // 2 days - expect(handler.mock.calls[1][0]).toEqual(176400); // 2 days, 1 hour - }); - }); - - describe('when changing the minute', () => { - it('calls the "onDurationChange" callback', async() => { - const handler = vi.fn(); - render(); - - await userEvent.selectOptions( - screen.getByTestId('duration-selector-minutes'), - screen.getByRole('option', { name: '15 minutes' }), - ); - - expect(handler.mock.calls[0][0]).toEqual(172800); // 2 days - expect(handler.mock.calls[1][0]).toEqual(173700); // 2 days, 1 minute - }); - }); -}); diff --git a/packages/pl-fe/src/features/compose/editor/utils/url.ts b/packages/pl-fe/src/features/compose/editor/utils/url.ts index 7bc2236ba..2fe5e2b71 100644 --- a/packages/pl-fe/src/features/compose/editor/utils/url.ts +++ b/packages/pl-fe/src/features/compose/editor/utils/url.ts @@ -24,14 +24,3 @@ export const sanitizeUrl = (url: string): string => { } return url; }; - -// Source: https://stackoverflow.com/a/8234912/2013580 -const urlRegExp = new RegExp( - /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/, -); - -export const validateUrl = (url: string): boolean => { - // TODO Fix UI for link insertion; it should never default to an invalid URL such as https://. - // Maybe show a dialog where they user can type the URL before inserting it. - return url === 'https://' || urlRegExp.test(url); -}; diff --git a/packages/pl-fe/src/features/emoji/index.test.ts b/packages/pl-fe/src/features/emoji/index.test.ts deleted file mode 100644 index 852181044..000000000 --- a/packages/pl-fe/src/features/emoji/index.test.ts +++ /dev/null @@ -1,1914 +0,0 @@ -import emojify from '.'; - -describe('emoji', () => { - describe('.emojify', () => { - it('ignores unknown shortcodes', () => { - expect(emojify(':foobarbazfake:')).toEqual(':foobarbazfake:'); - }); - - it('ignores shortcodes inside of tags', () => { - expect(emojify('

')).toEqual('

'); - }); - - it('works with unclosed tags', () => { - expect(emojify('hello>')).toEqual('hello>'); - expect(emojify(' { - expect(emojify('smile:')).toEqual('smile:'); - expect(emojify(':smile')).toEqual(':smile'); - }); - - it('does unicode', () => { - expect(emojify('\uD83D\uDC69\u200D\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66')).toEqual( - '👩‍👩‍👦‍👦'); - expect(emojify('👨‍👩‍👧‍👧')).toEqual( - '👨‍👩‍👧‍👧'); - expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); - expect(emojify('\u2757')).toEqual( - '❗'); - }); - - it('does multiple unicode', () => { - expect(emojify('\u2757 #\uFE0F\u20E3')).toEqual( - '❗ #️⃣'); - expect(emojify('\u2757#\uFE0F\u20E3')).toEqual( - '❗#️⃣'); - expect(emojify('\u2757 #\uFE0F\u20E3 \u2757')).toEqual( - '❗ #️⃣ ❗'); - expect(emojify('foo \u2757 #\uFE0F\u20E3 bar')).toEqual( - 'foo ❗ #️⃣ bar'); - }); - - it('ignores unicode inside of tags', () => { - expect(emojify('

')).toEqual('

'); - }); - - it('does multiple emoji properly (issue 5188)', () => { - expect(emojify('👌🌈💕')).toEqual('👌🌈💕'); - expect(emojify('👌 🌈 💕')).toEqual('👌 🌈 💕'); - }); - - it('does an emoji that has no shortcode', () => { - expect(emojify('👁‍🗨')).toEqual('👁‍🗨'); - }); - - it('skips the textual presentation VS15 character', () => { - expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15 - .toEqual('✴️'); - }); - - it('full v14 unicode emoji map', () => { - expect(emojify('💯')).toEqual('💯'); - expect(emojify('🔢')).toEqual('🔢'); - expect(emojify('😀')).toEqual('😀'); - expect(emojify('😃')).toEqual('😃'); - expect(emojify('😄')).toEqual('😄'); - expect(emojify('😁')).toEqual('😁'); - expect(emojify('😆')).toEqual('😆'); - expect(emojify('😅')).toEqual('😅'); - expect(emojify('🤣')).toEqual('🤣'); - expect(emojify('😂')).toEqual('😂'); - expect(emojify('🙂')).toEqual('🙂'); - expect(emojify('🙃')).toEqual('🙃'); - expect(emojify('🫠')).toEqual('🫠'); - expect(emojify('😉')).toEqual('😉'); - expect(emojify('😊')).toEqual('😊'); - expect(emojify('😇')).toEqual('😇'); - expect(emojify('🥰')).toEqual('🥰'); - expect(emojify('😍')).toEqual('😍'); - expect(emojify('🤩')).toEqual('🤩'); - expect(emojify('😘')).toEqual('😘'); - expect(emojify('😗')).toEqual('😗'); - expect(emojify('☺️')).toEqual('☺️'); - expect(emojify('😚')).toEqual('😚'); - expect(emojify('😙')).toEqual('😙'); - expect(emojify('🥲')).toEqual('🥲'); - expect(emojify('😋')).toEqual('😋'); - expect(emojify('😛')).toEqual('😛'); - expect(emojify('😜')).toEqual('😜'); - expect(emojify('🤪')).toEqual('🤪'); - expect(emojify('😝')).toEqual('😝'); - expect(emojify('🤑')).toEqual('🤑'); - expect(emojify('🤗')).toEqual('🤗'); - expect(emojify('🤭')).toEqual('🤭'); - expect(emojify('🫢')).toEqual('🫢'); - expect(emojify('🫣')).toEqual('🫣'); - expect(emojify('🤫')).toEqual('🤫'); - expect(emojify('🤔')).toEqual('🤔'); - expect(emojify('🫡')).toEqual('🫡'); - expect(emojify('🤐')).toEqual('🤐'); - expect(emojify('🤨')).toEqual('🤨'); - expect(emojify('😐')).toEqual('😐'); - expect(emojify('😑')).toEqual('😑'); - expect(emojify('😶')).toEqual('😶'); - expect(emojify('🫥')).toEqual('🫥'); - expect(emojify('😶‍🌫️')).toEqual('😶‍🌫️'); - expect(emojify('😏')).toEqual('😏'); - expect(emojify('😒')).toEqual('😒'); - expect(emojify('🙄')).toEqual('🙄'); - expect(emojify('😬')).toEqual('😬'); - expect(emojify('😮‍💨')).toEqual('😮‍💨'); - expect(emojify('🤥')).toEqual('🤥'); - expect(emojify('😌')).toEqual('😌'); - expect(emojify('😔')).toEqual('😔'); - expect(emojify('😪')).toEqual('😪'); - expect(emojify('🤤')).toEqual('🤤'); - expect(emojify('😴')).toEqual('😴'); - expect(emojify('😷')).toEqual('😷'); - expect(emojify('🤒')).toEqual('🤒'); - expect(emojify('🤕')).toEqual('🤕'); - expect(emojify('🤢')).toEqual('🤢'); - expect(emojify('🤮')).toEqual('🤮'); - expect(emojify('🤧')).toEqual('🤧'); - expect(emojify('🥵')).toEqual('🥵'); - expect(emojify('🥶')).toEqual('🥶'); - expect(emojify('🥴')).toEqual('🥴'); - expect(emojify('😵')).toEqual('😵'); - expect(emojify('😵‍💫')).toEqual('😵‍💫'); - expect(emojify('🤯')).toEqual('🤯'); - expect(emojify('🤠')).toEqual('🤠'); - expect(emojify('🥳')).toEqual('🥳'); - expect(emojify('🥸')).toEqual('🥸'); - expect(emojify('😎')).toEqual('😎'); - expect(emojify('🤓')).toEqual('🤓'); - expect(emojify('🧐')).toEqual('🧐'); - expect(emojify('😕')).toEqual('😕'); - expect(emojify('🫤')).toEqual('🫤'); - expect(emojify('😟')).toEqual('😟'); - expect(emojify('🙁')).toEqual('🙁'); - expect(emojify('☹️')).toEqual('☹️'); - expect(emojify('😮')).toEqual('😮'); - expect(emojify('😯')).toEqual('😯'); - expect(emojify('😲')).toEqual('😲'); - expect(emojify('😳')).toEqual('😳'); - expect(emojify('🥺')).toEqual('🥺'); - expect(emojify('🥹')).toEqual('🥹'); - expect(emojify('😦')).toEqual('😦'); - expect(emojify('😧')).toEqual('😧'); - expect(emojify('😨')).toEqual('😨'); - expect(emojify('😰')).toEqual('😰'); - expect(emojify('😥')).toEqual('😥'); - expect(emojify('😢')).toEqual('😢'); - expect(emojify('😭')).toEqual('😭'); - expect(emojify('😱')).toEqual('😱'); - expect(emojify('😖')).toEqual('😖'); - expect(emojify('😣')).toEqual('😣'); - expect(emojify('😞')).toEqual('😞'); - expect(emojify('😓')).toEqual('😓'); - expect(emojify('😩')).toEqual('😩'); - expect(emojify('😫')).toEqual('😫'); - expect(emojify('🥱')).toEqual('🥱'); - expect(emojify('😤')).toEqual('😤'); - expect(emojify('😡')).toEqual('😡'); - expect(emojify('😠')).toEqual('😠'); - expect(emojify('🤬')).toEqual('🤬'); - expect(emojify('😈')).toEqual('😈'); - expect(emojify('👿')).toEqual('👿'); - expect(emojify('💀')).toEqual('💀'); - expect(emojify('☠️')).toEqual('☠️'); - expect(emojify('💩')).toEqual('💩'); - expect(emojify('🤡')).toEqual('🤡'); - expect(emojify('👹')).toEqual('👹'); - expect(emojify('👺')).toEqual('👺'); - expect(emojify('👻')).toEqual('👻'); - expect(emojify('👽')).toEqual('👽'); - expect(emojify('👾')).toEqual('👾'); - expect(emojify('🤖')).toEqual('🤖'); - expect(emojify('😺')).toEqual('😺'); - expect(emojify('😸')).toEqual('😸'); - expect(emojify('😹')).toEqual('😹'); - expect(emojify('😻')).toEqual('😻'); - expect(emojify('😼')).toEqual('😼'); - expect(emojify('😽')).toEqual('😽'); - expect(emojify('🙀')).toEqual('🙀'); - expect(emojify('😿')).toEqual('😿'); - expect(emojify('😾')).toEqual('😾'); - expect(emojify('🙈')).toEqual('🙈'); - expect(emojify('🙉')).toEqual('🙉'); - expect(emojify('🙊')).toEqual('🙊'); - expect(emojify('💋')).toEqual('💋'); - expect(emojify('💌')).toEqual('💌'); - expect(emojify('💘')).toEqual('💘'); - expect(emojify('💝')).toEqual('💝'); - expect(emojify('💖')).toEqual('💖'); - expect(emojify('💗')).toEqual('💗'); - expect(emojify('💓')).toEqual('💓'); - expect(emojify('💞')).toEqual('💞'); - expect(emojify('💕')).toEqual('💕'); - expect(emojify('💟')).toEqual('💟'); - expect(emojify('❣️')).toEqual('❣️'); - expect(emojify('💔')).toEqual('💔'); - expect(emojify('❤️‍🔥')).toEqual('❤️‍🔥'); - expect(emojify('❤️‍🩹')).toEqual('❤️‍🩹'); - expect(emojify('❤️')).toEqual('❤️'); - expect(emojify('🧡')).toEqual('🧡'); - expect(emojify('💛')).toEqual('💛'); - expect(emojify('💚')).toEqual('💚'); - expect(emojify('💙')).toEqual('💙'); - expect(emojify('💜')).toEqual('💜'); - expect(emojify('🤎')).toEqual('🤎'); - expect(emojify('🖤')).toEqual('🖤'); - expect(emojify('🤍')).toEqual('🤍'); - expect(emojify('💢')).toEqual('💢'); - expect(emojify('💥')).toEqual('💥'); - expect(emojify('💫')).toEqual('💫'); - expect(emojify('💦')).toEqual('💦'); - expect(emojify('💨')).toEqual('💨'); - expect(emojify('🕳️')).toEqual('🕳️'); - expect(emojify('💣')).toEqual('💣'); - expect(emojify('💬')).toEqual('💬'); - expect(emojify('👁️‍🗨️')).toEqual('👁️‍🗨️'); - expect(emojify('🗨️')).toEqual('🗨️'); - expect(emojify('🗯️')).toEqual('🗯️'); - expect(emojify('💭')).toEqual('💭'); - expect(emojify('💤')).toEqual('💤'); - expect(emojify('👋')).toEqual('👋'); - expect(emojify('🤚')).toEqual('🤚'); - expect(emojify('🖐️')).toEqual('🖐️'); - expect(emojify('✋')).toEqual('✋'); - expect(emojify('🖖')).toEqual('🖖'); - expect(emojify('🫱')).toEqual('🫱'); - expect(emojify('🫲')).toEqual('🫲'); - expect(emojify('🫳')).toEqual('🫳'); - expect(emojify('🫴')).toEqual('🫴'); - expect(emojify('👌')).toEqual('👌'); - expect(emojify('🤌')).toEqual('🤌'); - expect(emojify('🤏')).toEqual('🤏'); - expect(emojify('✌️')).toEqual('✌️'); - expect(emojify('🤞')).toEqual('🤞'); - expect(emojify('🫰')).toEqual('🫰'); - expect(emojify('🤟')).toEqual('🤟'); - expect(emojify('🤘')).toEqual('🤘'); - expect(emojify('🤙')).toEqual('🤙'); - expect(emojify('👈')).toEqual('👈'); - expect(emojify('👉')).toEqual('👉'); - expect(emojify('👆')).toEqual('👆'); - expect(emojify('🖕')).toEqual('🖕'); - expect(emojify('👇')).toEqual('👇'); - expect(emojify('☝️')).toEqual('☝️'); - expect(emojify('🫵')).toEqual('🫵'); - expect(emojify('👍')).toEqual('👍'); - expect(emojify('👎')).toEqual('👎'); - expect(emojify('✊')).toEqual('✊'); - expect(emojify('👊')).toEqual('👊'); - expect(emojify('🤛')).toEqual('🤛'); - expect(emojify('🤜')).toEqual('🤜'); - expect(emojify('👏')).toEqual('👏'); - expect(emojify('🙌')).toEqual('🙌'); - expect(emojify('🫶')).toEqual('🫶'); - expect(emojify('👐')).toEqual('👐'); - expect(emojify('🤲')).toEqual('🤲'); - expect(emojify('🤝')).toEqual('🤝'); - expect(emojify('🙏')).toEqual('🙏'); - expect(emojify('✍️')).toEqual('✍️'); - expect(emojify('💅')).toEqual('💅'); - expect(emojify('🤳')).toEqual('🤳'); - expect(emojify('💪')).toEqual('💪'); - expect(emojify('🦾')).toEqual('🦾'); - expect(emojify('🦿')).toEqual('🦿'); - expect(emojify('🦵')).toEqual('🦵'); - expect(emojify('🦶')).toEqual('🦶'); - expect(emojify('👂')).toEqual('👂'); - expect(emojify('🦻')).toEqual('🦻'); - expect(emojify('👃')).toEqual('👃'); - expect(emojify('🧠')).toEqual('🧠'); - expect(emojify('🫀')).toEqual('🫀'); - expect(emojify('🫁')).toEqual('🫁'); - expect(emojify('🦷')).toEqual('🦷'); - expect(emojify('🦴')).toEqual('🦴'); - expect(emojify('👀')).toEqual('👀'); - expect(emojify('👁️')).toEqual('👁️'); - expect(emojify('👅')).toEqual('👅'); - expect(emojify('👄')).toEqual('👄'); - expect(emojify('🫦')).toEqual('🫦'); - expect(emojify('👶')).toEqual('👶'); - expect(emojify('🧒')).toEqual('🧒'); - expect(emojify('👦')).toEqual('👦'); - expect(emojify('👧')).toEqual('👧'); - expect(emojify('🧑')).toEqual('🧑'); - expect(emojify('👱')).toEqual('👱'); - expect(emojify('👨')).toEqual('👨'); - expect(emojify('🧔')).toEqual('🧔'); - expect(emojify('🧔‍♂️')).toEqual('🧔‍♂️'); - expect(emojify('🧔‍♀️')).toEqual('🧔‍♀️'); - expect(emojify('👨‍🦰')).toEqual('👨‍🦰'); - expect(emojify('👨‍🦱')).toEqual('👨‍🦱'); - expect(emojify('👨‍🦳')).toEqual('👨‍🦳'); - expect(emojify('👨‍🦲')).toEqual('👨‍🦲'); - expect(emojify('👩')).toEqual('👩'); - expect(emojify('👩‍🦰')).toEqual('👩‍🦰'); - expect(emojify('🧑‍🦰')).toEqual('🧑‍🦰'); - expect(emojify('👩‍🦱')).toEqual('👩‍🦱'); - expect(emojify('🧑‍🦱')).toEqual('🧑‍🦱'); - expect(emojify('👩‍🦳')).toEqual('👩‍🦳'); - expect(emojify('🧑‍🦳')).toEqual('🧑‍🦳'); - expect(emojify('👩‍🦲')).toEqual('👩‍🦲'); - expect(emojify('🧑‍🦲')).toEqual('🧑‍🦲'); - expect(emojify('👱‍♀️')).toEqual('👱‍♀️'); - expect(emojify('👱‍♂️')).toEqual('👱‍♂️'); - expect(emojify('🧓')).toEqual('🧓'); - expect(emojify('👴')).toEqual('👴'); - expect(emojify('👵')).toEqual('👵'); - expect(emojify('🙍')).toEqual('🙍'); - expect(emojify('🙍‍♂️')).toEqual('🙍‍♂️'); - expect(emojify('🙍‍♀️')).toEqual('🙍‍♀️'); - expect(emojify('🙎')).toEqual('🙎'); - expect(emojify('🙎‍♂️')).toEqual('🙎‍♂️'); - expect(emojify('🙎‍♀️')).toEqual('🙎‍♀️'); - expect(emojify('🙅')).toEqual('🙅'); - expect(emojify('🙅‍♂️')).toEqual('🙅‍♂️'); - expect(emojify('🙅‍♀️')).toEqual('🙅‍♀️'); - expect(emojify('🙆')).toEqual('🙆'); - expect(emojify('🙆‍♂️')).toEqual('🙆‍♂️'); - expect(emojify('🙆‍♀️')).toEqual('🙆‍♀️'); - expect(emojify('💁')).toEqual('💁'); - expect(emojify('💁‍♂️')).toEqual('💁‍♂️'); - expect(emojify('💁‍♀️')).toEqual('💁‍♀️'); - expect(emojify('🙋')).toEqual('🙋'); - expect(emojify('🙋‍♂️')).toEqual('🙋‍♂️'); - expect(emojify('🙋‍♀️')).toEqual('🙋‍♀️'); - expect(emojify('🧏')).toEqual('🧏'); - expect(emojify('🧏‍♂️')).toEqual('🧏‍♂️'); - expect(emojify('🧏‍♀️')).toEqual('🧏‍♀️'); - expect(emojify('🙇')).toEqual('🙇'); - expect(emojify('🙇‍♂️')).toEqual('🙇‍♂️'); - expect(emojify('🙇‍♀️')).toEqual('🙇‍♀️'); - expect(emojify('🤦')).toEqual('🤦'); - expect(emojify('🤦‍♂️')).toEqual('🤦‍♂️'); - expect(emojify('🤦‍♀️')).toEqual('🤦‍♀️'); - expect(emojify('🤷')).toEqual('🤷'); - expect(emojify('🤷‍♂️')).toEqual('🤷‍♂️'); - expect(emojify('🤷‍♀️')).toEqual('🤷‍♀️'); - expect(emojify('🧑‍⚕️')).toEqual('🧑‍⚕️'); - expect(emojify('👨‍⚕️')).toEqual('👨‍⚕️'); - expect(emojify('👩‍⚕️')).toEqual('👩‍⚕️'); - expect(emojify('🧑‍🎓')).toEqual('🧑‍🎓'); - expect(emojify('👨‍🎓')).toEqual('👨‍🎓'); - expect(emojify('👩‍🎓')).toEqual('👩‍🎓'); - expect(emojify('🧑‍🏫')).toEqual('🧑‍🏫'); - expect(emojify('👨‍🏫')).toEqual('👨‍🏫'); - expect(emojify('👩‍🏫')).toEqual('👩‍🏫'); - expect(emojify('🧑‍⚖️')).toEqual('🧑‍⚖️'); - expect(emojify('👨‍⚖️')).toEqual('👨‍⚖️'); - expect(emojify('👩‍⚖️')).toEqual('👩‍⚖️'); - expect(emojify('🧑‍🌾')).toEqual('🧑‍🌾'); - expect(emojify('👨‍🌾')).toEqual('👨‍🌾'); - expect(emojify('👩‍🌾')).toEqual('👩‍🌾'); - expect(emojify('🧑‍🍳')).toEqual('🧑‍🍳'); - expect(emojify('👨‍🍳')).toEqual('👨‍🍳'); - expect(emojify('👩‍🍳')).toEqual('👩‍🍳'); - expect(emojify('🧑‍🔧')).toEqual('🧑‍🔧'); - expect(emojify('👨‍🔧')).toEqual('👨‍🔧'); - expect(emojify('👩‍🔧')).toEqual('👩‍🔧'); - expect(emojify('🧑‍🏭')).toEqual('🧑‍🏭'); - expect(emojify('👨‍🏭')).toEqual('👨‍🏭'); - expect(emojify('👩‍🏭')).toEqual('👩‍🏭'); - expect(emojify('🧑‍💼')).toEqual('🧑‍💼'); - expect(emojify('👨‍💼')).toEqual('👨‍💼'); - expect(emojify('👩‍💼')).toEqual('👩‍💼'); - expect(emojify('🧑‍🔬')).toEqual('🧑‍🔬'); - expect(emojify('👨‍🔬')).toEqual('👨‍🔬'); - expect(emojify('👩‍🔬')).toEqual('👩‍🔬'); - expect(emojify('🧑‍💻')).toEqual('🧑‍💻'); - expect(emojify('👨‍💻')).toEqual('👨‍💻'); - expect(emojify('👩‍💻')).toEqual('👩‍💻'); - expect(emojify('🧑‍🎤')).toEqual('🧑‍🎤'); - expect(emojify('👨‍🎤')).toEqual('👨‍🎤'); - expect(emojify('👩‍🎤')).toEqual('👩‍🎤'); - expect(emojify('🧑‍🎨')).toEqual('🧑‍🎨'); - expect(emojify('👨‍🎨')).toEqual('👨‍🎨'); - expect(emojify('👩‍🎨')).toEqual('👩‍🎨'); - expect(emojify('🧑‍✈️')).toEqual('🧑‍✈️'); - expect(emojify('👨‍✈️')).toEqual('👨‍✈️'); - expect(emojify('👩‍✈️')).toEqual('👩‍✈️'); - expect(emojify('🧑‍🚀')).toEqual('🧑‍🚀'); - expect(emojify('👨‍🚀')).toEqual('👨‍🚀'); - expect(emojify('👩‍🚀')).toEqual('👩‍🚀'); - expect(emojify('🧑‍🚒')).toEqual('🧑‍🚒'); - expect(emojify('👨‍🚒')).toEqual('👨‍🚒'); - expect(emojify('👩‍🚒')).toEqual('👩‍🚒'); - expect(emojify('👮')).toEqual('👮'); - expect(emojify('👮‍♂️')).toEqual('👮‍♂️'); - expect(emojify('👮‍♀️')).toEqual('👮‍♀️'); - expect(emojify('🕵️')).toEqual('🕵️'); - expect(emojify('🕵️‍♂️')).toEqual('🕵️‍♂️'); - expect(emojify('🕵️‍♀️')).toEqual('🕵️‍♀️'); - expect(emojify('💂')).toEqual('💂'); - expect(emojify('💂‍♂️')).toEqual('💂‍♂️'); - expect(emojify('💂‍♀️')).toEqual('💂‍♀️'); - expect(emojify('🥷')).toEqual('🥷'); - expect(emojify('👷')).toEqual('👷'); - expect(emojify('👷‍♂️')).toEqual('👷‍♂️'); - expect(emojify('👷‍♀️')).toEqual('👷‍♀️'); - expect(emojify('🫅')).toEqual('🫅'); - expect(emojify('🤴')).toEqual('🤴'); - expect(emojify('👸')).toEqual('👸'); - expect(emojify('👳')).toEqual('👳'); - expect(emojify('👳‍♂️')).toEqual('👳‍♂️'); - expect(emojify('👳‍♀️')).toEqual('👳‍♀️'); - expect(emojify('👲')).toEqual('👲'); - expect(emojify('🧕')).toEqual('🧕'); - expect(emojify('🤵')).toEqual('🤵'); - expect(emojify('🤵‍♂️')).toEqual('🤵‍♂️'); - expect(emojify('🤵‍♀️')).toEqual('🤵‍♀️'); - expect(emojify('👰')).toEqual('👰'); - expect(emojify('👰‍♂️')).toEqual('👰‍♂️'); - expect(emojify('👰‍♀️')).toEqual('👰‍♀️'); - expect(emojify('🤰')).toEqual('🤰'); - expect(emojify('🫃')).toEqual('🫃'); - expect(emojify('🫄')).toEqual('🫄'); - expect(emojify('🤱')).toEqual('🤱'); - expect(emojify('👩‍🍼')).toEqual('👩‍🍼'); - expect(emojify('👨‍🍼')).toEqual('👨‍🍼'); - expect(emojify('🧑‍🍼')).toEqual('🧑‍🍼'); - expect(emojify('👼')).toEqual('👼'); - expect(emojify('🎅')).toEqual('🎅'); - expect(emojify('🤶')).toEqual('🤶'); - expect(emojify('🧑‍🎄')).toEqual('🧑‍🎄'); - expect(emojify('🦸')).toEqual('🦸'); - expect(emojify('🦸‍♂️')).toEqual('🦸‍♂️'); - expect(emojify('🦸‍♀️')).toEqual('🦸‍♀️'); - expect(emojify('🦹')).toEqual('🦹'); - expect(emojify('🦹‍♂️')).toEqual('🦹‍♂️'); - expect(emojify('🦹‍♀️')).toEqual('🦹‍♀️'); - expect(emojify('🧙')).toEqual('🧙'); - expect(emojify('🧙‍♂️')).toEqual('🧙‍♂️'); - expect(emojify('🧙‍♀️')).toEqual('🧙‍♀️'); - expect(emojify('🧚')).toEqual('🧚'); - expect(emojify('🧚‍♂️')).toEqual('🧚‍♂️'); - expect(emojify('🧚‍♀️')).toEqual('🧚‍♀️'); - expect(emojify('🧛')).toEqual('🧛'); - expect(emojify('🧛‍♂️')).toEqual('🧛‍♂️'); - expect(emojify('🧛‍♀️')).toEqual('🧛‍♀️'); - expect(emojify('🧜')).toEqual('🧜'); - expect(emojify('🧜‍♂️')).toEqual('🧜‍♂️'); - expect(emojify('🧜‍♀️')).toEqual('🧜‍♀️'); - expect(emojify('🧝')).toEqual('🧝'); - expect(emojify('🧝‍♂️')).toEqual('🧝‍♂️'); - expect(emojify('🧝‍♀️')).toEqual('🧝‍♀️'); - expect(emojify('🧞')).toEqual('🧞'); - expect(emojify('🧞‍♂️')).toEqual('🧞‍♂️'); - expect(emojify('🧞‍♀️')).toEqual('🧞‍♀️'); - expect(emojify('🧟')).toEqual('🧟'); - expect(emojify('🧟‍♂️')).toEqual('🧟‍♂️'); - expect(emojify('🧟‍♀️')).toEqual('🧟‍♀️'); - expect(emojify('🧌')).toEqual('🧌'); - expect(emojify('💆')).toEqual('💆'); - expect(emojify('💆‍♂️')).toEqual('💆‍♂️'); - expect(emojify('💆‍♀️')).toEqual('💆‍♀️'); - expect(emojify('💇')).toEqual('💇'); - expect(emojify('💇‍♂️')).toEqual('💇‍♂️'); - expect(emojify('💇‍♀️')).toEqual('💇‍♀️'); - expect(emojify('🚶')).toEqual('🚶'); - expect(emojify('🚶‍♂️')).toEqual('🚶‍♂️'); - expect(emojify('🚶‍♀️')).toEqual('🚶‍♀️'); - expect(emojify('🧍')).toEqual('🧍'); - expect(emojify('🧍‍♂️')).toEqual('🧍‍♂️'); - expect(emojify('🧍‍♀️')).toEqual('🧍‍♀️'); - expect(emojify('🧎')).toEqual('🧎'); - expect(emojify('🧎‍♂️')).toEqual('🧎‍♂️'); - expect(emojify('🧎‍♀️')).toEqual('🧎‍♀️'); - expect(emojify('🧑‍🦯')).toEqual('🧑‍🦯'); - expect(emojify('👨‍🦯')).toEqual('👨‍🦯'); - expect(emojify('👩‍🦯')).toEqual('👩‍🦯'); - expect(emojify('🧑‍🦼')).toEqual('🧑‍🦼'); - expect(emojify('👨‍🦼')).toEqual('👨‍🦼'); - expect(emojify('👩‍🦼')).toEqual('👩‍🦼'); - expect(emojify('🧑‍🦽')).toEqual('🧑‍🦽'); - expect(emojify('👨‍🦽')).toEqual('👨‍🦽'); - expect(emojify('👩‍🦽')).toEqual('👩‍🦽'); - expect(emojify('🏃')).toEqual('🏃'); - expect(emojify('🏃‍♂️')).toEqual('🏃‍♂️'); - expect(emojify('🏃‍♀️')).toEqual('🏃‍♀️'); - expect(emojify('💃')).toEqual('💃'); - expect(emojify('🕺')).toEqual('🕺'); - expect(emojify('🕴️')).toEqual('🕴️'); - expect(emojify('👯')).toEqual('👯'); - expect(emojify('👯‍♂️')).toEqual('👯‍♂️'); - expect(emojify('👯‍♀️')).toEqual('👯‍♀️'); - expect(emojify('🧖')).toEqual('🧖'); - expect(emojify('🧖‍♂️')).toEqual('🧖‍♂️'); - expect(emojify('🧖‍♀️')).toEqual('🧖‍♀️'); - expect(emojify('🧗')).toEqual('🧗'); - expect(emojify('🧗‍♂️')).toEqual('🧗‍♂️'); - expect(emojify('🧗‍♀️')).toEqual('🧗‍♀️'); - expect(emojify('🤺')).toEqual('🤺'); - expect(emojify('🏇')).toEqual('🏇'); - expect(emojify('⛷️')).toEqual('⛷️'); - expect(emojify('🏂')).toEqual('🏂'); - expect(emojify('🏌️')).toEqual('🏌️'); - expect(emojify('🏌️‍♂️')).toEqual('🏌️‍♂️'); - expect(emojify('🏌️‍♀️')).toEqual('🏌️‍♀️'); - expect(emojify('🏄')).toEqual('🏄'); - expect(emojify('🏄‍♂️')).toEqual('🏄‍♂️'); - expect(emojify('🏄‍♀️')).toEqual('🏄‍♀️'); - expect(emojify('🚣')).toEqual('🚣'); - expect(emojify('🚣‍♂️')).toEqual('🚣‍♂️'); - expect(emojify('🚣‍♀️')).toEqual('🚣‍♀️'); - expect(emojify('🏊')).toEqual('🏊'); - expect(emojify('🏊‍♂️')).toEqual('🏊‍♂️'); - expect(emojify('🏊‍♀️')).toEqual('🏊‍♀️'); - expect(emojify('⛹️')).toEqual('⛹️'); - expect(emojify('⛹️‍♂️')).toEqual('⛹️‍♂️'); - expect(emojify('⛹️‍♀️')).toEqual('⛹️‍♀️'); - expect(emojify('🏋️')).toEqual('🏋️'); - expect(emojify('🏋️‍♂️')).toEqual('🏋️‍♂️'); - expect(emojify('🏋️‍♀️')).toEqual('🏋️‍♀️'); - expect(emojify('🚴')).toEqual('🚴'); - expect(emojify('🚴‍♂️')).toEqual('🚴‍♂️'); - expect(emojify('🚴‍♀️')).toEqual('🚴‍♀️'); - expect(emojify('🚵')).toEqual('🚵'); - expect(emojify('🚵‍♂️')).toEqual('🚵‍♂️'); - expect(emojify('🚵‍♀️')).toEqual('🚵‍♀️'); - expect(emojify('🤸')).toEqual('🤸'); - expect(emojify('🤸‍♂️')).toEqual('🤸‍♂️'); - expect(emojify('🤸‍♀️')).toEqual('🤸‍♀️'); - expect(emojify('🤼')).toEqual('🤼'); - expect(emojify('🤼‍♂️')).toEqual('🤼‍♂️'); - expect(emojify('🤼‍♀️')).toEqual('🤼‍♀️'); - expect(emojify('🤽')).toEqual('🤽'); - expect(emojify('🤽‍♂️')).toEqual('🤽‍♂️'); - expect(emojify('🤽‍♀️')).toEqual('🤽‍♀️'); - expect(emojify('🤾')).toEqual('🤾'); - expect(emojify('🤾‍♂️')).toEqual('🤾‍♂️'); - expect(emojify('🤾‍♀️')).toEqual('🤾‍♀️'); - expect(emojify('🤹')).toEqual('🤹'); - expect(emojify('🤹‍♂️')).toEqual('🤹‍♂️'); - expect(emojify('🤹‍♀️')).toEqual('🤹‍♀️'); - expect(emojify('🧘')).toEqual('🧘'); - expect(emojify('🧘‍♂️')).toEqual('🧘‍♂️'); - expect(emojify('🧘‍♀️')).toEqual('🧘‍♀️'); - expect(emojify('🛀')).toEqual('🛀'); - expect(emojify('🛌')).toEqual('🛌'); - expect(emojify('🧑‍🤝‍🧑')).toEqual('🧑‍🤝‍🧑'); - expect(emojify('👭')).toEqual('👭'); - expect(emojify('👫')).toEqual('👫'); - expect(emojify('👬')).toEqual('👬'); - expect(emojify('💏')).toEqual('💏'); - expect(emojify('👩‍❤️‍💋‍👨')).toEqual('👩‍❤️‍💋‍👨'); - expect(emojify('👨‍❤️‍💋‍👨')).toEqual('👨‍❤️‍💋‍👨'); - expect(emojify('👩‍❤️‍💋‍👩')).toEqual('👩‍❤️‍💋‍👩'); - expect(emojify('💑')).toEqual('💑'); - expect(emojify('👩‍❤️‍👨')).toEqual('👩‍❤️‍👨'); - expect(emojify('👨‍❤️‍👨')).toEqual('👨‍❤️‍👨'); - expect(emojify('👩‍❤️‍👩')).toEqual('👩‍❤️‍👩'); - expect(emojify('👪')).toEqual('👪'); - expect(emojify('👨‍👩‍👦')).toEqual('👨‍👩‍👦'); - expect(emojify('👨‍👩‍👧')).toEqual('👨‍👩‍👧'); - expect(emojify('👨‍👩‍👧‍👦')).toEqual('👨‍👩‍👧‍👦'); - expect(emojify('👨‍👩‍👦‍👦')).toEqual('👨‍👩‍👦‍👦'); - expect(emojify('👨‍👩‍👧‍👧')).toEqual('👨‍👩‍👧‍👧'); - expect(emojify('👨‍👨‍👦')).toEqual('👨‍👨‍👦'); - expect(emojify('👨‍👨‍👧')).toEqual('👨‍👨‍👧'); - expect(emojify('👨‍👨‍👧‍👦')).toEqual('👨‍👨‍👧‍👦'); - expect(emojify('👨‍👨‍👦‍👦')).toEqual('👨‍👨‍👦‍👦'); - expect(emojify('👨‍👨‍👧‍👧')).toEqual('👨‍👨‍👧‍👧'); - expect(emojify('👩‍👩‍👦')).toEqual('👩‍👩‍👦'); - expect(emojify('👩‍👩‍👧')).toEqual('👩‍👩‍👧'); - expect(emojify('👩‍👩‍👧‍👦')).toEqual('👩‍👩‍👧‍👦'); - expect(emojify('👩‍👩‍👦‍👦')).toEqual('👩‍👩‍👦‍👦'); - expect(emojify('👩‍👩‍👧‍👧')).toEqual('👩‍👩‍👧‍👧'); - expect(emojify('👨‍👦')).toEqual('👨‍👦'); - expect(emojify('👨‍👦‍👦')).toEqual('👨‍👦‍👦'); - expect(emojify('👨‍👧')).toEqual('👨‍👧'); - expect(emojify('👨‍👧‍👦')).toEqual('👨‍👧‍👦'); - expect(emojify('👨‍👧‍👧')).toEqual('👨‍👧‍👧'); - expect(emojify('👩‍👦')).toEqual('👩‍👦'); - expect(emojify('👩‍👦‍👦')).toEqual('👩‍👦‍👦'); - expect(emojify('👩‍👧')).toEqual('👩‍👧'); - expect(emojify('👩‍👧‍👦')).toEqual('👩‍👧‍👦'); - expect(emojify('👩‍👧‍👧')).toEqual('👩‍👧‍👧'); - expect(emojify('🗣️')).toEqual('🗣️'); - expect(emojify('👤')).toEqual('👤'); - expect(emojify('👥')).toEqual('👥'); - expect(emojify('🫂')).toEqual('🫂'); - expect(emojify('👣')).toEqual('👣'); - expect(emojify('🐵')).toEqual('🐵'); - expect(emojify('🐒')).toEqual('🐒'); - expect(emojify('🦍')).toEqual('🦍'); - expect(emojify('🦧')).toEqual('🦧'); - expect(emojify('🐶')).toEqual('🐶'); - expect(emojify('🐕')).toEqual('🐕'); - expect(emojify('🦮')).toEqual('🦮'); - expect(emojify('🐕‍🦺')).toEqual('🐕‍🦺'); - expect(emojify('🐩')).toEqual('🐩'); - expect(emojify('🐺')).toEqual('🐺'); - expect(emojify('🦊')).toEqual('🦊'); - expect(emojify('🦝')).toEqual('🦝'); - expect(emojify('🐱')).toEqual('🐱'); - expect(emojify('🐈')).toEqual('🐈'); - expect(emojify('🐈‍⬛')).toEqual('🐈‍⬛'); - expect(emojify('🦁')).toEqual('🦁'); - expect(emojify('🐯')).toEqual('🐯'); - expect(emojify('🐅')).toEqual('🐅'); - expect(emojify('🐆')).toEqual('🐆'); - expect(emojify('🐴')).toEqual('🐴'); - expect(emojify('🐎')).toEqual('🐎'); - expect(emojify('🦄')).toEqual('🦄'); - expect(emojify('🦓')).toEqual('🦓'); - expect(emojify('🦌')).toEqual('🦌'); - expect(emojify('🦬')).toEqual('🦬'); - expect(emojify('🐮')).toEqual('🐮'); - expect(emojify('🐂')).toEqual('🐂'); - expect(emojify('🐃')).toEqual('🐃'); - expect(emojify('🐄')).toEqual('🐄'); - expect(emojify('🐷')).toEqual('🐷'); - expect(emojify('🐖')).toEqual('🐖'); - expect(emojify('🐗')).toEqual('🐗'); - expect(emojify('🐽')).toEqual('🐽'); - expect(emojify('🐏')).toEqual('🐏'); - expect(emojify('🐑')).toEqual('🐑'); - expect(emojify('🐐')).toEqual('🐐'); - expect(emojify('🐪')).toEqual('🐪'); - expect(emojify('🐫')).toEqual('🐫'); - expect(emojify('🦙')).toEqual('🦙'); - expect(emojify('🦒')).toEqual('🦒'); - expect(emojify('🐘')).toEqual('🐘'); - expect(emojify('🦣')).toEqual('🦣'); - expect(emojify('🦏')).toEqual('🦏'); - expect(emojify('🦛')).toEqual('🦛'); - expect(emojify('🐭')).toEqual('🐭'); - expect(emojify('🐁')).toEqual('🐁'); - expect(emojify('🐀')).toEqual('🐀'); - expect(emojify('🐹')).toEqual('🐹'); - expect(emojify('🐰')).toEqual('🐰'); - expect(emojify('🐇')).toEqual('🐇'); - expect(emojify('🐿️')).toEqual('🐿️'); - expect(emojify('🦫')).toEqual('🦫'); - expect(emojify('🦔')).toEqual('🦔'); - expect(emojify('🦇')).toEqual('🦇'); - expect(emojify('🐻')).toEqual('🐻'); - expect(emojify('🐻‍❄️')).toEqual('🐻‍❄️'); - expect(emojify('🐨')).toEqual('🐨'); - expect(emojify('🐼')).toEqual('🐼'); - expect(emojify('🦥')).toEqual('🦥'); - expect(emojify('🦦')).toEqual('🦦'); - expect(emojify('🦨')).toEqual('🦨'); - expect(emojify('🦘')).toEqual('🦘'); - expect(emojify('🦡')).toEqual('🦡'); - expect(emojify('🐾')).toEqual('🐾'); - expect(emojify('🦃')).toEqual('🦃'); - expect(emojify('🐔')).toEqual('🐔'); - expect(emojify('🐓')).toEqual('🐓'); - expect(emojify('🐣')).toEqual('🐣'); - expect(emojify('🐤')).toEqual('🐤'); - expect(emojify('🐥')).toEqual('🐥'); - expect(emojify('🐦')).toEqual('🐦'); - expect(emojify('🐧')).toEqual('🐧'); - expect(emojify('🕊️')).toEqual('🕊️'); - expect(emojify('🦅')).toEqual('🦅'); - expect(emojify('🦆')).toEqual('🦆'); - expect(emojify('🦢')).toEqual('🦢'); - expect(emojify('🦉')).toEqual('🦉'); - expect(emojify('🦤')).toEqual('🦤'); - expect(emojify('🪶')).toEqual('🪶'); - expect(emojify('🦩')).toEqual('🦩'); - expect(emojify('🦚')).toEqual('🦚'); - expect(emojify('🦜')).toEqual('🦜'); - expect(emojify('🐸')).toEqual('🐸'); - expect(emojify('🐊')).toEqual('🐊'); - expect(emojify('🐢')).toEqual('🐢'); - expect(emojify('🦎')).toEqual('🦎'); - expect(emojify('🐍')).toEqual('🐍'); - expect(emojify('🐲')).toEqual('🐲'); - expect(emojify('🐉')).toEqual('🐉'); - expect(emojify('🦕')).toEqual('🦕'); - expect(emojify('🦖')).toEqual('🦖'); - expect(emojify('🐳')).toEqual('🐳'); - expect(emojify('🐋')).toEqual('🐋'); - expect(emojify('🐬')).toEqual('🐬'); - expect(emojify('🦭')).toEqual('🦭'); - expect(emojify('🐟')).toEqual('🐟'); - expect(emojify('🐠')).toEqual('🐠'); - expect(emojify('🐡')).toEqual('🐡'); - expect(emojify('🦈')).toEqual('🦈'); - expect(emojify('🐙')).toEqual('🐙'); - expect(emojify('🐚')).toEqual('🐚'); - expect(emojify('🪸')).toEqual('🪸'); - expect(emojify('🐌')).toEqual('🐌'); - expect(emojify('🦋')).toEqual('🦋'); - expect(emojify('🐛')).toEqual('🐛'); - expect(emojify('🐜')).toEqual('🐜'); - expect(emojify('🐝')).toEqual('🐝'); - expect(emojify('🪲')).toEqual('🪲'); - expect(emojify('🐞')).toEqual('🐞'); - expect(emojify('🦗')).toEqual('🦗'); - expect(emojify('🪳')).toEqual('🪳'); - expect(emojify('🕷️')).toEqual('🕷️'); - expect(emojify('🕸️')).toEqual('🕸️'); - expect(emojify('🦂')).toEqual('🦂'); - expect(emojify('🦟')).toEqual('🦟'); - expect(emojify('🪰')).toEqual('🪰'); - expect(emojify('🪱')).toEqual('🪱'); - expect(emojify('🦠')).toEqual('🦠'); - expect(emojify('💐')).toEqual('💐'); - expect(emojify('🌸')).toEqual('🌸'); - expect(emojify('💮')).toEqual('💮'); - expect(emojify('🪷')).toEqual('🪷'); - expect(emojify('🏵️')).toEqual('🏵️'); - expect(emojify('🌹')).toEqual('🌹'); - expect(emojify('🥀')).toEqual('🥀'); - expect(emojify('🌺')).toEqual('🌺'); - expect(emojify('🌻')).toEqual('🌻'); - expect(emojify('🌼')).toEqual('🌼'); - expect(emojify('🌷')).toEqual('🌷'); - expect(emojify('🌱')).toEqual('🌱'); - expect(emojify('🪴')).toEqual('🪴'); - expect(emojify('🌲')).toEqual('🌲'); - expect(emojify('🌳')).toEqual('🌳'); - expect(emojify('🌴')).toEqual('🌴'); - expect(emojify('🌵')).toEqual('🌵'); - expect(emojify('🌾')).toEqual('🌾'); - expect(emojify('🌿')).toEqual('🌿'); - expect(emojify('☘️')).toEqual('☘️'); - expect(emojify('🍀')).toEqual('🍀'); - expect(emojify('🍁')).toEqual('🍁'); - expect(emojify('🍂')).toEqual('🍂'); - expect(emojify('🍃')).toEqual('🍃'); - expect(emojify('🪹')).toEqual('🪹'); - expect(emojify('🪺')).toEqual('🪺'); - expect(emojify('🍇')).toEqual('🍇'); - expect(emojify('🍈')).toEqual('🍈'); - expect(emojify('🍉')).toEqual('🍉'); - expect(emojify('🍊')).toEqual('🍊'); - expect(emojify('🍋')).toEqual('🍋'); - expect(emojify('🍌')).toEqual('🍌'); - expect(emojify('🍍')).toEqual('🍍'); - expect(emojify('🥭')).toEqual('🥭'); - expect(emojify('🍎')).toEqual('🍎'); - expect(emojify('🍏')).toEqual('🍏'); - expect(emojify('🍐')).toEqual('🍐'); - expect(emojify('🍑')).toEqual('🍑'); - expect(emojify('🍒')).toEqual('🍒'); - expect(emojify('🍓')).toEqual('🍓'); - expect(emojify('🫐')).toEqual('🫐'); - expect(emojify('🥝')).toEqual('🥝'); - expect(emojify('🍅')).toEqual('🍅'); - expect(emojify('🫒')).toEqual('🫒'); - expect(emojify('🥥')).toEqual('🥥'); - expect(emojify('🥑')).toEqual('🥑'); - expect(emojify('🍆')).toEqual('🍆'); - expect(emojify('🥔')).toEqual('🥔'); - expect(emojify('🥕')).toEqual('🥕'); - expect(emojify('🌽')).toEqual('🌽'); - expect(emojify('🌶️')).toEqual('🌶️'); - expect(emojify('🫑')).toEqual('🫑'); - expect(emojify('🥒')).toEqual('🥒'); - expect(emojify('🥬')).toEqual('🥬'); - expect(emojify('🥦')).toEqual('🥦'); - expect(emojify('🧄')).toEqual('🧄'); - expect(emojify('🧅')).toEqual('🧅'); - expect(emojify('🍄')).toEqual('🍄'); - expect(emojify('🥜')).toEqual('🥜'); - expect(emojify('🫘')).toEqual('🫘'); - expect(emojify('🌰')).toEqual('🌰'); - expect(emojify('🍞')).toEqual('🍞'); - expect(emojify('🥐')).toEqual('🥐'); - expect(emojify('🥖')).toEqual('🥖'); - expect(emojify('🫓')).toEqual('🫓'); - expect(emojify('🥨')).toEqual('🥨'); - expect(emojify('🥯')).toEqual('🥯'); - expect(emojify('🥞')).toEqual('🥞'); - expect(emojify('🧇')).toEqual('🧇'); - expect(emojify('🧀')).toEqual('🧀'); - expect(emojify('🍖')).toEqual('🍖'); - expect(emojify('🍗')).toEqual('🍗'); - expect(emojify('🥩')).toEqual('🥩'); - expect(emojify('🥓')).toEqual('🥓'); - expect(emojify('🍔')).toEqual('🍔'); - expect(emojify('🍟')).toEqual('🍟'); - expect(emojify('🍕')).toEqual('🍕'); - expect(emojify('🌭')).toEqual('🌭'); - expect(emojify('🥪')).toEqual('🥪'); - expect(emojify('🌮')).toEqual('🌮'); - expect(emojify('🌯')).toEqual('🌯'); - expect(emojify('🫔')).toEqual('🫔'); - expect(emojify('🥙')).toEqual('🥙'); - expect(emojify('🧆')).toEqual('🧆'); - expect(emojify('🥚')).toEqual('🥚'); - expect(emojify('🍳')).toEqual('🍳'); - expect(emojify('🥘')).toEqual('🥘'); - expect(emojify('🍲')).toEqual('🍲'); - expect(emojify('🫕')).toEqual('🫕'); - expect(emojify('🥣')).toEqual('🥣'); - expect(emojify('🥗')).toEqual('🥗'); - expect(emojify('🍿')).toEqual('🍿'); - expect(emojify('🧈')).toEqual('🧈'); - expect(emojify('🧂')).toEqual('🧂'); - expect(emojify('🥫')).toEqual('🥫'); - expect(emojify('🍱')).toEqual('🍱'); - expect(emojify('🍘')).toEqual('🍘'); - expect(emojify('🍙')).toEqual('🍙'); - expect(emojify('🍚')).toEqual('🍚'); - expect(emojify('🍛')).toEqual('🍛'); - expect(emojify('🍜')).toEqual('🍜'); - expect(emojify('🍝')).toEqual('🍝'); - expect(emojify('🍠')).toEqual('🍠'); - expect(emojify('🍢')).toEqual('🍢'); - expect(emojify('🍣')).toEqual('🍣'); - expect(emojify('🍤')).toEqual('🍤'); - expect(emojify('🍥')).toEqual('🍥'); - expect(emojify('🥮')).toEqual('🥮'); - expect(emojify('🍡')).toEqual('🍡'); - expect(emojify('🥟')).toEqual('🥟'); - expect(emojify('🥠')).toEqual('🥠'); - expect(emojify('🥡')).toEqual('🥡'); - expect(emojify('🦀')).toEqual('🦀'); - expect(emojify('🦞')).toEqual('🦞'); - expect(emojify('🦐')).toEqual('🦐'); - expect(emojify('🦑')).toEqual('🦑'); - expect(emojify('🦪')).toEqual('🦪'); - expect(emojify('🍦')).toEqual('🍦'); - expect(emojify('🍧')).toEqual('🍧'); - expect(emojify('🍨')).toEqual('🍨'); - expect(emojify('🍩')).toEqual('🍩'); - expect(emojify('🍪')).toEqual('🍪'); - expect(emojify('🎂')).toEqual('🎂'); - expect(emojify('🍰')).toEqual('🍰'); - expect(emojify('🧁')).toEqual('🧁'); - expect(emojify('🥧')).toEqual('🥧'); - expect(emojify('🍫')).toEqual('🍫'); - expect(emojify('🍬')).toEqual('🍬'); - expect(emojify('🍭')).toEqual('🍭'); - expect(emojify('🍮')).toEqual('🍮'); - expect(emojify('🍯')).toEqual('🍯'); - expect(emojify('🍼')).toEqual('🍼'); - expect(emojify('🥛')).toEqual('🥛'); - expect(emojify('☕')).toEqual('☕'); - expect(emojify('🫖')).toEqual('🫖'); - expect(emojify('🍵')).toEqual('🍵'); - expect(emojify('🍶')).toEqual('🍶'); - expect(emojify('🍾')).toEqual('🍾'); - expect(emojify('🍷')).toEqual('🍷'); - expect(emojify('🍸')).toEqual('🍸'); - expect(emojify('🍹')).toEqual('🍹'); - expect(emojify('🍺')).toEqual('🍺'); - expect(emojify('🍻')).toEqual('🍻'); - expect(emojify('🥂')).toEqual('🥂'); - expect(emojify('🥃')).toEqual('🥃'); - expect(emojify('🫗')).toEqual('🫗'); - expect(emojify('🥤')).toEqual('🥤'); - expect(emojify('🧋')).toEqual('🧋'); - expect(emojify('🧃')).toEqual('🧃'); - expect(emojify('🧉')).toEqual('🧉'); - expect(emojify('🧊')).toEqual('🧊'); - expect(emojify('🥢')).toEqual('🥢'); - expect(emojify('🍽️')).toEqual('🍽️'); - expect(emojify('🍴')).toEqual('🍴'); - expect(emojify('🥄')).toEqual('🥄'); - expect(emojify('🔪')).toEqual('🔪'); - expect(emojify('🫙')).toEqual('🫙'); - expect(emojify('🏺')).toEqual('🏺'); - expect(emojify('🌍')).toEqual('🌍'); - expect(emojify('🌎')).toEqual('🌎'); - expect(emojify('🌏')).toEqual('🌏'); - expect(emojify('🌐')).toEqual('🌐'); - expect(emojify('🗺️')).toEqual('🗺️'); - expect(emojify('🗾')).toEqual('🗾'); - expect(emojify('🧭')).toEqual('🧭'); - expect(emojify('🏔️')).toEqual('🏔️'); - expect(emojify('⛰️')).toEqual('⛰️'); - expect(emojify('🌋')).toEqual('🌋'); - expect(emojify('🗻')).toEqual('🗻'); - expect(emojify('🏕️')).toEqual('🏕️'); - expect(emojify('🏖️')).toEqual('🏖️'); - expect(emojify('🏜️')).toEqual('🏜️'); - expect(emojify('🏝️')).toEqual('🏝️'); - expect(emojify('🏞️')).toEqual('🏞️'); - expect(emojify('🏟️')).toEqual('🏟️'); - expect(emojify('🏛️')).toEqual('🏛️'); - expect(emojify('🏗️')).toEqual('🏗️'); - expect(emojify('🧱')).toEqual('🧱'); - expect(emojify('🪨')).toEqual('🪨'); - expect(emojify('🪵')).toEqual('🪵'); - expect(emojify('🛖')).toEqual('🛖'); - expect(emojify('🏘️')).toEqual('🏘️'); - expect(emojify('🏚️')).toEqual('🏚️'); - expect(emojify('🏠')).toEqual('🏠'); - expect(emojify('🏡')).toEqual('🏡'); - expect(emojify('🏢')).toEqual('🏢'); - expect(emojify('🏣')).toEqual('🏣'); - expect(emojify('🏤')).toEqual('🏤'); - expect(emojify('🏥')).toEqual('🏥'); - expect(emojify('🏦')).toEqual('🏦'); - expect(emojify('🏨')).toEqual('🏨'); - expect(emojify('🏩')).toEqual('🏩'); - expect(emojify('🏪')).toEqual('🏪'); - expect(emojify('🏫')).toEqual('🏫'); - expect(emojify('🏬')).toEqual('🏬'); - expect(emojify('🏭')).toEqual('🏭'); - expect(emojify('🏯')).toEqual('🏯'); - expect(emojify('🏰')).toEqual('🏰'); - expect(emojify('💒')).toEqual('💒'); - expect(emojify('🗼')).toEqual('🗼'); - expect(emojify('🗽')).toEqual('🗽'); - expect(emojify('⛪')).toEqual('⛪'); - expect(emojify('🕌')).toEqual('🕌'); - expect(emojify('🛕')).toEqual('🛕'); - expect(emojify('🕍')).toEqual('🕍'); - expect(emojify('⛩️')).toEqual('⛩️'); - expect(emojify('🕋')).toEqual('🕋'); - expect(emojify('⛲')).toEqual('⛲'); - expect(emojify('⛺')).toEqual('⛺'); - expect(emojify('🌁')).toEqual('🌁'); - expect(emojify('🌃')).toEqual('🌃'); - expect(emojify('🏙️')).toEqual('🏙️'); - expect(emojify('🌄')).toEqual('🌄'); - expect(emojify('🌅')).toEqual('🌅'); - expect(emojify('🌆')).toEqual('🌆'); - expect(emojify('🌇')).toEqual('🌇'); - expect(emojify('🌉')).toEqual('🌉'); - expect(emojify('♨️')).toEqual('♨️'); - expect(emojify('🎠')).toEqual('🎠'); - expect(emojify('🛝')).toEqual('🛝'); - expect(emojify('🎡')).toEqual('🎡'); - expect(emojify('🎢')).toEqual('🎢'); - expect(emojify('💈')).toEqual('💈'); - expect(emojify('🎪')).toEqual('🎪'); - expect(emojify('🚂')).toEqual('🚂'); - expect(emojify('🚃')).toEqual('🚃'); - expect(emojify('🚄')).toEqual('🚄'); - expect(emojify('🚅')).toEqual('🚅'); - expect(emojify('🚆')).toEqual('🚆'); - expect(emojify('🚇')).toEqual('🚇'); - expect(emojify('🚈')).toEqual('🚈'); - expect(emojify('🚉')).toEqual('🚉'); - expect(emojify('🚊')).toEqual('🚊'); - expect(emojify('🚝')).toEqual('🚝'); - expect(emojify('🚞')).toEqual('🚞'); - expect(emojify('🚋')).toEqual('🚋'); - expect(emojify('🚌')).toEqual('🚌'); - expect(emojify('🚍')).toEqual('🚍'); - expect(emojify('🚎')).toEqual('🚎'); - expect(emojify('🚐')).toEqual('🚐'); - expect(emojify('🚑')).toEqual('🚑'); - expect(emojify('🚒')).toEqual('🚒'); - expect(emojify('🚓')).toEqual('🚓'); - expect(emojify('🚔')).toEqual('🚔'); - expect(emojify('🚕')).toEqual('🚕'); - expect(emojify('🚖')).toEqual('🚖'); - expect(emojify('🚗')).toEqual('🚗'); - expect(emojify('🚘')).toEqual('🚘'); - expect(emojify('🚙')).toEqual('🚙'); - expect(emojify('🛻')).toEqual('🛻'); - expect(emojify('🚚')).toEqual('🚚'); - expect(emojify('🚛')).toEqual('🚛'); - expect(emojify('🚜')).toEqual('🚜'); - expect(emojify('🏎️')).toEqual('🏎️'); - expect(emojify('🏍️')).toEqual('🏍️'); - expect(emojify('🛵')).toEqual('🛵'); - expect(emojify('🦽')).toEqual('🦽'); - expect(emojify('🦼')).toEqual('🦼'); - expect(emojify('🛺')).toEqual('🛺'); - expect(emojify('🚲')).toEqual('🚲'); - expect(emojify('🛴')).toEqual('🛴'); - expect(emojify('🛹')).toEqual('🛹'); - expect(emojify('🛼')).toEqual('🛼'); - expect(emojify('🚏')).toEqual('🚏'); - expect(emojify('🛣️')).toEqual('🛣️'); - expect(emojify('🛤️')).toEqual('🛤️'); - expect(emojify('🛢️')).toEqual('🛢️'); - expect(emojify('⛽')).toEqual('⛽'); - expect(emojify('🛞')).toEqual('🛞'); - expect(emojify('🚨')).toEqual('🚨'); - expect(emojify('🚥')).toEqual('🚥'); - expect(emojify('🚦')).toEqual('🚦'); - expect(emojify('🛑')).toEqual('🛑'); - expect(emojify('🚧')).toEqual('🚧'); - expect(emojify('⚓')).toEqual('⚓'); - expect(emojify('🛟')).toEqual('🛟'); - expect(emojify('⛵')).toEqual('⛵'); - expect(emojify('🛶')).toEqual('🛶'); - expect(emojify('🚤')).toEqual('🚤'); - expect(emojify('🛳️')).toEqual('🛳️'); - expect(emojify('⛴️')).toEqual('⛴️'); - expect(emojify('🛥️')).toEqual('🛥️'); - expect(emojify('🚢')).toEqual('🚢'); - expect(emojify('✈️')).toEqual('✈️'); - expect(emojify('🛩️')).toEqual('🛩️'); - expect(emojify('🛫')).toEqual('🛫'); - expect(emojify('🛬')).toEqual('🛬'); - expect(emojify('🪂')).toEqual('🪂'); - expect(emojify('💺')).toEqual('💺'); - expect(emojify('🚁')).toEqual('🚁'); - expect(emojify('🚟')).toEqual('🚟'); - expect(emojify('🚠')).toEqual('🚠'); - expect(emojify('🚡')).toEqual('🚡'); - expect(emojify('🛰️')).toEqual('🛰️'); - expect(emojify('🚀')).toEqual('🚀'); - expect(emojify('🛸')).toEqual('🛸'); - expect(emojify('🛎️')).toEqual('🛎️'); - expect(emojify('🧳')).toEqual('🧳'); - expect(emojify('⌛')).toEqual('⌛'); - expect(emojify('⏳')).toEqual('⏳'); - expect(emojify('⌚')).toEqual('⌚'); - expect(emojify('⏰')).toEqual('⏰'); - expect(emojify('⏱️')).toEqual('⏱️'); - expect(emojify('⏲️')).toEqual('⏲️'); - expect(emojify('🕰️')).toEqual('🕰️'); - expect(emojify('🕛')).toEqual('🕛'); - expect(emojify('🕧')).toEqual('🕧'); - expect(emojify('🕐')).toEqual('🕐'); - expect(emojify('🕜')).toEqual('🕜'); - expect(emojify('🕑')).toEqual('🕑'); - expect(emojify('🕝')).toEqual('🕝'); - expect(emojify('🕒')).toEqual('🕒'); - expect(emojify('🕞')).toEqual('🕞'); - expect(emojify('🕓')).toEqual('🕓'); - expect(emojify('🕟')).toEqual('🕟'); - expect(emojify('🕔')).toEqual('🕔'); - expect(emojify('🕠')).toEqual('🕠'); - expect(emojify('🕕')).toEqual('🕕'); - expect(emojify('🕡')).toEqual('🕡'); - expect(emojify('🕖')).toEqual('🕖'); - expect(emojify('🕢')).toEqual('🕢'); - expect(emojify('🕗')).toEqual('🕗'); - expect(emojify('🕣')).toEqual('🕣'); - expect(emojify('🕘')).toEqual('🕘'); - expect(emojify('🕤')).toEqual('🕤'); - expect(emojify('🕙')).toEqual('🕙'); - expect(emojify('🕥')).toEqual('🕥'); - expect(emojify('🕚')).toEqual('🕚'); - expect(emojify('🕦')).toEqual('🕦'); - expect(emojify('🌑')).toEqual('🌑'); - expect(emojify('🌒')).toEqual('🌒'); - expect(emojify('🌓')).toEqual('🌓'); - expect(emojify('🌔')).toEqual('🌔'); - expect(emojify('🌕')).toEqual('🌕'); - expect(emojify('🌖')).toEqual('🌖'); - expect(emojify('🌗')).toEqual('🌗'); - expect(emojify('🌘')).toEqual('🌘'); - expect(emojify('🌙')).toEqual('🌙'); - expect(emojify('🌚')).toEqual('🌚'); - expect(emojify('🌛')).toEqual('🌛'); - expect(emojify('🌜')).toEqual('🌜'); - expect(emojify('🌡️')).toEqual('🌡️'); - expect(emojify('☀️')).toEqual('☀️'); - expect(emojify('🌝')).toEqual('🌝'); - expect(emojify('🌞')).toEqual('🌞'); - expect(emojify('🪐')).toEqual('🪐'); - expect(emojify('⭐')).toEqual('⭐'); - expect(emojify('🌟')).toEqual('🌟'); - expect(emojify('🌠')).toEqual('🌠'); - expect(emojify('🌌')).toEqual('🌌'); - expect(emojify('☁️')).toEqual('☁️'); - expect(emojify('⛅')).toEqual('⛅'); - expect(emojify('⛈️')).toEqual('⛈️'); - expect(emojify('🌤️')).toEqual('🌤️'); - expect(emojify('🌥️')).toEqual('🌥️'); - expect(emojify('🌦️')).toEqual('🌦️'); - expect(emojify('🌧️')).toEqual('🌧️'); - expect(emojify('🌨️')).toEqual('🌨️'); - expect(emojify('🌩️')).toEqual('🌩️'); - expect(emojify('🌪️')).toEqual('🌪️'); - expect(emojify('🌫️')).toEqual('🌫️'); - expect(emojify('🌬️')).toEqual('🌬️'); - expect(emojify('🌀')).toEqual('🌀'); - expect(emojify('🌈')).toEqual('🌈'); - expect(emojify('🌂')).toEqual('🌂'); - expect(emojify('☂️')).toEqual('☂️'); - expect(emojify('☔')).toEqual('☔'); - expect(emojify('⛱️')).toEqual('⛱️'); - expect(emojify('⚡')).toEqual('⚡'); - expect(emojify('❄️')).toEqual('❄️'); - expect(emojify('☃️')).toEqual('☃️'); - expect(emojify('⛄')).toEqual('⛄'); - expect(emojify('☄️')).toEqual('☄️'); - expect(emojify('🔥')).toEqual('🔥'); - expect(emojify('💧')).toEqual('💧'); - expect(emojify('🌊')).toEqual('🌊'); - expect(emojify('🎃')).toEqual('🎃'); - expect(emojify('🎄')).toEqual('🎄'); - expect(emojify('🎆')).toEqual('🎆'); - expect(emojify('🎇')).toEqual('🎇'); - expect(emojify('🧨')).toEqual('🧨'); - expect(emojify('✨')).toEqual('✨'); - expect(emojify('🎈')).toEqual('🎈'); - expect(emojify('🎉')).toEqual('🎉'); - expect(emojify('🎊')).toEqual('🎊'); - expect(emojify('🎋')).toEqual('🎋'); - expect(emojify('🎍')).toEqual('🎍'); - expect(emojify('🎎')).toEqual('🎎'); - expect(emojify('🎏')).toEqual('🎏'); - expect(emojify('🎐')).toEqual('🎐'); - expect(emojify('🎑')).toEqual('🎑'); - expect(emojify('🧧')).toEqual('🧧'); - expect(emojify('🎀')).toEqual('🎀'); - expect(emojify('🎁')).toEqual('🎁'); - expect(emojify('🎗️')).toEqual('🎗️'); - expect(emojify('🎟️')).toEqual('🎟️'); - expect(emojify('🎫')).toEqual('🎫'); - expect(emojify('🎖️')).toEqual('🎖️'); - expect(emojify('🏆')).toEqual('🏆'); - expect(emojify('🏅')).toEqual('🏅'); - expect(emojify('🥇')).toEqual('🥇'); - expect(emojify('🥈')).toEqual('🥈'); - expect(emojify('🥉')).toEqual('🥉'); - expect(emojify('⚽')).toEqual('⚽'); - expect(emojify('⚾')).toEqual('⚾'); - expect(emojify('🥎')).toEqual('🥎'); - expect(emojify('🏀')).toEqual('🏀'); - expect(emojify('🏐')).toEqual('🏐'); - expect(emojify('🏈')).toEqual('🏈'); - expect(emojify('🏉')).toEqual('🏉'); - expect(emojify('🎾')).toEqual('🎾'); - expect(emojify('🥏')).toEqual('🥏'); - expect(emojify('🎳')).toEqual('🎳'); - expect(emojify('🏏')).toEqual('🏏'); - expect(emojify('🏑')).toEqual('🏑'); - expect(emojify('🏒')).toEqual('🏒'); - expect(emojify('🥍')).toEqual('🥍'); - expect(emojify('🏓')).toEqual('🏓'); - expect(emojify('🏸')).toEqual('🏸'); - expect(emojify('🥊')).toEqual('🥊'); - expect(emojify('🥋')).toEqual('🥋'); - expect(emojify('🥅')).toEqual('🥅'); - expect(emojify('⛳')).toEqual('⛳'); - expect(emojify('⛸️')).toEqual('⛸️'); - expect(emojify('🎣')).toEqual('🎣'); - expect(emojify('🤿')).toEqual('🤿'); - expect(emojify('🎽')).toEqual('🎽'); - expect(emojify('🎿')).toEqual('🎿'); - expect(emojify('🛷')).toEqual('🛷'); - expect(emojify('🥌')).toEqual('🥌'); - expect(emojify('🎯')).toEqual('🎯'); - expect(emojify('🪀')).toEqual('🪀'); - expect(emojify('🪁')).toEqual('🪁'); - expect(emojify('🎱')).toEqual('🎱'); - expect(emojify('🔮')).toEqual('🔮'); - expect(emojify('🪄')).toEqual('🪄'); - expect(emojify('🧿')).toEqual('🧿'); - expect(emojify('🪬')).toEqual('🪬'); - expect(emojify('🎮')).toEqual('🎮'); - expect(emojify('🕹️')).toEqual('🕹️'); - expect(emojify('🎰')).toEqual('🎰'); - expect(emojify('🎲')).toEqual('🎲'); - expect(emojify('🧩')).toEqual('🧩'); - expect(emojify('🧸')).toEqual('🧸'); - expect(emojify('🪅')).toEqual('🪅'); - expect(emojify('🪩')).toEqual('🪩'); - expect(emojify('🪆')).toEqual('🪆'); - expect(emojify('♠️')).toEqual('♠️'); - expect(emojify('♥️')).toEqual('♥️'); - expect(emojify('♦️')).toEqual('♦️'); - expect(emojify('♣️')).toEqual('♣️'); - expect(emojify('♟️')).toEqual('♟️'); - expect(emojify('🃏')).toEqual('🃏'); - expect(emojify('🀄')).toEqual('🀄'); - expect(emojify('🎴')).toEqual('🎴'); - expect(emojify('🎭')).toEqual('🎭'); - expect(emojify('🖼️')).toEqual('🖼️'); - expect(emojify('🎨')).toEqual('🎨'); - expect(emojify('🧵')).toEqual('🧵'); - expect(emojify('🪡')).toEqual('🪡'); - expect(emojify('🧶')).toEqual('🧶'); - expect(emojify('🪢')).toEqual('🪢'); - expect(emojify('👓')).toEqual('👓'); - expect(emojify('🕶️')).toEqual('🕶️'); - expect(emojify('🥽')).toEqual('🥽'); - expect(emojify('🥼')).toEqual('🥼'); - expect(emojify('🦺')).toEqual('🦺'); - expect(emojify('👔')).toEqual('👔'); - expect(emojify('👕')).toEqual('👕'); - expect(emojify('👖')).toEqual('👖'); - expect(emojify('🧣')).toEqual('🧣'); - expect(emojify('🧤')).toEqual('🧤'); - expect(emojify('🧥')).toEqual('🧥'); - expect(emojify('🧦')).toEqual('🧦'); - expect(emojify('👗')).toEqual('👗'); - expect(emojify('👘')).toEqual('👘'); - expect(emojify('🥻')).toEqual('🥻'); - expect(emojify('🩱')).toEqual('🩱'); - expect(emojify('🩲')).toEqual('🩲'); - expect(emojify('🩳')).toEqual('🩳'); - expect(emojify('👙')).toEqual('👙'); - expect(emojify('👚')).toEqual('👚'); - expect(emojify('👛')).toEqual('👛'); - expect(emojify('👜')).toEqual('👜'); - expect(emojify('👝')).toEqual('👝'); - expect(emojify('🛍️')).toEqual('🛍️'); - expect(emojify('🎒')).toEqual('🎒'); - expect(emojify('🩴')).toEqual('🩴'); - expect(emojify('👞')).toEqual('👞'); - expect(emojify('👟')).toEqual('👟'); - expect(emojify('🥾')).toEqual('🥾'); - expect(emojify('🥿')).toEqual('🥿'); - expect(emojify('👠')).toEqual('👠'); - expect(emojify('👡')).toEqual('👡'); - expect(emojify('🩰')).toEqual('🩰'); - expect(emojify('👢')).toEqual('👢'); - expect(emojify('👑')).toEqual('👑'); - expect(emojify('👒')).toEqual('👒'); - expect(emojify('🎩')).toEqual('🎩'); - expect(emojify('🎓')).toEqual('🎓'); - expect(emojify('🧢')).toEqual('🧢'); - expect(emojify('🪖')).toEqual('🪖'); - expect(emojify('⛑️')).toEqual('⛑️'); - expect(emojify('📿')).toEqual('📿'); - expect(emojify('💄')).toEqual('💄'); - expect(emojify('💍')).toEqual('💍'); - expect(emojify('💎')).toEqual('💎'); - expect(emojify('🔇')).toEqual('🔇'); - expect(emojify('🔈')).toEqual('🔈'); - expect(emojify('🔉')).toEqual('🔉'); - expect(emojify('🔊')).toEqual('🔊'); - expect(emojify('📢')).toEqual('📢'); - expect(emojify('📣')).toEqual('📣'); - expect(emojify('📯')).toEqual('📯'); - expect(emojify('🔔')).toEqual('🔔'); - expect(emojify('🔕')).toEqual('🔕'); - expect(emojify('🎼')).toEqual('🎼'); - expect(emojify('🎵')).toEqual('🎵'); - expect(emojify('🎶')).toEqual('🎶'); - expect(emojify('🎙️')).toEqual('🎙️'); - expect(emojify('🎚️')).toEqual('🎚️'); - expect(emojify('🎛️')).toEqual('🎛️'); - expect(emojify('🎤')).toEqual('🎤'); - expect(emojify('🎧')).toEqual('🎧'); - expect(emojify('📻')).toEqual('📻'); - expect(emojify('🎷')).toEqual('🎷'); - expect(emojify('🪗')).toEqual('🪗'); - expect(emojify('🎸')).toEqual('🎸'); - expect(emojify('🎹')).toEqual('🎹'); - expect(emojify('🎺')).toEqual('🎺'); - expect(emojify('🎻')).toEqual('🎻'); - expect(emojify('🪕')).toEqual('🪕'); - expect(emojify('🥁')).toEqual('🥁'); - expect(emojify('🪘')).toEqual('🪘'); - expect(emojify('📱')).toEqual('📱'); - expect(emojify('📲')).toEqual('📲'); - expect(emojify('☎️')).toEqual('☎️'); - expect(emojify('📞')).toEqual('📞'); - expect(emojify('📟')).toEqual('📟'); - expect(emojify('📠')).toEqual('📠'); - expect(emojify('🔋')).toEqual('🔋'); - expect(emojify('🪫')).toEqual('🪫'); - expect(emojify('🔌')).toEqual('🔌'); - expect(emojify('💻')).toEqual('💻'); - expect(emojify('🖥️')).toEqual('🖥️'); - expect(emojify('🖨️')).toEqual('🖨️'); - expect(emojify('⌨️')).toEqual('⌨️'); - expect(emojify('🖱️')).toEqual('🖱️'); - expect(emojify('🖲️')).toEqual('🖲️'); - expect(emojify('💽')).toEqual('💽'); - expect(emojify('💾')).toEqual('💾'); - expect(emojify('💿')).toEqual('💿'); - expect(emojify('📀')).toEqual('📀'); - expect(emojify('🧮')).toEqual('🧮'); - expect(emojify('🎥')).toEqual('🎥'); - expect(emojify('🎞️')).toEqual('🎞️'); - expect(emojify('📽️')).toEqual('📽️'); - expect(emojify('🎬')).toEqual('🎬'); - expect(emojify('📺')).toEqual('📺'); - expect(emojify('📷')).toEqual('📷'); - expect(emojify('📸')).toEqual('📸'); - expect(emojify('📹')).toEqual('📹'); - expect(emojify('📼')).toEqual('📼'); - expect(emojify('🔍')).toEqual('🔍'); - expect(emojify('🔎')).toEqual('🔎'); - expect(emojify('🕯️')).toEqual('🕯️'); - expect(emojify('💡')).toEqual('💡'); - expect(emojify('🔦')).toEqual('🔦'); - expect(emojify('🏮')).toEqual('🏮'); - expect(emojify('🪔')).toEqual('🪔'); - expect(emojify('📔')).toEqual('📔'); - expect(emojify('📕')).toEqual('📕'); - expect(emojify('📖')).toEqual('📖'); - expect(emojify('📗')).toEqual('📗'); - expect(emojify('📘')).toEqual('📘'); - expect(emojify('📙')).toEqual('📙'); - expect(emojify('📚')).toEqual('📚'); - expect(emojify('📓')).toEqual('📓'); - expect(emojify('📒')).toEqual('📒'); - expect(emojify('📃')).toEqual('📃'); - expect(emojify('📜')).toEqual('📜'); - expect(emojify('📄')).toEqual('📄'); - expect(emojify('📰')).toEqual('📰'); - expect(emojify('🗞️')).toEqual('🗞️'); - expect(emojify('📑')).toEqual('📑'); - expect(emojify('🔖')).toEqual('🔖'); - expect(emojify('🏷️')).toEqual('🏷️'); - expect(emojify('💰')).toEqual('💰'); - expect(emojify('🪙')).toEqual('🪙'); - expect(emojify('💴')).toEqual('💴'); - expect(emojify('💵')).toEqual('💵'); - expect(emojify('💶')).toEqual('💶'); - expect(emojify('💷')).toEqual('💷'); - expect(emojify('💸')).toEqual('💸'); - expect(emojify('💳')).toEqual('💳'); - expect(emojify('🧾')).toEqual('🧾'); - expect(emojify('💹')).toEqual('💹'); - expect(emojify('✉️')).toEqual('✉️'); - expect(emojify('📧')).toEqual('📧'); - expect(emojify('📨')).toEqual('📨'); - expect(emojify('📩')).toEqual('📩'); - expect(emojify('📤')).toEqual('📤'); - expect(emojify('📥')).toEqual('📥'); - expect(emojify('📦')).toEqual('📦'); - expect(emojify('📫')).toEqual('📫'); - expect(emojify('📪')).toEqual('📪'); - expect(emojify('📬')).toEqual('📬'); - expect(emojify('📭')).toEqual('📭'); - expect(emojify('📮')).toEqual('📮'); - expect(emojify('🗳️')).toEqual('🗳️'); - expect(emojify('✏️')).toEqual('✏️'); - expect(emojify('✒️')).toEqual('✒️'); - expect(emojify('🖋️')).toEqual('🖋️'); - expect(emojify('🖊️')).toEqual('🖊️'); - expect(emojify('🖌️')).toEqual('🖌️'); - expect(emojify('🖍️')).toEqual('🖍️'); - expect(emojify('📝')).toEqual('📝'); - expect(emojify('💼')).toEqual('💼'); - expect(emojify('📁')).toEqual('📁'); - expect(emojify('📂')).toEqual('📂'); - expect(emojify('🗂️')).toEqual('🗂️'); - expect(emojify('📅')).toEqual('📅'); - expect(emojify('📆')).toEqual('📆'); - expect(emojify('🗒️')).toEqual('🗒️'); - expect(emojify('🗓️')).toEqual('🗓️'); - expect(emojify('📇')).toEqual('📇'); - expect(emojify('📈')).toEqual('📈'); - expect(emojify('📉')).toEqual('📉'); - expect(emojify('📊')).toEqual('📊'); - expect(emojify('📋')).toEqual('📋'); - expect(emojify('📌')).toEqual('📌'); - expect(emojify('📍')).toEqual('📍'); - expect(emojify('📎')).toEqual('📎'); - expect(emojify('🖇️')).toEqual('🖇️'); - expect(emojify('📏')).toEqual('📏'); - expect(emojify('📐')).toEqual('📐'); - expect(emojify('✂️')).toEqual('✂️'); - expect(emojify('🗃️')).toEqual('🗃️'); - expect(emojify('🗄️')).toEqual('🗄️'); - expect(emojify('🗑️')).toEqual('🗑️'); - expect(emojify('🔒')).toEqual('🔒'); - expect(emojify('🔓')).toEqual('🔓'); - expect(emojify('🔏')).toEqual('🔏'); - expect(emojify('🔐')).toEqual('🔐'); - expect(emojify('🔑')).toEqual('🔑'); - expect(emojify('🗝️')).toEqual('🗝️'); - expect(emojify('🔨')).toEqual('🔨'); - expect(emojify('🪓')).toEqual('🪓'); - expect(emojify('⛏️')).toEqual('⛏️'); - expect(emojify('⚒️')).toEqual('⚒️'); - expect(emojify('🛠️')).toEqual('🛠️'); - expect(emojify('🗡️')).toEqual('🗡️'); - expect(emojify('⚔️')).toEqual('⚔️'); - expect(emojify('🔫')).toEqual('🔫'); - expect(emojify('🪃')).toEqual('🪃'); - expect(emojify('🏹')).toEqual('🏹'); - expect(emojify('🛡️')).toEqual('🛡️'); - expect(emojify('🪚')).toEqual('🪚'); - expect(emojify('🔧')).toEqual('🔧'); - expect(emojify('🪛')).toEqual('🪛'); - expect(emojify('🔩')).toEqual('🔩'); - expect(emojify('⚙️')).toEqual('⚙️'); - expect(emojify('🗜️')).toEqual('🗜️'); - expect(emojify('⚖️')).toEqual('⚖️'); - expect(emojify('🦯')).toEqual('🦯'); - expect(emojify('🔗')).toEqual('🔗'); - expect(emojify('⛓️')).toEqual('⛓️'); - expect(emojify('🪝')).toEqual('🪝'); - expect(emojify('🧰')).toEqual('🧰'); - expect(emojify('🧲')).toEqual('🧲'); - expect(emojify('🪜')).toEqual('🪜'); - expect(emojify('⚗️')).toEqual('⚗️'); - expect(emojify('🧪')).toEqual('🧪'); - expect(emojify('🧫')).toEqual('🧫'); - expect(emojify('🧬')).toEqual('🧬'); - expect(emojify('🔬')).toEqual('🔬'); - expect(emojify('🔭')).toEqual('🔭'); - expect(emojify('📡')).toEqual('📡'); - expect(emojify('💉')).toEqual('💉'); - expect(emojify('🩸')).toEqual('🩸'); - expect(emojify('💊')).toEqual('💊'); - expect(emojify('🩹')).toEqual('🩹'); - expect(emojify('🩼')).toEqual('🩼'); - expect(emojify('🩺')).toEqual('🩺'); - expect(emojify('🩻')).toEqual('🩻'); - expect(emojify('🚪')).toEqual('🚪'); - expect(emojify('🛗')).toEqual('🛗'); - expect(emojify('🪞')).toEqual('🪞'); - expect(emojify('🪟')).toEqual('🪟'); - expect(emojify('🛏️')).toEqual('🛏️'); - expect(emojify('🛋️')).toEqual('🛋️'); - expect(emojify('🪑')).toEqual('🪑'); - expect(emojify('🚽')).toEqual('🚽'); - expect(emojify('🪠')).toEqual('🪠'); - expect(emojify('🚿')).toEqual('🚿'); - expect(emojify('🛁')).toEqual('🛁'); - expect(emojify('🪤')).toEqual('🪤'); - expect(emojify('🪒')).toEqual('🪒'); - expect(emojify('🧴')).toEqual('🧴'); - expect(emojify('🧷')).toEqual('🧷'); - expect(emojify('🧹')).toEqual('🧹'); - expect(emojify('🧺')).toEqual('🧺'); - expect(emojify('🧻')).toEqual('🧻'); - expect(emojify('🪣')).toEqual('🪣'); - expect(emojify('🧼')).toEqual('🧼'); - expect(emojify('🫧')).toEqual('🫧'); - expect(emojify('🪥')).toEqual('🪥'); - expect(emojify('🧽')).toEqual('🧽'); - expect(emojify('🧯')).toEqual('🧯'); - expect(emojify('🛒')).toEqual('🛒'); - expect(emojify('🚬')).toEqual('🚬'); - expect(emojify('⚰️')).toEqual('⚰️'); - expect(emojify('🪦')).toEqual('🪦'); - expect(emojify('⚱️')).toEqual('⚱️'); - expect(emojify('🗿')).toEqual('🗿'); - expect(emojify('🪧')).toEqual('🪧'); - expect(emojify('🪪')).toEqual('🪪'); - expect(emojify('🏧')).toEqual('🏧'); - expect(emojify('🚮')).toEqual('🚮'); - expect(emojify('🚰')).toEqual('🚰'); - expect(emojify('♿')).toEqual('♿'); - expect(emojify('🚹')).toEqual('🚹'); - expect(emojify('🚺')).toEqual('🚺'); - expect(emojify('🚻')).toEqual('🚻'); - expect(emojify('🚼')).toEqual('🚼'); - expect(emojify('🚾')).toEqual('🚾'); - expect(emojify('🛂')).toEqual('🛂'); - expect(emojify('🛃')).toEqual('🛃'); - expect(emojify('🛄')).toEqual('🛄'); - expect(emojify('🛅')).toEqual('🛅'); - expect(emojify('⚠️')).toEqual('⚠️'); - expect(emojify('🚸')).toEqual('🚸'); - expect(emojify('⛔')).toEqual('⛔'); - expect(emojify('🚫')).toEqual('🚫'); - expect(emojify('🚳')).toEqual('🚳'); - expect(emojify('🚭')).toEqual('🚭'); - expect(emojify('🚯')).toEqual('🚯'); - expect(emojify('🚱')).toEqual('🚱'); - expect(emojify('🚷')).toEqual('🚷'); - expect(emojify('📵')).toEqual('📵'); - expect(emojify('🔞')).toEqual('🔞'); - expect(emojify('☢️')).toEqual('☢️'); - expect(emojify('☣️')).toEqual('☣️'); - expect(emojify('⬆️')).toEqual('⬆️'); - expect(emojify('↗️')).toEqual('↗️'); - expect(emojify('➡️')).toEqual('➡️'); - expect(emojify('↘️')).toEqual('↘️'); - expect(emojify('⬇️')).toEqual('⬇️'); - expect(emojify('↙️')).toEqual('↙️'); - expect(emojify('⬅️')).toEqual('⬅️'); - expect(emojify('↖️')).toEqual('↖️'); - expect(emojify('↕️')).toEqual('↕️'); - expect(emojify('↔️')).toEqual('↔️'); - expect(emojify('↩️')).toEqual('↩️'); - expect(emojify('↪️')).toEqual('↪️'); - expect(emojify('⤴️')).toEqual('⤴️'); - expect(emojify('⤵️')).toEqual('⤵️'); - expect(emojify('🔃')).toEqual('🔃'); - expect(emojify('🔄')).toEqual('🔄'); - expect(emojify('🔙')).toEqual('🔙'); - expect(emojify('🔚')).toEqual('🔚'); - expect(emojify('🔛')).toEqual('🔛'); - expect(emojify('🔜')).toEqual('🔜'); - expect(emojify('🔝')).toEqual('🔝'); - expect(emojify('🛐')).toEqual('🛐'); - expect(emojify('⚛️')).toEqual('⚛️'); - expect(emojify('🕉️')).toEqual('🕉️'); - expect(emojify('✡️')).toEqual('✡️'); - expect(emojify('☸️')).toEqual('☸️'); - expect(emojify('☯️')).toEqual('☯️'); - expect(emojify('✝️')).toEqual('✝️'); - expect(emojify('☦️')).toEqual('☦️'); - expect(emojify('☪️')).toEqual('☪️'); - expect(emojify('☮️')).toEqual('☮️'); - expect(emojify('🕎')).toEqual('🕎'); - expect(emojify('🔯')).toEqual('🔯'); - expect(emojify('♈')).toEqual('♈'); - expect(emojify('♉')).toEqual('♉'); - expect(emojify('♊')).toEqual('♊'); - expect(emojify('♋')).toEqual('♋'); - expect(emojify('♌')).toEqual('♌'); - expect(emojify('♍')).toEqual('♍'); - expect(emojify('♎')).toEqual('♎'); - expect(emojify('♏')).toEqual('♏'); - expect(emojify('♐')).toEqual('♐'); - expect(emojify('♑')).toEqual('♑'); - expect(emojify('♒')).toEqual('♒'); - expect(emojify('♓')).toEqual('♓'); - expect(emojify('⛎')).toEqual('⛎'); - expect(emojify('🔀')).toEqual('🔀'); - expect(emojify('🔁')).toEqual('🔁'); - expect(emojify('🔂')).toEqual('🔂'); - expect(emojify('▶️')).toEqual('▶️'); - expect(emojify('⏩')).toEqual('⏩'); - expect(emojify('⏭️')).toEqual('⏭️'); - expect(emojify('⏯️')).toEqual('⏯️'); - expect(emojify('◀️')).toEqual('◀️'); - expect(emojify('⏪')).toEqual('⏪'); - expect(emojify('⏮️')).toEqual('⏮️'); - expect(emojify('🔼')).toEqual('🔼'); - expect(emojify('⏫')).toEqual('⏫'); - expect(emojify('🔽')).toEqual('🔽'); - expect(emojify('⏬')).toEqual('⏬'); - expect(emojify('⏸️')).toEqual('⏸️'); - expect(emojify('⏹️')).toEqual('⏹️'); - expect(emojify('⏺️')).toEqual('⏺️'); - expect(emojify('⏏️')).toEqual('⏏️'); - expect(emojify('🎦')).toEqual('🎦'); - expect(emojify('🔅')).toEqual('🔅'); - expect(emojify('🔆')).toEqual('🔆'); - expect(emojify('📶')).toEqual('📶'); - expect(emojify('📳')).toEqual('📳'); - expect(emojify('📴')).toEqual('📴'); - expect(emojify('♀️')).toEqual('♀️'); - expect(emojify('♂️')).toEqual('♂️'); - expect(emojify('⚧️')).toEqual('⚧️'); - expect(emojify('✖️')).toEqual('✖️'); - expect(emojify('➕')).toEqual('➕'); - expect(emojify('➖')).toEqual('➖'); - expect(emojify('➗')).toEqual('➗'); - expect(emojify('🟰')).toEqual('🟰'); - expect(emojify('♾️')).toEqual('♾️'); - expect(emojify('‼️')).toEqual('‼️'); - expect(emojify('⁉️')).toEqual('⁉️'); - expect(emojify('❓')).toEqual('❓'); - expect(emojify('❔')).toEqual('❔'); - expect(emojify('❕')).toEqual('❕'); - expect(emojify('❗')).toEqual('❗'); - expect(emojify('〰️')).toEqual('〰️'); - expect(emojify('💱')).toEqual('💱'); - expect(emojify('💲')).toEqual('💲'); - expect(emojify('⚕️')).toEqual('⚕️'); - expect(emojify('♻️')).toEqual('♻️'); - expect(emojify('⚜️')).toEqual('⚜️'); - expect(emojify('🔱')).toEqual('🔱'); - expect(emojify('📛')).toEqual('📛'); - expect(emojify('🔰')).toEqual('🔰'); - expect(emojify('⭕')).toEqual('⭕'); - expect(emojify('✅')).toEqual('✅'); - expect(emojify('☑️')).toEqual('☑️'); - expect(emojify('✔️')).toEqual('✔️'); - expect(emojify('❌')).toEqual('❌'); - expect(emojify('❎')).toEqual('❎'); - expect(emojify('➰')).toEqual('➰'); - expect(emojify('➿')).toEqual('➿'); - expect(emojify('〽️')).toEqual('〽️'); - expect(emojify('✳️')).toEqual('✳️'); - expect(emojify('✴️')).toEqual('✴️'); - expect(emojify('❇️')).toEqual('❇️'); - expect(emojify('©️')).toEqual('©️'); - expect(emojify('®️')).toEqual('®️'); - expect(emojify('™️')).toEqual('™️'); - expect(emojify('#️⃣')).toEqual('#️⃣'); - expect(emojify('*️⃣')).toEqual('*️⃣'); - expect(emojify('0️⃣')).toEqual('0️⃣'); - expect(emojify('1️⃣')).toEqual('1️⃣'); - expect(emojify('2️⃣')).toEqual('2️⃣'); - expect(emojify('3️⃣')).toEqual('3️⃣'); - expect(emojify('4️⃣')).toEqual('4️⃣'); - expect(emojify('5️⃣')).toEqual('5️⃣'); - expect(emojify('6️⃣')).toEqual('6️⃣'); - expect(emojify('7️⃣')).toEqual('7️⃣'); - expect(emojify('8️⃣')).toEqual('8️⃣'); - expect(emojify('9️⃣')).toEqual('9️⃣'); - expect(emojify('🔟')).toEqual('🔟'); - expect(emojify('🔠')).toEqual('🔠'); - expect(emojify('🔡')).toEqual('🔡'); - expect(emojify('🔣')).toEqual('🔣'); - expect(emojify('🔤')).toEqual('🔤'); - expect(emojify('🅰️')).toEqual('🅰️'); - expect(emojify('🆎')).toEqual('🆎'); - expect(emojify('🅱️')).toEqual('🅱️'); - expect(emojify('🆑')).toEqual('🆑'); - expect(emojify('🆒')).toEqual('🆒'); - expect(emojify('🆓')).toEqual('🆓'); - expect(emojify('ℹ️')).toEqual('ℹ️'); - expect(emojify('🆔')).toEqual('🆔'); - expect(emojify('Ⓜ️')).toEqual('Ⓜ️'); - expect(emojify('🆕')).toEqual('🆕'); - expect(emojify('🆖')).toEqual('🆖'); - expect(emojify('🅾️')).toEqual('🅾️'); - expect(emojify('🆗')).toEqual('🆗'); - expect(emojify('🅿️')).toEqual('🅿️'); - expect(emojify('🆘')).toEqual('🆘'); - expect(emojify('🆙')).toEqual('🆙'); - expect(emojify('🆚')).toEqual('🆚'); - expect(emojify('🈁')).toEqual('🈁'); - expect(emojify('🈂️')).toEqual('🈂️'); - expect(emojify('🈷️')).toEqual('🈷️'); - expect(emojify('🈶')).toEqual('🈶'); - expect(emojify('🈯')).toEqual('🈯'); - expect(emojify('🉐')).toEqual('🉐'); - expect(emojify('🈹')).toEqual('🈹'); - expect(emojify('🈚')).toEqual('🈚'); - expect(emojify('🈲')).toEqual('🈲'); - expect(emojify('🉑')).toEqual('🉑'); - expect(emojify('🈸')).toEqual('🈸'); - expect(emojify('🈴')).toEqual('🈴'); - expect(emojify('🈳')).toEqual('🈳'); - expect(emojify('㊗️')).toEqual('㊗️'); - expect(emojify('㊙️')).toEqual('㊙️'); - expect(emojify('🈺')).toEqual('🈺'); - expect(emojify('🈵')).toEqual('🈵'); - expect(emojify('🔴')).toEqual('🔴'); - expect(emojify('🟠')).toEqual('🟠'); - expect(emojify('🟡')).toEqual('🟡'); - expect(emojify('🟢')).toEqual('🟢'); - expect(emojify('🔵')).toEqual('🔵'); - expect(emojify('🟣')).toEqual('🟣'); - expect(emojify('🟤')).toEqual('🟤'); - expect(emojify('⚫')).toEqual('⚫'); - expect(emojify('⚪')).toEqual('⚪'); - expect(emojify('🟥')).toEqual('🟥'); - expect(emojify('🟧')).toEqual('🟧'); - expect(emojify('🟨')).toEqual('🟨'); - expect(emojify('🟩')).toEqual('🟩'); - expect(emojify('🟦')).toEqual('🟦'); - expect(emojify('🟪')).toEqual('🟪'); - expect(emojify('🟫')).toEqual('🟫'); - expect(emojify('⬛')).toEqual('⬛'); - expect(emojify('⬜')).toEqual('⬜'); - expect(emojify('◼️')).toEqual('◼️'); - expect(emojify('◻️')).toEqual('◻️'); - expect(emojify('◾')).toEqual('◾'); - expect(emojify('◽')).toEqual('◽'); - expect(emojify('▪️')).toEqual('▪️'); - expect(emojify('▫️')).toEqual('▫️'); - expect(emojify('🔶')).toEqual('🔶'); - expect(emojify('🔷')).toEqual('🔷'); - expect(emojify('🔸')).toEqual('🔸'); - expect(emojify('🔹')).toEqual('🔹'); - expect(emojify('🔺')).toEqual('🔺'); - expect(emojify('🔻')).toEqual('🔻'); - expect(emojify('💠')).toEqual('💠'); - expect(emojify('🔘')).toEqual('🔘'); - expect(emojify('🔳')).toEqual('🔳'); - expect(emojify('🔲')).toEqual('🔲'); - expect(emojify('🏁')).toEqual('🏁'); - expect(emojify('🚩')).toEqual('🚩'); - expect(emojify('🎌')).toEqual('🎌'); - expect(emojify('🏴')).toEqual('🏴'); - expect(emojify('🏳️')).toEqual('🏳️'); - expect(emojify('🏳️‍🌈')).toEqual('🏳️‍🌈'); - expect(emojify('🏳️‍⚧️')).toEqual('🏳️‍⚧️'); - expect(emojify('🏴‍☠️')).toEqual('🏴‍☠️'); - expect(emojify('🇦🇨')).toEqual('🇦🇨'); - expect(emojify('🇦🇩')).toEqual('🇦🇩'); - expect(emojify('🇦🇪')).toEqual('🇦🇪'); - expect(emojify('🇦🇫')).toEqual('🇦🇫'); - expect(emojify('🇦🇬')).toEqual('🇦🇬'); - expect(emojify('🇦🇮')).toEqual('🇦🇮'); - expect(emojify('🇦🇱')).toEqual('🇦🇱'); - expect(emojify('🇦🇲')).toEqual('🇦🇲'); - expect(emojify('🇦🇴')).toEqual('🇦🇴'); - expect(emojify('🇦🇶')).toEqual('🇦🇶'); - expect(emojify('🇦🇷')).toEqual('🇦🇷'); - expect(emojify('🇦🇸')).toEqual('🇦🇸'); - expect(emojify('🇦🇹')).toEqual('🇦🇹'); - expect(emojify('🇦🇺')).toEqual('🇦🇺'); - expect(emojify('🇦🇼')).toEqual('🇦🇼'); - expect(emojify('🇦🇽')).toEqual('🇦🇽'); - expect(emojify('🇦🇿')).toEqual('🇦🇿'); - expect(emojify('🇧🇦')).toEqual('🇧🇦'); - expect(emojify('🇧🇧')).toEqual('🇧🇧'); - expect(emojify('🇧🇩')).toEqual('🇧🇩'); - expect(emojify('🇧🇪')).toEqual('🇧🇪'); - expect(emojify('🇧🇫')).toEqual('🇧🇫'); - expect(emojify('🇧🇬')).toEqual('🇧🇬'); - expect(emojify('🇧🇭')).toEqual('🇧🇭'); - expect(emojify('🇧🇮')).toEqual('🇧🇮'); - expect(emojify('🇧🇯')).toEqual('🇧🇯'); - expect(emojify('🇧🇱')).toEqual('🇧🇱'); - expect(emojify('🇧🇲')).toEqual('🇧🇲'); - expect(emojify('🇧🇳')).toEqual('🇧🇳'); - expect(emojify('🇧🇴')).toEqual('🇧🇴'); - expect(emojify('🇧🇶')).toEqual('🇧🇶'); - expect(emojify('🇧🇷')).toEqual('🇧🇷'); - expect(emojify('🇧🇸')).toEqual('🇧🇸'); - expect(emojify('🇧🇹')).toEqual('🇧🇹'); - expect(emojify('🇧🇻')).toEqual('🇧🇻'); - expect(emojify('🇧🇼')).toEqual('🇧🇼'); - expect(emojify('🇧🇾')).toEqual('🇧🇾'); - expect(emojify('🇧🇿')).toEqual('🇧🇿'); - expect(emojify('🇨🇦')).toEqual('🇨🇦'); - expect(emojify('🇨🇨')).toEqual('🇨🇨'); - expect(emojify('🇨🇩')).toEqual('🇨🇩'); - expect(emojify('🇨🇫')).toEqual('🇨🇫'); - expect(emojify('🇨🇬')).toEqual('🇨🇬'); - expect(emojify('🇨🇭')).toEqual('🇨🇭'); - expect(emojify('🇨🇮')).toEqual('🇨🇮'); - expect(emojify('🇨🇰')).toEqual('🇨🇰'); - expect(emojify('🇨🇱')).toEqual('🇨🇱'); - expect(emojify('🇨🇲')).toEqual('🇨🇲'); - expect(emojify('🇨🇳')).toEqual('🇨🇳'); - expect(emojify('🇨🇴')).toEqual('🇨🇴'); - expect(emojify('🇨🇵')).toEqual('🇨🇵'); - expect(emojify('🇨🇷')).toEqual('🇨🇷'); - expect(emojify('🇨🇺')).toEqual('🇨🇺'); - expect(emojify('🇨🇻')).toEqual('🇨🇻'); - expect(emojify('🇨🇼')).toEqual('🇨🇼'); - expect(emojify('🇨🇽')).toEqual('🇨🇽'); - expect(emojify('🇨🇾')).toEqual('🇨🇾'); - expect(emojify('🇨🇿')).toEqual('🇨🇿'); - expect(emojify('🇩🇪')).toEqual('🇩🇪'); - expect(emojify('🇩🇬')).toEqual('🇩🇬'); - expect(emojify('🇩🇯')).toEqual('🇩🇯'); - expect(emojify('🇩🇰')).toEqual('🇩🇰'); - expect(emojify('🇩🇲')).toEqual('🇩🇲'); - expect(emojify('🇩🇴')).toEqual('🇩🇴'); - expect(emojify('🇩🇿')).toEqual('🇩🇿'); - expect(emojify('🇪🇦')).toEqual('🇪🇦'); - expect(emojify('🇪🇨')).toEqual('🇪🇨'); - expect(emojify('🇪🇪')).toEqual('🇪🇪'); - expect(emojify('🇪🇬')).toEqual('🇪🇬'); - expect(emojify('🇪🇭')).toEqual('🇪🇭'); - expect(emojify('🇪🇷')).toEqual('🇪🇷'); - expect(emojify('🇪🇸')).toEqual('🇪🇸'); - expect(emojify('🇪🇹')).toEqual('🇪🇹'); - expect(emojify('🇪🇺')).toEqual('🇪🇺'); - expect(emojify('🇫🇮')).toEqual('🇫🇮'); - expect(emojify('🇫🇯')).toEqual('🇫🇯'); - expect(emojify('🇫🇰')).toEqual('🇫🇰'); - expect(emojify('🇫🇲')).toEqual('🇫🇲'); - expect(emojify('🇫🇴')).toEqual('🇫🇴'); - expect(emojify('🇫🇷')).toEqual('🇫🇷'); - expect(emojify('🇬🇦')).toEqual('🇬🇦'); - expect(emojify('🇬🇧')).toEqual('🇬🇧'); - expect(emojify('🇬🇩')).toEqual('🇬🇩'); - expect(emojify('🇬🇪')).toEqual('🇬🇪'); - expect(emojify('🇬🇫')).toEqual('🇬🇫'); - expect(emojify('🇬🇬')).toEqual('🇬🇬'); - expect(emojify('🇬🇭')).toEqual('🇬🇭'); - expect(emojify('🇬🇮')).toEqual('🇬🇮'); - expect(emojify('🇬🇱')).toEqual('🇬🇱'); - expect(emojify('🇬🇲')).toEqual('🇬🇲'); - expect(emojify('🇬🇳')).toEqual('🇬🇳'); - expect(emojify('🇬🇵')).toEqual('🇬🇵'); - expect(emojify('🇬🇶')).toEqual('🇬🇶'); - expect(emojify('🇬🇷')).toEqual('🇬🇷'); - expect(emojify('🇬🇸')).toEqual('🇬🇸'); - expect(emojify('🇬🇹')).toEqual('🇬🇹'); - expect(emojify('🇬🇺')).toEqual('🇬🇺'); - expect(emojify('🇬🇼')).toEqual('🇬🇼'); - expect(emojify('🇬🇾')).toEqual('🇬🇾'); - expect(emojify('🇭🇰')).toEqual('🇭🇰'); - expect(emojify('🇭🇲')).toEqual('🇭🇲'); - expect(emojify('🇭🇳')).toEqual('🇭🇳'); - expect(emojify('🇭🇷')).toEqual('🇭🇷'); - expect(emojify('🇭🇹')).toEqual('🇭🇹'); - expect(emojify('🇭🇺')).toEqual('🇭🇺'); - expect(emojify('🇮🇨')).toEqual('🇮🇨'); - expect(emojify('🇮🇩')).toEqual('🇮🇩'); - expect(emojify('🇮🇪')).toEqual('🇮🇪'); - expect(emojify('🇮🇱')).toEqual('🇮🇱'); - expect(emojify('🇮🇲')).toEqual('🇮🇲'); - expect(emojify('🇮🇳')).toEqual('🇮🇳'); - expect(emojify('🇮🇴')).toEqual('🇮🇴'); - expect(emojify('🇮🇶')).toEqual('🇮🇶'); - expect(emojify('🇮🇷')).toEqual('🇮🇷'); - expect(emojify('🇮🇸')).toEqual('🇮🇸'); - expect(emojify('🇮🇹')).toEqual('🇮🇹'); - expect(emojify('🇯🇪')).toEqual('🇯🇪'); - expect(emojify('🇯🇲')).toEqual('🇯🇲'); - expect(emojify('🇯🇴')).toEqual('🇯🇴'); - expect(emojify('🇯🇵')).toEqual('🇯🇵'); - expect(emojify('🇰🇪')).toEqual('🇰🇪'); - expect(emojify('🇰🇬')).toEqual('🇰🇬'); - expect(emojify('🇰🇭')).toEqual('🇰🇭'); - expect(emojify('🇰🇮')).toEqual('🇰🇮'); - expect(emojify('🇰🇲')).toEqual('🇰🇲'); - expect(emojify('🇰🇳')).toEqual('🇰🇳'); - expect(emojify('🇰🇵')).toEqual('🇰🇵'); - expect(emojify('🇰🇷')).toEqual('🇰🇷'); - expect(emojify('🇰🇼')).toEqual('🇰🇼'); - expect(emojify('🇰🇾')).toEqual('🇰🇾'); - expect(emojify('🇰🇿')).toEqual('🇰🇿'); - expect(emojify('🇱🇦')).toEqual('🇱🇦'); - expect(emojify('🇱🇧')).toEqual('🇱🇧'); - expect(emojify('🇱🇨')).toEqual('🇱🇨'); - expect(emojify('🇱🇮')).toEqual('🇱🇮'); - expect(emojify('🇱🇰')).toEqual('🇱🇰'); - expect(emojify('🇱🇷')).toEqual('🇱🇷'); - expect(emojify('🇱🇸')).toEqual('🇱🇸'); - expect(emojify('🇱🇹')).toEqual('🇱🇹'); - expect(emojify('🇱🇺')).toEqual('🇱🇺'); - expect(emojify('🇱🇻')).toEqual('🇱🇻'); - expect(emojify('🇱🇾')).toEqual('🇱🇾'); - expect(emojify('🇲🇦')).toEqual('🇲🇦'); - expect(emojify('🇲🇨')).toEqual('🇲🇨'); - expect(emojify('🇲🇩')).toEqual('🇲🇩'); - expect(emojify('🇲🇪')).toEqual('🇲🇪'); - expect(emojify('🇲🇫')).toEqual('🇲🇫'); - expect(emojify('🇲🇬')).toEqual('🇲🇬'); - expect(emojify('🇲🇭')).toEqual('🇲🇭'); - expect(emojify('🇲🇰')).toEqual('🇲🇰'); - expect(emojify('🇲🇱')).toEqual('🇲🇱'); - expect(emojify('🇲🇲')).toEqual('🇲🇲'); - expect(emojify('🇲🇳')).toEqual('🇲🇳'); - expect(emojify('🇲🇴')).toEqual('🇲🇴'); - expect(emojify('🇲🇵')).toEqual('🇲🇵'); - expect(emojify('🇲🇶')).toEqual('🇲🇶'); - expect(emojify('🇲🇷')).toEqual('🇲🇷'); - expect(emojify('🇲🇸')).toEqual('🇲🇸'); - expect(emojify('🇲🇹')).toEqual('🇲🇹'); - expect(emojify('🇲🇺')).toEqual('🇲🇺'); - expect(emojify('🇲🇻')).toEqual('🇲🇻'); - expect(emojify('🇲🇼')).toEqual('🇲🇼'); - expect(emojify('🇲🇽')).toEqual('🇲🇽'); - expect(emojify('🇲🇾')).toEqual('🇲🇾'); - expect(emojify('🇲🇿')).toEqual('🇲🇿'); - expect(emojify('🇳🇦')).toEqual('🇳🇦'); - expect(emojify('🇳🇨')).toEqual('🇳🇨'); - expect(emojify('🇳🇪')).toEqual('🇳🇪'); - expect(emojify('🇳🇫')).toEqual('🇳🇫'); - expect(emojify('🇳🇬')).toEqual('🇳🇬'); - expect(emojify('🇳🇮')).toEqual('🇳🇮'); - expect(emojify('🇳🇱')).toEqual('🇳🇱'); - expect(emojify('🇳🇴')).toEqual('🇳🇴'); - expect(emojify('🇳🇵')).toEqual('🇳🇵'); - expect(emojify('🇳🇷')).toEqual('🇳🇷'); - expect(emojify('🇳🇺')).toEqual('🇳🇺'); - expect(emojify('🇳🇿')).toEqual('🇳🇿'); - expect(emojify('🇴🇲')).toEqual('🇴🇲'); - expect(emojify('🇵🇦')).toEqual('🇵🇦'); - expect(emojify('🇵🇪')).toEqual('🇵🇪'); - expect(emojify('🇵🇫')).toEqual('🇵🇫'); - expect(emojify('🇵🇬')).toEqual('🇵🇬'); - expect(emojify('🇵🇭')).toEqual('🇵🇭'); - expect(emojify('🇵🇰')).toEqual('🇵🇰'); - expect(emojify('🇵🇱')).toEqual('🇵🇱'); - expect(emojify('🇵🇲')).toEqual('🇵🇲'); - expect(emojify('🇵🇳')).toEqual('🇵🇳'); - expect(emojify('🇵🇷')).toEqual('🇵🇷'); - expect(emojify('🇵🇸')).toEqual('🇵🇸'); - expect(emojify('🇵🇹')).toEqual('🇵🇹'); - expect(emojify('🇵🇼')).toEqual('🇵🇼'); - expect(emojify('🇵🇾')).toEqual('🇵🇾'); - expect(emojify('🇶🇦')).toEqual('🇶🇦'); - expect(emojify('🇷🇪')).toEqual('🇷🇪'); - expect(emojify('🇷🇴')).toEqual('🇷🇴'); - expect(emojify('🇷🇸')).toEqual('🇷🇸'); - expect(emojify('🇷🇺')).toEqual('🇷🇺'); - expect(emojify('🇷🇼')).toEqual('🇷🇼'); - expect(emojify('🇸🇦')).toEqual('🇸🇦'); - expect(emojify('🇸🇧')).toEqual('🇸🇧'); - expect(emojify('🇸🇨')).toEqual('🇸🇨'); - expect(emojify('🇸🇩')).toEqual('🇸🇩'); - expect(emojify('🇸🇪')).toEqual('🇸🇪'); - expect(emojify('🇸🇬')).toEqual('🇸🇬'); - expect(emojify('🇸🇭')).toEqual('🇸🇭'); - expect(emojify('🇸🇮')).toEqual('🇸🇮'); - expect(emojify('🇸🇯')).toEqual('🇸🇯'); - expect(emojify('🇸🇰')).toEqual('🇸🇰'); - expect(emojify('🇸🇱')).toEqual('🇸🇱'); - expect(emojify('🇸🇲')).toEqual('🇸🇲'); - expect(emojify('🇸🇳')).toEqual('🇸🇳'); - expect(emojify('🇸🇴')).toEqual('🇸🇴'); - expect(emojify('🇸🇷')).toEqual('🇸🇷'); - expect(emojify('🇸🇸')).toEqual('🇸🇸'); - expect(emojify('🇸🇹')).toEqual('🇸🇹'); - expect(emojify('🇸🇻')).toEqual('🇸🇻'); - expect(emojify('🇸🇽')).toEqual('🇸🇽'); - expect(emojify('🇸🇾')).toEqual('🇸🇾'); - expect(emojify('🇸🇿')).toEqual('🇸🇿'); - expect(emojify('🇹🇦')).toEqual('🇹🇦'); - expect(emojify('🇹🇨')).toEqual('🇹🇨'); - expect(emojify('🇹🇩')).toEqual('🇹🇩'); - expect(emojify('🇹🇫')).toEqual('🇹🇫'); - expect(emojify('🇹🇬')).toEqual('🇹🇬'); - expect(emojify('🇹🇭')).toEqual('🇹🇭'); - expect(emojify('🇹🇯')).toEqual('🇹🇯'); - expect(emojify('🇹🇰')).toEqual('🇹🇰'); - expect(emojify('🇹🇱')).toEqual('🇹🇱'); - expect(emojify('🇹🇲')).toEqual('🇹🇲'); - expect(emojify('🇹🇳')).toEqual('🇹🇳'); - expect(emojify('🇹🇴')).toEqual('🇹🇴'); - expect(emojify('🇹🇷')).toEqual('🇹🇷'); - expect(emojify('🇹🇹')).toEqual('🇹🇹'); - expect(emojify('🇹🇻')).toEqual('🇹🇻'); - expect(emojify('🇹🇼')).toEqual('🇹🇼'); - expect(emojify('🇹🇿')).toEqual('🇹🇿'); - expect(emojify('🇺🇦')).toEqual('🇺🇦'); - expect(emojify('🇺🇬')).toEqual('🇺🇬'); - expect(emojify('🇺🇲')).toEqual('🇺🇲'); - expect(emojify('🇺🇳')).toEqual('🇺🇳'); - expect(emojify('🇺🇸')).toEqual('🇺🇸'); - expect(emojify('🇺🇾')).toEqual('🇺🇾'); - expect(emojify('🇺🇿')).toEqual('🇺🇿'); - expect(emojify('🇻🇦')).toEqual('🇻🇦'); - expect(emojify('🇻🇨')).toEqual('🇻🇨'); - expect(emojify('🇻🇪')).toEqual('🇻🇪'); - expect(emojify('🇻🇬')).toEqual('🇻🇬'); - expect(emojify('🇻🇮')).toEqual('🇻🇮'); - expect(emojify('🇻🇳')).toEqual('🇻🇳'); - expect(emojify('🇻🇺')).toEqual('🇻🇺'); - expect(emojify('🇼🇫')).toEqual('🇼🇫'); - expect(emojify('🇼🇸')).toEqual('🇼🇸'); - expect(emojify('🇽🇰')).toEqual('🇽🇰'); - expect(emojify('🇾🇪')).toEqual('🇾🇪'); - expect(emojify('🇾🇹')).toEqual('🇾🇹'); - expect(emojify('🇿🇦')).toEqual('🇿🇦'); - expect(emojify('🇿🇲')).toEqual('🇿🇲'); - expect(emojify('🇿🇼')).toEqual('🇿🇼'); - expect(emojify('🏴󠁧󠁢󠁥󠁮󠁧󠁿')).toEqual('🏴󠁧󠁢󠁥󠁮󠁧󠁿'); - expect(emojify('🏴󠁧󠁢󠁳󠁣󠁴󠁿')).toEqual('🏴󠁧󠁢󠁳󠁣󠁴󠁿'); - expect(emojify('🏴󠁧󠁢󠁷󠁬󠁳󠁿')).toEqual('🏴󠁧󠁢󠁷󠁬󠁳󠁿'); - }); - }); -}); diff --git a/packages/pl-fe/src/features/emoji/search.test.ts b/packages/pl-fe/src/features/emoji/search.test.ts deleted file mode 100644 index 40c71df6c..000000000 --- a/packages/pl-fe/src/features/emoji/search.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { List, Map } from 'immutable'; -import pick from 'lodash/pick'; - -import search, { addCustomToPool } from './search'; - -const trimEmojis = (emoji: any) => pick(emoji, ['id', 'unified', 'native', 'custom']); - -describe('emoji_index', () => { - it('should give same result for emoji_index_light and emoji-mart', () => { - const expected = [ - { - id: 'pineapple', - unified: '1f34d', - native: '🍍', - }, - ]; - expect(search('pineapple').map(trimEmojis)).toEqual(expected); - }); - - it('orders search results correctly', () => { - const expected = [ - { id: 'apple', unified: '1f34e', native: '🍎' }, - { id: 'pineapple', unified: '1f34d', native: '🍍' }, - { id: 'green_apple', unified: '1f34f', native: '🍏' }, - { id: 'iphone', unified: '1f4f1', native: '📱' }, - ]; - - expect(search('apple').map(trimEmojis)).toEqual(expected); - }); - - it('handles custom emojis', () => { - const custom = [ - { - id: 'mastodon', - name: 'mastodon', - keywords: ['mastodon'], - skins: { src: 'http://example.com' }, - }, - ]; - - const custom_emojis = List([ - Map({ static_url: 'http://example.com', shortcode: 'mastodon' }), - ]); - - const lightExpected = [ - { - id: 'mastodon', - custom: true, - }, - ]; - - addCustomToPool(custom); - expect(search('masto', {}, custom_emojis).map(trimEmojis)).toEqual(lightExpected); - }); - - it('updates custom emoji if another is passed', () => { - const custom = [ - { - id: 'mastodon', - name: 'mastodon', - keywords: ['mastodon'], - skins: { src: 'http://example.com' }, - }, - ]; - - addCustomToPool(custom); - - const custom2 = [ - { - id: 'pleroma', - name: 'pleroma', - keywords: ['pleroma'], - skins: { src: 'http://example.com' }, - }, - ]; - - addCustomToPool(custom2); - - const custom_emojis = List([ - Map({ static_url: 'http://example.com', shortcode: 'pleroma' }), - ]); - - const expected: any = []; - expect(search('masto', {}, custom_emojis).map(trimEmojis)).toEqual(expected); - }); - - it('does an emoji whose unified name is irregular', () => { - const expected = [ - { - 'id': 'water_polo', - 'unified': '1f93d', - 'native': '🤽', - }, - { - 'id': 'man-playing-water-polo', - 'unified': '1f93d-200d-2642-fe0f', - 'native': '🤽‍♂️', - }, - { - 'id': 'woman-playing-water-polo', - 'unified': '1f93d-200d-2640-fe0f', - 'native': '🤽‍♀️', - }, - ]; - expect(search('polo').map(trimEmojis)).toEqual(expected); - }); - - it('can search for thinking_face', () => { - const expected = [ - { - id: 'thinking_face', - unified: '1f914', - native: '🤔', - }, - ]; - expect(search('thinking_fac').map(trimEmojis)).toEqual(expected); - }); - - it('can search for woman-facepalming', () => { - const expected = [ - { - id: 'woman-facepalming', - unified: '1f926-200d-2640-fe0f', - native: '🤦‍♀️', - }, - ]; - expect(search('woman-facep').map(trimEmojis)).toEqual(expected); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-action-button.test.tsx b/packages/pl-fe/src/features/group/components/group-action-button.test.tsx deleted file mode 100644 index a3ad268ae..000000000 --- a/packages/pl-fe/src/features/group/components/group-action-button.test.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import { GroupRoles } from 'pl-api'; -import React from 'react'; - -import { buildGroup, buildGroupRelationship } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupActionButton from './group-action-button'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('with no group relationship', () => { - beforeEach(() => { - group = buildGroup({ - relationship: null, - }); - }); - - describe('with a private group', () => { - beforeEach(() => { - group = { ...group, locked: true }; - }); - - it('should render the Request Access button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Request Access'); - }); - }); - - describe('with a public group', () => { - beforeEach(() => { - group = { ...group, locked: false }; - }); - - it('should render the Join Group button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Join Group'); - }); - }); - }); - - describe('with no group relationship member', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - member: false, - }), - }); - }); - - describe('with a private group', () => { - beforeEach(() => { - group = { ...group, locked: true }; - }); - - it('should render the Request Access button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Request Access'); - }); - }); - - describe('with a public group', () => { - beforeEach(() => { - group = { ...group, locked: false }; - }); - - it('should render the Join Group button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Join Group'); - }); - }); - }); - - describe('when the user has requested to join', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: true, - member: true, - }), - }); - }); - - it('should render the Cancel Request button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Cancel Request'); - }); - }); - - describe('when the user is an Admin', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.OWNER, - }), - }); - }); - - it('should render the Manage Group button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Manage Group'); - }); - }); - - describe('when the user is just a member', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.USER, - }), - }); - }); - - it('should render the Leave Group button', () => { - render(); - - expect(screen.getByRole('button')).toHaveTextContent('Leave Group'); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-header.test.tsx b/packages/pl-fe/src/features/group/components/group-header.test.tsx deleted file mode 100644 index 5251c0a7e..000000000 --- a/packages/pl-fe/src/features/group/components/group-header.test.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; - -import { buildGroup } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupHeader from './group-header'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('without a group', () => { - it('should render the blankslate', () => { - render(); - expect(screen.getByTestId('group-header-missing')).toBeInTheDocument(); - }); - }); - - describe('when the Group has been deleted', () => { - it('only shows name, header, and avatar', () => { - group = buildGroup({ display_name: 'my group', deleted_at: new Date().toISOString() }); - render(); - - expect(screen.queryAllByTestId('group-header-missing')).toHaveLength(0); - expect(screen.queryAllByTestId('group-actions')).toHaveLength(0); - expect(screen.queryAllByTestId('group-meta')).toHaveLength(0); - expect(screen.getByTestId('group-header-image')).toBeInTheDocument(); - expect(screen.getByTestId('group-avatar')).toBeInTheDocument(); - expect(screen.getByTestId('group-name')).toBeInTheDocument(); - }); - }); - - describe('with a valid Group', () => { - it('only shows all fields', () => { - group = buildGroup({ display_name: 'my group', deleted_at: null }); - render(); - - expect(screen.queryAllByTestId('group-header-missing')).toHaveLength(0); - expect(screen.getByTestId('group-actions')).toBeInTheDocument(); - expect(screen.getByTestId('group-meta')).toBeInTheDocument(); - expect(screen.getByTestId('group-header-image')).toBeInTheDocument(); - expect(screen.getByTestId('group-avatar')).toBeInTheDocument(); - expect(screen.getByTestId('group-name')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-member-count.test.tsx b/packages/pl-fe/src/features/group/components/group-member-count.test.tsx deleted file mode 100644 index 0158256a8..000000000 --- a/packages/pl-fe/src/features/group/components/group-member-count.test.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React from 'react'; - -import { buildGroup } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupMemberCount from './group-member-count'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('with support for "members_count"', () => { - describe('with 1 member', () => { - beforeEach(() => { - group = buildGroup({ - members_count: 1, - }); - }); - - it('should render correctly', () => { - render(); - - expect(screen.getByTestId('group-member-count').textContent).toEqual('1 member'); - }); - }); - - describe('with 2 members', () => { - beforeEach(() => { - group = buildGroup({ - members_count: 2, - }); - }); - - it('should render correctly', () => { - render(); - - expect(screen.getByTestId('group-member-count').textContent).toEqual('2 members'); - }); - }); - - describe('with 1000 members', () => { - beforeEach(() => { - group = buildGroup({ - members_count: 1000, - }); - }); - - it('should render correctly', () => { - render(); - - expect(screen.getByTestId('group-member-count').textContent).toEqual('1k members'); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-member-list-item.test.tsx b/packages/pl-fe/src/features/group/components/group-member-list-item.test.tsx deleted file mode 100644 index dd1f9423b..000000000 --- a/packages/pl-fe/src/features/group/components/group-member-list-item.test.tsx +++ /dev/null @@ -1,303 +0,0 @@ -import userEvent from '@testing-library/user-event'; -import { GroupRoles } from 'pl-api'; -import React from 'react'; - -import { __stub } from '@/api'; -import { buildGroup, buildGroupMember, buildGroupRelationship } from '@/jest/factory'; -import { render, screen, waitFor } from '@/jest/test-helpers'; - -import GroupMemberListItem from './group-member-list-item'; - -describe('', () => { - describe('account rendering', () => { - const accountId = '4'; - const groupMember = buildGroupMember({}, { - id: accountId, - display_name: 'tiger woods', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render the users avatar', async () => { - const group = buildGroup({ - relationship: buildGroupRelationship(), - }); - - render(); - - await waitFor(() => { - expect(screen.getByTestId('group-member-list-item')).toHaveTextContent(groupMember.account.display_name); - }); - }); - }); - - describe('role badge', () => { - const accountId = '4'; - const group = buildGroup(); - - describe('when the user is an Owner', () => { - const groupMember = buildGroupMember({ role: GroupRoles.OWNER }, { - id: accountId, - display_name: 'tiger woods', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render the correct badge', async () => { - render(); - - await waitFor(() => { - expect(screen.getByTestId('role-badge')).toHaveTextContent('owner'); - }); - }); - }); - - describe('when the user is an Admin', () => { - const groupMember = buildGroupMember({ role: GroupRoles.ADMIN }, { - id: accountId, - display_name: 'tiger woods', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render the correct badge', async () => { - render(); - - await waitFor(() => { - expect(screen.getByTestId('role-badge')).toHaveTextContent('admin'); - }); - }); - }); - - describe('when the user is an User', () => { - const groupMember = buildGroupMember({ role: GroupRoles.USER }, { - id: accountId, - display_name: 'tiger woods', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render no correct badge', async () => { - render(); - - await waitFor(() => { - expect(screen.queryAllByTestId('role-badge')).toHaveLength(0); - }); - }); - }); - }); - - describe('as a Group owner', () => { - const group = buildGroup({ - relationship: buildGroupRelationship({ - role: GroupRoles.OWNER, - member: true, - }), - }); - - describe('when the user has role of "user"', () => { - const accountId = '4'; - const groupMember = buildGroupMember({}, { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render dropdown with correct Owner actions', async () => { - const user = userEvent.setup(); - - render(); - - await waitFor(async() => { - await user.click(screen.getByTestId('icon-button')); - }); - - const dropdownMenu = screen.getByTestId('dropdown-menu'); - expect(dropdownMenu).toHaveTextContent('Assign admin role'); - expect(dropdownMenu).toHaveTextContent('Kick @tiger from group'); - expect(dropdownMenu).toHaveTextContent('Ban from group'); - }); - }); - - describe('when the user has role of "admin"', () => { - const accountId = '4'; - const groupMember = buildGroupMember( - { - role: GroupRoles.ADMIN, - }, - { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }, - ); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render dropdown with correct Owner actions', async () => { - const user = userEvent.setup(); - - render(); - - await waitFor(async() => { - await user.click(screen.getByTestId('icon-button')); - }); - - const dropdownMenu = screen.getByTestId('dropdown-menu'); - expect(dropdownMenu).toHaveTextContent('Remove admin role'); - expect(dropdownMenu).toHaveTextContent('Kick @tiger from group'); - expect(dropdownMenu).toHaveTextContent('Ban from group'); - }); - }); - }); - - describe('as a Group admin', () => { - const group = buildGroup({ - relationship: buildGroupRelationship({ - role: GroupRoles.ADMIN, - member: true, - }), - }); - - describe('when the user has role of "user"', () => { - const accountId = '4'; - const groupMember = buildGroupMember({}, { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should render dropdown with correct Admin actions', async () => { - const user = userEvent.setup(); - - render(); - - await waitFor(async() => { - await user.click(screen.getByTestId('icon-button')); - }); - - const dropdownMenu = screen.getByTestId('dropdown-menu'); - expect(dropdownMenu).not.toHaveTextContent('Assign admin role'); - expect(dropdownMenu).toHaveTextContent('Kick @tiger from group'); - expect(dropdownMenu).toHaveTextContent('Ban from group'); - }); - }); - - describe('when the user has role of "admin"', () => { - const accountId = '4'; - const groupMember = buildGroupMember( - { - role: GroupRoles.ADMIN, - }, - { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }, - ); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should not render the dropdown', async () => { - render(); - - await waitFor(async() => { - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - }); - }); - - describe('when the user has role of "owner"', () => { - const accountId = '4'; - const groupMember = buildGroupMember( - { - role: GroupRoles.OWNER, - }, - { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }, - ); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should not render the dropdown', async () => { - render(); - - await waitFor(async() => { - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - }); - }); - }); - - describe('as a Group user', () => { - const group = buildGroup({ - relationship: buildGroupRelationship({ - role: GroupRoles.USER, - member: true, - }), - }); - const accountId = '4'; - const groupMember = buildGroupMember({}, { - id: accountId, - display_name: 'tiger woods', - username: 'tiger', - }); - - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/accounts/${accountId}`).reply(200, groupMember.account); - }); - }); - - it('should not render the dropdown', async () => { - render(); - - await waitFor(async() => { - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-options-button.test.tsx b/packages/pl-fe/src/features/group/components/group-options-button.test.tsx deleted file mode 100644 index 715ff823e..000000000 --- a/packages/pl-fe/src/features/group/components/group-options-button.test.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { GroupRoles } from 'pl-api'; -import React from 'react'; - -import { buildGroup, buildGroupRelationship } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupOptionsButton from './group-options-button'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('when the user blocked', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - blocked_by: true, - role: GroupRoles.USER, - }), - }); - }); - - it('should render null', () => { - render(); - - expect(screen.queryAllByTestId('dropdown-menu-button')).toHaveLength(0); - }); - }); - - describe('when the user is an admin', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.ADMIN, - }), - }); - }); - - it('should render one option for leaving the group', () => { - render(); - - // Leave group option only - expect(screen.queryAllByTestId('dropdown-menu-button')).toHaveLength(1); - }); - }); - - describe('when the user is an owner', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.OWNER, - }), - }); - }); - - it('should render one option for muting the group', () => { - render(); - - expect(screen.queryAllByTestId('dropdown-menu-button')).toHaveLength(1); - }); - }); - - describe('when the user is a member', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.USER, - }), - }); - }); - - it('should render the dropdown menu', () => { - render(); - - expect(screen.queryAllByTestId('dropdown-menu-button')).toHaveLength(1); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-privacy.test.tsx b/packages/pl-fe/src/features/group/components/group-privacy.test.tsx deleted file mode 100644 index ca9a99513..000000000 --- a/packages/pl-fe/src/features/group/components/group-privacy.test.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react'; - -import { buildGroup } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupPrivacy from './group-privacy'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('with a Private group', () => { - beforeEach(() => { - group = buildGroup({ - locked: true, - }); - }); - - it('should render the correct text', () => { - render(); - - expect(screen.getByTestId('group-privacy')).toHaveTextContent('Private'); - }); - }); - - describe('with a Public group', () => { - beforeEach(() => { - group = buildGroup({ - locked: false, - }); - }); - - it('should render the correct text', () => { - render(); - - expect(screen.getByTestId('group-privacy')).toHaveTextContent('Public'); - }); - }); -}); diff --git a/packages/pl-fe/src/features/group/components/group-relationship.test.tsx b/packages/pl-fe/src/features/group/components/group-relationship.test.tsx deleted file mode 100644 index 9c40c5eea..000000000 --- a/packages/pl-fe/src/features/group/components/group-relationship.test.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { GroupRoles } from 'pl-api'; -import React from 'react'; - -import { buildGroup, buildGroupRelationship } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupRelationship from './group-relationship'; - -import type { Group } from 'pl-api'; - -let group: Group; - -describe('', () => { - describe('when the user is an admin', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.ADMIN, - }), - }); - }); - - it('should render the relationship', () => { - render(); - - expect(screen.getByTestId('group-relationship')).toHaveTextContent('Admin'); - }); - }); - - describe('when the user is an owner', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.OWNER, - }), - }); - }); - - it('should render the relationship', () => { - render(); - - expect(screen.getByTestId('group-relationship')).toHaveTextContent('Owner'); - }); - }); - - describe('when the user is a member', () => { - beforeEach(() => { - group = buildGroup({ - relationship: buildGroupRelationship({ - requested: false, - member: true, - role: GroupRoles.USER, - }), - }); - }); - - it('should render null', () => { - render(); - - expect(screen.queryAllByTestId('group-relationship')).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/features/groups/components/discover/group-list-item.test.tsx b/packages/pl-fe/src/features/groups/components/discover/group-list-item.test.tsx deleted file mode 100644 index e2cff5ba4..000000000 --- a/packages/pl-fe/src/features/groups/components/discover/group-list-item.test.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -import { buildGroup } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import GroupListItem from './group-list-item'; - -describe(' { - it('should render correctly', () => { - const group = buildGroup({ - display_name: 'group name here', - locked: false, - members_count: 6, - }); - render(); - - expect(screen.getByTestId('group-list-item')).toHaveTextContent(group.display_name); - expect(screen.getByTestId('group-list-item')).toHaveTextContent('Public'); - expect(screen.getByTestId('group-list-item')).toHaveTextContent('6 members'); - }); -}); diff --git a/packages/pl-fe/src/features/notifications/components/notifications.test.tsx b/packages/pl-fe/src/features/notifications/components/notifications.test.tsx deleted file mode 100644 index edb2b7cc0..000000000 --- a/packages/pl-fe/src/features/notifications/components/notifications.test.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React from 'react'; - -import { updateNotifications } from '@/actions/notifications'; -import { render, screen, rootState, createTestStore } from '@/jest/test-helpers'; - -import Notification from './notification'; - -/** Prepare the notification for use by the component */ -const normalize = (notification: any) => { - const store = createTestStore(rootState); - store.dispatch(updateNotifications(notification) as any); - const state = store.getState(); - - return { - // @ts-ignore - notification: state.notifications.items.get(notification.id)!, - state, - }; -}; - -describe('', () => { - it('renders a follow notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-follow.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toBeInTheDocument(); - expect(screen.getByTestId('account')).toContainHTML('neko@rdrama.cc'); - expect(screen.getByTestId('message')).toHaveTextContent('Nekobit followed you'); - }); - - describe('grouped notifications', () => { - it('renders a grouped follow notification for more than 2', async () => { - const { notification, state } = normalize({ - ...await import('@/__fixtures__/notification-follow.json'), - total_count: 5, - }); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toBeInTheDocument(); - expect(screen.getByTestId('account')).toContainHTML('neko@rdrama.cc'); - expect(screen.getByTestId('message')).toHaveTextContent('Nekobit + 4 others followed you'); - }); - - it('renders a grouped follow notification for 1', async () => { - const { notification, state } = normalize({ - ...await import('@/__fixtures__/notification-follow.json'), - total_count: 2, - }); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toBeInTheDocument(); - expect(screen.getByTestId('account')).toContainHTML('neko@rdrama.cc'); - expect(screen.getByTestId('message')).toHaveTextContent('Nekobit + 1 other followed you'); - }); - }); - - it('renders a favourite notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-favourite.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('Hollahollara@spinster.xyz'); - expect(screen.getByTestId('status')).toContainHTML('https://media.gleasonator.com'); - }); - - // it('renders a follow_request notification', async () => { - // const { notification, state } = normalize(await import('@/__fixtures__/notification-follow_request.json')); - - // render(, undefined, state); - - // expect(screen.getByTestId('notification')).toBeInTheDocument(); - // expect(screen.getByTestId('account')).toContainHTML('alex@spinster.xyz'); - // }); - - it('renders a mention notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-mention.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('silverpill@mitra.social'); - expect(screen.getByTestId('status')).toContainHTML('ActivityPub spec'); - }); - - it('renders a move notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-move.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('alex@fedibird.com'); - expect(screen.getByTestId('account')).toContainHTML('benis911'); - }); - - it('renders a pleroma:emoji_reaction notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-pleroma-emoji_reaction.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('😮'); - expect(screen.getByTestId('status')).toContainHTML('Super Mario 64'); - }); - - it('renders a pleroma:chat_mention notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-pleroma-chat_mention.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('dave'); - }); - - it('renders a poll notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-poll.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toBeInTheDocument(); - expect(screen.getByTestId('status')).toContainHTML('what do you guys think?'); - }); - - it('renders a reblog notification', async () => { - const { notification, state } = normalize(await import('@/__fixtures__/notification-reblog.json')); - - render(, undefined, state); - - expect(screen.getByTestId('notification')).toContainHTML('rob@nicecrew.digital'); - expect(screen.getByTestId('status')).toContainHTML('never downloaded TikTok'); - }); -}); diff --git a/packages/pl-fe/src/features/ui/components/compose-button.test.tsx b/packages/pl-fe/src/features/ui/components/compose-button.test.tsx deleted file mode 100644 index c601f1ef3..000000000 --- a/packages/pl-fe/src/features/ui/components/compose-button.test.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { fireEvent, render, screen } from '@testing-library/react'; -import React from 'react'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; -import { MemoryRouter } from 'react-router-dom'; - -import { mockStore, rootState } from '@/jest/test-helpers'; - -import ComposeButton from './compose-button'; - -const store = mockStore(rootState); -const renderComposeButton = () => { - render( - - - - - - - , - ); -}; - -describe('', () => { - it('renders a button element', () => { - renderComposeButton(); - - expect(screen.getByRole('button')).toHaveTextContent('Compose'); - }); - - it('dispatches the MODAL_OPEN action', () => { - renderComposeButton(); - - expect(store.getActions().length).toEqual(0); - fireEvent.click(screen.getByRole('button')); - expect(store.getActions()[0].type).toEqual('MODAL_CLOSE'); - expect(store.getActions()[1].type).toEqual('MODAL_OPEN'); - }); -}); diff --git a/packages/pl-fe/src/features/ui/components/hotkeys.tsx b/packages/pl-fe/src/features/ui/components/hotkeys.tsx index 8d607d22a..f9be46377 100644 --- a/packages/pl-fe/src/features/ui/components/hotkeys.tsx +++ b/packages/pl-fe/src/features/ui/components/hotkeys.tsx @@ -173,11 +173,11 @@ const hotkeyMatcherMap = { type HotkeyName = keyof typeof hotkeyMatcherMap; -export type HandlerMap = Partial< +type HandlerMap = Partial< Record void> >; -export function useHotkeys(handlers: HandlerMap) { +function useHotkeys(handlers: HandlerMap) { const ref = useRef(null); const bufferedKeys = useRef([]); const sequenceTimer = useRef | null>(null); diff --git a/packages/pl-fe/src/features/ui/components/panels/sign-up-panel.test.tsx b/packages/pl-fe/src/features/ui/components/panels/sign-up-panel.test.tsx deleted file mode 100644 index 275eaab45..000000000 --- a/packages/pl-fe/src/features/ui/components/panels/sign-up-panel.test.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; - -import { storeOpen } from '@/jest/mock-stores'; -import { render, screen } from '@/jest/test-helpers'; - -import SignUpPanel from './sign-up-panel'; - -describe('', () => { - it('doesn\'t render by default', () => { - render(); - expect(screen.queryByTestId('sign-up-panel')).not.toBeInTheDocument(); - }); - - describe('with registrations enabled', () => { - it('successfully renders', () => { - render(, undefined, storeOpen); - expect(screen.getByTestId('sign-up-panel')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/pl-fe/src/features/ui/components/panels/trends-panel.test.tsx b/packages/pl-fe/src/features/ui/components/panels/trends-panel.test.tsx deleted file mode 100644 index 5ca17311d..000000000 --- a/packages/pl-fe/src/features/ui/components/panels/trends-panel.test.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from 'react'; - -import { __stub } from '@/api'; -import { queryClient, render, screen, waitFor } from '@/jest/test-helpers'; - -import TrendsPanel from './trends-panel'; - -describe('', () => { - beforeEach(() => { - queryClient.clear(); - }); - - describe('with hashtags', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/trends') - .reply(200, [ - { - name: 'hashtag 1', - url: 'https://example.com', - history: [{ - day: '1652745600', - uses: '294', - accounts: '180', - }], - }, - { name: 'hashtag 2', url: 'https://example.com' }, - ]); - }); - }); - - it('renders trending hashtags', async() => { - render(); - - await waitFor(() => { - expect(screen.getByTestId('hashtag')).toHaveTextContent(/hashtag 1/i); - expect(screen.getByTestId('hashtag')).toHaveTextContent(/180 people talking/i); - expect(screen.getByTestId('sparklines')).toBeInTheDocument(); - }); - }); - - it('renders multiple trends', async() => { - render(); - - await waitFor(() => { - expect(screen.queryAllByTestId('hashtag')).toHaveLength(2); - }); - }); - - it('respects the limit prop', async() => { - render(); - - await waitFor(() => { - expect(screen.queryAllByTestId('hashtag')).toHaveLength(1); - }); - }); - }); - - describe('without hashtags', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/trends').reply(200, []); - }); - }); - - it('renders empty', async() => { - render(); - - await waitFor(() => { - expect(screen.queryAllByTestId('hashtag')).toHaveLength(0); - }); - }); - }); -}); diff --git a/packages/pl-fe/src/features/ui/components/subscribe-button.test.tsx b/packages/pl-fe/src/features/ui/components/subscribe-button.test.tsx deleted file mode 100644 index 624f0b636..000000000 --- a/packages/pl-fe/src/features/ui/components/subscribe-button.test.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -import { buildAccount, buildRelationship } from '@/jest/factory'; -import { render, screen } from '@/jest/test-helpers'; - -import SubscribeButton from './subscription-button'; - -const justin = { - id: '1', - acct: 'justin-username', - display_name: 'Justin L', - avatar: 'test.jpg', -}; - -describe('', () => { - let store: any; - - describe('with "accountNotifies" disabled', () => { - it('renders nothing', () => { - const account = buildAccount({ ...justin, relationship: buildRelationship({ following: true }) }); - - render(, undefined, store); - expect(screen.queryAllByTestId('icon-button')).toHaveLength(0); - }); - }); -}); diff --git a/packages/pl-fe/src/hooks/__mocks__/resize-observer.ts b/packages/pl-fe/src/hooks/__mocks__/resize-observer.ts deleted file mode 100644 index 47c3ebc17..000000000 --- a/packages/pl-fe/src/hooks/__mocks__/resize-observer.ts +++ /dev/null @@ -1,25 +0,0 @@ -let listener: ((rect: any) => void) | undefined = undefined; -const mockDisconnect = vi.fn(); - -class ResizeObserver { - - constructor(ls: any) { - listener = ls; - } - - observe() { - // do nothing - } - unobserve() { - // do nothing - } - disconnect() { - mockDisconnect(); - } - -} - -// eslint-disable-next-line compat/compat -(window as any).ResizeObserver = ResizeObserver; - -export { ResizeObserver as default, listener, mockDisconnect }; diff --git a/packages/pl-fe/src/hooks/use-dimensions.test.ts b/packages/pl-fe/src/hooks/use-dimensions.test.ts deleted file mode 100644 index 3ce75e972..000000000 --- a/packages/pl-fe/src/hooks/use-dimensions.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { renderHook, act } from '@testing-library/react-hooks'; - -import { listener, mockDisconnect } from './__mocks__/resize-observer'; -import { useDimensions } from './use-dimensions'; - -describe('useDimensions()', () => { - beforeEach(() => { - mockDisconnect.mockClear(); - }); - - it('defaults to 0', () => { - const { result } = renderHook(() => useDimensions()); - - act(() => { - const div = document.createElement('div'); - (result.current[1] as any)(div); - }); - - expect(result.current[2]).toMatchObject({ - width: 0, - height: 0, - }); - }); - - it('measures the dimensions of a DOM element', () => { - const { result } = renderHook(() => useDimensions()); - - act(() => { - const div = document.createElement('div'); - (result.current[1] as any)(div); - }); - - act(() => { - listener!([ - { - contentRect: { - width: 200, - height: 200, - }, - }, - ]); - }); - - expect(result.current[2]).toMatchObject({ - width: 200, - height: 200, - }); - }); - - it('disconnects on unmount', () => { - const { result, unmount } = renderHook(() => useDimensions()); - - act(() => { - const div = document.createElement('div'); - (result.current[1] as any)(div); - }); - - expect(mockDisconnect).toHaveBeenCalledTimes(0); - unmount(); - expect(mockDisconnect).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/pl-fe/src/hooks/use-dimensions.ts b/packages/pl-fe/src/hooks/use-dimensions.ts deleted file mode 100644 index 2376b389d..000000000 --- a/packages/pl-fe/src/hooks/use-dimensions.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useEffect, useMemo, useState } from 'react'; - -type UseDimensionsRect = { width: number; height: number }; -type UseDimensionsResult = [Element | null, any, any] - -const defaultState: UseDimensionsRect = { - width: 0, - height: 0, -}; - -const useDimensions = (): UseDimensionsResult => { - const [element, setRef] = useState(null); - const [rect, setRect] = useState(defaultState); - - const observer = useMemo( - () => - new ResizeObserver((entries: any) => { - if (entries[0]) { - const { width, height } = entries[0].contentRect; - setRect({ width, height }); - } - }), - [], - ); - - useEffect(() => { - if (!element) return; - observer.observe(element); - - return () => { - observer.disconnect(); - }; - }, [element]); - - return [element, setRef, rect]; -}; - -export { useDimensions }; diff --git a/packages/pl-fe/src/jest/factory.ts b/packages/pl-fe/src/jest/factory.ts deleted file mode 100644 index df727e9c2..000000000 --- a/packages/pl-fe/src/jest/factory.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - accountSchema, - groupMemberSchema, - groupRelationshipSchema, - groupSchema, - instanceSchema, - relationshipSchema, - statusSchema, - GroupRoles, - type Account, - type Group, - type GroupMember, - type GroupRelationship, - type Instance, - type Relationship, - type Status, -} from 'pl-api'; -import * as v from 'valibot'; - -import type { PartialDeep } from 'type-fest'; - -// TODO: there's probably a better way to create these factory functions. -// This looks promising but didn't work on my first attempt: https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock - -const buildAccount = (props: PartialDeep = {}): Account => - v.parse(accountSchema, Object.assign({ - id: crypto.randomUUID(), - url: `https://soapbox.test/users/${crypto.randomUUID()}`, - }, props)); - -const buildGroup = (props: PartialDeep = {}): Group => - v.parse(groupSchema, Object.assign({ - id: crypto.randomUUID(), - owner: { - id: crypto.randomUUID(), - }, - }, props)); - -const buildGroupRelationship = (props: PartialDeep = {}): GroupRelationship => - v.parse(groupRelationshipSchema, Object.assign({ - id: crypto.randomUUID(), - }, props)); - -const buildGroupMember = ( - props: PartialDeep = {}, - accountProps: PartialDeep = {}, -): GroupMember => v.parse(groupMemberSchema, Object.assign({ - id: crypto.randomUUID(), - account: buildAccount(accountProps), - role: GroupRoles.USER, -}, props)); - -const buildInstance = (props: PartialDeep = {}) => v.parse(instanceSchema, props); - -const buildRelationship = (props: PartialDeep = {}): Relationship => - v.parse(relationshipSchema, Object.assign({ - id: crypto.randomUUID(), - }, props)); - -const buildStatus = (props: PartialDeep = {}) => - v.parse(statusSchema, Object.assign({ - id: crypto.randomUUID(), - account: buildAccount(), - }, props)); - -export { - buildAccount, - buildGroup, - buildGroupMember, - buildGroupRelationship, - buildInstance, - buildRelationship, - buildStatus, -}; diff --git a/packages/pl-fe/src/jest/fixtures/chats.json b/packages/pl-fe/src/jest/fixtures/chats.json deleted file mode 100644 index 101851fc7..000000000 --- a/packages/pl-fe/src/jest/fixtures/chats.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": "1", - "unread": 0, - "last_message": { - "account_id": "2", - "chat_id": "85", - "content": "last message content", - "created_at": "2022-09-28T17:43:01.432Z", - "id": "1166", - "unread": false - }, - "created_at": "2022-08-26T14:49:16.360Z", - "updated_at": "2022-09-29T19:09:30.257Z", - "accepted": true, - "account": { - "id": "2", - "username": "leonard", - "acct": "leonard", - "display_name": "leonard", - "created_at": "2021-10-19T00:00:00.000Z", - "avatar": "original.jpg", - "avatar_static": "original.jpg", - "verified": false, - "accepting_messages": true - } - }, - { - "id": "2", - "unread": 0, - "last_message": { - "account_id": "3", - "chat_id": "125", - "content": "\u003cp\u003eInventore enim numquam nihil facilis nostrum eum natus provident quis veritatis esse dolorem praesentium rem cumque.\u003c/p\u003e", - "created_at": "2022-09-23T14:09:29.625Z", - "id": "1033", - "unread": false - }, - "created_at": "2022-09-22T15:06:49.675Z", - "updated_at": "2022-09-23T14:09:29.628Z", - "accepted": true, - "account": { - "id": "3", - "username": "sheldon", - "acct": "sheldon", - "display_name": "sheldon", - "created_at": "2022-09-22T00:00:00.000Z", - "avatar": "original.jpg", - "avatar_static": "original.jpg", - "verified": false, - "accepting_messages": true - } - } -] \ No newline at end of file diff --git a/packages/pl-fe/src/jest/mock-stores.tsx b/packages/pl-fe/src/jest/mock-stores.tsx deleted file mode 100644 index da7e0e3cb..000000000 --- a/packages/pl-fe/src/jest/mock-stores.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { instanceSchema } from 'pl-api'; -import * as v from 'valibot'; - -/** Store with registrations open. */ -const storeOpen = { instance: v.parse(instanceSchema, { registrations: true }) }; - -export { - storeOpen, -}; diff --git a/packages/pl-fe/src/jest/test-helpers.tsx b/packages/pl-fe/src/jest/test-helpers.tsx deleted file mode 100644 index 1c4dcd756..000000000 --- a/packages/pl-fe/src/jest/test-helpers.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { configureMockStore } from '@jedmao/redux-mock-store'; -import { QueryClientProvider } from '@tanstack/react-query'; -import { render, RenderOptions } from '@testing-library/react'; -import { renderHook, RenderHookOptions } from '@testing-library/react-hooks'; -import React, { FC, ReactElement } from 'react'; -import { Toaster } from 'react-hot-toast'; -import { IntlProvider } from 'react-intl'; -import { Provider } from 'react-redux'; -import { MemoryRouter } from 'react-router-dom'; -import { applyMiddleware, createStore } from 'redux'; -import { thunk } from 'redux-thunk'; - -import { ChatProvider } from '@/contexts/chat-context'; -import { StatProvider } from '@/contexts/stat-context'; -import { queryClient } from '@/queries/client'; - -import { default as rootReducer } from '../reducers'; - -import type { AppDispatch } from '@/store'; -import type { Action, AnyAction } from 'redux'; - -// Mock Redux -// https://redux.js.org/recipes/writing-tests/ -const rootState = rootReducer(undefined, {} as Action); -const mockStore = configureMockStore([thunk]); - -/** Apply actions to the state, one at a time. */ -const applyActions = (state: any, actions: any, reducer: any) => - actions.reduce((state: any, action: any) => reducer(state, action), state); - -const createTestStore = (initialState: any) => createStore(rootReducer, initialState, applyMiddleware(thunk)); -const TestApp: FC = ({ children, storeProps, routerProps = {} }) => { - let store: ReturnType; - let appState = rootState; - - if (storeProps && typeof storeProps.getState !== 'undefined') { // storeProps is a store - store = storeProps; - } else if (storeProps) { // storeProps is state - appState = { ...rootState, ...storeProps }; - store = createTestStore(appState); - } else { - store = createTestStore(appState); - } - - const props = { - locale: 'en', - store, - }; - - return ( -
- - - - - - - {children} - - - - - - - - -
- ); -}; - -const customRender = ( - ui: ReactElement, - options?: Omit, - store?: any, - routerProps?: any, -) => render(ui, { - wrapper: () => , - ...options, -}); - -/** Like renderHook, but with access to the Redux store. */ -const customRenderHook = ( - callback: (props?: any) => any, - options?: Omit, 'wrapper'>, - store?: any, -) => renderHook(callback, { - wrapper: ({ children }) => , - ...options, - }); - -const mockWindowProperty = (property: any, value: any) => { - const { [property]: originalProperty } = window; - delete window[property]; - - beforeAll(() => { - Object.defineProperty(window, property, { - configurable: true, - writable: true, - value, - }); - }); - - afterAll(() => { - window[property] = originalProperty; - }); -}; - -export * from '@testing-library/react'; -export { - customRender as render, - customRenderHook as renderHook, - mockStore, - applyActions, - rootState, - mockWindowProperty, - createTestStore, - queryClient, -}; diff --git a/packages/pl-fe/src/jest/test-setup.ts b/packages/pl-fe/src/jest/test-setup.ts deleted file mode 100644 index 42e2b7ca1..000000000 --- a/packages/pl-fe/src/jest/test-setup.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { act } from '@testing-library/react'; -import { toast } from 'react-hot-toast'; -// eslint-disable-next-line import/no-extraneous-dependencies -import '@testing-library/jest-dom/vitest'; -// Mock IndexedDB -// https://dev.to/andyhaskell/testing-your-indexeddb-code-with-jest-2o17 -import 'fake-indexeddb/auto'; - -import { __clear as clearApiMocks } from '../api/__mocks__'; - -// API mocking -vi.mock('@/api'); -afterEach(() => { - clearApiMocks(); -}); - -// Query mocking -vi.mock('@/queries/client'); - -// Clear toasts after each test. -afterEach(() => { - act(() => { - toast.remove(); - }); -}); - -const intersectionObserverMock = () => ({ observe: () => null, disconnect: () => null }); -window.IntersectionObserver = vi.fn().mockImplementation(intersectionObserverMock); - -Object.defineProperty(window, 'matchMedia', { - writable: true, - value: vi.fn().mockImplementation(query => ({ - matches: false, - media: query, - onchange: null, - addListener: vi.fn(), // Deprecated - removeListener: vi.fn(), // Deprecated - addEventListener: vi.fn(), - removeEventListener: vi.fn(), - dispatchEvent: vi.fn(), - })), -}); diff --git a/packages/pl-fe/src/modals/unauthorized-modal.test.tsx b/packages/pl-fe/src/modals/unauthorized-modal.test.tsx deleted file mode 100644 index 6a4377d9a..000000000 --- a/packages/pl-fe/src/modals/unauthorized-modal.test.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; - -import { storeOpen } from '@/jest/mock-stores'; -import { render, screen } from '@/jest/test-helpers'; - -import UnauthorizedModal from './unauthorized-modal'; - -describe('', () => { - it('successfully renders', () => { - render(); - expect(screen.getByTestId('modal')).toBeInTheDocument(); - }); - - it('doesn\'t display the signup button by default', () => { - render(); - expect(screen.queryByText('Sign up')).not.toBeInTheDocument(); - }); - - describe('with registrations enabled', () => { - it('displays the signup button', () => { - render(, undefined, storeOpen); - expect(screen.getByText('Sign up')).toBeInTheDocument(); - }); - }); -}); diff --git a/packages/pl-fe/src/pages/auth/login.test.tsx b/packages/pl-fe/src/pages/auth/login.test.tsx deleted file mode 100644 index e9306f70c..000000000 --- a/packages/pl-fe/src/pages/auth/login.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { instanceSchema } from 'pl-api'; -import React from 'react'; -import * as v from 'valibot'; - -import { render, screen } from '@/jest/test-helpers'; - -import LoginPage from './login'; - -describe('', () => { - it('renders correctly on load', () => { - const store = { - instance: v.parse(instanceSchema, { - version: '2.7.2 (compatible; Pleroma 2.3.0)', - }), - }; - - render(, undefined, store); - - expect(screen.getByRole('heading')).toHaveTextContent('Sign In'); - }); - - // it('renders the OTP form when logIn returns with mfa_required', () => { - // - // stubApi(mock => { - // mock.onPost('/api/v1/apps').reply(200, { - // data: { - // client_id:'12345', client_secret:'12345', id:'111', name:'SoapboxFE', redirect_uri:'urn:ietf:wg:oauth:2.0:oob', website:null, vapid_key:'12345', - // }, - // }); - // mock.onPost('/oauth/token').reply(403, { - // error:'mfa_required', mfa_token:'12345', supported_challenge_types:'totp', - // }); - // }); - // - // const app = new Map(); - // app.set('app', { client_id: '12345', client_secret:'12345' }); - // const store = mockStore(ImmutableMap({ - // auth: { app }, - // })); - // const loginPage = createComponent(, { store }); - // - // return loginPage.handleSubmit().then(() => { - // const wrapper = loginPage.toJSON(); - // expect(wrapper.children[0].children[0].children[0].children[0]).toEqual(expect.objectContaining({ - // type: 'h1', - // props: { className: 'otp-login' }, - // children: [ 'OTP Login' ], - // })); - // }); - // - // }); -}); diff --git a/packages/pl-fe/src/queries/__mocks__/client.ts b/packages/pl-fe/src/queries/__mocks__/client.ts deleted file mode 100644 index 56123fd1d..000000000 --- a/packages/pl-fe/src/queries/__mocks__/client.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { QueryClient } from '@tanstack/react-query'; - -const queryClient = new QueryClient({ - defaultOptions: { - queries: { - staleTime: 0, - gcTime: Infinity, - retry: false, - }, - }, -}); - -export { queryClient }; diff --git a/packages/pl-fe/src/queries/chats.test.ts b/packages/pl-fe/src/queries/chats.test.ts deleted file mode 100644 index b602879ca..000000000 --- a/packages/pl-fe/src/queries/chats.test.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; -import sumBy from 'lodash/sumBy'; -import { useEffect } from 'react'; - -import { __stub } from '@/api'; -import { buildAccount, buildRelationship } from '@/jest/factory'; -import { createTestStore, mockStore, queryClient, renderHook, rootState, waitFor } from '@/jest/test-helpers'; -import { normalizeChatMessage } from '@/normalizers/chat-message'; -import { Store } from '@/store'; -import { flattenPages } from '@/utils/queries'; - -import { ChatKeys, IChat, useChat, useChatActions, useChatMessages, useChats } from './chats'; - -const chat: IChat = { - account: buildAccount({ - username: 'username', - verified: true, - id: '1', - acct: 'acct', - avatar: 'avatar', - avatar_static: 'avatar', - display_name: 'my name', - }), - created_at: '2020-06-10T02:05:06.000Z', - id: '1', - last_message: null, - unread: 0, -}; - -const buildChatMessage = (id: string) => normalizeChatMessage({ - id, - chat_id: '1', - account_id: '1', - content: `chat message #${id}`, - created_at: '2020-06-10T02:05:06.000Z', - expiration: 1209600, - unread: true, -}); - -describe('ChatKeys', () => { - it('has a "chat" key', () => { - const id = '1'; - - expect(ChatKeys.chat(id)).toEqual(['chats', 'chat', id]); - }); - - it('has a "chatMessages" key', () => { - const id = '1'; - - expect(ChatKeys.chatMessages(id)).toEqual(['chats', 'messages', id]); - }); -}); - -describe('useChatMessages', () => { - let store: ReturnType; - - beforeEach(() => { - queryClient.clear(); - }); - - describe('when the user is blocked', () => { - beforeEach(() => { - const state = { - ...rootState, - relationships: ImmutableMap({ '1': buildRelationship({ blocked_by: true }) }), - }; - - store = mockStore(state); - }); - - it('is does not fetch the endpoint', async () => { - const { result } = renderHook(() => useChatMessages(chat), undefined, store); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.data?.length).toBeUndefined(); - }); - }); - - describe('when the user is not blocked', () => { - describe('with a successful request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}/messages`) - .reply(200, [ - buildChatMessage('2'), - ], { - link: `; rel="prev"`, - }); - }); - }); - - it('is successful', async () => { - const { result } = renderHook(() => useChatMessages(chat)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.data?.length).toBe(1); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}/messages`).networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(() => useChatMessages(chat)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.error).toBeDefined(); - }); - }); - }); -}); - -describe('useChats', () => { - // let store: ReturnType; - - beforeEach(() => { - queryClient.clear(); - }); - - // describe('with a successful request', () => { - // beforeEach(() => { - // const state = rootState.setIn(['instance', 'version'], '2.7.2 (compatible; Pleroma 2.2.0)'); - // store = mockStore(state); - - // __stub((mock) => { - // mock.onGet('/api/v1/pleroma/chats') - // .reply(200, [ - // chat, - // ], { - // link: '; rel="prev"', - // }); - // }); - // }); - - // it('is successful', async () => { - // const { result } = renderHook(() => useChats().chatsQuery, undefined, store); - - // await waitFor(() => expect(result.current.isFetching).toBe(false)); - - // expect(result.current.data?.length).toBe(1); - // }); - // }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/pleroma/chats').networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(() => useChats().chatsQuery); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.error).toBeDefined(); - }); - }); -}); - -describe('useChat()', () => { - const relationshipId = '123'; - let store: Store; - - beforeEach(() => { - const state = rootState; - store = createTestStore(state); - - queryClient.clear(); - }); - - describe('with a successful request', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}`).reply(200, chat); - mock - .onGet(`/api/v1/accounts/relationships?id[]=${chat.account.id}`) - .reply(200, [buildRelationship({ id: relationshipId, blocked_by: true })]); - }); - }); - - it('is successful', async () => { - expect(store.getState().relationships.getIn([relationshipId, 'blocked_by'])).toBeUndefined(); - - const { result } = renderHook(() => useChat(chat.id), undefined, store); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(store.getState().relationships.getIn([relationshipId, 'id'])).toBe(relationshipId); - expect(store.getState().relationships.getIn([relationshipId, 'blocked_by'])).toBe(true); - expect(result.current.data.id).toBe(chat.id); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet(`/api/v1/pleroma/chats/${chat.id}`).networkError(); - }); - }); - - it('is has error state', async() => { - const { result } = renderHook(() => useChat(chat.id)); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.error).toBeDefined(); - }); - }); -}); - -describe('useChatActions', () => { - beforeEach(() => { - queryClient.clear(); - }); - - describe('markChatAsRead()', () => { - const nextUnreadCount = 5; - - beforeEach(() => { - __stub((mock) => { - mock - .onPost(`/api/v1/pleroma/chats/${chat.id}/read`, { last_read_id: '2' }) - .reply(200, { ...chat, unread: nextUnreadCount }); - }); - }); - - it('updates the queryCache', async() => { - const initialQueryData = { - pages: [ - { result: [chat], hasMore: false, link: undefined }, - ], - pageParams: [undefined], - }; - const initialFlattenedData = flattenPages(initialQueryData); - expect(sumBy(initialFlattenedData, (chat: IChat) => chat.unread)).toBe(0); - - queryClient.setQueryData(['chats', 'search'], initialQueryData); - - const { result } = renderHook(() => useChatActions(chat.id).markChatAsRead('2')); - - await waitFor(() => { - expect(result.current).resolves.toBeDefined(); - }); - - const nextQueryData = queryClient.getQueryData(['chats', 'search']); - const nextFlattenedData = flattenPages(nextQueryData as any); - expect(sumBy(nextFlattenedData as any, (chat: IChat) => chat.unread)).toBe(nextUnreadCount); - }); - }); - - describe('createChatMessage()', () => { - beforeEach(() => { - const initialQueryData = { - pages: [ - { result: [buildChatMessage('1')], hasMore: false, link: undefined }, - ], - pageParams: [undefined], - }; - - queryClient.setQueryData(ChatKeys.chatMessages(chat.id), initialQueryData); - - __stub((mock) => { - mock - .onPost(`/api/v1/pleroma/chats/${chat.id}/messages`) - .reply(200, { hello: 'world' }); - }); - }); - - it('creates a chat message', async() => { - const { result } = renderHook(() => { - const { createChatMessage } = useChatActions(chat.id); - - useEffect(() => { - createChatMessage.mutate({ chatId: chat.id, content: 'hello' }); - }, []); - - return createChatMessage; - }); - - await waitFor(() => { - expect(result.current.isLoading).toBe(false); - }); - - expect(result.current.data.data).toEqual({ hello: 'world' }); - }); - }); -}); diff --git a/packages/pl-fe/src/queries/trends.test.ts b/packages/pl-fe/src/queries/trends.test.ts deleted file mode 100644 index cd8a410e4..000000000 --- a/packages/pl-fe/src/queries/trends.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { __stub } from '@/api'; -import { queryClient, renderHook, waitFor } from '@/jest/test-helpers'; - -import useTrends from './trends'; - -describe('useTrends', () => { - beforeEach(() => { - queryClient.clear(); - }); - - describe('with a successful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/trends') - .reply(200, [ - { name: '#golf', url: 'https://example.com' }, - { name: '#tennis', url: 'https://example.com' }, - ]); - }); - }); - - it('is successful', async() => { - const { result } = renderHook(() => useTrends()); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.data?.length).toBe(2); - }); - }); - - describe('with an unsuccessful query', () => { - beforeEach(() => { - __stub((mock) => { - mock.onGet('/api/v1/trends').networkError(); - }); - }); - - it('is successful', async() => { - const { result } = renderHook(() => useTrends()); - - await waitFor(() => expect(result.current.isFetching).toBe(false)); - - expect(result.current.error).toBeDefined(); - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/admin.test.ts b/packages/pl-fe/src/reducers/admin.test.ts deleted file mode 100644 index fa4e26959..000000000 --- a/packages/pl-fe/src/reducers/admin.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Record as ImmutableRecord } from 'immutable'; - -import reducer from './admin'; - -describe('admin reducer', () => { - it('should return the initial state', () => { - const result = reducer(undefined, {} as any); - expect(ImmutableRecord.isRecord(result)).toBe(true); - expect(result.needsReboot).toBe(false); - }); -}); diff --git a/packages/pl-fe/src/reducers/auth.test.ts b/packages/pl-fe/src/reducers/auth.test.ts deleted file mode 100644 index 6e7913344..000000000 --- a/packages/pl-fe/src/reducers/auth.test.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; - -import { - AUTH_APP_CREATED, - AUTH_LOGGED_IN, - AUTH_LOGGED_OUT, - VERIFY_CREDENTIALS_SUCCESS, - VERIFY_CREDENTIALS_FAIL, - SWITCH_ACCOUNT, -} from '@/actions/auth'; -import { ME_FETCH_SKIP } from '@/actions/me'; -import { MASTODON_PRELOAD_IMPORT } from '@/actions/preload'; -import { buildAccount } from '@/jest/factory'; - -import reducer, { AuthAppRecord, AuthTokenRecord, AuthUserRecord, ReducerRecord } from './auth'; - -describe('auth reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any).toJS()).toMatchObject({ - app: {}, - users: {}, - tokens: {}, - me: null, - }); - }); - - describe('AUTH_APP_CREATED', () => { - it('should copy in the app', () => { - const token = { token_type: 'Bearer', access_token: 'ABCDEFG' }; - const action = { type: AUTH_APP_CREATED, app: token }; - - const result = reducer(undefined, action); - const expected = AuthAppRecord(token); - - expect(result.app).toEqual(expected); - }); - }); - - describe('AUTH_LOGGED_IN', () => { - it('should import the token', () => { - const token = { token_type: 'Bearer', access_token: 'ABCDEFG' }; - const action = { type: AUTH_LOGGED_IN, token }; - - const result = reducer(undefined, action); - const expected = ImmutableMap({ 'ABCDEFG': AuthTokenRecord(token) }); - - expect(result.tokens).toEqual(expected); - }); - - it('should merge the token with existing state', () => { - const state = ReducerRecord({ - tokens: ImmutableMap({ 'ABCDEFG': AuthTokenRecord({ token_type: 'Bearer', access_token: 'ABCDEFG' }) }), - }); - - const expected = ImmutableMap({ - 'ABCDEFG': AuthTokenRecord({ token_type: 'Bearer', access_token: 'ABCDEFG' }), - 'HIJKLMN': AuthTokenRecord({ token_type: 'Bearer', access_token: 'HIJKLMN' }), - }); - - const action = { - type: AUTH_LOGGED_IN, - token: { token_type: 'Bearer', access_token: 'HIJKLMN' }, - }; - - const result = reducer(state, action); - expect(result.tokens).toEqual(expected); - }); - }); - - describe('AUTH_LOGGED_OUT', () => { - it('deletes the user', () => { - const action = { - type: AUTH_LOGGED_OUT, - account: buildAccount({ url: 'https://gleasonator.com/users/alex' }), - }; - - const state = ReducerRecord({ - users: ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }), - }); - - const expected = ImmutableMap({ - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }); - - const result = reducer(state, action); - expect(result.users).toEqual(expected); - }); - - it('sets `me` to the next available user', () => { - const state = ReducerRecord({ - me: 'https://gleasonator.com/users/alex', - users: ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }), - }); - - const action = { - type: AUTH_LOGGED_OUT, - account: buildAccount({ url: 'https://gleasonator.com/users/alex' }), - }; - - const result = reducer(state, action); - expect(result.me).toEqual('https://gleasonator.com/users/benis'); - }); - }); - - describe('VERIFY_CREDENTIALS_SUCCESS', () => { - it('should import the user', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const expected = ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - }); - - const result = reducer(undefined, action); - expect(result.users).toEqual(expected); - }); - - it('should set the account in the token', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const state = ReducerRecord({ - tokens: ImmutableMap({ 'ABCDEFG': AuthTokenRecord({ token_type: 'Bearer', access_token: 'ABCDEFG' }) }), - }); - - const expected = { - 'ABCDEFG': { - token_type: 'Bearer', - access_token: 'ABCDEFG', - account: '1234', - me: 'https://gleasonator.com/users/alex', - }, - }; - - const result = reducer(state, action); - expect(result.tokens.toJS()).toMatchObject(expected); - }); - - it('sets `me` to the account if unset', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const result = reducer(undefined, action); - expect(result.me).toEqual('https://gleasonator.com/users/alex'); - }); - - it('leaves `me` alone if already set', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const state = ReducerRecord({ me: 'https://gleasonator.com/users/benis' }); - - const result = reducer(state, action); - expect(result.me).toEqual('https://gleasonator.com/users/benis'); - }); - - it('deletes mismatched users', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const state = ReducerRecord({ - users: ImmutableMap({ - 'https://gleasonator.com/users/mk': AuthUserRecord({ id: '4567', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/mk' }), - 'https://gleasonator.com/users/curtis': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/curtis' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5432', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }), - }); - - const expected = ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5432', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }); - - const result = reducer(state, action); - expect(result.users).toEqual(expected); - }); - - it('upgrades from an ID to a URL', () => { - const action = { - type: VERIFY_CREDENTIALS_SUCCESS, - token: 'ABCDEFG', - account: { id: '1234', url: 'https://gleasonator.com/users/alex' }, - }; - - const state = ReducerRecord({ - me: '1234', - users: ImmutableMap({ - '1234': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG' }), - '5432': AuthUserRecord({ id: '5432', access_token: 'HIJKLMN' }), - }), - tokens: ImmutableMap({ - 'ABCDEFG': AuthTokenRecord({ access_token: 'ABCDEFG', account: '1234' }), - }), - }); - - const expected = { - me: 'https://gleasonator.com/users/alex', - users: { - 'https://gleasonator.com/users/alex': { id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }, - '5432': { id: '5432', access_token: 'HIJKLMN' }, - }, - tokens: { - 'ABCDEFG': { access_token: 'ABCDEFG', account: '1234', me: 'https://gleasonator.com/users/alex' }, - }, - }; - - const result = reducer(state, action); - expect(result.toJS()).toMatchObject(expected); - }); - }); - - describe('VERIFY_CREDENTIALS_FAIL', () => { - it('should delete the failed token if it 403\'d', () => { - const state = ReducerRecord({ - tokens: ImmutableMap({ - 'ABCDEFG': AuthTokenRecord({ token_type: 'Bearer', access_token: 'ABCDEFG' }), - 'HIJKLMN': AuthTokenRecord({ token_type: 'Bearer', access_token: 'HIJKLMN' }), - }), - }); - - const expected = ImmutableMap({ - 'HIJKLMN': AuthTokenRecord({ token_type: 'Bearer', access_token: 'HIJKLMN' }), - }); - - const action = { - type: VERIFY_CREDENTIALS_FAIL, - token: 'ABCDEFG', - error: { response: { status: 403 } }, - }; - - const result = reducer(state, action); - expect(result.tokens).toEqual(expected); - }); - - it('should delete any users associated with the failed token', () => { - const state = ReducerRecord({ - users: ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }), - }); - - const expected = ImmutableMap({ - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }); - - const action = { - type: VERIFY_CREDENTIALS_FAIL, - token: 'ABCDEFG', - error: { response: { status: 403 } }, - }; - - const result = reducer(state, action); - expect(result.users).toEqual(expected); - }); - - it('should reassign `me` to the next in line', () => { - const state = ReducerRecord({ - me: 'https://gleasonator.com/users/alex', - users: ImmutableMap({ - 'https://gleasonator.com/users/alex': AuthUserRecord({ id: '1234', access_token: 'ABCDEFG', url: 'https://gleasonator.com/users/alex' }), - 'https://gleasonator.com/users/benis': AuthUserRecord({ id: '5678', access_token: 'HIJKLMN', url: 'https://gleasonator.com/users/benis' }), - }), - }); - - const action = { - type: VERIFY_CREDENTIALS_FAIL, - token: 'ABCDEFG', - error: { response: { status: 403 } }, - }; - - const result = reducer(state, action); - expect(result.me).toEqual('https://gleasonator.com/users/benis'); - }); - }); - - describe('SWITCH_ACCOUNT', () => { - it('sets the value of `me`', () => { - const action = { - type: SWITCH_ACCOUNT, - account: { url: 'https://gleasonator.com/users/benis' }, - }; - - const result = reducer(undefined, action); - expect(result.me).toEqual('https://gleasonator.com/users/benis'); - }); - }); - - describe('ME_FETCH_SKIP', () => { - it('sets `me` to null', () => { - const state = ReducerRecord({ me: 'https://gleasonator.com/users/alex' }); - const action = { type: ME_FETCH_SKIP }; - const result = reducer(state, action); - expect(result.me).toEqual(null); - }); - }); - - describe('MASTODON_PRELOAD_IMPORT', () => { - it('imports the user and token', async () => { - const data = await import('@/__fixtures__/mastodon_initial_state.json'); - - const action = { - type: MASTODON_PRELOAD_IMPORT, - data, - }; - - const expected = { - me: 'https://mastodon.social/@benis911', - app: {}, - users: { - 'https://mastodon.social/@benis911': { - id: '106801667066418367', - access_token: 'Nh15V9JWyY5Fshf2OJ_feNvOIkTV7YGVfEJFr0Y0D6Q', - url: 'https://mastodon.social/@benis911', - }, - }, - tokens: { - 'Nh15V9JWyY5Fshf2OJ_feNvOIkTV7YGVfEJFr0Y0D6Q': { - access_token: 'Nh15V9JWyY5Fshf2OJ_feNvOIkTV7YGVfEJFr0Y0D6Q', - account: '106801667066418367', - me: 'https://mastodon.social/@benis911', - scope: 'read write follow push', - token_type: 'Bearer', - }, - }, - }; - - const result = reducer(undefined, action); - expect(result.toJS()).toMatchObject(expected); - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/compose.test.ts b/packages/pl-fe/src/reducers/compose.test.ts deleted file mode 100644 index d6baa4fc2..000000000 --- a/packages/pl-fe/src/reducers/compose.test.ts +++ /dev/null @@ -1,482 +0,0 @@ -import { List as ImmutableList, Record as ImmutableRecord, fromJS } from 'immutable'; - -import * as actions from '@/actions/compose'; -import { ME_FETCH_SUCCESS, ME_PATCH_SUCCESS } from '@/actions/me'; -import { SETTING_CHANGE } from '@/actions/settings'; -import { TIMELINE_DELETE } from '@/actions/timelines'; -import { normalizeStatus } from '@/normalizers/status'; - -import reducer, { initialState, ReducerCompose } from './compose'; - -describe('compose reducer', () => { - it('returns the initial state by default', () => { - const state = reducer(undefined, {} as any); - expect(state.toJS()).toMatchObject({ - default: { - sensitive: false, - spoiler: false, - spoiler_text: '', - privacy: 'public', - text: '', - caretPosition: null, - in_reply_to: null, - is_submitting: false, - is_changing_upload: false, - is_uploading: false, - progress: 0, - media_attachments: [], - poll: null, - suggestion_token: null, - suggestions: [], - tagHistory: [], - content_type: 'text/plain', - }, - }); - expect(state.get('default')!.idempotencyKey.length === 36); - }); - - describe('COMPOSE_SET_STATUS', () => { - it('strips Pleroma integer attachments', async () => { - const status = await import('@/__fixtures__/pleroma-status-deleted.json'); - - const action = { - type: actions.COMPOSE_SET_STATUS, - id: 'compose-modal', - status: normalizeStatus(fromJS(status)), - v: { software: 'Pleroma' }, - withRedraft: true, - }; - - const result = reducer(undefined, action as any); - expect(result.get('compose-modal')!.media_attachments.isEmpty()).toBe(true); - }); - - it('leaves non-Pleroma integer attachments alone', async () => { - const status = await import('@/__fixtures__/pleroma-status-deleted.json'); - - const action = { - type: actions.COMPOSE_SET_STATUS, - id: 'compose-modal', - status: normalizeStatus(fromJS(status)), - }; - - const result = reducer(undefined, action as any); - expect(result.get('compose-modal')!.media_attachments.getIn([0, 'id'])).toEqual('508107650'); - }); - - it('sets the id when editing a post', async () => { - const status = await import('@/__fixtures__/pleroma-status-deleted.json'); - - const action = { - id: 'compose-modal', - withRedraft: false, - type: actions.COMPOSE_SET_STATUS, - status: normalizeStatus(fromJS(status)), - }; - - const result = reducer(undefined, action as any); - expect(result.get('compose-modal')!.id).toEqual('AHU2RrX0wdcwzCYjFQ'); - }); - - it('does not set the id when redrafting a post', async () => { - const status = await import('@/__fixtures__/pleroma-status-deleted.json'); - - const action = { - id: 'compose-modal', - withRedraft: true, - type: actions.COMPOSE_SET_STATUS, - status: normalizeStatus(fromJS(status)), - }; - - const result = reducer(undefined, action as any); - expect(result.get('compose-modal')!.id).toEqual(null); - }); - }); - - it('uses \'public\' scope as default', () => { - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({})(), - account: ImmutableRecord({})(), - }; - expect(reducer(undefined, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'public' }); - }); - - it('uses \'direct\' scope when replying to a DM', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({ visibility: 'direct' })(), - account: ImmutableRecord({})(), - }; - expect(reducer(state as any, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'direct' }); - }); - - it('uses \'private\' scope when replying to a private post', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({ visibility: 'private' })(), - account: ImmutableRecord({})(), - }; - expect(reducer(state as any, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'private' }); - }); - - it('uses \'unlisted\' scope when replying to an unlisted post', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({ visibility: 'unlisted' })(), - account: ImmutableRecord({})(), - }; - expect(reducer(state, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'unlisted' }); - }); - - it('uses \'private\' scope when set as preference and replying to a public post', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'private' })); - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({ visibility: 'public' })(), - account: ImmutableRecord({})(), - }; - expect(reducer(state, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'private' }); - }); - - it('uses \'unlisted\' scope when set as preference and replying to a public post', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'unlisted' })); - const action = { - type: actions.COMPOSE_REPLY, - id: 'compose-modal', - status: ImmutableRecord({ visibility: 'public' })(), - account: ImmutableRecord({})(), - }; - expect(reducer(state, action as any).toJS()['compose-modal']).toMatchObject({ privacy: 'unlisted' }); - }); - - it('sets preferred scope on user login', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: ME_FETCH_SUCCESS, - me: { pleroma: { settings_store: { pl_fe: { defaultPrivacy: 'unlisted' } } } }, - }; - expect(reducer(state, action as any).toJS().default).toMatchObject({ - privacy: 'unlisted', - }); - }); - - it('sets preferred scope on settings change', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: SETTING_CHANGE, - path: ['defaultPrivacy'], - value: 'unlisted', - }; - expect(reducer(state, action).toJS().default).toMatchObject({ - privacy: 'unlisted', - }); - }); - - it('sets default scope on settings save', () => { - const state = initialState.set('default', ReducerCompose({ privacy: 'public' })); - const action = { - type: ME_PATCH_SUCCESS, - me: { pleroma: { settings_store: { pl_fe: { defaultPrivacy: 'unlisted' } } } }, - }; - expect(reducer(state, action).toJS().default).toMatchObject({ - privacy: 'unlisted', - }); - }); - - it('should handle COMPOSE_SPOILERNESS_CHANGE on CW button click', () => { - const state = initialState.set('home', ReducerCompose({ spoiler_text: 'spoiler text', spoiler: true, sensitive: true, media_attachments: ImmutableList() })); - const action = { - type: actions.COMPOSE_SPOILERNESS_CHANGE, - id: 'home', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - spoiler: false, - spoiler_text: '', - sensitive: false, - }); - }); - - it('should handle COMPOSE_SPOILER_TEXT_CHANGE', () => { - const state = initialState.set('home', ReducerCompose({ spoiler_text: 'prevtext' })); - const action = { - type: actions.COMPOSE_SPOILER_TEXT_CHANGE, - id: 'home', - text: 'nexttext', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - spoiler_text: 'nexttext', - }); - }); - - it('should handle COMPOSE_VISIBILITY_CHANGE', () => { - const state = initialState.set('home', ReducerCompose({ privacy: 'public' })); - const action = { - type: actions.COMPOSE_VISIBILITY_CHANGE, - id: 'home', - value: 'direct', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - privacy: 'direct', - }); - }); - - describe('COMPOSE_CHANGE', () => { - it('should handle text changing', () => { - const state = initialState.set('home', ReducerCompose({ text: 'prevtext' })); - const action = { - type: actions.COMPOSE_CHANGE, - id: 'home', - text: 'nexttext', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - text: 'nexttext', - }); - }); - }); - - it('should handle COMPOSE_SUBMIT_REQUEST', () => { - const state = initialState.set('home', ReducerCompose({ is_submitting: false })); - const action = { - type: actions.COMPOSE_SUBMIT_REQUEST, - id: 'home', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - is_submitting: true, - }); - }); - - it('should handle COMPOSE_UPLOAD_CHANGE_REQUEST', () => { - const state = initialState.set('home', ReducerCompose({ is_changing_upload: false })); - const action = { - type: actions.COMPOSE_UPLOAD_CHANGE_REQUEST, - id: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_changing_upload: true, - }); - }); - - it('should handle COMPOSE_SUBMIT_SUCCESS', () => { - const state = initialState.set('home', ReducerCompose({ privacy: 'private' })); - const action = { - type: actions.COMPOSE_SUBMIT_SUCCESS, - id: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - privacy: 'public', - }); - }); - - it('should handle COMPOSE_SUBMIT_FAIL', () => { - const state = initialState.set('home', ReducerCompose({ is_submitting: true })); - const action = { - type: actions.COMPOSE_SUBMIT_FAIL, - id: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_submitting: false, - }); - }); - - it('should handle COMPOSE_UPLOAD_CHANGE_FAIL', () => { - const state = initialState.set('home', ReducerCompose({ is_changing_upload: true })); - const action = { - type: actions.COMPOSE_UPLOAD_CHANGE_FAIL, - composeId: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_changing_upload: false, - }); - }); - - it('should handle COMPOSE_UPLOAD_REQUEST', () => { - const state = initialState.set('home', ReducerCompose({ is_uploading: false })); - const action = { - type: actions.COMPOSE_UPLOAD_REQUEST, - id: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_uploading: true, - }); - }); - - it('should handle COMPOSE_UPLOAD_SUCCESS', () => { - const state = initialState.set('home', ReducerCompose({ media_attachments: ImmutableList() })); - const media = [ - { - description: null, - id: '1375732379', - pleroma: { - mime_type: 'image/jpeg', - }, - preview_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', - remote_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', - text_url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', - type: 'image', - url: 'https://media.gleasonator.com/media_attachments/files/000/853/856/original/7035d67937053e1d.jpg', - }, - ]; - const action = { - type: actions.COMPOSE_UPLOAD_SUCCESS, - id: 'home', - media: media, - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_uploading: false, - }); - }); - - it('should handle COMPOSE_UPLOAD_FAIL', () => { - const state = initialState.set('home', ReducerCompose({ is_uploading: true })); - const action = { - type: actions.COMPOSE_UPLOAD_FAIL, - id: 'home', - }; - expect(reducer(state, action as any).toJS().home).toMatchObject({ - is_uploading: false, - }); - }); - - it('should handle COMPOSE_UPLOAD_PROGRESS', () => { - const state = initialState.set('home', ReducerCompose({ progress: 0 })); - const action = { - type: actions.COMPOSE_UPLOAD_PROGRESS, - id: 'home', - loaded: 10, - total: 15, - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - progress: 67, - }); - }); - - it('should handle COMPOSE_SUGGESTIONS_CLEAR', () => { - const state = initialState.set('home', ReducerCompose()); - const action = { - type: actions.COMPOSE_SUGGESTIONS_CLEAR, - id: 'home', - suggestions: [], - suggestion_token: 'aiekdns3', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - suggestion_token: null, - }); - }); - - it('should handle COMPOSE_SUGGESTION_TAGS_UPDATE', () => { - const state = initialState.set('home', ReducerCompose({ tagHistory: ImmutableList([ 'hashtag' ]) })); - const action = { - type: actions.COMPOSE_SUGGESTION_TAGS_UPDATE, - id: 'home', - token: 'aaadken3', - tags: ImmutableList([ - { name: 'hashtag', url: '', history: null }, - ]), - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - suggestion_token: 'aaadken3', - suggestions: [], - tagHistory: [ 'hashtag' ], - }); - }); - - it('should handle COMPOSE_TAG_HISTORY_UPDATE', () => { - const action = { - type: actions.COMPOSE_TAG_HISTORY_UPDATE, - id: 'home', - tags: [ 'hashtag', 'hashtag2'], - }; - expect(reducer(undefined, action).toJS().home).toMatchObject({ - tagHistory: [ 'hashtag', 'hashtag2' ], - }); - }); - - it('should handle TIMELINE_DELETE - delete status from timeline', () => { - const state = initialState.set('compose-modal', ReducerCompose({ in_reply_to: '9wk6pmImMrZjgrK7iC' })); - const action = { - type: TIMELINE_DELETE, - id: '9wk6pmImMrZjgrK7iC', - }; - expect(reducer(state, action as any).toJS()['compose-modal']).toMatchObject({ - in_reply_to: null, - }); - }); - - it('should handle COMPOSE_POLL_ADD', () => { - const state = initialState.set('home', ReducerCompose({ poll: null })); - const initialPoll = Object({ - options: [ - '', - '', - ], - expires_in: 86400, - multiple: false, - }); - const action = { - type: actions.COMPOSE_POLL_ADD, - id: 'home', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - poll: initialPoll, - }); - }); - - it('should handle COMPOSE_POLL_REMOVE', () => { - const state = initialState.set('home', ReducerCompose()); - const action = { - type: actions.COMPOSE_POLL_REMOVE, - id: 'home', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ - poll: null, - }); - }); - - it('should handle COMPOSE_POLL_OPTION_CHANGE', () => { - const initialPoll = Object({ - options: [ - 'option 1', - 'option 2', - ], - expires_in: 86400, - multiple: false, - }); - const state = initialState.set('home', ReducerCompose({ poll: initialPoll })); - const action = { - type: actions.COMPOSE_POLL_OPTION_CHANGE, - id: 'home', - index: 0, - title: 'change option', - }; - const updatedPoll = Object({ - options: [ - 'change option', - 'option 2', - ], - expires_in: 86400, - multiple: false, - }); - expect(reducer(state, action).toJS().home).toMatchObject({ - poll: updatedPoll, - }); - }); - - it('sets the post content-type', () => { - const state = initialState.set('home', ReducerCompose()); - const action = { - type: actions.COMPOSE_TYPE_CHANGE, - id: 'home', - value: 'text/plain', - }; - expect(reducer(state, action).toJS().home).toMatchObject({ content_type: 'text/plain' }); - }); -}); diff --git a/packages/pl-fe/src/reducers/contexts.test.ts b/packages/pl-fe/src/reducers/contexts.test.ts deleted file mode 100644 index 9ab72f933..000000000 --- a/packages/pl-fe/src/reducers/contexts.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { - Map as ImmutableMap, - OrderedSet as ImmutableOrderedSet, - fromJS, - is, -} from 'immutable'; - -import { STATUS_IMPORT } from '@/actions/importer'; -import { CONTEXT_FETCH_SUCCESS } from '@/actions/statuses'; -import { TIMELINE_DELETE } from '@/actions/timelines'; -import { applyActions } from '@/jest/test-helpers'; - -import reducer, { ReducerRecord } from './contexts'; - -describe('contexts reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toEqual(ReducerRecord({ - inReplyTos: ImmutableMap(), - replies: ImmutableMap(), - })); - }); - - describe(CONTEXT_FETCH_SUCCESS, () => { - it('inserts a tombstone connecting an orphaned descendant', () => { - const status = { id: 'A', in_reply_to_id: null }; - - const context = { - id: 'A', - ancestors: [], - descendants: [ - { id: 'C', in_reply_to_id: 'B' }, - ], - }; - - const actions = [ - { type: STATUS_IMPORT, status }, - { type: CONTEXT_FETCH_SUCCESS, ...context }, - ]; - - const result = applyActions(undefined, actions, reducer); - expect(result.inReplyTos.get('C')).toBe('C-tombstone'); - expect(result.replies.get('A').toArray()).toEqual(['C-tombstone']); - }); - - it('inserts a tombstone connecting an orphaned descendant (with null in_reply_to_id)', () => { - const status = { id: 'A', in_reply_to_id: null }; - - const context = { - id: 'A', - ancestors: [], - descendants: [ - { id: 'C', in_reply_to_id: null }, - ], - }; - - const actions = [ - { type: STATUS_IMPORT, status }, - { type: CONTEXT_FETCH_SUCCESS, ...context }, - ]; - - const result = applyActions(undefined, actions, reducer); - expect(result.inReplyTos.get('C')).toBe('C-tombstone'); - expect(result.replies.get('A').toArray()).toEqual(['C-tombstone']); - }); - - it('doesn\'t explode when it encounters a loop', () => { - const status = { id: 'A', in_reply_to_id: null }; - - const context = { - id: 'A', - ancestors: [], - descendants: [ - { id: 'C', in_reply_to_id: 'E' }, - { id: 'D', in_reply_to_id: 'C' }, - { id: 'E', in_reply_to_id: 'D' }, - { id: 'F', in_reply_to_id: 'F' }, - ], - }; - - const actions = [ - { type: STATUS_IMPORT, status }, - { type: CONTEXT_FETCH_SUCCESS, ...context }, - ]; - - const result = applyActions(undefined, actions, reducer); - - // These checks are superficial. We just don't want a stack overflow! - expect(result.inReplyTos.get('C')).toBe('C-tombstone'); - expect(result.replies.get('A').toArray()).toEqual(['C-tombstone', 'F-tombstone']); - }); - }); - - describe(TIMELINE_DELETE, () => { - it('deletes the status', () => { - const action = { type: TIMELINE_DELETE, id: 'B' }; - - const state = ReducerRecord({ - inReplyTos: fromJS({ - B: 'A', - C: 'B', - }) as ImmutableMap, - replies: fromJS({ - A: ImmutableOrderedSet(['B']), - B: ImmutableOrderedSet(['C']), - }) as ImmutableMap>, - }); - - const expected = ReducerRecord({ - inReplyTos: fromJS({}) as ImmutableMap, - replies: fromJS({ - A: ImmutableOrderedSet(), - }) as ImmutableMap>, - }); - - expect(is(reducer(state, action), expected)).toBe(true); - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/conversations.test.ts b/packages/pl-fe/src/reducers/conversations.test.ts deleted file mode 100644 index 89027b95c..000000000 --- a/packages/pl-fe/src/reducers/conversations.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { List as ImmutableList, Record as ImmutableRecord } from 'immutable'; - -import * as actions from '@/actions/conversations'; - -import reducer from './conversations'; - -describe('conversations reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toMatchObject({ - items: ImmutableList(), - isLoading: false, - hasMore: true, - mounted: 0, - }); - }); - - it('should handle CONVERSATIONS_FETCH_REQUEST', () => { - const state = ImmutableRecord({ isLoading: false })(); - const action = { - type: actions.CONVERSATIONS_FETCH_REQUEST, - }; - expect(reducer(state as any, action).toJS()).toMatchObject({ - isLoading: true, - }); - }); - - it('should handle CONVERSATIONS_FETCH_FAIL', () => { - const state = ImmutableRecord({ isLoading: true })(); - const action = { - type: actions.CONVERSATIONS_FETCH_FAIL, - }; - expect(reducer(state as any, action).toJS()).toMatchObject({ - isLoading: false, - }); - }); - - // it('should handle the Action CONVERSATIONS_MOUNT', () => { - // expect( - // reducer( - // { - // mounted: false, - // }, - // { - // type: 'CONVERSATIONS_MOUNT', - // }, - // ), - // ).toEqual({ - // mounted: true, - // }); - // }); - // - // it('should handle the Action CONVERSATIONS_UNMOUNT', () => { - // expect( - // reducer( - // { - // mounted: true, - // }, - // { - // type: 'CONVERSATIONS_UNMOUNT', - // }, - // ), - // ).toEqual({ - // mounted: false, - // }); - // }); - -}); diff --git a/packages/pl-fe/src/reducers/filters.test.ts b/packages/pl-fe/src/reducers/filters.test.ts deleted file mode 100644 index 492eff94a..000000000 --- a/packages/pl-fe/src/reducers/filters.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { List as ImmutableList } from 'immutable'; - -import reducer from './filters'; - -describe('filters reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toEqual(ImmutableList()); - }); -}); diff --git a/packages/pl-fe/src/reducers/index.test.ts b/packages/pl-fe/src/reducers/index.test.ts deleted file mode 100644 index a3b1cf2ea..000000000 --- a/packages/pl-fe/src/reducers/index.test.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Record as ImmutableRecord } from 'immutable'; - -import reducer from '.'; - -describe('root reducer', () => { - it('should return the initial state', () => { - const result = reducer(undefined, {} as any); - expect(ImmutableRecord.isRecord(result)).toBe(true); - expect(result.instance.version).toEqual('0.0.0'); - }); -}); diff --git a/packages/pl-fe/src/reducers/instance.test.ts b/packages/pl-fe/src/reducers/instance.test.ts deleted file mode 100644 index 5a0c87a82..000000000 --- a/packages/pl-fe/src/reducers/instance.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { ADMIN_CONFIG_UPDATE_REQUEST } from '@/actions/admin'; - -import reducer from './instance'; - -describe('instance reducer', () => { - it('should return the initial state', () => { - const result = reducer(undefined, {} as any); - - const expected = { - description_limit: 1500, - configuration: { - chats: { - max_characters: 5000, - max_media_attachments: 1, - }, - statuses: { - max_characters: 500, - max_media_attachments: 4, - }, - polls: { - max_options: 4, - max_characters_per_option: 25, - min_expiration: 300, - max_expiration: 2629746, - }, - }, - version: '0.0.0', - }; - - expect(result).toMatchObject(expected); - }); - - describe('ADMIN_CONFIG_UPDATE_REQUEST', async () => { - const { configs } = await import('@/__fixtures__/pleroma-admin-config.json'); - - it('imports the configs', () => { - const action = { - type: ADMIN_CONFIG_UPDATE_REQUEST, - configs, - }; - - // The normalizer has `registrations: closed` by default - const state = reducer(undefined, {} as any); - expect(state.registrations).toBe(false); - - // After importing the configs, registration will be open - const result = reducer(state, action); - expect(result.registrations).toBe(true); - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/me.test.ts b/packages/pl-fe/src/reducers/me.test.ts deleted file mode 100644 index 753171d11..000000000 --- a/packages/pl-fe/src/reducers/me.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import reducer from './me'; - -describe('me reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toEqual(null); - }); -}); diff --git a/packages/pl-fe/src/reducers/meta.test.ts b/packages/pl-fe/src/reducers/meta.test.ts deleted file mode 100644 index 93ddc40ee..000000000 --- a/packages/pl-fe/src/reducers/meta.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Record as ImmutableRecord } from 'immutable'; - -import reducer from './meta'; - -describe('meta reducer', () => { - it('should return the initial state', () => { - const result = reducer(undefined, {} as any); - expect(ImmutableRecord.isRecord(result)).toBe(true); - expect(result.instance_fetch_failed).toBe(false); - expect(result.swUpdating).toBe(false); - }); -}); diff --git a/packages/pl-fe/src/reducers/push-notifications.test.ts b/packages/pl-fe/src/reducers/push-notifications.test.ts deleted file mode 100644 index 021cb1771..000000000 --- a/packages/pl-fe/src/reducers/push-notifications.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import reducer from './push-notifications'; - -describe('push_notifications reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any).toJS()).toEqual({ - subscription: null, - alerts: { - follow: true, - follow_request: true, - favourite: true, - reblog: true, - mention: true, - poll: true, - }, - isSubscribed: false, - browserSupport: false, - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/statuses.test.ts b/packages/pl-fe/src/reducers/statuses.test.ts deleted file mode 100644 index b4eb857e4..000000000 --- a/packages/pl-fe/src/reducers/statuses.test.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { - Map as ImmutableMap, - Record as ImmutableRecord, -} from 'immutable'; - -import { STATUS_IMPORT } from '@/actions/importer'; -import { - STATUS_CREATE_REQUEST, - STATUS_CREATE_FAIL, - STATUS_DELETE_REQUEST, - STATUS_DELETE_FAIL, -} from '@/actions/statuses'; -import { normalizeStatus } from '@/normalizers/status'; - -import reducer, { ReducerStatus } from './statuses'; - -describe('statuses reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toEqual(ImmutableMap()); - }); - - describe('STATUS_IMPORT', () => { - it('parses the status as a Record', async () => { - const status = await import('@/__fixtures__/pleroma-quote-post.json'); - const action = { type: STATUS_IMPORT, status }; - const result = reducer(undefined, action).get('AFmFMSpITT9xcOJKcK'); - - expect(ImmutableRecord.isRecord(result)).toBe(true); - }); - - it('fixes the order of mentions', async () => { - const status = await import('@/__fixtures__/status-unordered-mentions.json'); - const action = { type: STATUS_IMPORT, status }; - - const expected = ['NEETzsche', 'alex', 'Lumeinshin', 'sneeden']; - - const result = reducer(undefined, action) - .get('AFChectaqZjmOVkXZ2')?.mentions - .map(mention => mention.get('username')) - .toJS(); - - expect(result).toEqual(expected); - }); - - it('preserves the quote', async () => { - const quotePost = await import('@/__fixtures__/pleroma-quote-post.json'); - const quotedQuotePost = await import('@/__fixtures__/pleroma-quote-of-quote-post.json'); - - let state = undefined; - state = reducer(state, { type: STATUS_IMPORT, status: quotePost }); - state = reducer(state, { type: STATUS_IMPORT, status: quotedQuotePost.pleroma.quote }); - - expect(state.getIn(['AFmFMSpITT9xcOJKcK', 'quote'])).toEqual('AFmFLcd6XYVdjWCrOS'); - }); - - it('normalizes Mitra attachments', async () => { - const status = await import('@/__fixtures__/mitra-status-with-attachments.json'); - - const state = reducer(undefined, { type: STATUS_IMPORT, status }); - - const expected = [{ - id: '017eeb0e-e5df-30a4-77a7-a929145cb836', - type: 'image', - url: 'https://mitra.social/media/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png', - preview_url: 'https://mitra.social/media/8e04e6091bbbac79641b5812508683ce72c38693661c18d16040553f2371e18d.png', - remote_url: null, - }, { - id: '017eeb0e-e5e4-2a48-2889-afdebf368a54', - type: 'unknown', - url: 'https://mitra.social/media/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac', - preview_url: 'https://mitra.social/media/8f72dc2e98572eb4ba7c3a902bca5f69c448fc4391837e5f8f0d4556280440ac', - remote_url: null, - }, { - id: '017eeb0e-e5e5-79fd-6054-8b6869b1db49', - type: 'unknown', - url: 'https://mitra.social/media/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.oga', - preview_url: 'https://mitra.social/media/55a81a090247cc4fc127e5716bcf7964f6e0df9b584f85f4696c0b994747a4d0.oga', - remote_url: null, - }, { - id: '017eeb0e-e5e6-c416-a444-21e560c47839', - type: 'unknown', - url: 'https://mitra.social/media/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0', - preview_url: 'https://mitra.social/media/0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0', - remote_url: null, - }]; - - expect(state.get('017eeb0e-e5e7-98fe-6b2b-ad02349251fb')?.media_attachments.toJS()).toMatchObject(expected); - }); - - it('fixes Pleroma attachments', async () => { - const status = await import('@/__fixtures__/pleroma-status-with-attachments.json'); - const action = { type: STATUS_IMPORT, status }; - const state = reducer(undefined, action); - const result = state.get('AGNkA21auFR5lnEAHw')?.media_attachments; - - expect(result?.size).toBe(4); - expect(result?.get(1)?.meta).toEqual(ImmutableMap()); - expect(result?.getIn([1, 'pleroma', 'mime_type'])).toBe('application/x-nes-rom'); - }); - - it('hides CWs', async () => { - const status = await import('@/__fixtures__/status-cw.json'); - const action = { type: STATUS_IMPORT, status }; - - const hidden = reducer(undefined, action).getIn(['107831528995252317', 'hidden']); - expect(hidden).toBe(true); - }); - - it('parses custom emojis', async () => { - const status = await import('@/__fixtures__/status-custom-emoji.json'); - const action = { type: STATUS_IMPORT, status }; - - const expected = 'Hello :ablobcathyper: :ageblobcat: 😂 world 😋 test :blobcatphoto:'; - - const result = reducer(undefined, action).getIn(['AGm7uC9DaAIGUa4KYK', 'contentHtml']); - expect(result).toBe(expected); - }); - - it('builds search_index', async () => { - const status = await import('@/__fixtures__/status-with-poll.json'); - const action = { type: STATUS_IMPORT, status }; - - const expected = `What is tolerance? - -Banning, censoring, and deplatforming anyone you disagree with - -Promoting free speech, even for people and ideas you dislike`; - - const result = reducer(undefined, action).getIn(['103874034847713213', 'search_index']); - expect(result).toEqual(expected); - }); - - it('builds search_index with mentions', async () => { - const status = await import('@/__fixtures__/pleroma-status-reply-with-mentions.json'); - const action = { type: STATUS_IMPORT, status }; - - const expected = `DMs are definitely only federated to the servers of the recipients tho. So if I DM a kfcc user, the kfcc admins can see it, but no other instance admins can. - -@crunklord420@kiwifarms.cc - -@becassine@kiwifarms.cc - -@King_Porgi@poa.st - -@ademan@thebag.social`; - - const result = reducer(undefined, action).getIn(['AHcweewcCh0iPUtMdk', 'search_index']); - expect(result).toEqual(expected); - }); - }); - - describe('STATUS_CREATE_REQUEST', () => { - it('increments the replies_count of its parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 4 }) as ReducerStatus, - }); - - const action = { - type: STATUS_CREATE_REQUEST, - params: { in_reply_to_id: '123' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(5); - }); - }); - - describe('STATUS_CREATE_FAIL', () => { - it('decrements the replies_count of its parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 5 }) as ReducerStatus, - }); - - const action = { - type: STATUS_CREATE_FAIL, - params: { in_reply_to_id: '123' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(4); - }); - }); - - describe('STATUS_DELETE_REQUEST', () => { - it('decrements the replies_count of its parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 4 }) as ReducerStatus, - }); - - const action = { - type: STATUS_DELETE_REQUEST, - params: { in_reply_to_id: '123' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(3); - }); - - it('gracefully does nothing if no parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 4 }) as ReducerStatus, - }); - - const action = { - type: STATUS_DELETE_REQUEST, - params: { id: '1' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(4); - }); - }); - - describe('STATUS_DELETE_FAIL', () => { - it('decrements the replies_count of its parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 4 }) as ReducerStatus, - }); - - const action = { - type: STATUS_DELETE_FAIL, - params: { in_reply_to_id: '123' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(5); - }); - - it('gracefully does nothing if no parent', () => { - const state = ImmutableMap({ - '123': normalizeStatus({ replies_count: 4 }) as ReducerStatus, - }); - - const action = { - type: STATUS_DELETE_FAIL, - params: { id: '1' }, - }; - - const result = reducer(state, action).getIn(['123', 'replies_count']); - expect(result).toEqual(4); - }); - }); -}); diff --git a/packages/pl-fe/src/reducers/timelines.test.ts b/packages/pl-fe/src/reducers/timelines.test.ts deleted file mode 100644 index 3af0421f9..000000000 --- a/packages/pl-fe/src/reducers/timelines.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet, Record as ImmutableRecord, fromJS } from 'immutable'; - -import { - TIMELINE_EXPAND_REQUEST, - TIMELINE_EXPAND_FAIL, - TIMELINE_EXPAND_SUCCESS, -} from '@/actions/timelines'; - -import reducer from './timelines'; - -describe('timelines reducer', () => { - it('should return the initial state', () => { - expect(reducer(undefined, {} as any)).toEqual(ImmutableMap()); - }); - - describe('TIMELINE_EXPAND_REQUEST', () => { - it('sets loading to true', () => { - const action = { - type: TIMELINE_EXPAND_REQUEST, - timeline: 'home', - }; - - const result = reducer(undefined, action); - expect(result.getIn(['home', 'isLoading'])).toBe(true); - }); - }); - - describe('TIMELINE_EXPAND_FAIL', () => { - it('sets loading to false', () => { - const state = ImmutableMap({ - home: ImmutableRecord({ isLoading: true })(), - }); - - const action = { - type: TIMELINE_EXPAND_FAIL, - timeline: 'home', - }; - - const result = reducer(state as any, action); - expect(result.getIn(['home', 'isLoading'])).toBe(false); - }); - }); - - describe('TIMELINE_EXPAND_SUCCESS', () => { - it('sets loading to false', () => { - const state = ImmutableMap(fromJS({ - home: ImmutableRecord({ isLoading: true })(), - })); - - const action = { - type: TIMELINE_EXPAND_SUCCESS, - timeline: 'home', - }; - - const result = reducer(state as any, action); - expect(result.getIn(['home', 'isLoading'])).toBe(false); - }); - - it('adds the status IDs', () => { - const expected = ImmutableOrderedSet(['1', '2', '5']); - - const action = { - type: TIMELINE_EXPAND_SUCCESS, - timeline: 'home', - statuses: [{ id: '1' }, { id: '2' }, { id: '5' }], - }; - - const result = reducer(undefined, action); - expect(result.getIn(['home', 'items'])).toEqual(expected); - }); - - it('merges new status IDs', () => { - const state = ImmutableMap(fromJS({ - home: ImmutableRecord({ items: ImmutableOrderedSet(['5', '2', '1']) })(), - })); - - const expected = ImmutableOrderedSet(['6', '5', '4', '2', '1']); - - const action = { - type: TIMELINE_EXPAND_SUCCESS, - timeline: 'home', - statuses: [{ id: '6' }, { id: '5' }, { id: '4' }], - }; - - const result = reducer(state as any, action); - expect(result.getIn(['home', 'items'])).toEqual(expected); - }); - - it('merges old status IDs', () => { - const state = ImmutableMap(fromJS({ - home: ImmutableRecord({ items: ImmutableOrderedSet(['6', '4', '3']) })(), - })); - - const expected = ImmutableOrderedSet(['6', '4', '3', '5', '2', '1']); - - const action = { - type: TIMELINE_EXPAND_SUCCESS, - timeline: 'home', - statuses: [{ id: '5' }, { id: '2' }, { id: '1' }], - }; - - const result = reducer(state as any, action); - expect(result.getIn(['home', 'items'])).toEqual(expected); - }); - - it('overrides pinned post IDs', () => { - const state = ImmutableMap(fromJS({ - 'account:1:pinned': ImmutableRecord({ items: ImmutableOrderedSet(['5', '2', '1']) })(), - })); - - const expected = ImmutableOrderedSet(['9', '8', '7']); - - const action = { - type: TIMELINE_EXPAND_SUCCESS, - timeline: 'home', - statuses: [{ id: '9' }, { id: '8' }, { id: '7' }], - }; - - const result = reducer(state as any, action); - expect(result.getIn(['home', 'items'])).toEqual(expected); - }); - }); -}); diff --git a/packages/pl-fe/src/toast.test.tsx b/packages/pl-fe/src/toast.test.tsx deleted file mode 100644 index af23c7e60..000000000 --- a/packages/pl-fe/src/toast.test.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import { render } from '@testing-library/react'; -// import { AxiosError, AxiosHeaders } from 'axios'; -import React from 'react'; -import { Toaster } from 'react-hot-toast'; -import { IntlProvider } from 'react-intl'; - -import { act, screen } from '@/jest/test-helpers'; - -import toast from './toast'; - -const renderApp = () => ({ - toast, - ...render( - - - , - ), -}); - -beforeAll(() => { - vi.spyOn(console, 'error').mockImplementation(() => {}); -}); - -afterEach(() => { - (console.error as any).mockClear(); -}); - -afterAll(() => { - (console.error as any).mockRestore(); -}); - -describe('toasts', () => { - it('renders successfully', async() => { - const { toast } = renderApp(); - - act(() => { - toast.success('hello'); - }); - - expect(screen.getByTestId('toast')).toBeInTheDocument(); - expect(screen.getByTestId('toast-message')).toHaveTextContent('hello'); - }); - - describe('actionable button', () => { - it('renders the button', async() => { - const { toast } = renderApp(); - - act(() => { - toast.success('hello', { action: () => null, actionLabel: 'click me' }); - }); - - expect(screen.getByTestId('toast-action')).toHaveTextContent('click me'); - }); - - it('does not render the button', async() => { - const { toast } = renderApp(); - - act(() => { - toast.success('hello'); - }); - - expect(screen.queryAllByTestId('toast-action')).toHaveLength(0); - }); - }); - - // describe('showAlertForError()', () => { - // const buildError = (message: string, status: number) => new AxiosError(message, String(status), undefined, null, { - // data: { - // error: message, - // }, - // statusText: String(status), - // status, - // headers: {}, - // config: { - // headers: new AxiosHeaders(), - // }, - // }); - - // describe('with a 502 status code', () => { - // it('renders the correct message', async() => { - // const message = 'The server is down'; - // const error = buildError(message, 502); - // const { toast } = renderApp(); - - // act(() => { - // toast.showAlertForError(error); - // }); - - // expect(screen.getByTestId('toast')).toBeInTheDocument(); - // expect(screen.getByTestId('toast-message')).toHaveTextContent('The server is down'); - // }); - // }); - - // describe('with a 404 status code', () => { - // it('renders the correct message', async() => { - // const error = buildError('', 404); - // const { toast } = renderApp(); - - // act(() => { - // toast.showAlertForError(error); - // }); - - // expect(screen.queryAllByTestId('toast')).toHaveLength(0); - // }); - // }); - - // describe('with a 410 status code', () => { - // it('renders the correct message', async() => { - // const error = buildError('', 410); - // const { toast } = renderApp(); - - // act(() => { - // toast.showAlertForError(error); - // }); - - // expect(screen.queryAllByTestId('toast')).toHaveLength(0); - // }); - // }); - - // describe('with an accepted status code', () => { - // describe('with a message from the server', () => { - // it('renders the correct message', async() => { - // const message = 'custom message'; - // const error = buildError(message, 200); - // const { toast } = renderApp(); - - // act(() => { - // toast.showAlertForError(error); - // }); - - // expect(screen.getByTestId('toast')).toBeInTheDocument(); - // expect(screen.getByTestId('toast-message')).toHaveTextContent(message); - // }); - // }); - - // describe('without a message from the server', () => { - // it('renders the correct message', async() => { - // const message = 'The request has been accepted for processing'; - // const error = buildError(message, 202); - // const { toast } = renderApp(); - - // act(() => { - // toast.showAlertForError(error); - // }); - - // expect(screen.getByTestId('toast')).toBeInTheDocument(); - // expect(screen.getByTestId('toast-message')).toHaveTextContent(message); - // }); - // }); - // }); - - // // describe('without a response', () => { - // // it('renders the default message', async() => { - // // const error = new AxiosError(); - // // const { toast } = renderApp(); - - // // act(() => { - // // toast.showAlertForError(error); - // // }); - - // // expect(screen.getByTestId('toast')).toBeInTheDocument(); - // // expect(screen.getByTestId('toast-message')).toHaveTextContent('An unexpected error occurred.'); - // // }); - // // }); - // }); -}); diff --git a/packages/pl-fe/src/utils/badges.test.ts b/packages/pl-fe/src/utils/badges.test.ts deleted file mode 100644 index 2dff7a903..000000000 --- a/packages/pl-fe/src/utils/badges.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { buildAccount } from '@/jest/factory'; - -import { - tagToBadge, - badgeToTag, - filterBadges, - getTagDiff, - getBadges, -} from './badges'; - -test('tagToBadge', () => { - expect(tagToBadge('yolo')).toEqual('badge:yolo'); -}); - -test('badgeToTag', () => { - expect(badgeToTag('badge:yolo')).toEqual('yolo'); - expect(badgeToTag('badge:badge:')).toEqual('badge:'); -}); - -test('filterBadges', () => { - const tags = ['one', 'badge:two', 'badge:three', 'four']; - const badges = ['badge:two', 'badge:three']; - expect(filterBadges(tags)).toEqual(badges); -}); - -test('getTagDiff', () => { - const oldTags = ['one', 'two', 'three']; - const newTags = ['three', 'four', 'five']; - - const expected = { - added: ['four', 'five'], - removed: ['one', 'two'], - }; - - expect(getTagDiff(oldTags, newTags)).toEqual(expected); -}); - -test('getBadges', () => { - const account = buildAccount({ id: '1', pleroma: { tags: ['a', 'b', 'badge:c'] } }); - expect(getBadges(account)).toEqual(['badge:c']); -}); diff --git a/packages/pl-fe/src/utils/base64.test.ts b/packages/pl-fe/src/utils/base64.test.ts deleted file mode 100644 index ae0782677..000000000 --- a/packages/pl-fe/src/utils/base64.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as base64 from './base64'; - -describe('base64', () => { - describe('decode', () => { - it('returns a uint8 array', () => { - const arr = base64.decode('dGVzdA=='); - expect(arr).toEqual(new Uint8Array([116, 101, 115, 116])); - }); - }); -}); diff --git a/packages/pl-fe/src/utils/chats.test.ts b/packages/pl-fe/src/utils/chats.test.ts deleted file mode 100644 index cb6bee96e..000000000 --- a/packages/pl-fe/src/utils/chats.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { buildAccount } from '@/jest/factory'; -import { normalizeChatMessage } from '@/normalizers/chat-message'; -import { ChatKeys, IChat } from '@/queries/chats'; -import { queryClient } from '@/queries/client'; - -import { updateChatMessage } from './chats'; - -const chat: IChat = { - account: buildAccount({ - username: 'username', - verified: true, - id: '1', - acct: 'acct', - avatar: 'avatar', - avatar_static: 'avatar', - display_name: 'my name', - }), - created_at: '2020-06-10T02:05:06.000Z', - id: '1', - last_message: null, - unread: 0, -}; - -const buildChatMessage = (id: string) => normalizeChatMessage({ - id, - chat_id: '1', - account_id: '1', - content: `chat message #${id}`, - created_at: '2020-06-10T02:05:06.000Z', - unread: true, -}); - -describe('chat utils', () => { - describe('updateChatMessage()', () => { - const initialChatMessage = buildChatMessage('1'); - - beforeEach(() => { - const initialQueryData = { - pages: [ - { result: [initialChatMessage], hasMore: false, link: undefined }, - ], - pageParams: [undefined], - }; - - queryClient.setQueryData(ChatKeys.chatMessages(chat.id), initialQueryData); - }); - - it('correctly updates the chat message', () => { - expect( - (queryClient.getQueryData(ChatKeys.chatMessages(chat.id)) as any).pages[0].result[0].content, - ).toEqual(initialChatMessage.content); - - const nextChatMessage = normalizeChatMessage({ - ...initialChatMessage.toJS(), - content: 'new content', - }); - - updateChatMessage(nextChatMessage); - expect( - (queryClient.getQueryData(ChatKeys.chatMessages(chat.id)) as any).pages[0].result[0].content, - ).toEqual(nextChatMessage.content); - }); - }); -}); diff --git a/packages/pl-fe/src/utils/colors.test.ts b/packages/pl-fe/src/utils/colors.test.ts deleted file mode 100644 index 787d5886e..000000000 --- a/packages/pl-fe/src/utils/colors.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import tintify from './colors'; - -const AZURE = '#0482d8'; - -describe('tintify()', () => { - it('generates tints from a base color', () => { - const result = tintify(AZURE); - - expect(result).toEqual({ - '100': '#e6f3fb', - '200': '#c0e0f5', - '300': '#4fa8e4', - '400': '#369be0', - '50': '#f2f9fd', - '500': '#0482d8', - '600': '#0475c2', - '700': '#0362a2', - '800': '#012741', - '900': '#011929', - }); - }); -}); diff --git a/packages/pl-fe/src/utils/comparators.test.ts b/packages/pl-fe/src/utils/comparators.test.ts deleted file mode 100644 index d1254ae0b..000000000 --- a/packages/pl-fe/src/utils/comparators.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { compareId } from './comparators'; - -test('compareId', () => { - expect(compareId('3', '3')).toBe(0); - expect(compareId('10', '1')).toBe(1); - expect(compareId('99', '100')).toBe(-1); -}); diff --git a/packages/pl-fe/src/utils/config-db.test.ts b/packages/pl-fe/src/utils/config-db.test.ts deleted file mode 100644 index c9c73eb2e..000000000 --- a/packages/pl-fe/src/utils/config-db.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { List as ImmutableList, fromJS } from 'immutable'; - -import config_db from '@/__fixtures__/config_db.json'; - -import { ConfigDB } from './config-db'; - -test('find', () => { - const configs = fromJS(config_db).get('configs'); - expect(ConfigDB.find(configs as ImmutableList, ':phoenix', ':json_library')).toEqual(fromJS({ - group: ':phoenix', - key: ':json_library', - value: 'Jason', - })); -}); diff --git a/packages/pl-fe/src/utils/emoji-reacts.test.ts b/packages/pl-fe/src/utils/emoji-reacts.test.ts deleted file mode 100644 index 3e12a9dc9..000000000 --- a/packages/pl-fe/src/utils/emoji-reacts.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { List as ImmutableList, fromJS } from 'immutable'; -import { emojiReactionSchema } from 'pl-api'; -import * as v from 'valibot'; - -import { - simulateEmojiReact, - simulateUnEmojiReact, -} from './emoji-reacts'; - -describe('simulateEmojiReact', () => { - it('adds the emoji to the list', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 2, 'me': false, 'name': '❤', 'url': undefined }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateEmojiReact(emojiReacts, '❤')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 3, 'me': true, 'name': '❤', 'url': undefined }, - ])); - }); - - it('creates the emoji if it didn\'t already exist', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 2, 'me': false, 'name': '❤', 'url': undefined }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateEmojiReact(emojiReacts, '😯')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 2, 'me': false, 'name': '❤', 'url': undefined }, - { 'count': 1, 'me': true, 'name': '😯', 'url': undefined }, - ])); - }); - - it('adds a custom emoji to the list', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 2, 'me': false, 'name': '❤', 'url': undefined }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateEmojiReact(emojiReacts, 'soapbox', 'https://gleasonator.com/emoji/Gleasonator/soapbox.png')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍', 'url': undefined }, - { 'count': 2, 'me': false, 'name': '❤', 'url': undefined }, - { 'count': 1, 'me': true, 'name': 'soapbox', 'url': 'https://gleasonator.com/emoji/Gleasonator/soapbox.png' }, - ])); - }); -}); - -describe('simulateUnEmojiReact', () => { - it('removes the emoji from the list', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 3, 'me': true, 'name': '❤' }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateUnEmojiReact(emojiReacts, '❤')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 2, 'me': false, 'name': '❤' }, - ])); - }); - - it('removes the emoji if it\'s the last one in the list', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 2, 'me': false, 'name': '❤' }, - { 'count': 1, 'me': true, 'name': '😯' }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateUnEmojiReact(emojiReacts, '😯')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 2, 'me': false, 'name': '❤' }, - ])); - }); - - it ('removes custom emoji from the list', () => { - const emojiReacts = ImmutableList([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 2, 'me': false, 'name': '❤' }, - { 'count': 1, 'me': true, 'name': 'soapbox', 'url': 'https://gleasonator.com/emoji/Gleasonator/soapbox.png' }, - ].map((react) => v.parse(emojiReactionSchema, react))); - expect(simulateUnEmojiReact(emojiReacts, 'soapbox')).toEqual(fromJS([ - { 'count': 2, 'me': false, 'name': '👍' }, - { 'count': 2, 'me': false, 'name': '❤' }, - ])); - }); -}); diff --git a/packages/pl-fe/src/utils/emoji.test.ts b/packages/pl-fe/src/utils/emoji.test.ts deleted file mode 100644 index 9880589c2..000000000 --- a/packages/pl-fe/src/utils/emoji.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - removeVS16s, - toCodePoints, -} from './emoji'; - -const ASCII_HEART = '❤'; // '\u2764\uFE0F' -const RED_HEART_RGI = '❤️'; // '\u2764' -const JOY = '😂'; - -describe('removeVS16s()', () => { - it('removes Variation Selector-16 characters from emoji', () => { - // Sanity check - expect(ASCII_HEART).not.toBe(RED_HEART_RGI); - - // It normalizes an emoji with VS16s - expect(removeVS16s(RED_HEART_RGI)).toBe(ASCII_HEART); - - // Leaves a regular emoji alone - expect(removeVS16s(JOY)).toBe(JOY); - }); -}); - -describe('toCodePoints()', () => { - it('converts a plain emoji', () => { - expect(toCodePoints('😂')).toEqual(['1f602']); - }); - - it('converts a VS16 emoji', () => { - expect(toCodePoints(RED_HEART_RGI)).toEqual(['2764', 'fe0f']); - }); - - it('converts an ASCII character', () => { - expect(toCodePoints(ASCII_HEART)).toEqual(['2764']); - }); - - it('converts a sequence emoji', () => { - expect(toCodePoints('🇺🇸')).toEqual(['1f1fa', '1f1f8']); - }); -}); diff --git a/packages/pl-fe/src/utils/html.test.ts b/packages/pl-fe/src/utils/html.test.ts deleted file mode 100644 index cf0a62d1d..000000000 --- a/packages/pl-fe/src/utils/html.test.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as html from './html'; - -describe('html', () => { - describe('unsecapeHTML', () => { - it('returns unescaped HTML', () => { - const output = html.unescapeHTML('

lorem

ipsum


<br>'); - expect(output).toEqual('lorem\n\nipsum\n
'); - }); - }); -}); diff --git a/packages/pl-fe/src/utils/input.test.ts b/packages/pl-fe/src/utils/input.test.ts deleted file mode 100644 index 90fb1dc81..000000000 --- a/packages/pl-fe/src/utils/input.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { normalizeUsername } from './input'; - -test('normalizeUsername', () => { - expect(normalizeUsername('@alex')).toBe('alex'); - expect(normalizeUsername('alex@alexgleason.me')).toBe('alex@alexgleason.me'); - expect(normalizeUsername('@alex@gleasonator.com')).toBe('alex@gleasonator.com'); -}); diff --git a/packages/pl-fe/src/utils/media.test.ts b/packages/pl-fe/src/utils/media.test.ts deleted file mode 100644 index c819f594c..000000000 --- a/packages/pl-fe/src/utils/media.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { addAutoPlay } from './media'; - -describe('addAutoPlay()', () => { - it('adds the correct query parameters to the src', () => { - const html = ''; - expect(addAutoPlay(html)).toEqual(''); - }); - - describe('when the iframe src already has params', () => { - it('adds the correct query parameters to the src', () => { - const html = ''; - expect(addAutoPlay(html)).toEqual(''); - }); - }); -}); diff --git a/packages/pl-fe/src/utils/numbers.test.tsx b/packages/pl-fe/src/utils/numbers.test.tsx deleted file mode 100644 index 747d7c59b..000000000 --- a/packages/pl-fe/src/utils/numbers.test.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import React from 'react'; - -import { render, screen } from '@/jest/test-helpers'; - -import { isIntegerId, shortNumberFormat } from './numbers'; - -test('isIntegerId()', () => { - expect(isIntegerId('0')).toBe(true); - expect(isIntegerId('1')).toBe(true); - expect(isIntegerId('508107650')).toBe(true); - expect(isIntegerId('-1764036199')).toBe(true); - expect(isIntegerId('106801667066418367')).toBe(true); - expect(isIntegerId('9v5bmRalQvjOy0ECcC')).toBe(false); - expect(isIntegerId(null as any)).toBe(false); - expect(isIntegerId(undefined as any)).toBe(false); -}); -describe('shortNumberFormat', () => { - test('handles non-numbers', () => { - render(
{shortNumberFormat('not-number')}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('•'); - }); - - test('handles max argument', () => { - render(
{shortNumberFormat(25, 20)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('20+'); - }); - - test('formats numbers under 1,000', () => { - render(
{shortNumberFormat(555)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('555'); - }); - - test('formats numbers under 1,000,000', () => { - render(
{shortNumberFormat(5555)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('5.55k'); - }); - - test('formats numbers over 1,000,000', () => { - render(
{shortNumberFormat(5555555)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('5.55M'); - }); - - test('formats a multitude of numbers', () => { - let result = render(
{shortNumberFormat(0)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('0'); - result.unmount(); - - result = render(
{shortNumberFormat(1)}
); - expect(screen.getByTestId('num')).toHaveTextContent('1'); - result.unmount(); - - result = render(
{shortNumberFormat(999)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('999'); - result.unmount(); - - result = render(
{shortNumberFormat(1000)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1k'); - result.unmount(); - - result = render(
{shortNumberFormat(1001)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1k'); - result.unmount(); - - result = render(
{shortNumberFormat(1005)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1k'); - result.unmount(); - - result = render(
{shortNumberFormat(1006)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1k'); - result.unmount(); - - result = render(
{shortNumberFormat(1010)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1.01k'); - result.unmount(); - - result = render(
{shortNumberFormat(1530)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1.53k'); - result.unmount(); - - result = render(
{shortNumberFormat(10530)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('10.5k'); - result.unmount(); - - result = render(
{shortNumberFormat(999500)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('999k'); - result.unmount(); - - result = render(
{shortNumberFormat(999999)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('999k'); - result.unmount(); - - result = render(
{shortNumberFormat(999499)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('999k'); - result.unmount(); - - result = render(
{shortNumberFormat(1000000)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1M'); - result.unmount(); - - result = render(
{shortNumberFormat(3905558)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('3.9M'); - result.unmount(); - - result = render(
{shortNumberFormat(1031511)}
, undefined, null); - expect(screen.getByTestId('num')).toHaveTextContent('1.03M'); - result.unmount(); - }); -}); diff --git a/packages/pl-fe/src/utils/numbers.tsx b/packages/pl-fe/src/utils/numbers.tsx index 3524dbcee..5b623b071 100644 --- a/packages/pl-fe/src/utils/numbers.tsx +++ b/packages/pl-fe/src/utils/numbers.tsx @@ -46,12 +46,8 @@ const shortNumberFormat = (number: any, max?: number): React.ReactNode => { ); }; -/** Check if an entity ID is an integer (eg not a FlakeId). */ -const isIntegerId = (id: string): boolean => new RegExp(/^-?[0-9]+$/g).test(id); - export { isNumber, roundDown, shortNumberFormat, - isIntegerId, }; diff --git a/packages/pl-fe/src/utils/queries.test.ts b/packages/pl-fe/src/utils/queries.test.ts deleted file mode 100644 index 451a76b32..000000000 --- a/packages/pl-fe/src/utils/queries.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { InfiniteData } from '@tanstack/react-query'; - -import { queryClient } from '@/queries/client'; - -import { PaginatedResult, sortQueryData, updatePageItem } from './queries'; - -interface Item { - id: number; - text: string; -} - -const buildItem = (id: number): Item => ({ id, text: `item ${id}` }); - -const queryKey = ['test', 'query']; - -describe('updatePageItem()', () => { - beforeEach(() => { - queryClient.clear(); - }); - - describe('without cached data', () => { - it('safely returns undefined', () => { - updatePageItem(queryKey, buildItem(1), (o, n) => o.id === n.id); - const nextQueryData = queryClient.getQueryData>>(queryKey); - expect(nextQueryData).toBeUndefined(); - }); - }); - - describe('with cached data', () => { - const cachedQueryData = { - pages: [ - { - result: [buildItem(1), buildItem(2), buildItem(3)], - hasMore: false, - link: undefined, - }, - ], - pageParams: [undefined], - }; - - beforeEach(() => { - queryClient.setQueryData(queryKey, cachedQueryData); - }); - - it('updates the correct item in the cached data', () => { - const initialQueryData = queryClient.getQueryData>>(queryKey); - expect(initialQueryData?.pages[0].result.map((r) => r.id)).toEqual([1, 2, 3]); - expect(initialQueryData?.pages[0].result.find((r) => r.id === 2)?.text).toEqual('item 2'); - updatePageItem(queryKey, { id: 2, text: 'new text' }, (o, n) => o.id === n.id); - const nextQueryData = queryClient.getQueryData>>(queryKey); - expect(nextQueryData?.pages[0].result.map((r) => r.id)).toEqual([1, 2, 3]); - expect(nextQueryData?.pages[0].result.find((r) => r.id === 2)?.text).toEqual('new text'); - }); - }); -}); - -describe('sortQueryData()', () => { - beforeEach(() => { - queryClient.clear(); - }); - - describe('without cached data', () => { - it('safely returns undefined', () => { - sortQueryData(queryKey, (a, b) => b.id - a.id); - const nextQueryData = queryClient.getQueryData>>(queryKey); - expect(nextQueryData).toBeUndefined(); - }); - }); - - describe('with cached data', () => { - const cachedQueryData = { - pages: [ - { - result: [...Array(20).fill(0).map((_, idx) => buildItem(idx))], - hasMore: false, - link: undefined, - }, - { - result: [...Array(4).fill(0).map((_, idx) => buildItem(idx + 20))], - hasMore: true, - link: 'my-link', - }, - ], - pageParams: [undefined], - }; - - beforeEach(() => { - queryClient.setQueryData(queryKey, cachedQueryData); - }); - - it('sorts the cached data', () => { - const initialQueryData = queryClient.getQueryData>>(queryKey); - expect(initialQueryData?.pages[0].result[0].id === 0); // first id is 0 - sortQueryData(queryKey, (a, b) => b.id - a.id); // sort descending - const nextQueryData = queryClient.getQueryData>>(queryKey); - expect(nextQueryData?.pages[0].result[0].id === 0); // first id is now 23 - }); - - it('persists the metadata', () => { - const initialQueryData = queryClient.getQueryData>>(queryKey); - const initialMetaData = initialQueryData?.pages.map((page) => page.link); - sortQueryData(queryKey, (a, b) => b.id - a.id); - const nextQueryData = queryClient.getQueryData>>(queryKey); - const nextMetaData = nextQueryData?.pages.map((page) => page.link); - - expect(initialMetaData).toEqual(nextMetaData); - }); - }); -}); diff --git a/packages/pl-fe/src/utils/redirect.ts b/packages/pl-fe/src/utils/redirect.ts index e344c434c..b44ae5cbf 100644 --- a/packages/pl-fe/src/utils/redirect.ts +++ b/packages/pl-fe/src/utils/redirect.ts @@ -1,5 +1,3 @@ -import { useEffect } from 'react'; - const LOCAL_STORAGE_REDIRECT_KEY = 'plfe:redirect_uri'; const getRedirectUrl = () => { @@ -12,18 +10,4 @@ const getRedirectUrl = () => { return redirectUri || '/'; }; -const useCachedLocationHandler = () => { - const removeCachedRedirectUri = () => localStorage.removeItem(LOCAL_STORAGE_REDIRECT_KEY); - - useEffect(() => { - window.addEventListener('beforeunload', removeCachedRedirectUri); - - return () => { - window.removeEventListener('beforeunload', removeCachedRedirectUri); - }; - }, []); - - return null; -}; - -export { getRedirectUrl, useCachedLocationHandler }; +export { getRedirectUrl }; diff --git a/packages/pl-fe/src/utils/status.test.ts b/packages/pl-fe/src/utils/status.test.ts deleted file mode 100644 index e00e0ed5b..000000000 --- a/packages/pl-fe/src/utils/status.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { buildStatus } from '@/jest/factory'; - -import { - hasIntegerMediaIds, - defaultMediaVisibility, -} from './status'; - -describe('hasIntegerMediaIds()', () => { - it('returns true for a Pleroma deleted status', async () => { - const status = buildStatus(await import('@/__fixtures__/pleroma-status-deleted.json') as any); - expect(hasIntegerMediaIds(status)).toBe(true); - }); -}); - -describe('defaultMediaVisibility()', () => { - it('returns false with no status', () => { - expect(defaultMediaVisibility(undefined, 'default')).toBe(false); - }); - - it('hides sensitive media by default', () => { - const status = buildStatus({ sensitive: true }); - expect(defaultMediaVisibility(status, 'default')).toBe(false); - }); - - it('hides media when displayMedia is hide_all', () => { - const status = buildStatus({}); - expect(defaultMediaVisibility(status, 'hide_all')).toBe(false); - }); - - it('shows sensitive media when displayMedia is show_all', () => { - const status = buildStatus({ sensitive: true }); - expect(defaultMediaVisibility(status, 'show_all')).toBe(true); - }); -}); diff --git a/packages/pl-fe/src/utils/status.ts b/packages/pl-fe/src/utils/status.ts index 0c30075ac..10ec50ad5 100644 --- a/packages/pl-fe/src/utils/status.ts +++ b/packages/pl-fe/src/utils/status.ts @@ -1,14 +1,6 @@ -import { isIntegerId } from '@/utils/numbers'; - import type { Status } from '@/normalizers/status'; import type { IntlShape } from 'react-intl'; -/** Get the initial visibility of media attachments from user settings. */ -const defaultMediaVisibility = ( - status: Pick, - displayMedia: string, -): boolean => (displayMedia !== 'hide_all' && !status.sensitive || displayMedia === 'show_all'); - /** Grab the first external link from a status. */ const getFirstExternalLink = (status: Pick): HTMLAnchorElement | null => { try { @@ -26,11 +18,6 @@ const getFirstExternalLink = (status: Pick): HTMLAnchorElemen const shouldHaveCard = (status: Pick): boolean => Boolean(getFirstExternalLink(status)); -/** Whether the media IDs on this status have integer IDs (opposed to FlakeIds). */ -// https://gitlab.com/soapbox-pub/soapbox/-/merge_requests/1087 -const hasIntegerMediaIds = (status: Pick): boolean => - status.media_attachments.some(({ id }) => isIntegerId(id)); - /** Sanitize status text for use with screen readers. */ const textForScreenReader = ( intl: IntlShape, @@ -67,9 +54,7 @@ const getStatusIdsFromLinksInContent = (content: string): string[] => { }; export { - defaultMediaVisibility, shouldHaveCard, - hasIntegerMediaIds, textForScreenReader, getStatusIdsFromLinksInContent, }; diff --git a/packages/pl-fe/src/utils/tailwind.test.ts b/packages/pl-fe/src/utils/tailwind.test.ts deleted file mode 100644 index 4341caeb6..000000000 --- a/packages/pl-fe/src/utils/tailwind.test.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { Map as ImmutableMap } from 'immutable'; - -import { toTailwind, fromBasicColors, expandPalette } from './tailwind'; - -describe('toTailwind()', () => { - it('handles empty pl-fe config', () => { - const frontendConfig = ImmutableMap(); - const result = toTailwind(frontendConfig); - const expected = ImmutableMap({ colors: ImmutableMap() }); - expect(result).toEqual(expected); - }); - - it('converts brandColor into a Tailwind color palette', () => { - const frontendConfig = ImmutableMap({ brandColor: '#0482d8' }); - - const expected = { - brandColor: '#0482d8', - colors: { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - }, - }; - - const result = toTailwind(frontendConfig); - expect(result.toJS()).toMatchObject(expected); - }); - - it('prefers Tailwind colors object over legacy colors', () => { - const frontendConfig = ImmutableMap({ - brandColor: '#0482d8', - colors: ImmutableMap({ - primary: ImmutableMap({ - 300: '#ff0000', - }), - }), - }); - - const expected = { - brandColor: '#0482d8', - colors: { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#ff0000', // <-- - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - }, - }; - - const result = toTailwind(frontendConfig); - expect(result.toJS()).toMatchObject(expected); - }); -}); - -describe('fromBasicColors()', () => { - it('converts only brandColor', () => { - const frontendConfig = ImmutableMap({ brandColor: '#0482d8' }); - - const expected = { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - // Accent color is generated from brandColor - accent: { - 50: '#f3fbfd', - 100: '#e7f7fa', - 200: '#c3ecf4', - 300: '#58cadf', - 400: '#40c2da', - 500: '#10b3d1', - 600: '#0ea1bc', - 700: '#0c869d', - 800: '#05363f', - 900: '#032228', - }, - secondary: { - 50: '#f3fbfd', - 100: '#e7f7fa', - 200: '#c3ecf4', - 300: '#58cadf', - 400: '#40c2da', - 500: '#10b3d1', - 600: '#0ea1bc', - 700: '#0c869d', - 800: '#05363f', - 900: '#032228', - }, - gray: { - 50: '#f8fafa', - 100: '#f1f4f6', - 200: '#dde4e8', - 300: '#9eb2bf', - 400: '#91a7b5', - 500: '#7591a3', - 600: '#698393', - 700: '#586d7a', - 800: '#232c31', - 900: '#161c1f', - }, - }; - - const result = fromBasicColors(frontendConfig); - expect(result).toEqual(expected); - }); - - it('converts both legacy colors', () => { - const frontendConfig = ImmutableMap({ - brandColor: '#0482d8', - accentColor: '#2bd110', - }); - - const expected = { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - accent: { - 50: '#f4fdf3', - 100: '#eafae7', - 200: '#caf4c3', - 300: '#6bdf58', - 400: '#55da40', - 500: '#2bd110', - 600: '#27bc0e', - 700: '#209d0c', - 800: '#0d3f05', - 900: '#082803', - }, - secondary: { - 50: '#f4fdf3', - 100: '#eafae7', - 200: '#caf4c3', - 300: '#6bdf58', - 400: '#55da40', - 500: '#2bd110', - 600: '#27bc0e', - 700: '#209d0c', - 800: '#0d3f05', - 900: '#082803', - }, - gray: { - 50: '#f8fafa', - 100: '#f1f4f6', - 200: '#dde4e8', - 300: '#9eb2bf', - 400: '#91a7b5', - 500: '#7591a3', - 600: '#698393', - 700: '#586d7a', - 800: '#232c31', - 900: '#161c1f', - }, - }; - - const result = fromBasicColors(frontendConfig); - expect(result).toEqual(expected); - }); -}); - -describe('expandPalette()', () => { - it('expands one color', () => { - const palette = { primary: '#0482d8' }; - - const expected = { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - }; - - const result = expandPalette(palette); - expect(result).toEqual(expected); - }); - - it('expands mixed palette', () => { - const palette = { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - accent: '#2bd110', - }; - - const expected = { - primary: { - 50: '#f2f9fd', - 100: '#e6f3fb', - 200: '#c0e0f5', - 300: '#4fa8e4', - 400: '#369be0', - 500: '#0482d8', - 600: '#0475c2', - 700: '#0362a2', - 800: '#012741', - 900: '#011929', - }, - accent: { - 50: '#f4fdf3', - 100: '#eafae7', - 200: '#caf4c3', - 300: '#6bdf58', - 400: '#55da40', - 500: '#2bd110', - 600: '#27bc0e', - 700: '#209d0c', - 800: '#0d3f05', - 900: '#082803', - }, - }; - - const result = expandPalette(palette); - expect(result).toEqual(expected); - }); -}); diff --git a/packages/pl-fe/src/utils/tailwind.ts b/packages/pl-fe/src/utils/tailwind.ts index 7041d0c52..3fc8c487e 100644 --- a/packages/pl-fe/src/utils/tailwind.ts +++ b/packages/pl-fe/src/utils/tailwind.ts @@ -59,7 +59,5 @@ const toTailwind = (config: { }; export { - expandPalette, - fromBasicColors, toTailwind, }; diff --git a/packages/pl-fe/src/utils/timelines.test.ts b/packages/pl-fe/src/utils/timelines.test.ts deleted file mode 100644 index f248e2ee9..000000000 --- a/packages/pl-fe/src/utils/timelines.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { fromJS } from 'immutable'; - -import { buildStatus } from '@/jest/factory'; - -import { shouldFilter } from './timelines'; - -describe('shouldFilter', () => { - it('returns false under normal circumstances', () => { - const columnSettings = fromJS({}); - const status = buildStatus({}); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('reblog: returns true when `shows.reblog == false`', () => { - const columnSettings = fromJS({ shows: { reblog: false } }); - const status = buildStatus({ reblog: buildStatus() as any }); - expect(shouldFilter(status, columnSettings)).toBe(true); - }); - - it('reblog: returns false when `shows.reblog == true`', () => { - const columnSettings = fromJS({ shows: { reblog: true } }); - const status = buildStatus({ reblog: buildStatus() as any }); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('reply: returns true when `shows.reply == false`', () => { - const columnSettings = fromJS({ shows: { reply: false } }); - const status = buildStatus({ in_reply_to_id: '1234' }); - expect(shouldFilter(status, columnSettings)).toBe(true); - }); - - it('reply: returns false when `shows.reply == true`', () => { - const columnSettings = fromJS({ shows: { reply: true } }); - const status = buildStatus({ in_reply_to_id: '1234' }); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('direct: returns true when `shows.direct == false`', () => { - const columnSettings = fromJS({ shows: { direct: false } }); - const status = buildStatus({ visibility: 'direct' }); - expect(shouldFilter(status, columnSettings)).toBe(true); - }); - - it('direct: returns false when `shows.direct == true`', () => { - const columnSettings = fromJS({ shows: { direct: true } }); - const status = buildStatus({ visibility: 'direct' }); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('direct: returns false for a public post when `shows.direct == false`', () => { - const columnSettings = fromJS({ shows: { direct: false } }); - const status = buildStatus({ visibility: 'public' }); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('multiple settings', () => { - const columnSettings = fromJS({ shows: { reblog: false, reply: false, direct: false } }); - const status = buildStatus({ reblog: null, in_reply_to_id: null, visibility: 'direct' }); - expect(shouldFilter(status, columnSettings)).toBe(true); - }); - - it('multiple settings', () => { - const columnSettings = fromJS({ shows: { reblog: false, reply: true, direct: false } }); - const status = buildStatus({ reblog: null, in_reply_to_id: '1234', visibility: 'public' }); - expect(shouldFilter(status, columnSettings)).toBe(false); - }); - - it('multiple settings', () => { - const columnSettings = fromJS({ shows: { reblog: true, reply: false, direct: true } }); - const status = buildStatus({ reblog: {}, in_reply_to_id: '1234', visibility: 'direct' }); - expect(shouldFilter(status, columnSettings)).toBe(true); - }); -}); diff --git a/packages/pl-fe/tailwind/colors.test.ts b/packages/pl-fe/tailwind/colors.test.ts deleted file mode 100644 index 426de1db2..000000000 --- a/packages/pl-fe/tailwind/colors.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - withOpacityValue, - parseColorMatrix, -} from './colors'; - -describe('withOpacityValue()', () => { - it('returns a Tailwind color function with alpha support', () => { - const result = withOpacityValue('--color-primary-500'); - - // It returns a function - expect(typeof result).toBe('function'); - - // Test calling the function - expect(result).toBe('rgb(var(--color-primary-500) / )'); - }); -}); - -describe('parseColorMatrix()', () => { - it('returns a Tailwind color object', () => { - const colorMatrix = { - gray: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - primary: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - success: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - danger: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - accent: [300, 500], - }; - - const result = parseColorMatrix(colorMatrix); - - // Colors are mapped to functions which return CSS values - // @ts-ignore - expect(result.accent['300']).toEqual('rgb(var(--color-accent-300) / )'); - }); - - it('parses single-tint values', () => { - const colorMatrix = { - gray: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - primary: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - success: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - danger: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900], - accent: [300, 500], - 'gradient-start': true, - 'gradient-end': true, - }; - - const result = parseColorMatrix(colorMatrix); - - expect(result['gradient-start']).toEqual('rgb(var(--color-gradient-start) / )'); - }); -}); diff --git a/packages/pl-fe/tailwind/colors.ts b/packages/pl-fe/tailwind/colors.ts index bfb21718b..a83a47f16 100644 --- a/packages/pl-fe/tailwind/colors.ts +++ b/packages/pl-fe/tailwind/colors.ts @@ -37,4 +37,4 @@ const parseColorMatrix = (colorMatrix: ColorMatrix): RecursiveKeyValuePair => return palette; }, {}); -export { withOpacityValue, parseColorMatrix }; +export { parseColorMatrix }; diff --git a/packages/pl-fe/tsconfig.json b/packages/pl-fe/tsconfig.json index 52cdc94f6..ba8c097f8 100644 --- a/packages/pl-fe/tsconfig.json +++ b/packages/pl-fe/tsconfig.json @@ -22,7 +22,6 @@ ], "types": [ "vite/client", - "vitest/globals", "vite-plugin-compile-time/client" ], }, diff --git a/packages/pl-fe/vite.config.ts b/packages/pl-fe/vite.config.ts index b8aaa70a7..ec0e97947 100644 --- a/packages/pl-fe/vite.config.ts +++ b/packages/pl-fe/vite.config.ts @@ -1,4 +1,3 @@ -/// import fs from 'node:fs'; import { fileURLToPath, URL } from 'node:url'; @@ -180,11 +179,6 @@ const config = defineConfig(({ command }) => ({ ], dedupe: ['@floating-ui/react', 'tabbable', 'query-string', 'valibot'], }, - test: { - globals: true, - environment: 'jsdom', - setupFiles: 'src/jest/test-setup.ts', - }, })); /** Return file as string, or return empty string if the file isn't found. */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13336d530..e9950e695 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -431,18 +431,6 @@ importers: '@stylistic/eslint-plugin': specifier: ^3.1.0 version: 3.1.0(eslint@8.57.1)(typescript@5.7.3) - '@testing-library/jest-dom': - specifier: ^6.6.3 - version: 6.6.4 - '@testing-library/react': - specifier: ^16.1.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@testing-library/react-hooks': - specifier: ^8.0.1 - version: 8.0.1(@types/react@18.3.27)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.6.1(@testing-library/dom@10.4.1) '@types/dom-chromium-ai': specifier: ^0.0.11 version: 0.0.11 @@ -518,15 +506,9 @@ importers: eslint-plugin-tailwindcss: specifier: ^3.17.5 version: 3.18.2(tailwindcss@3.4.17) - fake-indexeddb: - specifier: ^6.0.0 - version: 6.0.1 globals: specifier: ^15.14.0 version: 15.15.0 - jsdom: - specifier: ^25.0.1 - version: 25.0.1 rollup-plugin-bundle-stats: specifier: ^4.21.10 version: 4.21.10(core-js@3.44.0)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) @@ -569,9 +551,6 @@ importers: vite-plugin-static-copy: specifier: ^3.2.0 version: 3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) - vitest: - specifier: ^2.1.9 - version: 2.1.9(@types/node@25.0.3)(jsdom@25.0.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) packages/pl-hooks: dependencies: @@ -636,9 +615,6 @@ packages: '@acemir/cssom@0.9.30': resolution: {integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==} - '@adobe/css-tools@4.4.3': - resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -649,9 +625,6 @@ packages: peerDependencies: ajv: '>=8' - '@asamuzakjp/css-color@3.2.0': - resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@asamuzakjp/css-color@4.1.1': resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} @@ -1240,10 +1213,6 @@ packages: core-js: ^3.0.0 lodash: ^4.0.0 - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} - engines: {node: '>=18'} - '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -1255,13 +1224,6 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.10': - resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.1.0': resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} @@ -2737,51 +2699,6 @@ packages: '@tanstack/store@0.8.0': resolution: {integrity: sha512-Om+BO0YfMZe//X2z0uLF2j+75nQga6TpTJgLJQBiq85aOyZNIhkCgleNcud2KQg4k4v9Y9l+Uhru3qWMPGTOzQ==} - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.6.4': - resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/react-hooks@8.0.1': - resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} - engines: {node: '>=12'} - peerDependencies: - '@types/react': ^18.3.18 - react: ^16.9.0 || ^17.0.0 - react-dom: ^16.9.0 || ^17.0.0 - react-test-renderer: ^16.9.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - react-dom: - optional: true - react-test-renderer: - optional: true - - '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.3.18 - '@types/react-dom': ^18.3.5 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@transfem-org/sfm-js@0.24.8': resolution: {integrity: sha1-G97++XwNPZZaxIExiJbm2kJZSg0=, tarball: https://activitypub.software/api/v4/projects/2/packages/npm/@transfem-org/sfm-js/-/@transfem-org/sfm-js-0.24.8.tgz} @@ -2801,9 +2718,6 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3177,35 +3091,6 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@volar/language-core@2.4.22': resolution: {integrity: sha512-gp4M7Di5KgNyIyO903wTClYBavRt6UyFNpc5LWfyZr1lBsTUY+QrVZfmbNF2aCyfklBOVk9YC4p+zkwoyT7ECg==} @@ -3384,10 +3269,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -3412,9 +3293,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -3455,10 +3333,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - ast-metadata-inferer@0.8.1: resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} @@ -3476,9 +3350,6 @@ packages: async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -3577,10 +3448,6 @@ packages: peerDependencies: esbuild: '>=0.18' - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cacheable@1.10.3: resolution: {integrity: sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==} @@ -3616,10 +3483,6 @@ packages: caniuse-lite@1.0.30001762: resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} - engines: {node: '>=18'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -3632,10 +3495,6 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3680,10 +3539,6 @@ packages: colorjs.io@0.5.2: resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - commander@13.1.0: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} @@ -3797,9 +3652,6 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -3827,10 +3679,6 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - cssstyle@4.6.0: - resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} - engines: {node: '>=18'} - cssstyle@5.3.7: resolution: {integrity: sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==} engines: {node: '>=20'} @@ -3844,10 +3692,6 @@ packages: damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - data-urls@6.0.0: resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} engines: {node: '>=20'} @@ -3903,10 +3747,6 @@ packages: resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} engines: {node: '>=14.16'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3922,14 +3762,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - detect-it@4.0.1: resolution: {integrity: sha512-dg5YBTJYvogK1+dA2mBUDKzOWfYZtHVba89SyZUhc4+e3i2tzgjANFg5lDRCd3UOtRcw00vUTMK8LELcMdicug==} @@ -3962,12 +3794,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -4297,9 +4123,6 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -4318,17 +4141,9 @@ packages: exifr@7.1.3: resolution: {integrity: sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} - engines: {node: '>=12.0.0'} - exsolve@1.0.7: resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} - fake-indexeddb@6.0.1: - resolution: {integrity: sha512-He2AjQGHe46svIFq5+L2Nx/eHDTI1oKgoevBP+TthnjymXiKkeJQ3+ITeWey99Y5+2OaPFbI1qEsx/5RsGtWnQ==} - engines: {node: '>=18'} - fast-average-color@9.5.0: resolution: {integrity: sha512-nC6x2YIlJ9xxgkMFMd1BNoM1ctMjNoRKfRliPmiEWW3S6rLTHiQcy9g3pt/xiKv/D0NAAkhb9VyV+WJFvTqMGg==} engines: {node: '>= 12'} @@ -4430,10 +4245,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} @@ -4604,10 +4415,6 @@ packages: html-dom-parser@5.1.2: resolution: {integrity: sha512-9nD3Rj3/FuQt83AgIa1Y3ruzspwFFA54AJbQnohXN+K6fL1/bhcDQJJY5Ne4L4A163ADQFVESd/0TLyNoV0mfg==} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - html-encoding-sniffer@6.0.0: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -4654,10 +4461,6 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} @@ -4690,10 +4493,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4942,15 +4741,6 @@ packages: resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} engines: {node: '>=12.0.0'} - jsdom@25.0.1: - resolution: {integrity: sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true - jsdom@27.4.0: resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -5155,9 +4945,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -5178,10 +4965,6 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -5252,10 +5035,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - mini-css-extract-plugin@2.9.4: resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} engines: {node: '>= 12.13.0'} @@ -5347,9 +5126,6 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - nwsapi@2.2.21: - resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5455,9 +5231,6 @@ packages: parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@8.0.0: resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} @@ -5497,16 +5270,9 @@ packages: pathe@0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -5786,10 +5552,6 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -5847,12 +5609,6 @@ packages: peerDependencies: react: ^19.2.3 - react-error-boundary@3.1.4: - resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} - engines: {node: '>=10', npm: '>=6'} - peerDependencies: - react: '>=16.13.1' - react-error-boundary@4.1.2: resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} peerDependencies: @@ -5906,9 +5662,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-property@2.0.2: resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} @@ -5983,10 +5736,6 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -6142,12 +5891,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6169,9 +5912,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass-embedded-all-unknown@1.93.3: resolution: {integrity: sha512-3okGgnE41eg+CPLtAPletu6nQ4N0ij7AeW+Sl5Km4j29XcmqZQeFwYjHe1AlKTEgLi/UAONk1O8i8/lupeKMbw==} cpu: ['!arm', '!arm64', '!riscv64', '!x64'] @@ -6369,9 +6109,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -6439,12 +6176,6 @@ packages: stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -6524,10 +6255,6 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6706,15 +6433,9 @@ packages: tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} @@ -6723,28 +6444,9 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} - - tldts-core@6.1.86: - resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.19: resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} - tldts@6.1.86: - resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} - hasBin: true - tldts@7.0.19: resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} hasBin: true @@ -6753,10 +6455,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} - engines: {node: '>=16'} - tough-cookie@6.0.0: resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} engines: {node: '>=16'} @@ -6764,10 +6462,6 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} - tr46@6.0.0: resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} engines: {node: '>=20'} @@ -6958,11 +6652,6 @@ packages: varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - vite-plugin-checker@0.12.0: resolution: {integrity: sha512-CmdZdDOGss7kdQwv73UyVgLPv0FVYe5czAgnmRX2oKljgEvSrODGuClaV3PDR2+3ou7N/OKGauDDBjy2MB07Rg==} engines: {node: '>=16.11'} @@ -7114,31 +6803,6 @@ packages: yaml: optional: true - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} @@ -7168,10 +6832,6 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -7190,19 +6850,10 @@ packages: webpack-cli: optional: true - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} - whatwg-url@15.1.0: resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} engines: {node: '>=20'} @@ -7235,11 +6886,6 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -7392,8 +7038,6 @@ snapshots: '@acemir/cssom@0.9.30': {} - '@adobe/css-tools@4.4.3': {} - '@alloc/quick-lru@5.2.0': {} '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': @@ -7403,14 +7047,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@asamuzakjp/css-color@3.2.0': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 10.4.3 - '@asamuzakjp/css-color@4.1.1': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -8186,8 +7822,6 @@ snapshots: lodash: 4.17.23 serialize-query-params: 2.0.4 - '@csstools/color-helpers@5.0.2': {} - '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -8195,13 +7829,6 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/color-helpers': 5.1.0 @@ -9574,50 +9201,6 @@ snapshots: '@tanstack/store@0.8.0': {} - '@testing-library/dom@10.4.1': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.28.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@6.6.4': - dependencies: - '@adobe/css-tools': 4.4.3 - aria-query: 5.3.2 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.23 - picocolors: 1.1.1 - redent: 3.0.0 - - '@testing-library/react-hooks@8.0.1(@types/react@18.3.27)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@babel/runtime': 7.28.2 - react: 19.2.3 - react-error-boundary: 3.1.4(react@19.2.3) - optionalDependencies: - '@types/react': 18.3.27 - react-dom: 19.2.3(react@19.2.3) - - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.27))(@types/react@18.3.27)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@babel/runtime': 7.28.2 - '@testing-library/dom': 10.4.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 18.3.27 - '@types/react-dom': 18.3.7(@types/react@18.3.27) - - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': - dependencies: - '@testing-library/dom': 10.4.1 - '@transfem-org/sfm-js@0.24.8': dependencies: '@twemoji/parser': 15.0.0 @@ -9635,8 +9218,6 @@ snapshots: '@types/argparse@1.0.38': {} - '@types/aria-query@5.0.4': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.0 @@ -10129,46 +9710,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@2.1.9': - dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 - chai: 5.2.1 - tinyrainbow: 1.2.0 - - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0))': - dependencies: - '@vitest/spy': 2.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/runner@2.1.9': - dependencies: - '@vitest/utils': 2.1.9 - pathe: 1.1.2 - - '@vitest/snapshot@2.1.9': - dependencies: - '@vitest/pretty-format': 2.1.9 - magic-string: 0.30.17 - pathe: 1.1.2 - - '@vitest/spy@2.1.9': - dependencies: - tinyspy: 3.0.2 - - '@vitest/utils@2.1.9': - dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.2.0 - tinyrainbow: 1.2.0 - '@volar/language-core@2.4.22': dependencies: '@volar/source-map': 2.4.22 @@ -10397,8 +9938,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -10418,10 +9957,6 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -10493,8 +10028,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - assertion-error@2.0.1: {} - ast-metadata-inferer@0.8.1: dependencies: '@mdn/browser-compat-data': 5.7.6 @@ -10507,8 +10040,6 @@ snapshots: async@3.2.6: {} - asynckit@0.4.0: {} - at-least-node@1.0.0: {} autoprefixer@10.4.23(postcss@8.5.6): @@ -10605,8 +10136,6 @@ snapshots: esbuild: 0.24.2 load-tsconfig: 0.2.5 - cac@6.7.14: {} - cacheable@1.10.3: dependencies: hookified: 1.11.0 @@ -10649,14 +10178,6 @@ snapshots: caniuse-lite@1.0.30001762: {} - chai@5.2.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.2.0 - pathval: 2.0.1 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -10666,8 +10187,6 @@ snapshots: char-regex@1.0.2: {} - check-error@2.1.1: {} - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -10713,10 +10232,6 @@ snapshots: colorjs.io@0.5.2: {} - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - commander@13.1.0: {} commander@2.20.3: {} @@ -10813,8 +10328,6 @@ snapshots: css-what@6.2.2: {} - css.escape@1.5.1: {} - cssesc@3.0.0: {} cssnano-preset-default@6.1.2(postcss@8.5.6): @@ -10865,11 +10378,6 @@ snapshots: dependencies: css-tree: 2.2.1 - cssstyle@4.6.0: - dependencies: - '@asamuzakjp/css-color': 3.2.0 - rrweb-cssom: 0.8.0 - cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.1 @@ -10883,11 +10391,6 @@ snapshots: damerau-levenshtein@1.0.8: {} - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -10931,8 +10434,6 @@ snapshots: decode-uri-component@0.4.1: {} - deep-eql@5.0.2: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -10949,10 +10450,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - delayed-stream@1.0.0: {} - - dequal@2.0.3: {} - detect-it@4.0.1: {} detect-libc@1.0.3: @@ -10980,10 +10477,6 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} - - dom-accessibility-api@0.6.3: {} - dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -11621,10 +11114,6 @@ snapshots: estree-walker@2.0.2: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - esutils@2.0.3: {} eventemitter3@5.0.1: {} @@ -11645,12 +11134,8 @@ snapshots: exifr@7.1.3: {} - expect-type@1.2.2: {} - exsolve@1.0.7: {} - fake-indexeddb@6.0.1: {} - fast-average-color@9.5.0: {} fast-deep-equal@3.1.3: {} @@ -11748,14 +11233,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - fraction.js@5.3.4: {} fs-extra@10.1.0: @@ -11941,10 +11418,6 @@ snapshots: domhandler: 5.0.3 htmlparser2: 10.0.0 - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - html-encoding-sniffer@6.0.0: dependencies: '@exodus/bytes': 1.8.0 @@ -12000,10 +11473,6 @@ snapshots: husky@9.1.7: {} - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - idb@7.1.1: {} ignore@5.3.2: {} @@ -12025,8 +11494,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -12276,34 +11743,6 @@ snapshots: jsdoc-type-pratt-parser@4.1.0: {} - jsdom@25.0.1: - dependencies: - cssstyle: 4.6.0 - data-urls: 5.0.0 - decimal.js: 10.6.0 - form-data: 4.0.4 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.21 - parse5: 7.3.0 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 5.1.2 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - ws: 8.18.3 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - jsdom@27.4.0: dependencies: '@acemir/cssom': 0.9.30 @@ -12518,8 +11957,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.2.0: {} - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -12538,8 +11975,6 @@ snapshots: lunr@2.3.9: {} - lz-string@1.5.0: {} - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -12598,8 +12033,6 @@ snapshots: mimic-function@5.0.1: {} - min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.4(webpack@5.101.0(esbuild@0.24.2)): dependencies: schema-utils: 4.3.2 @@ -12685,8 +12118,6 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.21: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -12806,10 +12237,6 @@ snapshots: parse-statements@1.0.11: {} - parse5@7.3.0: - dependencies: - entities: 6.0.1 - parse5@8.0.0: dependencies: entities: 6.0.1 @@ -12840,12 +12267,8 @@ snapshots: pathe@0.2.0: {} - pathe@1.1.2: {} - pathe@2.0.3: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -13088,12 +12511,6 @@ snapshots: pretty-bytes@6.1.1: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - prismjs@1.30.0: {} process@0.11.10: {} @@ -13156,11 +12573,6 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 - react-error-boundary@3.1.4(react@19.2.3): - dependencies: - '@babel/runtime': 7.28.2 - react: 19.2.3 - react-error-boundary@4.1.2(react@19.2.3): dependencies: '@babel/runtime': 7.28.2 @@ -13219,8 +12631,6 @@ snapshots: react-is@16.13.1: {} - react-is@17.0.2: {} - react-property@2.0.2: {} react-redux@9.2.0(@types/react@18.3.27)(react@19.2.3)(redux@5.0.1): @@ -13295,11 +12705,6 @@ snapshots: readdirp@4.1.2: {} - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 @@ -13484,10 +12889,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 - rrweb-cssom@0.7.1: {} - - rrweb-cssom@0.8.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -13517,8 +12918,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safer-buffer@2.1.2: {} - sass-embedded-all-unknown@1.93.3: dependencies: sass: 1.93.3 @@ -13709,8 +13108,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} - signal-exit@4.1.0: {} slash@3.0.0: {} @@ -13765,10 +13162,6 @@ snapshots: stable-hash@0.0.5: {} - stackback@0.0.2: {} - - std-env@3.9.0: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -13876,10 +13269,6 @@ snapshots: strip-final-newline@3.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - strip-json-comments@3.1.1: {} style-to-js@1.1.21: @@ -14118,12 +13507,8 @@ snapshots: tiny-warning@1.0.3: {} - tinybench@2.9.0: {} - tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} - tinyglobby@0.2.14: dependencies: fdir: 6.4.6(picomatch@4.0.3) @@ -14134,20 +13519,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@1.2.0: {} - - tinyspy@3.0.2: {} - - tldts-core@6.1.86: {} - tldts-core@7.0.19: {} - tldts@6.1.86: - dependencies: - tldts-core: 6.1.86 - tldts@7.0.19: dependencies: tldts-core: 7.0.19 @@ -14156,10 +13529,6 @@ snapshots: dependencies: is-number: 7.0.0 - tough-cookie@5.1.2: - dependencies: - tldts: 6.1.86 - tough-cookie@6.0.0: dependencies: tldts: 7.0.19 @@ -14168,10 +13537,6 @@ snapshots: dependencies: punycode: 2.3.1 - tr46@5.1.1: - dependencies: - punycode: 2.3.1 - tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -14379,24 +13744,6 @@ snapshots: varint@6.0.0: {} - vite-node@2.1.9(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 1.1.2 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.29.0 @@ -14538,18 +13885,6 @@ snapshots: sass-embedded: 1.93.3 terser: 5.46.0 - vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.6 - rollup: 4.52.5 - optionalDependencies: - '@types/node': 25.0.3 - fsevents: 2.3.3 - sass: 1.93.3 - sass-embedded: 1.93.3 - terser: 5.46.0 - vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: esbuild: 0.27.3 @@ -14567,42 +13902,6 @@ snapshots: terser: 5.46.0 yaml: 2.8.0 - vitest@2.1.9(@types/node@25.0.3)(jsdom@25.0.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): - dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 - chai: 5.2.1 - debug: 4.4.1 - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 1.1.2 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.1.1 - tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) - vite-node: 2.1.9(@types/node@25.0.3)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 25.0.3 - jsdom: 25.0.1 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vscode-uri@3.1.0: {} vue-loader@17.4.2(@vue/compiler-sfc@3.5.18)(webpack@5.101.0(esbuild@0.24.2)): @@ -14629,8 +13928,6 @@ snapshots: webidl-conversions@4.0.2: {} - webidl-conversions@7.0.0: {} - webidl-conversions@8.0.1: {} webpack-sources@3.3.3: {} @@ -14667,17 +13964,8 @@ snapshots: - esbuild - uglify-js - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@4.0.0: {} - whatwg-url@14.2.0: - dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 - whatwg-url@15.1.0: dependencies: tr46: 6.0.0 @@ -14738,11 +14026,6 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - word-wrap@1.2.5: {} workbox-background-sync@7.3.0: From 1cfa337ac2e46891224c06647c638b2bbf0ee1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 23:27:12 +0100 Subject: [PATCH 05/74] nicolium: update vite-plugin-compile-time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/package.json | 3 +- packages/pl-fe/src/build-config.ts | 49 +++++++- .../utils/manifest-map-compiletime.ts | 16 --- .../crypto-donate/utils/manifest-map.ts | 16 ++- .../src/features/emoji/mapping-compiletime.ts | 107 ------------------ packages/pl-fe/src/features/emoji/mapping.ts | 106 ++++++++++++++++- packages/pl-fe/src/service-worker/sw.ts | 4 +- .../src/service-worker/web-push-locales.ts | 54 ++++----- packages/pl-fe/src/utils/code-compiletime.ts | 52 --------- packages/pl-fe/src/utils/code.ts | 55 ++++++++- pnpm-lock.yaml | 82 ++++---------- 11 files changed, 275 insertions(+), 269 deletions(-) delete mode 100644 packages/pl-fe/src/features/crypto-donate/utils/manifest-map-compiletime.ts delete mode 100644 packages/pl-fe/src/features/emoji/mapping-compiletime.ts delete mode 100644 packages/pl-fe/src/utils/code-compiletime.ts diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 53242f48c..51930828b 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -127,6 +127,7 @@ "resize-observer": "^1.0.4", "sass-embedded": "^1.93.3", "stringz": "^2.1.0", + "tabbable": "^6.4.0", "use-mutative": "^1.3.1", "util": "^0.12.5", "valibot": "^1.2.0", @@ -171,7 +172,7 @@ "typescript": "5.7.3", "vite": "^7.3.1", "vite-plugin-checker": "^0.12.0", - "vite-plugin-compile-time": "^0.3.2", + "vite-plugin-compile-time": "^0.4.6", "vite-plugin-html": "^3.2.2", "vite-plugin-pwa": "^1.2.0", "vite-plugin-require": "^1.2.14", diff --git a/packages/pl-fe/src/build-config.ts b/packages/pl-fe/src/build-config.ts index 72e4b5186..448b407fc 100644 --- a/packages/pl-fe/src/build-config.ts +++ b/packages/pl-fe/src/build-config.ts @@ -1,8 +1,51 @@ -import type { PlFeEnv } from './build-config-compiletime'; +/** + * Build config: configuration set at build time. + * @module pl-fe/build-config + */ -export const { +// eslint-disable-next-line import/extensions +import trim from 'lodash/trim.js'; +// eslint-disable-next-line import/extensions +import trimEnd from 'lodash/trimEnd.js'; + +const env = compileTime(() => { + const { + NODE_ENV, + BACKEND_URL, + FE_SUBDIRECTORY, + WITH_LANDING_PAGE, + } = process.env; + + const sanitizeURL = (url: string | undefined = ''): string => { + try { + return trimEnd(new URL(url).toString(), '/'); + } catch { + return ''; + } + }; + + const sanitizeBasename = (path: string | undefined = ''): string => `/${trim(path, '/')}`; + + return { + NODE_ENV: NODE_ENV || 'development', + BACKEND_URL: sanitizeURL(BACKEND_URL), + FE_SUBDIRECTORY: sanitizeBasename(FE_SUBDIRECTORY), + WITH_LANDING_PAGE: WITH_LANDING_PAGE === 'true', + }; +}); + +const { NODE_ENV, BACKEND_URL, FE_SUBDIRECTORY, WITH_LANDING_PAGE, -} = import.meta.compileTime('./build-config-compiletime.ts'); +} = env; + +export type PlFeEnv = typeof env; + +export { + NODE_ENV, + BACKEND_URL, + FE_SUBDIRECTORY, + WITH_LANDING_PAGE, +}; diff --git a/packages/pl-fe/src/features/crypto-donate/utils/manifest-map-compiletime.ts b/packages/pl-fe/src/features/crypto-donate/utils/manifest-map-compiletime.ts deleted file mode 100644 index ff3686620..000000000 --- a/packages/pl-fe/src/features/crypto-donate/utils/manifest-map-compiletime.ts +++ /dev/null @@ -1,16 +0,0 @@ -// Converts cryptocurrency-icon's manifest file from a list to a map. -// See: https://github.com/spothq/cryptocurrency-icons/blob/master/manifest.json - -import { createRequire } from 'node:module'; - -const require = createRequire(import.meta.url); -const manifest = require('cryptocurrency-icons/manifest.json'); - -const manifestMap = manifest.reduce((acc: Record, entry: typeof manifest[0]) => { - acc[entry.symbol.toLowerCase()] = entry; - return acc; -}, {}); - -export default () => ({ - data: manifestMap, -}); diff --git a/packages/pl-fe/src/features/crypto-donate/utils/manifest-map.ts b/packages/pl-fe/src/features/crypto-donate/utils/manifest-map.ts index d544bde5b..781ff82e2 100644 --- a/packages/pl-fe/src/features/crypto-donate/utils/manifest-map.ts +++ b/packages/pl-fe/src/features/crypto-donate/utils/manifest-map.ts @@ -1,3 +1,5 @@ +import { createRequire } from 'node:module'; + interface ManifestMap { [s: string]: { symbol: string; @@ -6,6 +8,18 @@ interface ManifestMap { }; } -export default import.meta.compileTime('./manifest-map-compiletime.ts'); +const manifestMap = compileTime(() => { + const require = createRequire(import.meta.url); + const manifest = require('cryptocurrency-icons/manifest.json'); + + const manifestMap = manifest.reduce((acc: Record, entry: typeof manifest[0]) => { + acc[entry.symbol.toLowerCase()] = entry; + return acc; + }, {}); + + return manifestMap; +}); + +export default manifestMap; export type { ManifestMap }; diff --git a/packages/pl-fe/src/features/emoji/mapping-compiletime.ts b/packages/pl-fe/src/features/emoji/mapping-compiletime.ts deleted file mode 100644 index f5ef8cdf0..000000000 --- a/packages/pl-fe/src/features/emoji/mapping-compiletime.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { createRequire } from 'node:module'; - -import type { EmojiData } from './data'; -import type { UnicodeMap } from './mapping'; - -const require = createRequire(import.meta.url); -const data = require('@emoji-mart/data/sets/14/twitter.json'); - -const stripLeadingZeros = /^0+/; - -/* - * Twemoji strips their hex codes from unicode codepoints to make it look "pretty" - * - leading 0s are removed - * - fe0f is removed unless it has 200d - * - fe0f is NOT removed for 1f441-fe0f-200d-1f5e8-fe0f even though it has a 200d - * - * this is all wrong - */ -const blacklist = { - '1f441-fe0f-200d-1f5e8-fe0f': true, -}; - -const tweaks = { - '#⃣': ['23-20e3', 'hash'], - '*⃣': ['2a-20e3', 'keycap_star'], - '0⃣': ['30-20e3', 'zero'], - '1⃣': ['31-20e3', 'one'], - '2⃣': ['32-20e3', 'two'], - '3⃣': ['33-20e3', 'three'], - '4⃣': ['34-20e3', 'four'], - '5⃣': ['35-20e3', 'five'], - '6⃣': ['36-20e3', 'six'], - '7⃣': ['37-20e3', 'seven'], - '8⃣': ['38-20e3', 'eight'], - '9⃣': ['39-20e3', 'nine'], - '❤‍🔥': ['2764-fe0f-200d-1f525', 'heart_on_fire'], - '❤‍🩹': ['2764-fe0f-200d-1fa79', 'mending_heart'], - '👁‍🗨️': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '👁️‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '👁‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], - '🕵‍♂️': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵️‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], - '🕵‍♀️': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🕵️‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🕵‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], - '🏌‍♂️': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌️‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], - '🏌‍♀️': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '🏌️‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '🏌‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], - '⛹‍♂️': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹️‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], - '⛹‍♀️': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '⛹️‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '⛹‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], - '🏋‍♂️': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋️‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], - '🏋‍♀️': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏋️‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏋‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], - '🏳‍🌈': ['1f3f3-fe0f-200d-1f308', 'rainbow_flag'], - '🏳‍⚧️': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], - '🏳️‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], - '🏳‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], -}; - -const stripcodes = (unified: string, native: string) => { - const stripped = unified.replace(stripLeadingZeros, ''); - - if (unified.includes('200d') && !(unified in blacklist)) { - return stripped; - } else { - return stripped.replaceAll('-fe0f', ''); - } -}; - -const generateMappings = (emojiMap: EmojiData['emojis']): UnicodeMap => { - const result: UnicodeMap = {}; - const emojis = Object.values(emojiMap ?? {}); - - for (const value of emojis) { - for (const item of value.skins) { - const { unified, native } = item; - const stripped = stripcodes(unified, native); - - result[native] = { unified: stripped, shortcode: value.id }; - } - } - - for (const [native, [unified, shortcode]] of Object.entries(tweaks)) { - const stripped = stripcodes(unified, native); - - result[native] = { unified: stripped, shortcode }; - } - - return result; -}; - -const unicodeMapping = generateMappings(data.emojis); - -export default () => ({ - data: unicodeMapping, -}); diff --git a/packages/pl-fe/src/features/emoji/mapping.ts b/packages/pl-fe/src/features/emoji/mapping.ts index a76d52245..2e6ca376a 100644 --- a/packages/pl-fe/src/features/emoji/mapping.ts +++ b/packages/pl-fe/src/features/emoji/mapping.ts @@ -1,3 +1,7 @@ +import { createRequire } from 'node:module'; + +import type { EmojiData } from './data'; + interface UnicodeMap { [s: string]: { unified: string; @@ -5,6 +9,106 @@ interface UnicodeMap { }; } -export default import.meta.compileTime('./mapping-compiletime.ts'); +const unicodeMapping = compileTime(() => { + const require = createRequire(import.meta.url); + const data = require('@emoji-mart/data/sets/14/twitter.json'); + + const stripLeadingZeros = /^0+/; + + /* + * Twemoji strips their hex codes from unicode codepoints to make it look "pretty" + * - leading 0s are removed + * - fe0f is removed unless it has 200d + * - fe0f is NOT removed for 1f441-fe0f-200d-1f5e8-fe0f even though it has a 200d + * + * this is all wrong + */ + const blacklist = { + '1f441-fe0f-200d-1f5e8-fe0f': true, + }; + + const tweaks = { + '#⃣': ['23-20e3', 'hash'], + '*⃣': ['2a-20e3', 'keycap_star'], + '0⃣': ['30-20e3', 'zero'], + '1⃣': ['31-20e3', 'one'], + '2⃣': ['32-20e3', 'two'], + '3⃣': ['33-20e3', 'three'], + '4⃣': ['34-20e3', 'four'], + '5⃣': ['35-20e3', 'five'], + '6⃣': ['36-20e3', 'six'], + '7⃣': ['37-20e3', 'seven'], + '8⃣': ['38-20e3', 'eight'], + '9⃣': ['39-20e3', 'nine'], + '❤‍🔥': ['2764-fe0f-200d-1f525', 'heart_on_fire'], + '❤‍🩹': ['2764-fe0f-200d-1fa79', 'mending_heart'], + '👁‍🗨️': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '👁️‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '👁‍🗨': ['1f441-fe0f-200d-1f5e8-fe0f', 'eye-in-speech-bubble'], + '🕵‍♂️': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵️‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵‍♂': ['1f575-fe0f-200d-2642-fe0f', 'male-detective'], + '🕵‍♀️': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🕵️‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🕵‍♀': ['1f575-fe0f-200d-2640-fe0f', 'female-detective'], + '🏌‍♂️': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌️‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌‍♂': ['1f3cc-fe0f-200d-2642-fe0f', 'man-golfing'], + '🏌‍♀️': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '🏌️‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '🏌‍♀': ['1f3cc-fe0f-200d-2640-fe0f', 'woman-golfing'], + '⛹‍♂️': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹️‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹‍♂': ['26f9-fe0f-200d-2642-fe0f', 'man-bouncing-ball'], + '⛹‍♀️': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '⛹️‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '⛹‍♀': ['26f9-fe0f-200d-2640-fe0f', 'woman-bouncing-ball'], + '🏋‍♂️': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋️‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋‍♂': ['1f3cb-fe0f-200d-2642-fe0f', 'man-lifting-weights'], + '🏋‍♀️': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏋️‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏋‍♀': ['1f3cb-fe0f-200d-2640-fe0f', 'woman-lifting-weights'], + '🏳‍🌈': ['1f3f3-fe0f-200d-1f308', 'rainbow_flag'], + '🏳‍⚧️': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], + '🏳️‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], + '🏳‍⚧': ['1f3f3-fe0f-200d-26a7-fe0f', 'transgender_flag'], + }; + + const stripcodes = (unified: string, native: string) => { + const stripped = unified.replace(stripLeadingZeros, ''); + + if (unified.includes('200d') && !(unified in blacklist)) { + return stripped; + } else { + return stripped.replaceAll('-fe0f', ''); + } + }; + + const generateMappings = (emojiMap: EmojiData['emojis']): UnicodeMap => { + const result: UnicodeMap = {}; + const emojis = Object.values(emojiMap ?? {}); + + for (const value of emojis) { + for (const item of value.skins) { + const { unified, native } = item; + const stripped = stripcodes(unified, native); + + result[native] = { unified: stripped, shortcode: value.id }; + } + } + + for (const [native, [unified, shortcode]] of Object.entries(tweaks)) { + const stripped = stripcodes(unified, native); + + result[native] = { unified: stripped, shortcode }; + } + + return result; + }; + + return generateMappings(data.emojis); +}); +export default unicodeMapping; export type { UnicodeMap }; diff --git a/packages/pl-fe/src/service-worker/sw.ts b/packages/pl-fe/src/service-worker/sw.ts index cc0b86699..94172c61f 100644 --- a/packages/pl-fe/src/service-worker/sw.ts +++ b/packages/pl-fe/src/service-worker/sw.ts @@ -3,14 +3,14 @@ import IntlMessageFormat from 'intl-messageformat'; import 'intl-pluralrules'; import unescape from 'lodash/unescape'; +import locales from './web-push-locales'; + import type { Account as AccountEntity, Notification as NotificationEntity, Status as StatusEntity, } from 'pl-api'; -const locales = import.meta.compileTime>>('./web-push-locales.ts'); - /** Limit before we start grouping device notifications into a single notification. */ const MAX_NOTIFICATIONS = 5; /** Tag for the grouped notification. */ diff --git a/packages/pl-fe/src/service-worker/web-push-locales.ts b/packages/pl-fe/src/service-worker/web-push-locales.ts index efb638dd1..ec52e339c 100644 --- a/packages/pl-fe/src/service-worker/web-push-locales.ts +++ b/packages/pl-fe/src/service-worker/web-push-locales.ts @@ -1,37 +1,39 @@ import fs from 'node:fs'; import path from 'path'; -const filtered: Record> = {}; -const filenames = fs.readdirSync(path.resolve(__dirname, '../locales')); +const filtered = compileTime(() => { + const filtered: Record> = {}; + const filenames = fs.readdirSync(path.resolve(__dirname, '../locales')); -filenames.forEach(filename => { - if (!filename.match(/\.json$/) || filename.match(/defaultMessages|whitelist/)) return; + filenames.forEach(filename => { + if (!filename.match(/\.json$/) || filename.match(/defaultMessages|whitelist/)) return; - const content = fs.readFileSync(path.resolve(__dirname, `../locales/${filename}`), 'utf-8'); - const full = JSON.parse(content) as Record; - const locale = filename.split('.')[0]; + const content = fs.readFileSync(path.resolve(__dirname, `../locales/${filename}`), 'utf-8'); + const full = JSON.parse(content) as Record; + const locale = filename.split('.')[0]; - filtered[locale] = { - 'notification.favourite': full['notification.favourite'] || '', - 'notification.follow': full['notification.follow'] || '', - 'notification.follow_request': full['notification.follow_request'] || '', - 'notification.mention': full['notification.mention'] || '', - 'notification.reblog': full['notification.reblog'] || '', - 'notification.poll': full['notification.poll'] || '', - 'notification.status': full['notification.status'] || '', - 'notification.move': full['notification.move'] || '', + filtered[locale] = { + 'notification.favourite': full['notification.favourite'] || '', + 'notification.follow': full['notification.follow'] || '', + 'notification.follow_request': full['notification.follow_request'] || '', + 'notification.mention': full['notification.mention'] || '', + 'notification.reblog': full['notification.reblog'] || '', + 'notification.poll': full['notification.poll'] || '', + 'notification.status': full['notification.status'] || '', + 'notification.move': full['notification.move'] || '', - 'notification.pleroma:chat_mention': full['notification.pleroma:chat_mention'] || '', - 'notification.pleroma:emoji_reaction': full['notification.pleroma:emoji_reaction'] || '', + 'notification.pleroma:chat_mention': full['notification.pleroma:chat_mention'] || '', + 'notification.pleroma:emoji_reaction': full['notification.pleroma:emoji_reaction'] || '', - 'status.show_more': full['status.show_more'] || '', - 'status.reblog': full['status.reblog'] || '', - 'status.favourite': full['status.favourite'] || '', + 'status.show_more': full['status.show_more'] || '', + 'status.reblog': full['status.reblog'] || '', + 'status.favourite': full['status.favourite'] || '', - 'notifications.group': full['notifications.group'] || '', - }; + 'notifications.group': full['notifications.group'] || '', + }; + }); + + return filtered; }); -export default () => ({ - data: filtered, -}); +export default filtered; diff --git a/packages/pl-fe/src/utils/code-compiletime.ts b/packages/pl-fe/src/utils/code-compiletime.ts deleted file mode 100644 index f229d5e10..000000000 --- a/packages/pl-fe/src/utils/code-compiletime.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { execSync } from 'node:child_process'; - -import pkg from '../../package.json'; - -const { CI_COMMIT_TAG, CI_COMMIT_REF_NAME, CI_COMMIT_SHA } = process.env; - -const shortRepoName = (url: string): string => new URL(url).pathname.substring(1); -const trimHash = (hash: string): string => hash.substring(0, 7); - -const tryGit = (cmd: string): string | undefined => { - try { - return String(execSync(cmd)); - } catch (e) { - return undefined; - } -}; - -const version = (pkg: { version: string }): string => { - // Try to discern from GitLab CI first - if (CI_COMMIT_TAG === `v${pkg.version}` || CI_COMMIT_REF_NAME === 'stable') { - return pkg.version; - } - - if (typeof CI_COMMIT_SHA === 'string') { - return `${pkg.version}-${trimHash(CI_COMMIT_SHA)}`; - } - - // Fall back to git directly - const head = tryGit('git rev-parse HEAD'); - const tag = tryGit(`git rev-parse v${pkg.version}`); - - if (head && head !== tag) return `${pkg.version}-${trimHash(head)}`; - - // Fall back to version in package.json - return pkg.version; -}; - -const code = { - name: pkg.name, - displayName: pkg.displayName, - url: pkg.repository.url, - repository: shortRepoName(pkg.repository.url), - version: version(pkg), - homepage: pkg.homepage, - ref: CI_COMMIT_TAG || CI_COMMIT_SHA || tryGit('git rev-parse HEAD'), -}; - -export type Code = typeof code; - -export default () => ({ - data: code, -}); diff --git a/packages/pl-fe/src/utils/code.ts b/packages/pl-fe/src/utils/code.ts index dd22a303c..ec9e02b6f 100644 --- a/packages/pl-fe/src/utils/code.ts +++ b/packages/pl-fe/src/utils/code.ts @@ -1,3 +1,54 @@ -import type { Code } from './code-compiletime'; +import { execSync } from 'node:child_process'; -export default import.meta.compileTime('./code-compiletime.ts'); +import pkg from '../../package.json'; + +const code = compileTime(() => { + const { CI_COMMIT_TAG, CI_COMMIT_REF_NAME, CI_COMMIT_SHA } = process.env; + + const shortRepoName = (url: string): string => new URL(url).pathname.substring(1); + const trimHash = (hash: string): string => hash.substring(0, 7); + + const tryGit = (cmd: string): string | undefined => { + try { + return String(execSync(cmd)); + } catch (e) { + return undefined; + } + }; + + const version = (pkg: { version: string }): string => { + // Try to discern from GitLab CI first + if (CI_COMMIT_TAG === `v${pkg.version}` || CI_COMMIT_REF_NAME === 'stable') { + return pkg.version; + } + + if (typeof CI_COMMIT_SHA === 'string') { + return `${pkg.version}-${trimHash(CI_COMMIT_SHA)}`; + } + + // Fall back to git directly + const head = tryGit('git rev-parse HEAD'); + const tag = tryGit(`git rev-parse v${pkg.version}`); + + if (head && head !== tag) return `${pkg.version}-${trimHash(head)}`; + + // Fall back to version in package.json + return pkg.version; + }; + + const code = { + name: pkg.name, + displayName: pkg.displayName, + url: pkg.repository.url, + repository: shortRepoName(pkg.repository.url), + version: version(pkg), + homepage: pkg.homepage, + ref: CI_COMMIT_TAG || CI_COMMIT_SHA || tryGit('git rev-parse HEAD'), + }; + + return code; +}); + +export type Code = typeof code; + +export default code; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e9950e695..98ab5bc87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -280,9 +280,6 @@ importers: html-react-parser: specifier: ^5.2.11 version: 5.2.11(@types/react@18.3.27)(react@19.2.3) - immutable: - specifier: ^5.0.3 - version: 5.1.3 intersection-observer: specifier: ^0.12.2 version: 0.12.2 @@ -349,9 +346,6 @@ importers: react-dom: specifier: ^19.2.3 version: 19.2.3(react@19.2.3) - react-error-boundary: - specifier: ^4.1.2 - version: 4.1.2(react@19.2.3) react-helmet-async: specifier: ^2.0.5 version: 2.0.5(react@19.2.3) @@ -400,9 +394,6 @@ importers: tabbable: specifier: ^6.4.0 version: 6.4.0 - tiny-queue: - specifier: ^0.2.1 - version: 0.2.1 use-mutative: specifier: ^1.3.1 version: 1.3.1(@types/react@18.3.27)(mutative@1.3.0)(react@19.2.3) @@ -422,9 +413,6 @@ importers: '@formatjs/cli': specifier: ^6.9.0 version: 6.9.0(@vue/compiler-core@3.5.18) - '@jedmao/redux-mock-store': - specifier: ^3.0.5 - version: 3.0.5(redux@5.0.1) '@sentry/types': specifier: ^8.47.0 version: 8.55.0 @@ -461,9 +449,6 @@ importers: '@types/react-swipeable-views': specifier: ^0.13.6 version: 0.13.6 - '@types/redux-mock-store': - specifier: ^1.5.0 - version: 1.5.0 '@typescript-eslint/eslint-plugin': specifier: ^8.24.1 version: 8.38.0(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) @@ -537,8 +522,8 @@ importers: specifier: ^0.12.0 version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-compile-time: - specifier: ^0.3.2 - version: 0.3.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + specifier: ^0.4.6 + version: 0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-html: specifier: ^3.2.2 version: 3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) @@ -1891,11 +1876,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jedmao/redux-mock-store@3.0.5': - resolution: {integrity: sha512-zNcVCd5/ekSMdQWk64CqTPM24D9Lo59st9KvS+fljGpQXV4SliB7Vo0NFQIgvQJWPYeeobdngnrGy0XbCaARNw==} - peerDependencies: - redux: ^4 - '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -2837,9 +2817,6 @@ packages: peerDependencies: '@types/react': ^18.3.18 - '@types/redux-mock-store@1.5.0': - resolution: {integrity: sha512-jcscBazm6j05Hs6xYCca6psTUBbFT2wqMxT7wZEHAYFxHB/I8jYk7d5msrHUlDiSL02HdTqTmkK2oIV8i3C8DA==} - '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -3373,6 +3350,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-dead-code-elimination@1.0.12: + resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} + babel-plugin-polyfill-corejs2@0.4.15: resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: @@ -5609,11 +5589,6 @@ packages: peerDependencies: react: ^19.2.3 - react-error-boundary@4.1.2: - resolution: {integrity: sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==} - peerDependencies: - react: '>=16.13.1' - react-error-boundary@6.0.0: resolution: {integrity: sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==} peerDependencies: @@ -5741,9 +5716,6 @@ packages: peerDependencies: redux: ^5.0.0 - redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} @@ -6427,9 +6399,6 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tiny-queue@0.2.1: - resolution: {integrity: sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==} - tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} @@ -6689,8 +6658,8 @@ packages: vue-tsc: optional: true - vite-plugin-compile-time@0.3.2: - resolution: {integrity: sha512-obNDktew663JQlriX5MJV/l2e8ofPzr1yfZBq0erjIxMuwmmnEfT7SYBGfcb/Y35u17nzQqsAvCvqbsxpbmvwQ==} + vite-plugin-compile-time@0.4.6: + resolution: {integrity: sha512-0aHRCd3AtDekc5pMq5+cyrVqBPVjT8bISD1/EU3ebJDovZsv3Wom6uDF4+Uf1zxUTfn27gHFSFQ11R3ciqPg7g==} peerDependencies: vite: '>=2' @@ -8276,10 +8245,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jedmao/redux-mock-store@3.0.5(redux@5.0.1)': - dependencies: - redux: 5.0.1 - '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -9356,10 +9321,6 @@ snapshots: dependencies: '@types/react': 18.3.27 - '@types/redux-mock-store@1.5.0': - dependencies: - redux: 4.2.1 - '@types/resolve@1.20.2': {} '@types/semver@7.7.0': {} @@ -10059,6 +10020,15 @@ snapshots: axobject-query@4.1.0: {} + babel-dead-code-elimination@1.0.12: + dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.29.0): dependencies: '@babel/compat-data': 7.29.0 @@ -12573,11 +12543,6 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 - react-error-boundary@4.1.2(react@19.2.3): - dependencies: - '@babel/runtime': 7.28.2 - react: 19.2.3 - react-error-boundary@6.0.0(react@19.2.3): dependencies: '@babel/runtime': 7.28.6 @@ -12709,10 +12674,6 @@ snapshots: dependencies: redux: 5.0.1 - redux@4.2.1: - dependencies: - '@babel/runtime': 7.28.2 - redux@5.0.1: {} reflect.getprototypeof@1.0.10: @@ -13503,8 +13464,6 @@ snapshots: tiny-invariant@1.3.3: {} - tiny-queue@0.2.1: {} - tiny-warning@1.0.3: {} tinycolor2@1.6.0: {} @@ -13762,13 +13721,20 @@ snapshots: stylelint: 16.23.0(typescript@5.7.3) typescript: 5.7.3 - vite-plugin-compile-time@0.3.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-compile-time@0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + babel-dead-code-elimination: 1.0.12 bundle-require: 5.1.0(esbuild@0.24.2) devalue: 5.1.1 esbuild: 0.24.2 magic-string: 0.30.17 vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): dependencies: From a6ab74f72ddfa9ce26b4628f687de3395b0a65d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 23:33:32 +0100 Subject: [PATCH 06/74] nicolium: switch to vite 8 beta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/package.json | 2 +- packages/pl-fe/src/service-worker/sw.ts | 6 +- pnpm-lock.yaml | 705 +++++++++++++----------- 3 files changed, 391 insertions(+), 322 deletions(-) diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 51930828b..af0e933a0 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -170,7 +170,7 @@ "tslib": "^2.8.1", "type-fest": "^4.30.1", "typescript": "5.7.3", - "vite": "^7.3.1", + "vite": "^8.0.0-beta.14", "vite-plugin-checker": "^0.12.0", "vite-plugin-compile-time": "^0.4.6", "vite-plugin-html": "^3.2.2", diff --git a/packages/pl-fe/src/service-worker/sw.ts b/packages/pl-fe/src/service-worker/sw.ts index 94172c61f..2b9df1b3a 100644 --- a/packages/pl-fe/src/service-worker/sw.ts +++ b/packages/pl-fe/src/service-worker/sw.ts @@ -194,21 +194,21 @@ const handlePush = (event: PushEvent) => { /** Native action to open a status on the device. */ const actionExpand = (preferred_locale: string) => ({ action: 'expand', - icon: `/${require('../../assets/images/web-push/web-push-icon_expand.png')}`, + icon: `/${require('../assets/images/web-push/web-push-icon_expand.png')}`, title: formatMessage('status.show_more', preferred_locale), }); /** Native action to repost status. */ const actionReblog = (preferred_locale: string) => ({ action: 'reblog', - icon: `/${require('../../assets/images/web-push/web-push-icon_reblog.png')}`, + icon: `/${require('../assets/images/web-push/web-push-icon_reblog.png')}`, title: formatMessage('status.reblog', preferred_locale), }); /** Native action to like status. */ const actionFavourite = (preferred_locale: string) => ({ action: 'favourite', - icon: `/${require('../../assets/images/web-push/web-push-icon_favourite.png')}`, + icon: `/${require('../assets/images/web-push/web-push-icon_favourite.png')}`, title: formatMessage('status.favourite', preferred_locale), }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98ab5bc87..d0a1cc1ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -105,10 +105,10 @@ importers: version: 5.9.2 vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + version: 5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) ws: specifier: ^8.18.3 version: 8.18.3 @@ -457,7 +457,7 @@ importers: version: 8.38.0(eslint@8.57.1)(typescript@5.7.3) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 5.1.4(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -496,7 +496,7 @@ importers: version: 15.15.0 rollup-plugin-bundle-stats: specifier: ^4.21.10 - version: 4.21.10(core-js@3.44.0)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) stylelint: specifier: ^16.12.0 version: 16.23.0(typescript@5.7.3) @@ -516,26 +516,26 @@ importers: specifier: 5.7.3 version: 5.7.3 vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + specifier: ^8.0.0-beta.14 + version: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.12.0 - version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-compile-time: specifier: ^0.4.6 - version: 0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 0.4.6(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 3.2.2(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-pwa: specifier: ^1.2.0 - version: 1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-require: specifier: ^1.2.14 - version: 1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 1.2.14(esbuild@0.24.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-static-copy: specifier: ^3.2.0 - version: 3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 3.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) packages/pl-hooks: dependencies: @@ -590,10 +590,10 @@ importers: version: 5.9.2 vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + version: 5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) vite-plugin-dts: specifier: ^4.2.1 - version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) packages: @@ -1249,12 +1249,21 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emoji-mart/data@1.2.1': resolution: {integrity: sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==} @@ -1274,12 +1283,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1292,12 +1295,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1310,12 +1307,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1328,12 +1319,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1346,12 +1331,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1364,12 +1343,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1382,12 +1355,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1400,12 +1367,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1418,12 +1379,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1436,12 +1391,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1454,12 +1403,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -1472,12 +1415,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1490,12 +1427,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1508,12 +1439,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1526,12 +1451,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1544,12 +1463,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1562,24 +1475,12 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1592,24 +1493,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1622,18 +1511,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1646,12 +1523,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1664,12 +1535,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1682,12 +1547,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1700,12 +1559,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2009,6 +1862,9 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2025,6 +1881,13 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@oxc-project/runtime@0.113.0': + resolution: {integrity: sha512-apRWH/gXeAsl/sQiblIZnLu7f8P/C9S2fJIicuHV9KOK9J7Hv1JPyTwB8WAcOrDBfjs+cbzjMOGe9UR2ue4ZQg==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@oxc-project/types@0.113.0': + resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -2211,9 +2074,89 @@ packages: react-redux: optional: true + '@rolldown/binding-android-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.4': + resolution: {integrity: sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.4': + resolution: {integrity: sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': + resolution: {integrity: sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': + resolution: {integrity: sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': + resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': + resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': + resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': + resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + resolution: {integrity: sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': + resolution: {integrity: sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': + resolution: {integrity: sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} + '@rolldown/pluginutils@1.0.0-rc.4': + resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} + '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -2695,6 +2638,9 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -3750,6 +3696,10 @@ packages: engines: {node: '>=0.10'} hasBin: true + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-passive-events@2.0.3: resolution: {integrity: sha512-QN/1X65Axis6a9D8qg8Py9cwY/fkWAmAH/edTbmLMcv4m5dboLJ7LcAi8CfaCON2tjk904KwKX/HTdsHC6yeRg==} @@ -3916,11 +3866,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4834,6 +4779,76 @@ packages: lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -5803,6 +5818,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rolldown@1.0.0-rc.4: + resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-bundle-stats@4.21.10: resolution: {integrity: sha512-vcUqcAZpXHhBf/Gu7OLcRIVU4Rz6ZXISNCsbuFdpfkGcYDOOcB+pYkTXx73ZHHdD4RkT5SlkrQQwdNKfrTPc5g==} engines: {node: '>= 16.0'} @@ -6732,15 +6752,16 @@ packages: terser: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@8.0.0-beta.14: + resolution: {integrity: sha512-oLW66oi8tZcoxu6+1HFXb+5hLHco3OnEVu2Awmj5NqEo7vxaqybjBM0BXHcq+jAFhzkMGXJl8xcO5qDBczgKLg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.0.0-alpha.31 + esbuild: ^0.27.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -6751,12 +6772,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -7830,16 +7853,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emoji-mart/data@1.2.1': {} '@es-joy/jsdoccomment@0.50.2': @@ -7856,222 +7895,144 @@ snapshots: '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/aix-ppc64@0.27.3': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm64@0.27.3': - optional: true - '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-arm@0.27.3': - optional: true - '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/android-x64@0.27.3': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.27.3': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/darwin-x64@0.27.3': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.27.3': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.27.3': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm64@0.27.3': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-arm@0.27.3': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-ia32@0.27.3': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-loong64@0.27.3': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-mips64el@0.27.3': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-ppc64@0.27.3': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.27.3': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-s390x@0.27.3': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.24.2': optional: true - '@esbuild/linux-x64@0.27.3': - optional: true - '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-arm64@0.27.3': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.27.3': - optional: true - '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.27.3': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.27.3': - optional: true - - '@esbuild/openharmony-arm64@0.27.3': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.27.3': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-arm64@0.27.3': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-ia32@0.27.3': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.24.2': optional: true - '@esbuild/win32-x64@0.27.3': - optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -8523,6 +8484,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8537,6 +8505,10 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@oxc-project/runtime@0.113.0': {} + + '@oxc-project/types@0.113.0': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -8715,8 +8687,51 @@ snapshots: react: 19.2.3 react-redux: 9.2.0(@types/react@18.3.27)(react@19.2.3)(redux@5.0.1) + '@rolldown/binding-android-arm64@1.0.0-rc.4': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-rc.4': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-rc.4': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-rc.4': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': + optional: true + '@rolldown/pluginutils@1.0.0-rc.3': {} + '@rolldown/pluginutils@1.0.0-rc.4': {} + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: '@babel/core': 7.29.0 @@ -9181,6 +9196,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/argparse@1.0.38': {} '@types/babel__core@7.20.5': @@ -9659,7 +9679,7 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.3 - '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))': + '@vitejs/plugin-react@5.1.4(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -9667,7 +9687,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -10425,6 +10445,8 @@ snapshots: detect-libc@1.0.3: optional: true + detect-libc@2.1.2: {} + detect-passive-events@2.0.3: dependencies: detect-it: 4.0.1 @@ -10696,35 +10718,6 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 - esbuild@0.27.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 - escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -11835,6 +11828,55 @@ snapshots: dependencies: immediate: 3.0.6 + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + lilconfig@3.1.3: {} line-awesome@1.3.0: {} @@ -12764,28 +12806,50 @@ snapshots: dependencies: glob: 7.2.3 - rollup-plugin-bundle-stats@4.21.10(core-js@3.44.0)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rolldown@1.0.0-rc.4: + dependencies: + '@oxc-project/types': 0.113.0 + '@rolldown/pluginutils': 1.0.0-rc.4 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.4 + '@rolldown/binding-darwin-x64': 1.0.0-rc.4 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 + + rollup-plugin-bundle-stats@4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@bundle-stats/cli-utils': 4.21.10(core-js@3.44.0) - rollup-plugin-webpack-stats: 2.1.11(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + rollup-plugin-webpack-stats: 2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) tslib: 2.8.1 optionalDependencies: + rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - core-js - rollup-plugin-stats@1.5.6(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rollup-plugin-stats@1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): optionalDependencies: + rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - rollup-plugin-webpack-stats@2.1.11(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rollup-plugin-webpack-stats@2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: - rollup-plugin-stats: 1.5.6(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + rollup-plugin-stats: 1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) optionalDependencies: + rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) rollup@2.79.2: optionalDependencies: @@ -12849,6 +12913,7 @@ snapshots: '@rollup/rollup-win32-x64-gnu': 4.57.1 '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 + optional: true run-parallel@1.2.0: dependencies: @@ -13703,7 +13768,7 @@ snapshots: varint@6.0.0: {} - vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -13712,7 +13777,7 @@ snapshots: picomatch: 4.0.3 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 8.57.1 @@ -13721,7 +13786,7 @@ snapshots: stylelint: 16.23.0(typescript@5.7.3) typescript: 5.7.3 - vite-plugin-compile-time@0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-compile-time@0.4.6(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 @@ -13732,11 +13797,11 @@ snapshots: devalue: 5.1.1 esbuild: 0.24.2 magic-string: 0.30.17 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@20.19.9) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13749,13 +13814,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@22.17.0) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13768,13 +13833,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-html@3.2.2(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -13788,27 +13853,27 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite-plugin-pwa@1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 '@babel/types': 7.28.2 '@vue/compiler-sfc': 3.5.18 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vue-loader: 17.4.2(@vue/compiler-sfc@3.5.18)(webpack@5.101.0(esbuild@0.24.2)) webpack: 5.101.0(esbuild@0.24.2) transitivePeerDependencies: @@ -13819,15 +13884,15 @@ snapshots: - vue - webpack-cli - vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-static-copy@3.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite@5.4.21(@types/node@20.19.9)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): + vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -13835,11 +13900,12 @@ snapshots: optionalDependencies: '@types/node': 20.19.9 fsevents: 2.3.3 + lightningcss: 1.31.1 sass: 1.93.3 sass-embedded: 1.93.3 terser: 5.46.0 - vite@5.4.21(@types/node@22.17.0)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): + vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -13847,20 +13913,23 @@ snapshots: optionalDependencies: '@types/node': 22.17.0 fsevents: 2.3.3 + lightningcss: 1.31.1 sass: 1.93.3 sass-embedded: 1.93.3 terser: 5.46.0 - vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): + vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: - esbuild: 0.27.3 + '@oxc-project/runtime': 0.113.0 fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.31.1 picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.57.1 + rolldown: 1.0.0-rc.4 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.0.3 + esbuild: 0.24.2 fsevents: 2.3.3 jiti: 1.21.7 sass: 1.93.3 From ffdfeadb8f1c9d8d18c6aa882062735d5cb2fab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sat, 14 Feb 2026 23:37:32 +0100 Subject: [PATCH 07/74] nicolium: also migrate pl-api MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/package.json | 2 +- packages/pl-hooks/package.json | 2 +- pnpm-lock.yaml | 524 ++------------------------------- 3 files changed, 30 insertions(+), 498 deletions(-) diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json index 6f1bf1506..9717800b4 100644 --- a/packages/pl-api/package.json +++ b/packages/pl-api/package.json @@ -36,7 +36,7 @@ "typedoc-material-theme": "^1.4.0", "typedoc-plugin-valibot": "^1.0.0", "typescript": "^5.8.3", - "vite": "^5.4.21", + "vite": "^8.0.0-beta.14", "vite-plugin-dts": "^4.5.4", "ws": "^8.18.3" }, diff --git a/packages/pl-hooks/package.json b/packages/pl-hooks/package.json index cb56fad19..29e898a48 100644 --- a/packages/pl-hooks/package.json +++ b/packages/pl-hooks/package.json @@ -29,7 +29,7 @@ "eslint-plugin-import": "^2.28.1", "eslint-plugin-promise": "^6.0.0", "typescript": "^5.6.2", - "vite": "^5.4.21", + "vite": "^8.0.0-beta.14", "vite-plugin-dts": "^4.2.1" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d0a1cc1ef..c523169c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -104,11 +104,11 @@ importers: specifier: ^5.8.3 version: 5.9.2 vite: - specifier: ^5.4.21 - version: 5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + specifier: ^8.0.0-beta.14 + version: 8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) ws: specifier: ^8.18.3 version: 8.18.3 @@ -589,11 +589,11 @@ importers: specifier: ^5.6.2 version: 5.9.2 vite: - specifier: ^5.4.21 - version: 5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + specifier: ^8.0.0-beta.14 + version: 8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-dts: specifier: ^4.2.1 - version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)) + version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) packages: @@ -1271,204 +1271,102 @@ packages: resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -1481,12 +1379,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -1499,60 +1391,30 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -2219,111 +2081,56 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.57.1': resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.57.1': resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.57.1': resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.57.1': resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.57.1': resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.57.1': resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.57.1': resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.57.1': resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.57.1': resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.57.1': resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] @@ -2334,11 +2141,6 @@ packages: cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.57.1': resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] @@ -2349,51 +2151,26 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.57.1': resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.57.1': resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.57.1': resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.57.1': resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.57.1': resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] @@ -2404,51 +2181,26 @@ packages: cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} - cpu: [arm64] - os: [openharmony] - '@rollup/rollup-openharmony-arm64@4.57.1': resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.57.1': resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.57.1': resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-gnu@4.57.1': resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.57.1': resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] @@ -3856,11 +3608,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -5873,11 +5620,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -6721,37 +6463,6 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@8.0.0-beta.14: resolution: {integrity: sha512-oLW66oi8tZcoxu6+1HFXb+5hLHco3OnEVu2Awmj5NqEo7vxaqybjBM0BXHcq+jAFhzkMGXJl8xcO5qDBczgKLg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7889,147 +7600,78 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.24.2': optional: true @@ -8795,144 +8437,78 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/rollup-android-arm-eabi@4.52.5': - optional: true - '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.52.5': - optional: true - '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.52.5': - optional: true - '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.52.5': - optional: true - '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': - optional: true - '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': - optional: true - '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': - optional: true - '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.52.5': - optional: true - '@rollup/rollup-linux-x64-musl@4.57.1': optional: true '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.52.5': - optional: true - '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': - optional: true - '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': - optional: true - '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true @@ -10664,32 +10240,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -12855,34 +12405,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - rollup@4.52.5: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 - fsevents: 2.3.3 - rollup@4.57.1: dependencies: '@types/estree': 1.0.8 @@ -13801,7 +13323,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@20.19.9) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13814,13 +13336,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@22.17.0) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13833,7 +13355,7 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0) + vite: 8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup @@ -13892,31 +13414,41 @@ snapshots: tinyglobby: 0.2.15 vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite@5.4.21(@types/node@20.19.9)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): + vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: - esbuild: 0.21.5 + '@oxc-project/runtime': 0.113.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.31.1 + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.5 + rolldown: 1.0.0-rc.4 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.9 fsevents: 2.3.3 - lightningcss: 1.31.1 + jiti: 1.21.7 sass: 1.93.3 sass-embedded: 1.93.3 terser: 5.46.0 + yaml: 2.8.0 - vite@5.4.21(@types/node@22.17.0)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0): + vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: - esbuild: 0.21.5 + '@oxc-project/runtime': 0.113.0 + fdir: 6.5.0(picomatch@4.0.3) + lightningcss: 1.31.1 + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.52.5 + rolldown: 1.0.0-rc.4 + tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.17.0 fsevents: 2.3.3 - lightningcss: 1.31.1 + jiti: 1.21.7 sass: 1.93.3 sass-embedded: 1.93.3 terser: 5.46.0 + yaml: 2.8.0 vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: From f4c74902638003fb19ffc87730573715487823b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 15 Feb 2026 00:40:44 +0100 Subject: [PATCH 08/74] nicolium: probably a fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/.eslintrc.json | 5 +- packages/pl-api/package.json | 9 +- packages/pl-fe/package.json | 2 +- .../pl-fe/src/build-config-compiletime.ts | 39 ---- packages/pl-fe/src/build-config.ts | 9 +- packages/pl-fe/vite.config.ts | 6 +- pnpm-lock.yaml | 221 +++++++++++++++++- 7 files changed, 230 insertions(+), 61 deletions(-) delete mode 100644 packages/pl-fe/src/build-config-compiletime.ts diff --git a/packages/pl-api/.eslintrc.json b/packages/pl-api/.eslintrc.json index 6bf945a6e..d3d44b71f 100644 --- a/packages/pl-api/.eslintrc.json +++ b/packages/pl-api/.eslintrc.json @@ -50,10 +50,7 @@ "ResizeObserver", "URL", "URLSearchParams" - ], - "tailwindcss": { - "config": "tailwind.config.ts" - } + ] }, "rules": { "brace-style": "error", diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json index 9717800b4..525831e38 100644 --- a/packages/pl-api/package.json +++ b/packages/pl-api/package.json @@ -15,7 +15,8 @@ "build": "vite build", "watch": "vite build --watch", "preview": "vite preview", - "lint": "npx eslint --ext .js,.jsx,.cjs,.mjs,.ts,.tsx . --cache" + "lint": "oxlint", + "precommit": "lint-staged" }, "license": "AGPL-3.0-or-later", "devDependencies": { @@ -32,6 +33,7 @@ "eslint-plugin-compat": "6.0.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-promise": "^7.2.1", + "oxlint": "^1.47.0", "typedoc": "^0.28.7", "typedoc-material-theme": "^1.4.0", "typedoc-plugin-valibot": "^1.0.0", @@ -55,5 +57,8 @@ "types": "dist/main.d.ts", "files": [ "dist" - ] + ], + "lint-staged": { + "*.{js,cjs,mjs,ts,tsx}": "pnpm run lint" + } } diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index af0e933a0..b85b2ccb3 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -98,7 +98,7 @@ "lexical": "^0.39.0", "line-awesome": "^1.3.0", "localforage": "^1.10.0", - "lodash": "^4.17.23", + "lodash-es": "^4.17.23", "mini-css-extract-plugin": "^2.9.4", "mutative": "^1.3.0", "path-browserify": "^1.0.1", diff --git a/packages/pl-fe/src/build-config-compiletime.ts b/packages/pl-fe/src/build-config-compiletime.ts deleted file mode 100644 index 452bc0f63..000000000 --- a/packages/pl-fe/src/build-config-compiletime.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Build config: configuration set at build time. - * @module pl-fe/build-config - */ - -// eslint-disable-next-line import/extensions -import trim from 'lodash/trim.js'; -// eslint-disable-next-line import/extensions -import trimEnd from 'lodash/trimEnd.js'; - -const { - NODE_ENV, - BACKEND_URL, - FE_SUBDIRECTORY, - WITH_LANDING_PAGE, -} = process.env; - -const sanitizeURL = (url: string | undefined = ''): string => { - try { - return trimEnd(new URL(url).toString(), '/'); - } catch { - return ''; - } -}; - -const sanitizeBasename = (path: string | undefined = ''): string => `/${trim(path, '/')}`; - -const env = { - NODE_ENV: NODE_ENV || 'development', - BACKEND_URL: sanitizeURL(BACKEND_URL), - FE_SUBDIRECTORY: sanitizeBasename(FE_SUBDIRECTORY), - WITH_LANDING_PAGE: WITH_LANDING_PAGE === 'true', -}; - -export type PlFeEnv = typeof env; - -export default () => ({ - data: env, -}); diff --git a/packages/pl-fe/src/build-config.ts b/packages/pl-fe/src/build-config.ts index 448b407fc..c9416a059 100644 --- a/packages/pl-fe/src/build-config.ts +++ b/packages/pl-fe/src/build-config.ts @@ -3,11 +3,6 @@ * @module pl-fe/build-config */ -// eslint-disable-next-line import/extensions -import trim from 'lodash/trim.js'; -// eslint-disable-next-line import/extensions -import trimEnd from 'lodash/trimEnd.js'; - const env = compileTime(() => { const { NODE_ENV, @@ -18,13 +13,13 @@ const env = compileTime(() => { const sanitizeURL = (url: string | undefined = ''): string => { try { - return trimEnd(new URL(url).toString(), '/'); + return new URL(url).toString().replace(/\/+$/, ''); } catch { return ''; } }; - const sanitizeBasename = (path: string | undefined = ''): string => `/${trim(path, '/')}`; + const sanitizeBasename = (path: string | undefined = ''): string => `/${path.replace(/^\/+|\/+$/g, '')}`; return { NODE_ENV: NODE_ENV || 'development', diff --git a/packages/pl-fe/vite.config.ts b/packages/pl-fe/vite.config.ts index ec0e97947..7299eb968 100644 --- a/packages/pl-fe/vite.config.ts +++ b/packages/pl-fe/vite.config.ts @@ -12,7 +12,7 @@ import { VitePWA } from 'vite-plugin-pwa'; import vitePluginRequire from 'vite-plugin-require'; import { viteStaticCopy } from 'vite-plugin-static-copy'; -const config = defineConfig(({ command }) => ({ +const config = defineConfig(() => ({ build: { assetsDir: 'packs', assetsInlineLimit: 0, @@ -176,6 +176,10 @@ const config = defineConfig(({ command }) => ({ find: '@/', replacement: fileURLToPath(new URL('./src/', import.meta.url)), }, + { + find: 'lodash', + replacement: 'lodash-es', + }, ], dedupe: ['@floating-ui/react', 'tabbable', 'query-string', 'valibot'], }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c523169c3..cac6d549f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,6 +91,9 @@ importers: eslint-plugin-promise: specifier: ^7.2.1 version: 7.2.1(eslint@8.57.1) + oxlint: + specifier: ^1.47.0 + version: 1.47.0 typedoc: specifier: ^0.28.7 version: 0.28.9(typescript@5.9.2) @@ -304,7 +307,7 @@ importers: localforage: specifier: ^1.10.0 version: 1.10.0 - lodash: + lodash-es: specifier: ^4.17.23 version: 4.17.23 mini-css-extract-plugin: @@ -520,7 +523,7 @@ importers: version: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.12.0 - version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-compile-time: specifier: ^0.4.6 version: 0.4.6(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) @@ -1750,6 +1753,120 @@ packages: '@oxc-project/types@0.113.0': resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} + '@oxlint/binding-android-arm-eabi@1.47.0': + resolution: {integrity: sha512-UHqo3te9K/fh29brCuQdHjN+kfpIi9cnTPABuD5S9wb9ykXYRGTOOMVuSV/CK43sOhU4wwb2nT1RVjcbrrQjFw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.47.0': + resolution: {integrity: sha512-xh02lsTF1TAkR+SZrRMYHR/xCx8Wg2MAHxJNdHVpAKELh9/yE9h4LJeqAOBbIb3YYn8o/D97U9VmkvkfJfrHfw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.47.0': + resolution: {integrity: sha512-OSOfNJqabOYbkyQDGT5pdoL+05qgyrmlQrvtCO58M4iKGEQ/xf3XkkKj7ws+hO+k8Y4VF4zGlBsJlwqy7qBcHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.47.0': + resolution: {integrity: sha512-hP2bOI4IWNS+F6pVXWtRshSTuJ1qCRZgDgVUg6EBUqsRy+ExkEPJkx+YmIuxgdCduYK1LKptLNFuQLJP8voPbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.47.0': + resolution: {integrity: sha512-F55jIEH5xmGu7S661Uho8vGiLFk0bY3A/g4J8CTKiLJnYu/PSMZ2WxFoy5Hji6qvFuujrrM9Q8XXbMO0fKOYPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.47.0': + resolution: {integrity: sha512-wxmOn/wns/WKPXUC1fo5mu9pMZPVOu8hsynaVDrgmmXMdHKS7on6bA5cPauFFN9tJXNdsjW26AK9lpfu3IfHBQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.47.0': + resolution: {integrity: sha512-KJTmVIA/GqRlM2K+ZROH30VMdydEU7bDTY35fNg3tOPzQRIs2deLZlY/9JWwdWo1F/9mIYmpbdCmPqtKhWNOPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.47.0': + resolution: {integrity: sha512-PF7ELcFg1GVlS0X0ZB6aWiXobjLrAKer3T8YEkwIoO8RwWiAMkL3n3gbleg895BuZkHVlJ2kPRUwfrhHrVkD1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.47.0': + resolution: {integrity: sha512-4BezLRO5cu0asf0Jp1gkrnn2OHiXrPPPEfBTxq1k5/yJ2zdGGTmZxHD2KF2voR23wb8Elyu3iQawXo7wvIZq0Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.47.0': + resolution: {integrity: sha512-aI5ds9jq2CPDOvjeapiIj48T/vlWp+f4prkxs+FVzrmVN9BWIj0eqeJ/hV8WgXg79HVMIz9PU6deI2ki09bR1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.47.0': + resolution: {integrity: sha512-mO7ycp9Elvgt5EdGkQHCwJA6878xvo9tk+vlMfT1qg++UjvOMB8INsOCQIOH2IKErF/8/P21LULkdIrocMw9xA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.47.0': + resolution: {integrity: sha512-24D0wsYT/7hDFn3Ow32m3/+QT/1ZwrUhShx4/wRDAmz11GQHOZ1k+/HBuK/MflebdnalmXWITcPEy4BWTi7TCA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.47.0': + resolution: {integrity: sha512-8tPzPne882mtML/uy3mApvdCyuVOpthJ7xUv3b67gVfz63hOOM/bwO0cysSkPyYYFDFRn6/FnUb7Jhmsesntvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.47.0': + resolution: {integrity: sha512-q58pIyGIzeffEBhEgbRxLFHmHfV9m7g1RnkLiahQuEvyjKNiJcvdHOwKH2BdgZxdzc99Cs6hF5xTa86X40WzPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.47.0': + resolution: {integrity: sha512-e7DiLZtETZUCwTa4EEHg9G+7g3pY+afCWXvSeMG7m0TQ29UHHxMARPaEQUE4mfKgSqIWnJaUk2iZzRPMRdga5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.47.0': + resolution: {integrity: sha512-3AFPfQ0WKMleT/bKd7zsks3xoawtZA6E/wKf0DjwysH7wUiMMJkNKXOzYq1R/00G98JFgSU1AkrlOQrSdNNhlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.47.0': + resolution: {integrity: sha512-cLMVVM6TBxp+N7FldQJ2GQnkcLYEPGgiuEaXdvhgvSgODBk9ov3jed+khIXSAWtnFOW0wOnG3RjwqPh0rCuheA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.47.0': + resolution: {integrity: sha512-VpFOSzvTnld77/Edje3ZdHgZWnlTb5nVWXyTgjD3/DKF/6t5bRRbwn3z77zOdnGy44xAMvbyAwDNOSeOdVUmRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.47.0': + resolution: {integrity: sha512-+q8IWptxXx2HMTM6JluR67284t0h8X/oHJgqpxH1siowxPMqZeIpAcWCUq+tY+Rv2iQK8TUugjZnSBQAVV5CmA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -4641,8 +4758,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -4926,6 +5043,16 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxlint@1.47.0: + resolution: {integrity: sha512-v7xkK1iv1qdvTxJGclM97QzN8hHs5816AneFAQ0NGji1BMUquhiDAhXpMwp8+ls16uRVJtzVHxP9pAAXblDeGA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.11.2' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8151,6 +8278,63 @@ snapshots: '@oxc-project/types@0.113.0': {} + '@oxlint/binding-android-arm-eabi@1.47.0': + optional: true + + '@oxlint/binding-android-arm64@1.47.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.47.0': + optional: true + + '@oxlint/binding-darwin-x64@1.47.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.47.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.47.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.47.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.47.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.47.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.47.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.47.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.47.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.47.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.47.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.47.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.47.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.47.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.47.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.47.0': + optional: true + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -11483,7 +11667,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + lodash-es@4.17.23: {} lodash.castarray@4.4.0: {} @@ -11753,6 +11937,28 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxlint@1.47.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.47.0 + '@oxlint/binding-android-arm64': 1.47.0 + '@oxlint/binding-darwin-arm64': 1.47.0 + '@oxlint/binding-darwin-x64': 1.47.0 + '@oxlint/binding-freebsd-x64': 1.47.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.47.0 + '@oxlint/binding-linux-arm-musleabihf': 1.47.0 + '@oxlint/binding-linux-arm64-gnu': 1.47.0 + '@oxlint/binding-linux-arm64-musl': 1.47.0 + '@oxlint/binding-linux-ppc64-gnu': 1.47.0 + '@oxlint/binding-linux-riscv64-gnu': 1.47.0 + '@oxlint/binding-linux-riscv64-musl': 1.47.0 + '@oxlint/binding-linux-s390x-gnu': 1.47.0 + '@oxlint/binding-linux-x64-gnu': 1.47.0 + '@oxlint/binding-linux-x64-musl': 1.47.0 + '@oxlint/binding-openharmony-arm64': 1.47.0 + '@oxlint/binding-win32-arm64-msvc': 1.47.0 + '@oxlint/binding-win32-ia32-msvc': 1.47.0 + '@oxlint/binding-win32-x64-msvc': 1.47.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -12115,7 +12321,7 @@ snapshots: dependencies: '@icons/material': 0.2.4(react@19.2.3) lodash: 4.17.23 - lodash-es: 4.17.21 + lodash-es: 4.17.23 material-colors: 1.2.6 prop-types: 15.8.1 react: 19.2.3 @@ -13290,7 +13496,7 @@ snapshots: varint@6.0.0: {} - vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -13305,6 +13511,7 @@ snapshots: eslint: 8.57.1 meow: 13.2.0 optionator: 0.9.4 + oxlint: 1.47.0 stylelint: 16.23.0(typescript@5.7.3) typescript: 5.7.3 From df7feb8ea837f76b3dbf7987e482d5a7987e5f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 15 Feb 2026 00:46:40 +0100 Subject: [PATCH 09/74] downgrade vite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/package.json | 2 +- packages/pl-fe/package.json | 2 +- pnpm-lock.yaml | 467 +++++++++++++++++++++++++++++------ 3 files changed, 389 insertions(+), 82 deletions(-) diff --git a/packages/pl-api/package.json b/packages/pl-api/package.json index 525831e38..17b294da5 100644 --- a/packages/pl-api/package.json +++ b/packages/pl-api/package.json @@ -38,7 +38,7 @@ "typedoc-material-theme": "^1.4.0", "typedoc-plugin-valibot": "^1.0.0", "typescript": "^5.8.3", - "vite": "^8.0.0-beta.14", + "vite": "^7.0.0", "vite-plugin-dts": "^4.5.4", "ws": "^8.18.3" }, diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index b85b2ccb3..3731739b5 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -170,7 +170,7 @@ "tslib": "^2.8.1", "type-fest": "^4.30.1", "typescript": "5.7.3", - "vite": "^8.0.0-beta.14", + "vite": "^7.0.0", "vite-plugin-checker": "^0.12.0", "vite-plugin-compile-time": "^0.4.6", "vite-plugin-html": "^3.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cac6d549f..32a1db160 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,11 +107,11 @@ importers: specifier: ^5.8.3 version: 5.9.2 vite: - specifier: ^8.0.0-beta.14 - version: 8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + specifier: ^7.0.0 + version: 7.3.1(@types/node@22.17.0)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@7.3.1(@types/node@22.17.0)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) ws: specifier: ^8.18.3 version: 8.18.3 @@ -460,7 +460,7 @@ importers: version: 8.38.0(eslint@8.57.1)(typescript@5.7.3) '@vitejs/plugin-react': specifier: ^5.1.3 - version: 5.1.4(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -499,7 +499,7 @@ importers: version: 15.15.0 rollup-plugin-bundle-stats: specifier: ^4.21.10 - version: 4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) stylelint: specifier: ^16.12.0 version: 16.23.0(typescript@5.7.3) @@ -519,26 +519,26 @@ importers: specifier: 5.7.3 version: 5.7.3 vite: - specifier: ^8.0.0-beta.14 - version: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + specifier: ^7.0.0 + version: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-checker: specifier: ^0.12.0 - version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-compile-time: specifier: ^0.4.6 - version: 0.4.6(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-html: specifier: ^3.2.2 - version: 3.2.2(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-pwa: specifier: ^1.2.0 - version: 1.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-require: specifier: ^1.2.14 - version: 1.2.14(esbuild@0.24.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) vite-plugin-static-copy: specifier: ^3.2.0 - version: 3.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) packages/pl-hooks: dependencies: @@ -593,10 +593,10 @@ importers: version: 5.9.2 vite: specifier: ^8.0.0-beta.14 - version: 8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + version: 8.0.0-beta.14(@types/node@20.19.9)(esbuild@0.27.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vite-plugin-dts: specifier: ^4.2.1 - version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + version: 4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(esbuild@0.27.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) packages: @@ -1280,150 +1280,306 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3730,6 +3886,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -6590,6 +6751,46 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vite@8.0.0-beta.14: resolution: {integrity: sha512-oLW66oi8tZcoxu6+1HFXb+5hLHco3OnEVu2Awmj5NqEo7vxaqybjBM0BXHcq+jAFhzkMGXJl8xcO5qDBczgKLg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -7730,78 +7931,156 @@ snapshots: '@esbuild/aix-ppc64@0.24.2': optional: true + '@esbuild/aix-ppc64@0.27.3': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true + '@esbuild/android-arm64@0.27.3': + optional: true + '@esbuild/android-arm@0.24.2': optional: true + '@esbuild/android-arm@0.27.3': + optional: true + '@esbuild/android-x64@0.24.2': optional: true + '@esbuild/android-x64@0.27.3': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true + '@esbuild/darwin-arm64@0.27.3': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true + '@esbuild/darwin-x64@0.27.3': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true + '@esbuild/freebsd-arm64@0.27.3': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true + '@esbuild/freebsd-x64@0.27.3': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true + '@esbuild/linux-arm64@0.27.3': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true + '@esbuild/linux-arm@0.27.3': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true + '@esbuild/linux-ia32@0.27.3': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true + '@esbuild/linux-loong64@0.27.3': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true + '@esbuild/linux-mips64el@0.27.3': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true + '@esbuild/linux-ppc64@0.27.3': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true + '@esbuild/linux-riscv64@0.27.3': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true + '@esbuild/linux-s390x@0.27.3': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true + '@esbuild/linux-x64@0.27.3': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true + '@esbuild/netbsd-arm64@0.27.3': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true + '@esbuild/netbsd-x64@0.27.3': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true + '@esbuild/openbsd-arm64@0.27.3': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true + '@esbuild/sunos-x64@0.27.3': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true + '@esbuild/win32-arm64@0.27.3': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true + '@esbuild/win32-ia32@0.27.3': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true + '@esbuild/win32-x64@0.27.3': + optional: true + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -9439,7 +9718,7 @@ snapshots: '@use-gesture/core': 10.3.1 react: 19.2.3 - '@vitejs/plugin-react@5.1.4(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))': + '@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -9447,7 +9726,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -10452,6 +10731,35 @@ snapshots: '@esbuild/win32-ia32': 0.24.2 '@esbuild/win32-x64': 0.24.2 + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -12581,31 +12889,31 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 - rollup-plugin-bundle-stats@4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rollup-plugin-bundle-stats@4.21.10(core-js@3.44.0)(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@bundle-stats/cli-utils': 4.21.10(core-js@3.44.0) - rollup-plugin-webpack-stats: 2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + rollup-plugin-webpack-stats: 2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) tslib: 2.8.1 optionalDependencies: rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - core-js - rollup-plugin-stats@1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rollup-plugin-stats@1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): optionalDependencies: rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - rollup-plugin-webpack-stats@2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + rollup-plugin-webpack-stats@2.1.11(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: - rollup-plugin-stats: 1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) + rollup-plugin-stats: 1.5.6(rolldown@1.0.0-rc.4)(rollup@2.79.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)) optionalDependencies: rolldown: 1.0.0-rc.4 rollup: 2.79.2 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) rollup@2.79.2: optionalDependencies: @@ -12641,7 +12949,6 @@ snapshots: '@rollup/rollup-win32-x64-gnu': 4.57.1 '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 - optional: true run-parallel@1.2.0: dependencies: @@ -13496,7 +13803,7 @@ snapshots: varint@6.0.0: {} - vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-checker@0.12.0(eslint@8.57.1)(meow@13.2.0)(optionator@0.9.4)(oxlint@1.47.0)(stylelint@16.23.0(typescript@5.7.3))(typescript@5.7.3)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -13505,7 +13812,7 @@ snapshots: picomatch: 4.0.3 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 8.57.1 @@ -13515,7 +13822,7 @@ snapshots: stylelint: 16.23.0(typescript@5.7.3) typescript: 5.7.3 - vite-plugin-compile-time@0.4.6(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-compile-time@0.4.6(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 @@ -13526,11 +13833,11 @@ snapshots: devalue: 5.1.1 esbuild: 0.24.2 magic-string: 0.30.17 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color - vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@20.19.9)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@20.19.9)(esbuild@0.27.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@20.19.9) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13543,13 +13850,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 8.0.0-beta.14(@types/node@20.19.9)(esbuild@0.27.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-dts@4.5.4(@types/node@22.17.0)(rollup@4.57.1)(typescript@5.9.2)(vite@7.3.1(@types/node@22.17.0)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@microsoft/api-extractor': 7.52.10(@types/node@22.17.0) '@rollup/pluginutils': 5.2.0(rollup@4.57.1) @@ -13562,13 +13869,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@22.17.0)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-html@3.2.2(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -13582,27 +13889,27 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite-plugin-pwa@1.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.15 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - supports-color - vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-require@1.2.14(esbuild@0.24.2)(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 '@babel/types': 7.28.2 '@vue/compiler-sfc': 3.5.18 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) vue-loader: 17.4.2(@vue/compiler-sfc@3.5.18)(webpack@5.101.0(esbuild@0.24.2)) webpack: 5.101.0(esbuild@0.24.2) transitivePeerDependencies: @@ -13613,15 +13920,51 @@ snapshots: - vue - webpack-cli - vite-plugin-static-copy@3.2.0(vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): + vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) + vite: 7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0) - vite@8.0.0-beta.14(@types/node@20.19.9)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): + vite@7.3.1(@types/node@22.17.0)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.17.0 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.31.1 + sass: 1.93.3 + sass-embedded: 1.93.3 + terser: 5.46.0 + yaml: 2.8.0 + + vite@7.3.1(@types/node@25.0.3)(jiti@1.21.7)(lightningcss@1.31.1)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.3 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.31.1 + sass: 1.93.3 + sass-embedded: 1.93.3 + terser: 5.46.0 + yaml: 2.8.0 + + vite@8.0.0-beta.14(@types/node@20.19.9)(esbuild@0.27.3)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): dependencies: '@oxc-project/runtime': 0.113.0 fdir: 6.5.0(picomatch@4.0.3) @@ -13632,43 +13975,7 @@ snapshots: tinyglobby: 0.2.15 optionalDependencies: '@types/node': 20.19.9 - fsevents: 2.3.3 - jiti: 1.21.7 - sass: 1.93.3 - sass-embedded: 1.93.3 - terser: 5.46.0 - yaml: 2.8.0 - - vite@8.0.0-beta.14(@types/node@22.17.0)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): - dependencies: - '@oxc-project/runtime': 0.113.0 - fdir: 6.5.0(picomatch@4.0.3) - lightningcss: 1.31.1 - picomatch: 4.0.3 - postcss: 8.5.6 - rolldown: 1.0.0-rc.4 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.17.0 - fsevents: 2.3.3 - jiti: 1.21.7 - sass: 1.93.3 - sass-embedded: 1.93.3 - terser: 5.46.0 - yaml: 2.8.0 - - vite@8.0.0-beta.14(@types/node@25.0.3)(esbuild@0.24.2)(jiti@1.21.7)(sass-embedded@1.93.3)(sass@1.93.3)(terser@5.46.0)(yaml@2.8.0): - dependencies: - '@oxc-project/runtime': 0.113.0 - fdir: 6.5.0(picomatch@4.0.3) - lightningcss: 1.31.1 - picomatch: 4.0.3 - postcss: 8.5.6 - rolldown: 1.0.0-rc.4 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.0.3 - esbuild: 0.24.2 + esbuild: 0.27.3 fsevents: 2.3.3 jiti: 1.21.7 sass: 1.93.3 From ad0012941150a4b6e311386c3da0c8d6498f336d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 15 Feb 2026 02:55:43 +0100 Subject: [PATCH 10/74] pl-api: migrate to oxfmt+oxlint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .husky/pre-commit | 3 +- packages/pl-api/.eslintignore | 7 - packages/pl-api/.eslintrc.json | 215 -- packages/pl-api/.oxfmtrc.json | 11 + packages/pl-api/.oxlintrc.json | 60 + packages/pl-api/README.md | 5 +- packages/pl-api/lib/client.ts | 2338 +++++++++++------ packages/pl-api/lib/directory-client.ts | 7 +- .../pl-api/lib/entities/account-warning.ts | 12 +- packages/pl-api/lib/entities/account.ts | 222 +- packages/pl-api/lib/entities/admin/account.ts | 17 +- .../entities/admin/canonical-email-block.ts | 5 +- packages/pl-api/lib/entities/admin/cohort.ts | 17 +- .../pl-api/lib/entities/admin/dimension.ts | 21 +- .../pl-api/lib/entities/admin/domain-allow.ts | 5 +- .../pl-api/lib/entities/admin/domain-block.ts | 5 +- packages/pl-api/lib/entities/admin/domain.ts | 2 +- .../lib/entities/admin/email-domain-block.ts | 17 +- .../pl-api/lib/entities/admin/ip-block.ts | 5 +- packages/pl-api/lib/entities/admin/ip.ts | 5 +- packages/pl-api/lib/entities/admin/measure.ts | 15 +- .../entities/admin/moderation-log-entry.ts | 2 +- .../lib/entities/admin/pleroma-config.ts | 14 +- packages/pl-api/lib/entities/admin/relay.ts | 2 +- packages/pl-api/lib/entities/admin/report.ts | 10 +- packages/pl-api/lib/entities/admin/tag.ts | 5 +- packages/pl-api/lib/entities/announcement.ts | 10 +- packages/pl-api/lib/entities/antenna.ts | 2 +- packages/pl-api/lib/entities/application.ts | 42 +- .../pl-api/lib/entities/bookmark-folder.ts | 22 +- packages/pl-api/lib/entities/drive-file.ts | 40 +- packages/pl-api/lib/entities/drive-folder.ts | 28 +- packages/pl-api/lib/entities/drive-status.ts | 22 +- .../pl-api/lib/entities/emoji-reaction.ts | 18 +- .../pl-api/lib/entities/familiar-followers.ts | 2 +- packages/pl-api/lib/entities/filter.ts | 12 +- packages/pl-api/lib/entities/group-member.ts | 41 +- packages/pl-api/lib/entities/group.ts | 113 +- .../entities/grouped-notifications-results.ts | 34 +- packages/pl-api/lib/entities/instance.ts | 188 +- .../pl-api/lib/entities/interaction-policy.ts | 19 +- packages/pl-api/lib/entities/item.ts | 53 +- packages/pl-api/lib/entities/location.ts | 13 +- packages/pl-api/lib/entities/marker.ts | 19 +- .../pl-api/lib/entities/media-attachment.ts | 121 +- packages/pl-api/lib/entities/notification.ts | 47 +- packages/pl-api/lib/entities/quote.ts | 12 +- packages/pl-api/lib/entities/review.ts | 5 +- packages/pl-api/lib/entities/role.ts | 5 +- packages/pl-api/lib/entities/rule.ts | 14 +- .../pl-api/lib/entities/scheduled-status.ts | 17 +- packages/pl-api/lib/entities/scrobble.ts | 12 +- packages/pl-api/lib/entities/status-edit.ts | 17 +- packages/pl-api/lib/entities/status.ts | 116 +- .../lib/entities/story-carousel-item.ts | 38 +- packages/pl-api/lib/entities/story-media.ts | 22 +- .../pl-api/lib/entities/streaming-event.ts | 90 +- .../lib/entities/subscription-details.ts | 5 +- .../lib/entities/subscription-invoice.ts | 16 +- .../lib/entities/subscription-option.ts | 5 +- packages/pl-api/lib/entities/suggestion.ts | 19 +- packages/pl-api/lib/entities/tag.ts | 18 +- packages/pl-api/lib/entities/translation.ts | 25 +- packages/pl-api/lib/entities/utils.ts | 22 +- packages/pl-api/lib/features.ts | 236 +- packages/pl-api/lib/main.ts | 2 +- packages/pl-api/lib/params/accounts.ts | 14 +- packages/pl-api/lib/params/admin.ts | 30 +- packages/pl-api/lib/params/antennas.ts | 5 +- packages/pl-api/lib/params/apps.ts | 4 +- packages/pl-api/lib/params/chats.ts | 22 +- packages/pl-api/lib/params/circles.ts | 5 +- packages/pl-api/lib/params/instance.ts | 4 +- .../pl-api/lib/params/interaction-requests.ts | 4 +- packages/pl-api/lib/params/lists.ts | 10 +- packages/pl-api/lib/params/media.ts | 5 +- packages/pl-api/lib/params/oauth.ts | 7 +- .../pl-api/lib/params/scheduled-statuses.ts | 4 +- packages/pl-api/lib/params/search.ts | 4 +- packages/pl-api/lib/params/settings.ts | 36 +- packages/pl-api/lib/params/statuses.ts | 18 +- packages/pl-api/lib/params/stories.ts | 10 +- packages/pl-api/lib/params/timelines.ts | 26 +- packages/pl-api/lib/params/trends.ts | 6 +- packages/pl-api/lib/request.ts | 60 +- packages/pl-api/lib/responses.ts | 4 +- packages/pl-api/lib/utils/accounts.ts | 17 +- packages/pl-api/lib/utils/domain.ts | 3 +- packages/pl-api/lib/utils/url.ts | 12 +- packages/pl-api/package.json | 63 +- pnpm-lock.yaml | 372 +-- 91 files changed, 3167 insertions(+), 2147 deletions(-) delete mode 100644 packages/pl-api/.eslintignore delete mode 100644 packages/pl-api/.eslintrc.json create mode 100644 packages/pl-api/.oxfmtrc.json create mode 100644 packages/pl-api/.oxlintrc.json diff --git a/.husky/pre-commit b/.husky/pre-commit index b3d4e050d..143e52c17 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,5 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -cd packages/pl-fe && pnpm precommit && cd - \ No newline at end of file +cd packages/pl-api && pnpm precommit && cd - +cd packages/pl-fe && pnpm precommit && cd - diff --git a/packages/pl-api/.eslintignore b/packages/pl-api/.eslintignore deleted file mode 100644 index 256b5ff45..000000000 --- a/packages/pl-api/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -/node_modules/** -/dist/** -/static/** -/public/** -/tmp/** -/coverage/** -/custom/** diff --git a/packages/pl-api/.eslintrc.json b/packages/pl-api/.eslintrc.json deleted file mode 100644 index d3d44b71f..000000000 --- a/packages/pl-api/.eslintrc.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "root": true, - "extends": [ - "eslint:recommended", - "plugin:import/typescript", - "plugin:compat/recommended" - ], - "env": { - "browser": true, - "node": true, - "es6": true, - "jest": true - }, - "globals": { - "ATTACHMENT_HOST": false - }, - "plugins": [ - "@stylistic", - "import", - "promise", - "@typescript-eslint" - ], - "parserOptions": { - "sourceType": "module", - "ecmaFeatures": { - "experimentalObjectRestSpread": true - }, - "ecmaVersion": 2018 - }, - "settings": { - "import/extensions": [ - ".js", - ".cjs", - ".mjs", - ".ts" - ], - "import/ignore": [ - "node_modules", - "\\.(css|scss|json)$" - ], - "import/resolver": { - "typescript": true, - "node": true - }, - "polyfills": [ - "es:all", - "fetch", - "IntersectionObserver", - "Promise", - "ResizeObserver", - "URL", - "URLSearchParams" - ] - }, - "rules": { - "brace-style": "error", - "comma-dangle": [ - "error", - "always-multiline" - ], - "comma-spacing": [ - "warn", - { - "before": false, - "after": true - } - ], - "comma-style": [ - "warn", - "last" - ], - "import/no-duplicates": "error", - "space-before-function-paren": [ - "error", - "never" - ], - "space-infix-ops": "error", - "space-in-parens": [ - "error", - "never" - ], - "keyword-spacing": "error", - "dot-notation": "error", - "eqeqeq": "error", - "indent": [ - "error", - 2, - { - "SwitchCase": 1, - "ignoredNodes": [ - "TemplateLiteral" - ] - } - ], - "key-spacing": [ - "error", - { - "mode": "minimum" - } - ], - "no-catch-shadow": "error", - "no-cond-assign": "error", - "no-console": [ - "warn", - { - "allow": [ - "error", - "warn" - ] - } - ], - "no-extra-semi": "error", - "no-const-assign": "error", - "no-fallthrough": "error", - "no-irregular-whitespace": "error", - "no-loop-func": "error", - "no-mixed-spaces-and-tabs": "error", - "no-nested-ternary": "warn", - "no-trailing-spaces": "error", - "no-undef": "error", - "no-unreachable": "error", - "no-unused-expressions": "error", - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "vars": "all", - "args": "none", - "ignoreRestSiblings": true, - "caughtErrors": "none", - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_" - } - ], - "no-useless-escape": "warn", - "no-var": "error", - "object-curly-spacing": [ - "error", - "always" - ], - "padded-blocks": [ - "error", - { - "classes": "always" - } - ], - "prefer-const": "error", - "quotes": [ - "error", - "single" - ], - "semi": "error", - "space-unary-ops": [ - "error", - { - "words": true, - "nonwords": false - } - ], - "strict": "off", - "valid-typeof": "error", - "import/extensions": [ - "error", - "always", - { - "js": "never", - "mjs": "ignorePackages", - "ts": "never" - } - ], - "import/newline-after-import": "error", - "import/no-extraneous-dependencies": "error", - "import/no-unresolved": "error", - "import/no-webpack-loader-syntax": "error", - "import/order": [ - "error", - { - "groups": [ - "builtin", - "external", - "internal", - "parent", - "sibling", - "index", - "object", - "type" - ], - "newlines-between": "always", - "alphabetize": { - "order": "asc" - } - } - ], - "@stylistic/member-delimiter-style": "error", - "promise/catch-or-return": "error", - "sort-imports": [ - "error", - { - "ignoreCase": true, - "ignoreDeclarationSort": true - } - ], - "eol-last": "error" - }, - "overrides": [ - { - "files": ["**/*.ts"], - "rules": { - "no-undef": "off", - "space-before-function-paren": "off" - }, - "parser": "@typescript-eslint/parser" - } - ] -} diff --git a/packages/pl-api/.oxfmtrc.json b/packages/pl-api/.oxfmtrc.json new file mode 100644 index 000000000..f3af56790 --- /dev/null +++ b/packages/pl-api/.oxfmtrc.json @@ -0,0 +1,11 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "ignorePatterns": [], + "printWidth": null, + "singleQuote": true, + "arrowParens": null, + "experimentalSortImports": { + "groups": ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type"] + }, + "tabWidth": 2 +} diff --git a/packages/pl-api/.oxlintrc.json b/packages/pl-api/.oxlintrc.json new file mode 100644 index 000000000..ad54a5067 --- /dev/null +++ b/packages/pl-api/.oxlintrc.json @@ -0,0 +1,60 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import", "promise"], + "categories": { + "correctness": "error", + "suspicious": "error", + "pedantic": "warn" + }, + "rules": { + "max-dependencies": "off", + "max-lines": "off", + "max-lines-per-function": "off", + "no-inline-comments": "off", + "no-unused-vars": [ + "error", + { + "vars": "all", + "args": "none", + "ignoreRestSiblings": true, + "caughtErrors": "none", + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ] + }, + "settings": { + "jsx-a11y": { + "polymorphicPropName": null, + "components": {}, + "attributes": {} + }, + "next": { + "rootDir": [] + }, + "react": { + "formComponents": [], + "linkComponents": [], + "version": null, + "componentWrapperFunctions": [] + }, + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + } + }, + "env": { + "builtin": true, + "browser": true, + "node": true, + "es6": true + }, + "globals": {}, + "ignorePatterns": [] +} diff --git a/packages/pl-api/README.md b/packages/pl-api/README.md index 0c5e3e4ab..db28bdfb9 100644 --- a/packages/pl-api/README.md +++ b/packages/pl-api/README.md @@ -9,6 +9,7 @@ A JavaScript library for interacting with Mastodon API-compatible servers, focus `pl-api` attempts to abstract out the implementation details when supporting different backends, implementing the same features in different ways. It uses [Valibot](https://valibot.dev/) to ensure type safety and normalize API responses. Example: + ```ts import { PlApiClient, type CreateApplicationParams } from 'pl-api'; @@ -37,8 +38,8 @@ For unsupported projects, it falls back to a basic feature set, though every met ## Projects using `pl-api` -* [Nicolium](https://codeberg.org/mkljczk/nicolium/src/branch/develop/packages/pl-fe) is a web client for Mastodon-compatible servers forked from Soapbox. It uses `pl-api` for API interactions. -* [`pl-hooks`](https://codeberg.org/mkljczk/nicolium/src/branch/develop/packages/pl-hooks) is a work-in-progress library utilizing `pl-api`. +- [Nicolium](https://codeberg.org/mkljczk/nicolium/src/branch/develop/packages/pl-fe) is a web client for Mastodon-compatible servers forked from Soapbox. It uses `pl-api` for API interactions. +- [`pl-hooks`](https://codeberg.org/mkljczk/nicolium/src/branch/develop/packages/pl-hooks) is a work-in-progress library utilizing `pl-api`. If you are using `pl-api` in your project, please open a pull request with a link to the project. diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index 5cbca163e..b2276cdce 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -97,8 +97,23 @@ import { webPushSubscriptionSchema, } from './entities'; import { coerceObject, filteredArray } from './entities/utils'; -import { AKKOMA, type Features, getFeatures, GOTOSOCIAL, ICESHRIMP_NET, MITRA, PIXELFED, PLEROMA } from './features'; -import request, { getAsyncRefreshHeader, getNextLink, getPrevLink, type RequestBody, type RequestMeta } from './request'; +import { + AKKOMA, + type Features, + getFeatures, + GOTOSOCIAL, + ICESHRIMP_NET, + MITRA, + PIXELFED, + PLEROMA, +} from './features'; +import request, { + getAsyncRefreshHeader, + getNextLink, + getPrevLink, + type RequestBody, + type RequestMeta, +} from './request'; import { buildFullPath } from './utils/url'; import type { @@ -191,7 +206,10 @@ import type { MuteAccountParams, UpdateFilterParams, } from './params/filtering'; -import type { GetGroupedNotificationsParams, GetUnreadNotificationGroupCountParams } from './params/grouped-notifications'; +import type { + GetGroupedNotificationsParams, + GetUnreadNotificationGroupCountParams, +} from './params/grouped-notifications'; import type { CreateGroupParams, GetGroupBlocksParams, @@ -200,18 +218,9 @@ import type { UpdateGroupParams, } from './params/groups'; import type { ProfileDirectoryParams } from './params/instance'; -import type { - GetInteractionRequestsParams, -} from './params/interaction-requests'; -import type { - CreateListParams, - GetListAccountsParams, - UpdateListParams, -} from './params/lists'; -import type { - UpdateMediaParams, - UploadMediaParams, -} from './params/media'; +import type { GetInteractionRequestsParams } from './params/interaction-requests'; +import type { CreateListParams, GetListAccountsParams, UpdateListParams } from './params/lists'; +import type { UpdateMediaParams, UploadMediaParams } from './params/media'; import type { CreateBookmarkFolderParams, GetBookmarksParams, @@ -258,7 +267,12 @@ import type { GetStatusQuotesParams, GetStatusReferencesParams, } from './params/statuses'; -import type { CreateStoryParams, CreateStoryPollParams, CropStoryPhotoParams, StoryReportType } from './params/stories'; +import type { + CreateStoryParams, + CreateStoryPollParams, + CropStoryPhotoParams, + StoryReportType, +} from './params/stories'; import type { AntennaTimelineParams, BubbleTimelineParams, @@ -272,14 +286,19 @@ import type { SaveMarkersParams, WrenchedTimelineParams, } from './params/timelines'; -import type { - GetTrendingLinks, - GetTrendingStatuses, - GetTrendingTags, -} from './params/trends'; +import type { GetTrendingLinks, GetTrendingStatuses, GetTrendingTags } from './params/trends'; import type { PaginatedResponse } from './responses'; -const GROUPED_TYPES = ['favourite', 'reblog', 'emoji_reaction', 'event_reminder', 'participation_accepted', 'participation_request']; +const GROUPED_TYPES = [ + 'favourite', + 'reblog', + 'emoji_reaction', + 'event_reminder', + 'participation_accepted', + 'participation_request', +]; + +type EmptyObject = Record; interface PlApiClientConstructorOpts { /** Instance object to use by default, to be populated eg. from cache */ @@ -301,7 +320,6 @@ interface PlApiClientConstructorOpts { * @category Clients */ class PlApiClient { - baseURL: string; #accessToken?: string; #iceshrimpAccessToken?: string; @@ -326,14 +344,18 @@ class PlApiClient { * @param baseURL Mastodon API-compatible server URL * @param accessToken OAuth token for an authorized user */ - constructor(baseURL: string, accessToken?: string, { - instance, - fetchInstance, - fetchInstanceSignal, - onInstanceFetchSuccess, - onInstanceFetchError, - customAuthorizationToken, - }: PlApiClientConstructorOpts = {}) { + constructor( + baseURL: string, + accessToken?: string, + { + instance, + fetchInstance, + fetchInstanceSignal, + onInstanceFetchSuccess, + onInstanceFetchError, + customAuthorizationToken, + }: PlApiClientConstructorOpts = {}, + ) { this.baseURL = baseURL; this.#accessToken = accessToken; this.#customAuthorizationToken = customAuthorizationToken; @@ -342,27 +364,37 @@ class PlApiClient { this.#setInstance(instance); } if (fetchInstance) { - this.instance.getInstance().then((instance) => { - if (fetchInstanceSignal?.aborted) return; - onInstanceFetchSuccess?.(instance); - }).catch((error) => { - if (fetchInstanceSignal?.aborted) return; - onInstanceFetchError?.(error); - }); + this.instance + .getInstance() + .then((instance) => { + if (fetchInstanceSignal?.aborted) return; + return onInstanceFetchSuccess?.(instance); + }) + .catch((error) => { + if (fetchInstanceSignal?.aborted) return; + onInstanceFetchError?.(error); + }); } } - #paginatedGet = async (input: URL | RequestInfo, body: RequestBody, schema: v.BaseSchema>, isArray = true as IsArray): Promise> => { + #paginatedGet = async ( + input: URL | RequestInfo, + body: RequestBody, + schema: v.BaseSchema>, + isArray = true as IsArray, + ): Promise> => { const targetSchema = isArray ? filteredArray(schema) : schema; - const processResponse = (response: PlApiResponse) => ({ - previous: getMore(getPrevLink(response)), - next: getMore(getNextLink(response)), - items: v.parse(targetSchema, response.json), - partial: response.status === 206, - } as PaginatedResponse); + const processResponse = (response: PlApiResponse) => + ({ + previous: getMore(getPrevLink(response)), + next: getMore(getNextLink(response)), + items: v.parse(targetSchema, response.json), + partial: response.status === 206, + }) as PaginatedResponse; - const getMore = (input: string | null) => input ? () => this.request(input).then(processResponse) : null; + const getMore = (input: string | null) => + input ? () => this.request(input).then(processResponse) : null; const response = await this.request(input, body); @@ -387,10 +419,14 @@ class PlApiClient { // adminAccounts.forEach((adminAccount) => adminAccount.account = accounts.find(({ id }) => id === adminAccount.id) || null); return { - previous: !params.page ? null : () => this.#paginatedPleromaAccounts({ ...params, page: params.page! - 1 }), - next: response.json?.count > (params.page_size * ((params.page || 1) - 1) + response.json?.users?.length) - ? () => this.#paginatedPleromaAccounts({ ...params, page: (params.page || 0) + 1 }) + previous: params.page + ? () => this.#paginatedPleromaAccounts({ ...params, page: params.page! - 1 }) : null, + next: + response.json?.count > + params.page_size * ((params.page || 1) - 1) + response.json?.users?.length + ? () => this.#paginatedPleromaAccounts({ ...params, page: (params.page || 0) + 1 }) + : null, items: adminAccounts, partial: response.status === 206, total: response.json?.count, @@ -406,10 +442,14 @@ class PlApiClient { const response = await this.request('/api/v1/pleroma/admin/reports', { params }); return { - previous: !params.page ? null : () => this.#paginatedPleromaReports({ ...params, page: params.page! - 1 }), - next: response.json?.total > (params.page_size * ((params.page || 1) - 1) + response.json?.reports?.length) - ? () => this.#paginatedPleromaReports({ ...params, page: (params.page || 0) + 1 }) + previous: params.page + ? () => this.#paginatedPleromaReports({ ...params, page: params.page! - 1 }) : null, + next: + response.json?.total > + params.page_size * ((params.page || 1) - 1) + response.json?.reports?.length + ? () => this.#paginatedPleromaReports({ ...params, page: (params.page || 0) + 1 }) + : null, items: v.parse(filteredArray(adminReportSchema), response.json?.reports), partial: response.status === 206, total: response.json?.total, @@ -426,7 +466,9 @@ class PlApiClient { const response = await this.request('/api/v1/pleroma/admin/statuses', { params }); return { - previous: !params.page ? null : () => this.#paginatedPleromaStatuses({ ...params, page: params.page! - 1 }), + previous: params.page + ? () => this.#paginatedPleromaStatuses({ ...params, page: params.page! - 1 }) + : null, next: response.json?.length ? () => this.#paginatedPleromaStatuses({ ...params, page: (params.page || 0) + 1 }) : null, @@ -435,10 +477,13 @@ class PlApiClient { }; }; - #paginatedIceshrimpAccountsList = async (url: string, fn: (body: T) => Array): Promise> => { + #paginatedIceshrimpAccountsList = async ( + url: string, + fn: (body: T) => Array, + ): Promise> => { await this.#getIceshrimpAccessToken(); - const response = (await this.request(url)); + const response = await this.request(url); const ids = fn(response.json); const accounts = await this.accounts.getAccounts(ids); @@ -454,19 +499,24 @@ class PlApiClient { }; }; - #groupNotifications = ({ previous, next, items, ...response }: PaginatedResponse, params?: GetGroupedNotificationsParams): PaginatedResponse => { + #groupNotifications = ( + { previous, next, items, ...response }: PaginatedResponse, + params?: GetGroupedNotificationsParams, + ): PaginatedResponse => { const notificationGroups: Array = []; for (const notification of items) { let existingGroup: NotificationGroup | undefined; if ((params?.grouped_types || GROUPED_TYPES).includes(notification.type)) { - existingGroup = notificationGroups - .find(notificationGroup => - notificationGroup.type === notification.type - && ((notification.type === 'emoji_reaction' && notificationGroup.type === 'emoji_reaction') ? notification.emoji === notificationGroup.emoji : true) - // @ts-ignore - && notificationGroup.status_id === notification.status?.id, - ); + existingGroup = notificationGroups.find( + (notificationGroup) => + notificationGroup.type === notification.type && + (notification.type === 'emoji_reaction' && notificationGroup.type === 'emoji_reaction' + ? notification.emoji === notificationGroup.emoji + : true) && + // @ts-expect-error used optional chaining + notificationGroup.status_id === notification.status?.id, + ); } if (existingGroup) { @@ -475,7 +525,7 @@ class PlApiClient { existingGroup.sample_account_ids.push(notification.account.id); } else { notificationGroups.push({ - ...(omit(notification, ['account', 'status', 'target'])), + ...omit(notification, ['account', 'status', 'target']), group_key: notification.id, notifications_count: 1, most_recent_notification_id: notification.id, @@ -483,25 +533,30 @@ class PlApiClient { page_max_id: notification.id, latest_page_notification_at: notification.created_at, sample_account_ids: [notification.account.id], - // @ts-ignore + // @ts-expect-error used optional chaining status_id: notification.status?.id, - // @ts-ignore + // @ts-expect-error used optional chaining target_id: notification.target?.id, }); } } const groupedNotificationsResults: GroupedNotificationsResults = { - accounts: Object.values(items.reduce>((accounts, notification) => { - accounts[notification.account.id] = notification.account; - if ('target' in notification) accounts[notification.target.id] = notification.target; + accounts: Object.values( + items.reduce>((accounts, notification) => { + accounts[notification.account.id] = notification.account; + if ('target' in notification) accounts[notification.target.id] = notification.target; - return accounts; - }, {})), - statuses: Object.values(items.reduce>((statuses, notification) => { - if ('status' in notification && notification.status) statuses[notification.status.id] = notification.status; - return statuses; - }, {})), + return accounts; + }, {}), + ), + statuses: Object.values( + items.reduce>((statuses, notification) => { + if ('status' in notification && notification.status) + statuses[notification.status.id] = notification.status; + return statuses; + }, {}), + ), notification_groups: notificationGroups, }; @@ -557,35 +612,39 @@ class PlApiClient { */ getToken: async (params: GetTokenParams) => { if (this.features.version.software === ICESHRIMP_NET && params.grant_type === 'password') { - const loginResponse = (await this.request<{ - token: string; - }>('/api/iceshrimp/auth/login', { - method: 'POST', - body: { - username: params.username, - password: params.password, - }, - })).json; + const loginResponse = ( + await this.request<{ + token: string; + }>('/api/iceshrimp/auth/login', { + method: 'POST', + body: { + username: params.username, + password: params.password, + }, + }) + ).json; this.#iceshrimpAccessToken = loginResponse.token; - const mastodonTokenResponse = (await this.request<{ - id: string; - token: string; - created_at: string; - scopes: Array; - }>('/api/iceshrimp/sessions/mastodon', { - method: 'POST', - body: { - appName: params.client_id, - scopes: params.scope?.split(' '), - flags: { - supportsHtmlFormatting: true, - autoDetectQuotes: false, - isPleroma: true, - supportsInlineMedia: true, + const mastodonTokenResponse = ( + await this.request<{ + id: string; + token: string; + created_at: string; + scopes: Array; + }>('/api/iceshrimp/sessions/mastodon', { + method: 'POST', + body: { + appName: params.client_id, + scopes: params.scope?.split(' '), + flags: { + supportsHtmlFormatting: true, + autoDetectQuotes: false, + isPleroma: true, + supportsInlineMedia: true, + }, }, - }, - })).json; + }) + ).json; return v.parse(tokenSchema, { access_token: mastodonTokenResponse.token, @@ -594,11 +653,14 @@ class PlApiClient { created_at: new Date(mastodonTokenResponse.created_at).getTime(), id: mastodonTokenResponse.id, }); - } else { - const response = await this.request('/oauth/token', { method: 'POST', body: params, contentType: '' }); - - return v.parse(tokenSchema, { scope: params.scope || '', ...response.json }); } + const response = await this.request('/oauth/token', { + method: 'POST', + body: params, + contentType: '', + }); + + return v.parse(tokenSchema, { scope: params.scope || '', ...response.json }); }, /** @@ -607,11 +669,15 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/oauth/#revoke} */ revokeToken: async (params: RevokeTokenParams) => { - const response = await this.request('/oauth/revoke', { method: 'POST', body: params, contentType: '' }); + const response = await this.request('/oauth/revoke', { + method: 'POST', + body: params, + contentType: '', + }); this.#socket?.close(); - return response.json as {}; + return response.json; }, /** @@ -634,13 +700,19 @@ class PlApiClient { /** * Get a new captcha * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#apiv1pleromacaptcha} - */ + */ getCaptcha: async () => { const response = await this.request('/api/pleroma/captcha'); - return v.parse(v.intersect([v.object({ - type: v.string(), - }), v.record(v.string(), v.any())]), response.json); + return v.parse( + v.intersect([ + v.object({ + type: v.string(), + }), + v.record(v.string(), v.any()), + ]), + response.json, + ); }, mfaChallenge: async (params: MfaChallengeParams) => { @@ -652,9 +724,12 @@ class PlApiClient { public readonly emails = { resendConfirmationEmail: async (email: string) => { - const response = await this.request('/api/v1/emails/confirmations', { method: 'POST', body: { email } }); + const response = await this.request('/api/v1/emails/confirmations', { + method: 'POST', + body: { email }, + }); - return response.json as {}; + return response.json; }, }; @@ -688,7 +763,7 @@ class PlApiClient { * Statuses posted to the given account. * @see {@link https://docs.joinmastodon.org/methods/accounts/#statuses} */ - getAccountStatuses: async (accountId: string, params?: GetAccountStatusesParams) => + getAccountStatuses: (accountId: string, params?: GetAccountStatusesParams) => this.#paginatedGet(`/api/v1/accounts/${accountId}/statuses`, { params }, statusSchema), /** @@ -696,7 +771,7 @@ class PlApiClient { * Accounts which follow the given account, if network is not hidden by the account owner. * @see {@link https://docs.joinmastodon.org/methods/accounts/#followers} */ - getAccountFollowers: async (accountId: string, params?: GetAccountFollowersParams) => + getAccountFollowers: (accountId: string, params?: GetAccountFollowersParams) => this.#paginatedGet(`/api/v1/accounts/${accountId}/followers`, { params }, accountSchema), /** @@ -704,7 +779,7 @@ class PlApiClient { * Accounts which the given account is following, if network is not hidden by the account owner. * @see {@link https://docs.joinmastodon.org/methods/accounts/#following} */ - getAccountFollowing: async (accountId: string, params?: GetAccountFollowingParams) => + getAccountFollowing: (accountId: string, params?: GetAccountFollowingParams) => this.#paginatedGet(`/api/v1/accounts/${accountId}/following`, { params }, accountSchema), /** @@ -712,7 +787,7 @@ class PlApiClient { * * Requires features{@link Features.subscriptions}. */ - getAccountSubscribers: async (accountId: string, params?: GetAccountSubscribersParams) => + getAccountSubscribers: (accountId: string, params?: GetAccountSubscribersParams) => this.#paginatedGet(`/api/v1/accounts/${accountId}/subscribers`, { params }, accountSchema), /** @@ -777,7 +852,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#follow} */ followAccount: async (accountId: string, params?: FollowAccountParams) => { - const response = await this.request(`/api/v1/accounts/${accountId}/follow`, { method: 'POST', body: params }); + const response = await this.request(`/api/v1/accounts/${accountId}/follow`, { + method: 'POST', + body: params, + }); return v.parse(relationshipSchema, response.json); }, @@ -788,7 +866,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#unfollow} */ unfollowAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/unfollow`, { method: 'POST' }); + const response = await this.request(`/api/v1/accounts/${accountId}/unfollow`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -799,7 +879,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#remove_from_followers} */ removeAccountFromFollowers: async (accountId: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/remove_from_followers`, { method: 'POST' }); + const response = await this.request(`/api/v1/accounts/${accountId}/remove_from_followers`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -821,7 +903,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#unpin} */ unpinAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/unpin`, { method: 'POST' }); + const response = await this.request(`/api/v1/accounts/${accountId}/unpin`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -832,7 +916,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#note} */ updateAccountNote: async (accountId: string, comment: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/note`, { method: 'POST', body: { comment } }); + const response = await this.request(`/api/v1/accounts/${accountId}/note`, { + method: 'POST', + body: { comment }, + }); return v.parse(relationshipSchema, response.json); }, @@ -843,7 +930,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#relationships} */ getRelationships: async (accountIds: string[], params?: GetRelationshipsParams) => { - const response = await this.request('/api/v1/accounts/relationships', { params: { ...params, id: accountIds } }); + const response = await this.request('/api/v1/accounts/relationships', { + params: { ...params, id: accountIds }, + }); return v.parse(filteredArray(relationshipSchema), response.json); }, @@ -868,7 +957,9 @@ class PlApiClient { }); } } else { - response = (await this.request('/api/v1/accounts/familiar_followers', { params: { id: accountIds } })).json; + response = ( + await this.request('/api/v1/accounts/familiar_followers', { params: { id: accountIds } }) + ).json; } return v.parse(filteredArray(familiarFollowersSchema), response); @@ -880,7 +971,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#search} */ searchAccounts: async (q: string, params?: SearchAccountParams, meta?: RequestMeta) => { - const response = await this.request('/api/v1/accounts/search', { ...meta, params: { ...params, q } }); + const response = await this.request('/api/v1/accounts/search', { + ...meta, + params: { ...params, q }, + }); return v.parse(filteredArray(accountSchema), response.json); }, @@ -919,7 +1013,7 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#apiv1pleromaaccountsidendorsements} * @see {@link https://docs.joinmastodon.org/methods/accounts/endorsements} */ - getAccountEndorsements: async (accountId: string, params?: GetAccountEndorsementsParams) => + getAccountEndorsements: (accountId: string, params?: GetAccountEndorsementsParams) => this.#paginatedGet( `/api/v1/${[PLEROMA].includes(this.features.version.software as string) ? 'pleroma/' : ''}accounts/${accountId}/endorsements`, { params }, @@ -944,8 +1038,12 @@ class PlApiClient { * Requires features{@link Features.publicFavourites}. * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#apiv1pleromaaccountsidfavourites} */ - getAccountFavourites: async (accountId: string, params?: GetAccountFavouritesParams) => - this.#paginatedGet(`/api/v1/pleroma/accounts/${accountId}/favourites`, { params }, statusSchema), + getAccountFavourites: (accountId: string, params?: GetAccountFavouritesParams) => + this.#paginatedGet( + `/api/v1/pleroma/accounts/${accountId}/favourites`, + { params }, + statusSchema, + ), /** * Interact with profile or status from remote account @@ -956,13 +1054,19 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#apiv1pleromaremote_interaction} */ remoteInteraction: async (ap_id: string, profile: string) => { - const response = await this.request('/api/v1/pleroma/remote_interaction', { method: 'POST', body: { ap_id, profile } }); + const response = await this.request('/api/v1/pleroma/remote_interaction', { + method: 'POST', + body: { ap_id, profile }, + }); if (response.json?.error) throw response.json.error; - return v.parse(v.object({ - url: v.string(), - }), response.json); + return v.parse( + v.object({ + url: v.string(), + }), + response.json, + ); }, /** @@ -975,14 +1079,20 @@ class PlApiClient { let response; switch (this.features.version.software) { case ICESHRIMP_NET: - response = await this.request('/api/v1/bite', { method: 'POST', body: accountId }); + response = await this.request('/api/v1/bite', { + method: 'POST', + body: accountId, + }); break; default: - response = await this.request('/api/v1/bite', { method: 'POST', params: { id: accountId } }); + response = await this.request('/api/v1/bite', { + method: 'POST', + params: { id: accountId }, + }); break; } - return response.json as {}; + return response.json; }, /** @@ -991,8 +1101,12 @@ class PlApiClient { * Requires features{@link Features.scrobbles} * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#get-apiv1pleromaaccountsidscrobbles} */ - getScrobbles: async (accountId: string, params?: GetScrobblesParams) => - this.#paginatedGet(`/api/v1/pleroma/accounts/${accountId}/scrobbles`, { params }, scrobbleSchema), + getScrobbles: (accountId: string, params?: GetScrobblesParams) => + this.#paginatedGet( + `/api/v1/pleroma/accounts/${accountId}/scrobbles`, + { params }, + scrobbleSchema, + ), /** * Creates a new Listen activity for an account @@ -1014,7 +1128,10 @@ class PlApiClient { * Requires features{@link Features.loadActivities} */ loadActivities: async (accountId: string) => { - const response = await this.request<{}>(`/api/v1/accounts/${accountId}/load_activities`, { method: 'POST' }); + const response = await this.request( + `/api/v1/accounts/${accountId}/load_activities`, + { method: 'POST' }, + ); return response.json; }, @@ -1026,7 +1143,7 @@ class PlApiClient { * Statuses the user has bookmarked. * @see {@link https://docs.joinmastodon.org/methods/bookmarks/#get} */ - getBookmarks: async (params?: GetBookmarksParams) => + getBookmarks: (params?: GetBookmarksParams) => this.#paginatedGet( this.features.bookmarkFoldersMultiple && params?.folder_id ? `/api/v1/bookmark_categories/${params.folder_id}/statuses` @@ -1040,14 +1157,14 @@ class PlApiClient { * Statuses the user has favourited. * @see {@link https://docs.joinmastodon.org/methods/favourites/#get} */ - getFavourites: async (params?: GetFavouritesParams) => + getFavourites: (params?: GetFavouritesParams) => this.#paginatedGet('/api/v1/favourites', { params }, statusSchema), /** * View pending follow requests * @see {@link https://docs.joinmastodon.org/methods/follow_requests/#get} */ - getFollowRequests: async (params?: GetFollowRequestsParams) => + getFollowRequests: (params?: GetFollowRequestsParams) => this.#paginatedGet('/api/v1/follow_requests', { params }, accountSchema), /** @@ -1055,11 +1172,11 @@ class PlApiClient { * * Requires features{@link Features.outgoingFollowRequests}. */ - getOutgoingFollowRequests: async (params?: GetFollowRequestsParams) => { + getOutgoingFollowRequests: (params?: GetFollowRequestsParams) => { if (this.features.version.software === ICESHRIMP_NET) { return this.#paginatedIceshrimpAccountsList( '/api/iceshrimp/follow_requests/outgoing', - (response: Array<{ user: {id: string } }>) => response.map(({ user }) => user.id), + (response: Array<{ user: { id: string } }>) => response.map(({ user }) => user.id), ); } @@ -1068,7 +1185,11 @@ class PlApiClient { return this.#paginatedGet('/api/v1/follow_requests/outgoing', { params }, accountSchema); default: - return this.#paginatedGet('/api/v1/pleroma/outgoing_follow_requests', { params }, accountSchema); + return this.#paginatedGet( + '/api/v1/pleroma/outgoing_follow_requests', + { params }, + accountSchema, + ); } }, @@ -1077,7 +1198,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/follow_requests/#accept} */ acceptFollowRequest: async (accountId: string) => { - const response = await this.request(`/api/v1/follow_requests/${accountId}/authorize`, { method: 'POST' }); + const response = await this.request(`/api/v1/follow_requests/${accountId}/authorize`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -1087,7 +1210,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/follow_requests/#reject} */ rejectFollowRequest: async (accountId: string) => { - const response = await this.request(`/api/v1/follow_requests/${accountId}/reject`, { method: 'POST' }); + const response = await this.request(`/api/v1/follow_requests/${accountId}/reject`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -1097,7 +1222,7 @@ class PlApiClient { * Accounts that the user is currently featuring on their profile. * @see {@link https://docs.joinmastodon.org/methods/endorsements/#get} */ - getEndorsements: async (params?: GetEndorsementsParams) => + getEndorsements: (params?: GetEndorsementsParams) => this.#paginatedGet('/api/v1/endorsements', { params }, accountSchema), /** @@ -1137,12 +1262,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/featured_tags/#unfeature} */ unfeatureTag: async (name: string) => { - const response = await this.request('/api/v1/featured_tags', { + const response = await this.request('/api/v1/featured_tags', { method: 'DELETE', body: { name }, }); - return response.json as {}; + return response.json; }, /** @@ -1165,7 +1290,7 @@ class PlApiClient { * Requires features{@link Features.followHashtags}. * @see {@link https://docs.joinmastodon.org/methods/followed_tags/#get} */ - getFollowedTags: async (params?: GetFollowedTagsParams) => + getFollowedTags: (params?: GetFollowedTagsParams) => this.#paginatedGet('/api/v1/followed_tags', { params }, tagSchema), /** @@ -1229,9 +1354,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/suggestions/#remove} */ dismissSuggestions: async (accountId: string) => { - const response = await this.request(`/api/v1/suggestions/${accountId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/suggestions/${accountId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, /** @@ -1241,7 +1368,11 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#get-apiv1pleromabookmark_folders} */ getBookmarkFolders: async () => { - const response = await this.request(this.features.version.software === PLEROMA ? '/api/v1/pleroma/bookmark_folders' : '/api/v1/bookmark_categories'); + const response = await this.request( + this.features.version.software === PLEROMA + ? '/api/v1/pleroma/bookmark_folders' + : '/api/v1/bookmark_categories', + ); return v.parse(filteredArray(bookmarkFolderSchema), response.json); }, @@ -1255,7 +1386,9 @@ class PlApiClient { */ createBookmarkFolder: async (params: CreateBookmarkFolderParams) => { const response = await this.request( - this.features.version.software === PLEROMA ? '/api/v1/pleroma/bookmark_folders' : '/api/v1/bookmark_categories', + this.features.version.software === PLEROMA + ? '/api/v1/pleroma/bookmark_folders' + : '/api/v1/bookmark_categories', { method: 'POST', body: { title: params.name, ...params } }, ); @@ -1297,7 +1430,7 @@ class PlApiClient { * Requires features{@link Features.bookmarkFoldersMultiple}. */ addBookmarkToFolder: async (statusId: string, folderId: string) => { - const response = await this.request <{}>( + const response = await this.request( `/api/v1/bookmark_categories/${folderId}/statuses`, { method: 'POST', params: { status_ids: [statusId] } }, ); @@ -1309,7 +1442,7 @@ class PlApiClient { * Requires features{@link Features.bookmarkFoldersMultiple}. */ removeBookmarkFromFolder: async (statusId: string, folderId: string) => { - const response = await this.request<{}>( + const response = await this.request( `/api/v1/bookmark_categories/${folderId}/statuses`, { method: 'DELETE', params: { status_ids: [statusId] } }, ); @@ -1332,10 +1465,14 @@ class PlApiClient { body: { language: params.locale, birthday: params.date_of_birth, ...params }, }); - if ('identifier' in response.json) return v.parse(v.object({ - message: v.string(), - identifier: v.string(), - }), response.json); + if ('identifier' in response.json) + return v.parse( + v.object({ + message: v.string(), + identifier: v.string(), + }), + response.json, + ); return v.parse(tokenSchema, response.json); }, @@ -1376,7 +1513,13 @@ class PlApiClient { const response = await this.request('/api/v1/accounts/update_credentials', { method: 'PATCH', - contentType: (this.features.version.software === GOTOSOCIAL || this.features.version.software === ICESHRIMP_NET || params.avatar || params.header) ? '' : undefined, + contentType: + this.features.version.software === GOTOSOCIAL || + this.features.version.software === ICESHRIMP_NET || + params.avatar || + params.header + ? '' + : undefined, body: params, }); @@ -1458,7 +1601,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#add-alias-to-the-current-account} */ addAccountAlias: async (alias: string) => { - const response = await this.request('/api/pleroma/aliases', { method: 'PUT', body: { alias } }); + const response = await this.request('/api/pleroma/aliases', { + method: 'PUT', + body: { alias }, + }); return v.parse(v.object({ status: v.literal('success') }), response.json); }, @@ -1471,7 +1617,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#delete-alias-from-the-current-account} */ deleteAccountAlias: async (alias: string) => { - const response = await this.request('/api/pleroma/aliases', { method: 'DELETE', body: { alias } }); + const response = await this.request('/api/pleroma/aliases', { + method: 'DELETE', + body: { alias }, + }); return v.parse(v.object({ status: v.literal('success') }), response.json); }, @@ -1511,17 +1660,23 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request(`/api/v1/tokens/${oauthTokenId}/invalidate`, { method: 'POST' }); + response = await this.request(`/api/v1/tokens/${oauthTokenId}/invalidate`, { + method: 'POST', + }); break; case MITRA: - response = await this.request(`/api/v1/settings/sessions/${oauthTokenId}`, { method: 'DELETE' }); + response = await this.request(`/api/v1/settings/sessions/${oauthTokenId}`, { + method: 'DELETE', + }); break; default: - response = await this.request(`/api/oauth_tokens/${oauthTokenId}`, { method: 'DELETE' }); + response = await this.request(`/api/oauth_tokens/${oauthTokenId}`, { + method: 'DELETE', + }); break; } - return response.json as {}; + return response.json; }, /** @@ -1537,7 +1692,7 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request('/api/v1/user/password_change', { + response = await this.request('/api/v1/user/password_change', { method: 'POST', body: { old_password: current_password, @@ -1547,7 +1702,7 @@ class PlApiClient { break; case ICESHRIMP_NET: await this.#getIceshrimpAccessToken(); - response = await this.request('/api/iceshrimp/auth/change-password', { + response = await this.request('/api/iceshrimp/auth/change-password', { method: 'POST', body: { oldPassword: current_password, @@ -1556,13 +1711,13 @@ class PlApiClient { }); break; case MITRA: - response = await this.request('/api/v1/settings/change_password', { + response = await this.request('/api/v1/settings/change_password', { method: 'POST', body: { new_password }, }); break; case PIXELFED: - response = await this.request('/api/v1.1/accounts/change-password', { + response = await this.request('/api/v1.1/accounts/change-password', { method: 'POST', body: { current_password, @@ -1573,7 +1728,7 @@ class PlApiClient { if (response.redirected) throw response; break; default: - response = await this.request('/api/pleroma/change_password', { + response = await this.request('/api/pleroma/change_password', { method: 'POST', body: { password: current_password, @@ -1583,7 +1738,7 @@ class PlApiClient { }); } - return response.json as {}; + return response.json; }, /** @@ -1592,12 +1747,12 @@ class PlApiClient { * Requires features{@link Features.resetPassword}. */ resetPassword: async (email?: string, nickname?: string) => { - const response = await this.request('/auth/password', { + const response = await this.request('/auth/password', { method: 'POST', body: { email, nickname }, }); - return response.json as {}; + return response.json; }, /** @@ -1608,7 +1763,7 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request('/api/v1/user/email_change', { + response = await this.request('/api/v1/user/email_change', { method: 'POST', body: { new_email: email, @@ -1617,7 +1772,7 @@ class PlApiClient { }); break; default: - response = await this.request('/api/pleroma/change_email', { + response = await this.request('/api/pleroma/change_email', { method: 'POST', body: { email, @@ -1628,7 +1783,7 @@ class PlApiClient { if (response.json?.error) throw response.json.error; - return response.json as {}; + return response.json; }, /** @@ -1639,13 +1794,13 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request('/api/v1/accounts/delete', { + response = await this.request('/api/v1/accounts/delete', { method: 'POST', body: { password }, }); break; default: - response = await this.request('/api/pleroma/delete_account', { + response = await this.request('/api/pleroma/delete_account', { method: 'POST', body: { password }, }); @@ -1653,18 +1808,18 @@ class PlApiClient { if (response.json?.error) throw response.json.error; - return response.json as {}; + return response.json; }, /** * Requires features{@link Features.deleteAccountWithoutPassword}. */ deleteAccountWithoutPassword: async () => { - const response = await this.request('/api/v1/settings/delete_account', { + const response = await this.request('/api/v1/settings/delete_account', { method: 'POST', }); - return response.json as {}; + return response.json; }, /** @@ -1673,28 +1828,28 @@ class PlApiClient { * Requires features{@link Features.disableAccount}. */ disableAccount: async (password: string) => { - const response = await this.request('/api/pleroma/disable_account', { + const response = await this.request('/api/pleroma/disable_account', { method: 'POST', body: { password }, }); if (response.json?.error) throw response.json.error; - return response.json as {}; + return response.json; }, /** * Requires features{@link Features.accountMoving}. */ moveAccount: async (target_account: string, password: string) => { - const response = await this.request('/api/pleroma/move_account', { + const response = await this.request('/api/pleroma/move_account', { method: 'POST', body: { password, target_account }, }); if (response.json?.error) throw response.json.error; - return response.json as {}; + return response.json; }, mfa: { @@ -1717,12 +1872,15 @@ class PlApiClient { response = (await this.request('/api/pleroma/accounts/mfa')).json; } - return v.parse(v.object({ - settings: coerceObject({ - enabled: v.boolean(), - totp: v.boolean(), + return v.parse( + v.object({ + settings: coerceObject({ + enabled: v.boolean(), + totp: v.boolean(), + }), }), - }), response); + response, + ); }, /** @@ -1731,9 +1889,12 @@ class PlApiClient { getMfaBackupCodes: async () => { const response = await this.request('/api/pleroma/accounts/mfa/backup_codes'); - return v.parse(v.object({ - codes: v.array(v.string()), - }), response.json); + return v.parse( + v.object({ + codes: v.array(v.string()), + }), + response.json, + ); }, /** @@ -1753,10 +1914,13 @@ class PlApiClient { response = (await this.request(`/api/pleroma/accounts/mfa/setup/${method}`)).json; } - return v.parse(v.object({ - key: v.fallback(v.string(), ''), - provisioning_uri: v.string(), - }), response); + return v.parse( + v.object({ + key: v.fallback(v.string(), ''), + provisioning_uri: v.string(), + }), + response, + ); }, /** @@ -1767,18 +1931,23 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request('/api/v1/user/2fa/enable', { method: 'POST', body: { code } }); + response = await this.request('/api/v1/user/2fa/enable', { + method: 'POST', + body: { code }, + }); break; default: - response = (await this.request(`/api/pleroma/accounts/mfa/confirm/${method}`, { - method: 'POST', - body: { code, password }, - })).json; + response = ( + await this.request(`/api/pleroma/accounts/mfa/confirm/${method}`, { + method: 'POST', + body: { code, password }, + }) + ).json; } if (response?.error) throw response.error; - return response as {}; + return response as EmptyObject; }, /** @@ -1789,13 +1958,13 @@ class PlApiClient { switch (this.features.version.software) { case GOTOSOCIAL: - response = await this.request('/api/v1/user/2fa/disable', { + response = await this.request('/api/v1/user/2fa/disable', { method: 'POST', body: { password }, }); break; default: - response = await this.request(`/api/pleroma/accounts/mfa/${method}`, { + response = await this.request(`/api/pleroma/accounts/mfa/${method}`, { method: 'DELETE', body: { password }, }); @@ -1803,7 +1972,7 @@ class PlApiClient { if (response.json?.error) throw response.json.error; - return response.json as {}; + return response.json; }, }, @@ -1843,14 +2012,17 @@ class PlApiClient { }, /** - * Move followers from remote alias. (experimental?) - * - * Requires features{@link Features.importFollowers}. - */ + * Move followers from remote alias. (experimental?) + * + * Requires features{@link Features.importFollowers}. + */ importFollowers: async (list: File | string, actorId: string) => { const response = await this.request('/api/v1/settings/import_followers', { method: 'POST', - body: { from_actor_id: actorId, followers_csv: typeof list === 'string' ? list : await list.text() }, + body: { + from_actor_id: actorId, + followers_csv: typeof list === 'string' ? list : await list.text(), + }, }); return response.json; @@ -1961,10 +2133,10 @@ class PlApiClient { }, /** - * Export lists to CSV file - * - * Requires features{@link Features.exportLists}. - */ + * Export lists to CSV file + * + * Requires features{@link Features.exportLists}. + */ exportLists: async () => { const response = await this.request('/api/v1/exports/lists.csv', { method: 'GET', @@ -1974,10 +2146,10 @@ class PlApiClient { }, /** - * Export blocks to CSV file - * - * Requires features{@link Features.exportBlocks}. - */ + * Export blocks to CSV file + * + * Requires features{@link Features.exportBlocks}. + */ exportBlocks: async () => { const response = await this.request('/api/v1/exports/blocks.csv', { method: 'GET', @@ -1987,10 +2159,10 @@ class PlApiClient { }, /** - * Export mutes to CSV file - * - * Requires features{@link Features.exportMutes}. - */ + * Export mutes to CSV file + * + * Requires features{@link Features.exportMutes}. + */ exportMutes: async () => { const response = await this.request('/api/v1/exports/mutes.csv', { method: 'GET', @@ -2006,7 +2178,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/pleroma_api/#apipleromanotification_settings} */ updateNotificationSettings: async (params: UpdateNotificationSettingsParams) => { - const response = await this.request('/api/pleroma/notification_settings', { method: 'PUT', body: params }); + const response = await this.request('/api/pleroma/notification_settings', { + method: 'PUT', + body: params, + }); if (response.json?.error) throw response.json.error; @@ -2032,7 +2207,10 @@ class PlApiClient { * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} */ updateInteractionPolicies: async (params: UpdateInteractionPoliciesParams) => { - const response = await this.request('/api/v1/interaction_policies/defaults', { method: 'PATCH', body: params }); + const response = await this.request('/api/v1/interaction_policies/defaults', { + method: 'PATCH', + body: params, + }); return v.parse(interactionPoliciesSchema, response.json); }, @@ -2056,13 +2234,18 @@ class PlApiClient { * Requires features{@link Features.preferredFrontends}. */ setPreferredFrontend: async (frontendName: string) => { - const response = await this.request('/api/v1/akkoma/preferred_frontend', { method: 'PUT', body: { frontend_name: frontendName } }); + const response = await this.request('/api/v1/akkoma/preferred_frontend', { + method: 'PUT', + body: { frontend_name: frontendName }, + }); return v.parse(v.object({ frontend_name: v.string() }), response.json); }, authorizeIceshrimp: async () => { - const response = await this.request('/api/v1/accounts/authorize_iceshrimp', { method: 'POST' }); + const response = await this.request('/api/v1/accounts/authorize_iceshrimp', { + method: 'POST', + }); return response.json; }, @@ -2076,7 +2259,10 @@ class PlApiClient { * `duration` parameter requires features{@link Features.blocksDuration}. */ blockAccount: async (accountId: string, params?: BlockAccountParams) => { - const response = await this.request(`/api/v1/accounts/${accountId}/block`, { method: 'POST', body: params }); + const response = await this.request(`/api/v1/accounts/${accountId}/block`, { + method: 'POST', + body: params, + }); return v.parse(relationshipSchema, response.json); }, @@ -2087,7 +2273,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#unblock} */ unblockAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/unblock`, { method: 'POST' }); + const response = await this.request(`/api/v1/accounts/${accountId}/unblock`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -2100,7 +2288,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#mute} */ muteAccount: async (accountId: string, params?: MuteAccountParams) => { - const response = await this.request(`/api/v1/accounts/${accountId}/mute`, { method: 'POST', body: params }); + const response = await this.request(`/api/v1/accounts/${accountId}/mute`, { + method: 'POST', + body: params, + }); return v.parse(relationshipSchema, response.json); }, @@ -2113,7 +2304,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/accounts/#unmute} */ unmuteAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/accounts/${accountId}/unmute`, { method: 'POST' }); + const response = await this.request(`/api/v1/accounts/${accountId}/unmute`, { + method: 'POST', + }); return v.parse(relationshipSchema, response.json); }, @@ -2125,14 +2318,14 @@ class PlApiClient { * Requires features{@link Features.mutes}. * @see {@link https://docs.joinmastodon.org/methods/mutes/#get} */ - getMutes: async (params?: GetMutesParams) => + getMutes: (params?: GetMutesParams) => this.#paginatedGet('/api/v1/mutes', { params }, mutedAccountSchema), /** * View blocked users * @see {@link https://docs.joinmastodon.org/methods/blocks/#get} */ - getBlocks: async (params?: GetBlocksParams) => + getBlocks: (params?: GetBlocksParams) => this.#paginatedGet('/api/v1/blocks', { params }, blockedAccountSchema), /** @@ -2140,7 +2333,7 @@ class PlApiClient { * View domains the user has blocked. * @see {@link https://docs.joinmastodon.org/methods/domain_blocks/#get} */ - getDomainBlocks: async (params?: GetDomainBlocksParams) => + getDomainBlocks: (params?: GetDomainBlocksParams) => this.#paginatedGet('/api/v1/domain_blocks', { params }, v.string()), /** @@ -2153,9 +2346,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/domain_blocks/#block} */ blockDomain: async (domain: string) => { - const response = await this.request('/api/v1/domain_blocks', { method: 'POST', body: { domain } }); + const response = await this.request('/api/v1/domain_blocks', { + method: 'POST', + body: { domain }, + }); - return response.json as {}; + return response.json; }, /** @@ -2164,12 +2360,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/domain_blocks/#unblock} */ unblockDomain: async (domain: string) => { - const response = await this.request('/api/v1/domain_blocks', { + const response = await this.request('/api/v1/domain_blocks', { method: 'DELETE', body: { domain }, }); - return response.json as {}; + return response.json; }, /** @@ -2180,7 +2376,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/filters/#get} */ getFilters: async () => { - const response = await this.request(this.features.filtersV2 ? '/api/v2/filters' : '/api/v1/filters'); + const response = await this.request( + this.features.filtersV2 ? '/api/v2/filters' : '/api/v1/filters', + ); return v.parse(filteredArray(filterSchema), response.json); }, @@ -2194,9 +2392,7 @@ class PlApiClient { */ getFilter: async (filterId: string) => { const response = await this.request( - this.features.filtersV2 - ? `/api/v2/filters/${filterId}` - : `/api/v1/filters/${filterId}`, + this.features.filtersV2 ? `/api/v2/filters/${filterId}` : `/api/v1/filters/${filterId}`, ); return v.parse(filterSchema, response.json); @@ -2211,19 +2407,18 @@ class PlApiClient { */ createFilter: async (params: CreateFilterParams) => { const { filtersV2 } = this.features; - const response = await this.request( - filtersV2 ? '/api/v2/filters' : '/api/v1/filters', - { - method: 'POST', - body: filtersV2 ? params : { - phrase: params.keywords_attributes[0]?.keyword, - context: params.context, - irreversible: params.filter_action === 'hide', - whole_word: params.keywords_attributes[0]?.whole_word, - expires_in: params.expires_in, - }, - }, - ); + const response = await this.request(filtersV2 ? '/api/v2/filters' : '/api/v1/filters', { + method: 'POST', + body: filtersV2 + ? params + : { + phrase: params.keywords_attributes[0]?.keyword, + context: params.context, + irreversible: params.filter_action === 'hide', + whole_word: params.keywords_attributes[0]?.whole_word, + expires_in: params.expires_in, + }, + }); return v.parse(filterSchema, response.json); }, @@ -2241,13 +2436,15 @@ class PlApiClient { filtersV2 ? `/api/v2/filters/${filterId}` : `/api/v1/filters/${filterId}`, { method: 'PUT', - body: filtersV2 ? params : { - phrase: params.keywords_attributes?.[0]?.keyword, - context: params.context, - irreversible: params.filter_action === 'hide', - whole_word: params.keywords_attributes?.[0]?.whole_word, - expires_in: params.expires_in, - }, + body: filtersV2 + ? params + : { + phrase: params.keywords_attributes?.[0]?.keyword, + context: params.context, + irreversible: params.filter_action === 'hide', + whole_word: params.keywords_attributes?.[0]?.whole_word, + expires_in: params.expires_in, + }, }, ); @@ -2262,14 +2459,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/filters/#delete} */ deleteFilter: async (filterId: string) => { - const response = await this.request( - this.features.filtersV2 - ? `/api/v2/filters/${filterId}` - : `/api/v1/filters/${filterId}`, + const response = await this.request( + this.features.filtersV2 ? `/api/v2/filters/${filterId}` : `/api/v1/filters/${filterId}`, { method: 'DELETE' }, ); - return response.json as {}; + return response.json; }, /** @@ -2338,9 +2533,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/filters/#keywords-delete} */ deleteFilterKeyword: async (filterId: string) => { - const response = await this.request(`/api/v2/filters/keywords/${filterId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v2/filters/keywords/${filterId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, /** @@ -2393,11 +2590,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/filters/#statuses-remove} */ deleteFilterStatus: async (statusId: string) => { - const response = await this.request(`/api/v2/filters/statuses/${statusId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v2/filters/statuses/${statusId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, - }; public readonly statuses = { @@ -2414,19 +2612,25 @@ class PlApiClient { const fixedParams: ExtendedCreateStatusParams = params; - if (params.content_type === 'text/markdown' && this.#instance.api_versions['kmyblue_markdown.fedibird.pl-api'] >= 1) { + if ( + params.content_type === 'text/markdown' && + this.#instance.api_versions['kmyblue_markdown.fedibird.pl-api'] >= 1 + ) { fixedParams.markdown = true; } if (params.visibility?.startsWith('api/v1/bookmark_categories')) { fixedParams.circle_id = params.visibility.slice(7); fixedParams.visibility = 'circle'; } - if (params.quote_id && this.#instance.api_versions.mastodon >= 7) params.quoted_status_id = params.quote_id; - else if (params.quoted_status_id && (this.#instance.api_versions.mastodon || 0) < 7) params.quote_id = params.quoted_status_id; + if (params.quote_id && this.#instance.api_versions.mastodon >= 7) + params.quoted_status_id = params.quote_id; + else if (params.quoted_status_id && (this.#instance.api_versions.mastodon || 0) < 7) + params.quote_id = params.quoted_status_id; - const input = params.preview && this.features.version.software === MITRA - ? '/api/v1/statuses/preview' - : '/api/v1/statuses'; + const input = + params.preview && this.features.version.software === MITRA + ? '/api/v1/statuses/preview' + : '/api/v1/statuses'; const response = await this.request(input, { method: 'POST', @@ -2441,9 +2645,10 @@ class PlApiClient { * Requires features{@link Features.createStatusPreview}. */ previewStatus: async (params: CreateStatusParams) => { - const input = this.features.version.software === PLEROMA || this.features.version.software === AKKOMA - ? '/api/v1/statuses' - : '/api/v1/statuses/preview'; + const input = + this.features.version.software === PLEROMA || this.features.version.software === AKKOMA + ? '/api/v1/statuses' + : '/api/v1/statuses/preview'; if (this.features.version.software === PLEROMA || this.features.version.software === AKKOMA) { params.preview = true; @@ -2474,9 +2679,11 @@ class PlApiClient { * * Requires features{@link Features.getStatuses}. * @see {@link https://docs.joinmastodon.org/methods/statuses/#index} - */ + */ getStatuses: async (statusIds: string[], params?: GetStatusesParams) => { - const response = await this.request('/api/v1/statuses', { params: { ...params, id: statusIds } }); + const response = await this.request('/api/v1/statuses', { + params: { ...params, id: statusIds }, + }); return v.parse(filteredArray(statusSchema), response.json); }, @@ -2489,7 +2696,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#delete} */ deleteStatus: async (statusId: string, deleteMedia?: boolean) => { - const response = await this.request(`/api/v1/statuses/${statusId}`, { method: 'DELETE', params: { delete_media: deleteMedia } }); + const response = await this.request(`/api/v1/statuses/${statusId}`, { + method: 'DELETE', + params: { delete_media: deleteMedia }, + }); return v.parse(statusSourceSchema, response.json); }, @@ -2504,7 +2714,7 @@ class PlApiClient { const asyncRefreshHeader = getAsyncRefreshHeader(response); - return { asyncRefreshHeader, ...v.parse(contextSchema, response.json) } ; + return { asyncRefreshHeader, ...v.parse(contextSchema, response.json) }; }, /** @@ -2516,9 +2726,11 @@ class PlApiClient { let response; if (this.features.version.software === AKKOMA) { response = await this.request(`/api/v1/statuses/${statusId}/translations/${lang}`); - } else { - response = await this.request(`/api/v1/statuses/${statusId}/translate`, { method: 'POST', body: { lang } }); + response = await this.request(`/api/v1/statuses/${statusId}/translate`, { + method: 'POST', + body: { lang }, + }); } return v.parse(translationSchema, response.json); @@ -2530,7 +2742,10 @@ class PlApiClient { * Requires features{@link Features.lazyTranslations}. */ translateStatuses: async (statusIds: Array, lang: string) => { - const response = await this.request('/api/v1/pl/statuses/translate', { method: 'POST', body: { ids: statusIds, lang } }); + const response = await this.request('/api/v1/pl/statuses/translate', { + method: 'POST', + body: { ids: statusIds, lang }, + }); return v.parse(filteredArray(translationSchema), response.json); }, @@ -2540,7 +2755,7 @@ class PlApiClient { * View who boosted a given status. * @see {@link https://docs.joinmastodon.org/methods/statuses/#reblogged_by} */ - getRebloggedBy: async (statusId: string, params?: GetRebloggedByParams) => + getRebloggedBy: (statusId: string, params?: GetRebloggedByParams) => this.#paginatedGet(`/api/v1/statuses/${statusId}/reblogged_by`, { params }, accountSchema), /** @@ -2548,7 +2763,7 @@ class PlApiClient { * View who favourited a given status. * @see {@link https://docs.joinmastodon.org/methods/statuses/#favourited_by} */ - getFavouritedBy: async (statusId: string, params?: GetFavouritedByParams) => + getFavouritedBy: (statusId: string, params?: GetFavouritedByParams) => this.#paginatedGet(`/api/v1/statuses/${statusId}/favourited_by`, { params }, accountSchema), /** @@ -2557,7 +2772,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#favourite} */ favouriteStatus: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/favourite`, { method: 'POST' }); + const response = await this.request(`/api/v1/statuses/${statusId}/favourite`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2568,7 +2785,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#unfavourite} */ unfavouriteStatus: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/unfavourite`, { method: 'POST' }); + const response = await this.request(`/api/v1/statuses/${statusId}/unfavourite`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2581,7 +2800,10 @@ class PlApiClient { * Specifying reblog visibility requires features{@link Features.reblogVisibility}. */ reblogStatus: async (statusId: string, visibility?: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/reblog`, { method: 'POST', body: { visibility } }); + const response = await this.request(`/api/v1/statuses/${statusId}/reblog`, { + method: 'POST', + body: { visibility }, + }); return v.parse(statusSchema, response.json); }, @@ -2592,7 +2814,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#unreblog} */ unreblogStatus: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/unreblog`, { method: 'POST' }); + const response = await this.request(`/api/v1/statuses/${statusId}/unreblog`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2603,10 +2827,16 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#bookmark} */ bookmarkStatus: async (statusId: string, folderId?: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/bookmark`, { method: 'POST', body: { folder_id: folderId } }); + const response = await this.request(`/api/v1/statuses/${statusId}/bookmark`, { + method: 'POST', + body: { folder_id: folderId }, + }); if (folderId && this.features.bookmarkFoldersMultiple) { - await this.request(`/api/v1/bookmark_categories/${folderId}/statuses`, { method: 'POST', params: { status_ids: [statusId] } }); + await this.request(`/api/v1/bookmark_categories/${folderId}/statuses`, { + method: 'POST', + params: { status_ids: [statusId] }, + }); } return v.parse(statusSchema, response.json); @@ -2618,7 +2848,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#unbookmark} */ unbookmarkStatus: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/unbookmark`, { method: 'POST' }); + const response = await this.request(`/api/v1/statuses/${statusId}/unbookmark`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2629,7 +2861,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#revoke_quote} */ revokeQuote: async (statusId: string, quotingStatusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/quotes/${quotingStatusId}/revoke`, { method: 'POST' }); + const response = await this.request( + `/api/v1/statuses/${statusId}/quotes/${quotingStatusId}/revoke`, + { method: 'POST' }, + ); return v.parse(statusSchema, response.json); }, @@ -2651,7 +2886,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#unmute} */ unmuteStatus: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/unmute`, { method: 'POST' }); + const response = await this.request(`/api/v1/statuses/${statusId}/unmute`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2690,11 +2927,17 @@ class PlApiClient { const fixedParams: ExtendedEditStatusParams = params; - if (params.content_type === 'text/markdown' && this.#instance.api_versions['kmyblue_markdown.fedibird.pl-api'] >= 1) { + if ( + params.content_type === 'text/markdown' && + this.#instance.api_versions['kmyblue_markdown.fedibird.pl-api'] >= 1 + ) { fixedParams.markdown = true; } - const response = await this.request(`/api/v1/statuses/${statusId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/statuses/${statusId}`, { + method: 'PUT', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -2705,7 +2948,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/statuses/#edit_interaction_policy} */ editInteractionPolicy: async (statusId: string, params: EditInteractionPolicyParams) => { - const response = await this.request(`/api/v1/statuses/${statusId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/statuses/${statusId}`, { + method: 'PUT', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -2743,24 +2989,32 @@ class PlApiClient { const apiVersions = this.#instance.api_versions; let response; - if (apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || this.features.version.software === ICESHRIMP_NET) { - response = await this.request(`/api/v1/pleroma/statuses/${statusId}/reactions${emoji ? `/${emoji}` : ''}`); + if ( + apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || + this.features.version.software === ICESHRIMP_NET + ) { + response = await this.request( + `/api/v1/pleroma/statuses/${statusId}/reactions${emoji ? `/${emoji}` : ''}`, + ); } else { if (apiVersions['emoji_reaction.fedibird.pl-api'] >= 1) { response = await this.request(`/api/v1/statuses/${statusId}/emoji_reactioned_by`); } else { - response = await this.request(`/api/v1/statuses/${statusId}/reactions`, { params: { emoji } }); + response = await this.request(`/api/v1/statuses/${statusId}/reactions`, { + params: { emoji }, + }); } response.json = response.json?.reduce((acc: Array, cur: any) => { if (emoji && cur.name !== emoji) return acc; - const existing = acc.find(reaction => reaction.name === cur.name); + const existing = acc.find((reaction) => reaction.name === cur.name); if (existing) { existing.accounts.push(cur.account); existing.account_ids.push(cur.account.id); existing.count += 1; - } else acc.push({ count: 1, accounts: [cur.account], account_ids: [cur.account.id], ...cur }); + } else + acc.push({ count: 1, accounts: [cur.account], account_ids: [cur.account.id], ...cur }); return acc; }, []); @@ -2780,10 +3034,19 @@ class PlApiClient { const apiVersions = this.#instance.api_versions; let response; - if (apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || this.features.version.software === MITRA) { - response = await this.request(`/api/v1/pleroma/statuses/${statusId}/reactions/${encodeURIComponent(emoji)}`, { method: 'PUT' }); + if ( + apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || + this.features.version.software === MITRA + ) { + response = await this.request( + `/api/v1/pleroma/statuses/${statusId}/reactions/${encodeURIComponent(emoji)}`, + { method: 'PUT' }, + ); } else { - response = await this.request(`/api/v1/statuses/${statusId}/react/${encodeURIComponent(emoji)}`, { method: 'POST' }); + response = await this.request( + `/api/v1/statuses/${statusId}/react/${encodeURIComponent(emoji)}`, + { method: 'POST' }, + ); } return v.parse(statusSchema, response.json); @@ -2799,10 +3062,18 @@ class PlApiClient { const apiVersions = this.#instance.api_versions; let response; - if (apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || this.features.version.software === MITRA) { - response = await this.request(`/api/v1/pleroma/statuses/${statusId}/reactions/${emoji}`, { method: 'DELETE' }); + if ( + apiVersions['emoji_reactions.pleroma.pl-api'] >= 1 || + this.features.version.software === MITRA + ) { + response = await this.request(`/api/v1/pleroma/statuses/${statusId}/reactions/${emoji}`, { + method: 'DELETE', + }); } else { - response = await this.request(`/api/v1/statuses/${statusId}/unreact/${encodeURIComponent(emoji)}`, { method: 'POST' }); + response = await this.request( + `/api/v1/statuses/${statusId}/unreact/${encodeURIComponent(emoji)}`, + { method: 'POST' }, + ); } return v.parse(statusSchema, response.json); @@ -2814,9 +3085,11 @@ class PlApiClient { * Requires features{@link Features.quotePosts}. * @see {@link https://docs.joinmastodon.org/methods/statuses/#quotes} */ - getStatusQuotes: async (statusId: string, params?: GetStatusQuotesParams) => + getStatusQuotes: (statusId: string, params?: GetStatusQuotesParams) => this.#paginatedGet( - this.#instance.api_versions.mastodon >= 7 ? `/api/v1/statuses/${statusId}/quotes` : `/api/v1/pleroma/statuses/${statusId}/quotes`, + this.#instance.api_versions.mastodon >= 7 + ? `/api/v1/statuses/${statusId}/quotes` + : `/api/v1/pleroma/statuses/${statusId}/quotes`, { params }, statusSchema, ), @@ -2827,7 +3100,7 @@ class PlApiClient { * Requires features{@link Features.statusDislikes}. * @see {@link https://github.com/friendica/friendica/blob/2024.06-rc/doc/API-Friendica.md#get-apifriendicastatusesiddisliked_by} */ - getDislikedBy: async (statusId: string) => + getDislikedBy: (statusId: string) => this.#paginatedGet(`/api/v1/statuses/${statusId}/disliked_by`, {}, accountSchema), /** @@ -2835,7 +3108,9 @@ class PlApiClient { * @see {@link https://github.com/friendica/friendica/blob/2024.06-rc/doc/API-Friendica.md#post-apifriendicastatusesiddislike} */ dislikeStatus: async (statusId: string) => { - const response = await this.request(`/api/friendica/statuses/${statusId}/dislike`, { method: 'POST' }); + const response = await this.request(`/api/friendica/statuses/${statusId}/dislike`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -2845,15 +3120,17 @@ class PlApiClient { * @see {@link https://github.com/friendica/friendica/blob/2024.06-rc/doc/API-Friendica.md#post-apifriendicastatusesidundislike} */ undislikeStatus: async (statusId: string) => { - const response = await this.request(`/api/friendica/statuses/${statusId}/undislike`, { method: 'POST' }); + const response = await this.request(`/api/friendica/statuses/${statusId}/undislike`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, - getStatusReferences: async (statusId: string, params?: GetStatusReferencesParams) => + getStatusReferences: (statusId: string, params?: GetStatusReferencesParams) => this.#paginatedGet(`/api/v1/statuses/${statusId}/referred_by`, { params }, statusSchema), - getStatusMentionedUsers: async (statusId: string, params?: GetStatusMentionedUsersParams) => + getStatusMentionedUsers: (statusId: string, params?: GetStatusMentionedUsersParams) => this.#paginatedGet(`/api/v1/statuses/${statusId}/mentioned_by`, { params }, accountSchema), /** @@ -2862,7 +3139,10 @@ class PlApiClient { * Requires features{@link Features.loadConversation}. */ loadConversation: async (statusId: string) => { - const response = await this.request <{}>(`/api/v1/statuses/${statusId}/load_conversation`, { method: 'POST' }); + const response = await this.request( + `/api/v1/statuses/${statusId}/load_conversation`, + { method: 'POST' }, + ); return response.json; }, @@ -2871,7 +3151,9 @@ class PlApiClient { * Requires features{@link Features.bookmarkFoldersMultiple}. */ getStatusBookmarkFolders: async (statusId: string) => { - const response = await this.request(`/api/v1/statuses/${statusId}/bookmark_categories`, { method: 'GET' }); + const response = await this.request(`/api/v1/statuses/${statusId}/bookmark_categories`, { + method: 'GET', + }); return v.parse(filteredArray(bookmarkFolderSchema), response.json); }, @@ -2911,7 +3193,8 @@ class PlApiClient { updateMedia: async (attachmentId: string, params: UpdateMediaParams) => { const response = await this.request(`/api/v1/media/${attachmentId}`, { method: 'PUT', - body: params, contentType: params.thumbnail ? '' : undefined, + body: params, + contentType: params.thumbnail ? '' : undefined, }); return v.parse(mediaAttachmentSchema, response.json); @@ -2925,7 +3208,7 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/media/delete} */ deleteMedia: async (attachmentId: string) => { - const response = await this.request<{}>(`/api/v1/media/${attachmentId}`, { + const response = await this.request(`/api/v1/media/${attachmentId}`, { method: 'DELETE', }); @@ -2951,7 +3234,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/polls/#vote} */ vote: async (pollId: string, choices: number[]) => { - const response = await this.request(`/api/v1/polls/${pollId}/votes`, { method: 'POST', body: { choices } }); + const response = await this.request(`/api/v1/polls/${pollId}/votes`, { + method: 'POST', + body: { choices }, + }); return v.parse(pollSchema, response.json); }, @@ -2962,7 +3248,7 @@ class PlApiClient { * View scheduled statuses * @see {@link https://docs.joinmastodon.org/methods/scheduled_statuses/#get} */ - getScheduledStatuses: async (params?: GetScheduledStatusesParams) => + getScheduledStatuses: (params?: GetScheduledStatusesParams) => this.#paginatedGet('/api/v1/scheduled_statuses', { params }, scheduledStatusSchema), /** @@ -2993,9 +3279,14 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/scheduled_statuses/#cancel} */ cancelScheduledStatus: async (scheduledStatusId: string) => { - const response = await this.request(`/api/v1/scheduled_statuses/${scheduledStatusId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/scheduled_statuses/${scheduledStatusId}`, + { + method: 'DELETE', + }, + ); - return response.json as {}; + return response.json; }, }; @@ -3053,9 +3344,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/conversations/#delete} */ deleteConversation: async (conversationId: string) => { - const response = await this.request(`/api/v1/conversations/${conversationId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/conversations/${conversationId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, /** @@ -3063,7 +3356,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/conversations/#read} */ markConversationRead: async (conversationId: string) => { - const response = await this.request(`/api/v1/conversations/${conversationId}/read`, { method: 'POST' }); + const response = await this.request(`/api/v1/conversations/${conversationId}/read`, { + method: 'POST', + }); return v.parse(conversationSchema, response.json); }, @@ -3093,9 +3388,11 @@ class PlApiClient { /** * Requires features{@link Features.groups}. */ - groupTimeline: async (groupId: string, params?: GroupTimelineParams) => + groupTimeline: (groupId: string, params?: GroupTimelineParams) => this.#paginatedGet( - this.features.version.software === PIXELFED ? `/api/v0/groups/${groupId}/feed` : `/api/v1/timelines/group/${groupId}`, + this.features.version.software === PIXELFED + ? `/api/v0/groups/${groupId}/feed` + : `/api/v1/timelines/group/${groupId}`, { params }, statusSchema, ), @@ -3103,7 +3400,7 @@ class PlApiClient { /** * Requires features{@link Features.bubbleTimeline}. */ - bubbleTimeline: async (params?: BubbleTimelineParams) => + bubbleTimeline: (params?: BubbleTimelineParams) => this.#paginatedGet('/api/v1/timelines/bubble', { params }, statusSchema), /** @@ -3116,7 +3413,7 @@ class PlApiClient { /** * Requires features{@link Features.wrenchedTimeline}. */ - wrenchedTimeline: async (params?: WrenchedTimelineParams) => + wrenchedTimeline: (params?: WrenchedTimelineParams) => this.#paginatedGet('/api/v1/pleroma/timelines/wrenched', { params }, statusSchema), }; @@ -3160,7 +3457,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/lists/#update} */ updateList: async (listId: string, params: UpdateListParams) => { - const response = await this.request(`/api/v1/lists/${listId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/lists/${listId}`, { + method: 'PUT', + body: params, + }); return v.parse(listSchema, response.json); }, @@ -3170,16 +3470,18 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/lists/#delete} */ deleteList: async (listId: string) => { - const response = await this.request(`/api/v1/lists/${listId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/lists/${listId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, /** * View accounts in a list * @see {@link https://docs.joinmastodon.org/methods/lists/#accounts} */ - getListAccounts: async (listId: string, params?: GetListAccountsParams) => + getListAccounts: (listId: string, params?: GetListAccountsParams) => this.#paginatedGet(`/api/v1/lists/${listId}/accounts`, { params }, accountSchema), /** @@ -3188,11 +3490,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/lists/#accounts-add} */ addListAccounts: async (listId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/lists/${listId}/accounts`, { - method: 'POST', body: { account_ids: accountIds }, + const response = await this.request(`/api/v1/lists/${listId}/accounts`, { + method: 'POST', + body: { account_ids: accountIds }, }); - return response.json as {}; + return response.json; }, /** @@ -3201,11 +3504,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/lists/#accounts-remove} */ deleteListAccounts: async (listId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/lists/${listId}/accounts`, { - method: 'DELETE', body: { account_ids: accountIds }, + const response = await this.request(`/api/v1/lists/${listId}/accounts`, { + method: 'DELETE', + body: { account_ids: accountIds }, }); - return response.json as {}; + return response.json; }, /** @@ -3225,7 +3529,9 @@ class PlApiClient { * Requires features{@link Features.listsFavourite}. */ unfavouriteList: async (listId: string) => { - const response = await this.request(`/api/v1/lists/${listId}/unfavourite`, { method: 'POST' }); + const response = await this.request(`/api/v1/lists/${listId}/unfavourite`, { + method: 'POST', + }); return v.parse(listSchema, response.json); }, @@ -3251,28 +3557,38 @@ class PlApiClient { connect: () => { if (this.#socket) return this.#socket; - const path = buildFullPath('/api/v1/streaming', this.#instance?.configuration.urls.streaming, { access_token: this.accessToken }); + const path = buildFullPath( + '/api/v1/streaming', + this.#instance?.configuration.urls.streaming, + { access_token: this.accessToken }, + ); const ws = new WebSocket(path, this.accessToken as any); let listeners: Array<{ listener: (event: StreamingEvent) => any; stream?: string }> = []; const queue: Array<() => any> = []; - const enqueue = (fn: () => any) => ws.readyState === WebSocket.CONNECTING ? queue.push(fn) : fn(); + const enqueue = (fn: () => any) => + ws.readyState === WebSocket.CONNECTING ? queue.push(fn) : fn(); ws.onmessage = (event) => { const message = v.parse(streamingEventSchema, JSON.parse(event.data as string)); - listeners.filter(({ listener, stream }) => (!stream || message.stream.includes(stream)) && listener(message)); + listeners.filter( + ({ listener, stream }) => + (!stream || message.stream.includes(stream)) && listener(message), + ); }; ws.onopen = () => { - queue.forEach(fn => fn()); + queue.forEach((fn) => fn()); }; this.#socket = { - listen: (listener: (event: StreamingEvent) => any, stream?: string) => listeners.push({ listener, stream }), - unlisten: (listener: (event: StreamingEvent) => any) => listeners = listeners.filter((value) => value.listener !== listener), + listen: (listener: (event: StreamingEvent) => any, stream?: string) => + listeners.push({ listener, stream }), + unlisten: (listener: (event: StreamingEvent) => any) => + (listeners = listeners.filter((value) => value.listener !== listener)), subscribe: (stream: string, { list, tag }: { list?: string; tag?: string } = {}) => enqueue(() => ws.send(JSON.stringify({ type: 'subscribe', stream, list, tag }))), unsubscribe: (stream: string, { list, tag }: { list?: string; tag?: string } = {}) => @@ -3293,20 +3609,32 @@ class PlApiClient { * Notifications concerning the user. This API returns Link headers containing links to the next/previous page. However, the links can also be constructed dynamically using query params and `id` values. * @see {@link https://docs.joinmastodon.org/methods/notifications/#get} */ - getNotifications: async (params?: GetNotificationParams, meta?: RequestMeta) => { + getNotifications: (params?: GetNotificationParams, meta?: RequestMeta) => { const PLEROMA_TYPES = [ - 'chat_mention', 'emoji_reaction', 'report', 'participation_accepted', 'participation_request', 'event_reminder', 'event_update', + 'chat_mention', + 'emoji_reaction', + 'report', + 'participation_accepted', + 'participation_request', + 'event_reminder', + 'event_update', ]; - if (params?.types) params.types = [ - ...params.types, - ...params.types.filter(type => PLEROMA_TYPES.includes(type)).map(type => `pleroma:${type}`), - ]; + if (params?.types) + params.types = [ + ...params.types, + ...params.types + .filter((type) => PLEROMA_TYPES.includes(type)) + .map((type) => `pleroma:${type}`), + ]; - if (params?.exclude_types) params.exclude_types = [ - ...params.exclude_types, - ...params.exclude_types.filter(type => PLEROMA_TYPES.includes(type)).map(type => `pleroma:${type}`), - ]; + if (params?.exclude_types) + params.exclude_types = [ + ...params.exclude_types, + ...params.exclude_types + .filter((type) => PLEROMA_TYPES.includes(type)) + .map((type) => `pleroma:${type}`), + ]; return this.#paginatedGet('/api/v1/notifications', { ...meta, params }, notificationSchema); }, @@ -3328,9 +3656,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#clear} */ dismissNotifications: async () => { - const response = await this.request('/api/v1/notifications/clear', { method: 'POST' }); + const response = await this.request('/api/v1/notifications/clear', { + method: 'POST', + }); - return response.json as {}; + return response.json; }, /** @@ -3339,9 +3669,14 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#dismiss} */ dismissNotification: async (notificationId: string) => { - const response = await this.request(`/api/v1/notifications/${notificationId}/dismiss`, { method: 'POST' }); + const response = await this.request( + `/api/v1/notifications/${notificationId}/dismiss`, + { + method: 'POST', + }, + ); - return response.json as {}; + return response.json; }, /** @@ -3354,9 +3689,12 @@ class PlApiClient { getUnreadNotificationCount: async (params?: GetUnreadNotificationCountParams) => { const response = await this.request('/api/v1/notifications/unread_count', { params }); - return v.parse(v.object({ - count: v.number(), - }), response.json); + return v.parse( + v.object({ + count: v.number(), + }), + response.json, + ); }, /** @@ -3380,7 +3718,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#update-the-filtering-policy-for-notifications} */ updateNotificationPolicy: async (params: UpdateNotificationPolicyRequest) => { - const response = await this.request('/api/v2/notifications/policy', { method: 'PATCH', body: params }); + const response = await this.request('/api/v2/notifications/policy', { + method: 'PATCH', + body: params, + }); return v.parse(notificationPolicySchema, response.json); }, @@ -3390,7 +3731,7 @@ class PlApiClient { * Notification requests for notifications filtered by the user’s policy. This API returns Link headers containing links to the next/previous page. * @see {@link https://docs.joinmastodon.org/methods/notifications/#get-requests} */ - getNotificationRequests: async (params?: GetNotificationRequestsParams) => + getNotificationRequests: (params?: GetNotificationRequestsParams) => this.#paginatedGet('/api/v1/notifications/requests', { params }, notificationRequestSchema), /** @@ -3399,7 +3740,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#get-one-request} */ getNotificationRequest: async (notificationRequestId: string) => { - const response = await this.request(`/api/v1/notifications/requests/${notificationRequestId}`); + const response = await this.request( + `/api/v1/notifications/requests/${notificationRequestId}`, + ); return v.parse(notificationRequestSchema, response.json); }, @@ -3410,9 +3753,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#accept-request} */ acceptNotificationRequest: async (notificationRequestId: string) => { - const response = await this.request(`/api/v1/notifications/requests/${notificationRequestId}/dismiss`, { method: 'POST' }); + const response = await this.request( + `/api/v1/notifications/requests/${notificationRequestId}/dismiss`, + { method: 'POST' }, + ); - return response.json as {}; + return response.json; }, /** @@ -3421,9 +3767,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/notifications/#dismiss-request} */ dismissNotificationRequest: async (notificationRequestId: string) => { - const response = await this.request(`/api/v1/notifications/requests/${notificationRequestId}/dismiss`, { method: 'POST' }); + const response = await this.request( + `/api/v1/notifications/requests/${notificationRequestId}/dismiss`, + { method: 'POST' }, + ); - return response.json as {}; + return response.json; }, /** @@ -3433,9 +3782,12 @@ class PlApiClient { * Requires features{@link Features.notificationsRequestsAcceptMultiple}. */ acceptMultipleNotificationRequests: async (notificationRequestIds: Array) => { - const response = await this.request('/api/v1/notifications/requests/accept', { method: 'POST', body: { id: notificationRequestIds } }); + const response = await this.request('/api/v1/notifications/requests/accept', { + method: 'POST', + body: { id: notificationRequestIds }, + }); - return response.json as {}; + return response.json; }, /** @@ -3445,9 +3797,12 @@ class PlApiClient { * Requires features{@link Features.notificationsRequestsAcceptMultiple}. */ dismissMultipleNotificationRequests: async (notificationRequestIds: Array) => { - const response = await this.request('/api/v1/notifications/requests/dismiss', { method: 'POST', body: { id: notificationRequestIds } }); + const response = await this.request('/api/v1/notifications/requests/dismiss', { + method: 'POST', + body: { id: notificationRequestIds }, + }); - return response.json as {}; + return response.json; }, /** @@ -3459,9 +3814,12 @@ class PlApiClient { checkNotificationRequestsMerged: async () => { const response = await this.request('/api/v1/notifications/requests/merged'); - return v.parse(v.object({ - merged: v.boolean(), - }), response.json); + return v.parse( + v.object({ + merged: v.boolean(), + }), + response.json, + ); }, /** @@ -3471,12 +3829,12 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/differences_in_mastoapi_responses/#delete-apiv1notificationsdestroy_multiple} */ dismissMultipleNotifications: async (notificationIds: string[]) => { - const response = await this.request('/api/v1/notifications/destroy_multiple', { + const response = await this.request('/api/v1/notifications/destroy_multiple', { params: { ids: notificationIds }, method: 'DELETE', }); - return response.json as {}; + return response.json; }, }; @@ -3493,14 +3851,28 @@ class PlApiClient { */ getGroupedNotifications: async (params: GetGroupedNotificationsParams, meta?: RequestMeta) => { if (this.features.groupedNotifications) { - return this.#paginatedGet('/api/v2/notifications', { ...meta, params }, groupedNotificationsResultsSchema, false); - } else { - const response = await this.notifications.getNotifications( - pick(params, ['max_id', 'since_id', 'limit', 'min_id', 'types', 'exclude_types', 'account_id', 'include_filtered']), + return this.#paginatedGet( + '/api/v2/notifications', + { ...meta, params }, + groupedNotificationsResultsSchema, + false, ); - - return this.#groupNotifications(response, params); } + + const response = await this.notifications.getNotifications( + pick(params, [ + 'max_id', + 'since_id', + 'limit', + 'min_id', + 'types', + 'exclude_types', + 'account_id', + 'include_filtered', + ]), + ); + + return this.#groupNotifications(response, params); }, /** @@ -3515,16 +3887,16 @@ class PlApiClient { const response = await this.request(`/api/v2/notifications/${groupKey}`); return v.parse(groupedNotificationsResultsSchema, response.json); - } else { - const response = await this.request(`/api/v1/notifications/${groupKey}`); - - return this.#groupNotifications({ - previous: null, - next: null, - items: [response.json], - partial: false, - }).items; } + + const response = await this.request(`/api/v1/notifications/${groupKey}`); + + return this.#groupNotifications({ + previous: null, + next: null, + items: [response.json], + partial: false, + }).items; }, /** @@ -3536,12 +3908,17 @@ class PlApiClient { */ dismissNotificationGroup: async (groupKey: string) => { if (this.features.groupedNotifications) { - const response = await this.request(`/api/v2/notifications/${groupKey}/dismiss`, { method: 'POST' }); + const response = await this.request( + `/api/v2/notifications/${groupKey}/dismiss`, + { + method: 'POST', + }, + ); - return response.json as {}; - } else { - return this.notifications.dismissNotification(groupKey); + return response.json; } + + return this.notifications.dismissNotification(groupKey); }, /** @@ -3555,9 +3932,9 @@ class PlApiClient { const response = await this.request(`/api/v2/notifications/${groupKey}/accounts`); return v.parse(filteredArray(accountSchema), response.json); - } else { - return (await (this.groupedNotifications.getNotificationGroup(groupKey))).accounts; } + + return (await this.groupedNotifications.getNotificationGroup(groupKey)).accounts; }, /** @@ -3571,14 +3948,25 @@ class PlApiClient { if (this.features.groupedNotifications) { const response = await this.request('/api/v2/notifications/unread_count', { params }); - return v.parse(v.object({ - count: v.number(), - }), response.json); - } else { - return this.notifications.getUnreadNotificationCount( - pick(params || {}, ['max_id', 'since_id', 'limit', 'min_id', 'types', 'exclude_types', 'account_id']), + return v.parse( + v.object({ + count: v.number(), + }), + response.json, ); } + + return this.notifications.getUnreadNotificationCount( + pick(params || {}, [ + 'max_id', + 'since_id', + 'limit', + 'min_id', + 'types', + 'exclude_types', + 'account_id', + ]), + ); }, }; @@ -3589,7 +3977,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/push/#create} */ createSubscription: async (params: CreatePushNotificationsSubscriptionParams) => { - const response = await this.request('/api/v1/push/subscription', { method: 'POST', body: params }); + const response = await this.request('/api/v1/push/subscription', { + method: 'POST', + body: params, + }); return v.parse(webPushSubscriptionSchema, response.json); }, @@ -3611,7 +4002,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/push/#update} */ updateSubscription: async (params: UpdatePushNotificationsSubscriptionParams) => { - const response = await this.request('/api/v1/push/subscription', { method: 'PUT', body: params }); + const response = await this.request('/api/v1/push/subscription', { + method: 'PUT', + body: params, + }); return v.parse(webPushSubscriptionSchema, response.json); }, @@ -3622,9 +4016,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/push/#delete} */ deleteSubscription: async () => { - const response = await this.request('/api/v1/push/subscription', { method: 'DELETE' }); + const response = await this.request('/api/v1/push/subscription', { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, }; @@ -3660,7 +4056,10 @@ class PlApiClient { * @see {@link https://github.com/mkljczk/pl/blob/fork/docs/development/API/pleroma_api.md#apiv1pleromasearchlocation} */ searchLocation: async (q: string, meta?: RequestMeta) => { - const response = await this.request('/api/v1/pleroma/search/location', { ...meta, params: { q } }); + const response = await this.request('/api/v1/pleroma/search/location', { + ...meta, + params: { q }, + }); return v.parse(filteredArray(locationSchema), response.json); }, @@ -3705,12 +4104,17 @@ class PlApiClient { getInstanceActivity: async () => { const response = await this.request('/api/v1/instance/activity'); - return v.parse(v.array(v.object({ - week: v.string(), - statuses: v.pipe(v.unknown(), v.transform(String)), - logins: v.pipe(v.unknown(), v.transform(String)), - registrations: v.pipe(v.unknown(), v.transform(String)), - })), response.json); + return v.parse( + v.array( + v.object({ + week: v.string(), + statuses: v.pipe(v.unknown(), v.transform(String)), + logins: v.pipe(v.unknown(), v.transform(String)), + registrations: v.pipe(v.unknown(), v.transform(String)), + }), + ), + response.json, + ); }, /** @@ -3758,10 +4162,15 @@ class PlApiClient { target: Array<{ code: string; name: string }>; }>('/api/v1/akkoma/translation/languages'); - return Object.fromEntries(response.json.source.map(source => [ - source.code.toLocaleLowerCase(), - response.json.target.map(lang => lang.code).filter(lang => lang !== source.code).map(lang => lang.toLocaleLowerCase()), - ])); + return Object.fromEntries( + response.json.source.map((source) => [ + source.code.toLocaleLowerCase(), + response.json.target + .map((lang) => lang.code) + .filter((lang) => lang !== source.code) + .map((lang) => lang.toLocaleLowerCase()), + ]), + ); } const response = await this.request('/api/v1/instance/translation_languages'); @@ -3803,7 +4212,8 @@ class PlApiClient { switch (this.features.version.software) { case MITRA: - response = (await this.request('/api/v1/accounts/verify_credentials')).json?.client_config; + response = (await this.request('/api/v1/accounts/verify_credentials')).json + ?.client_config; break; default: response = (await this.request('/api/pleroma/frontend_configurations')).json; @@ -3835,10 +4245,10 @@ class PlApiClient { }, /** - * View a specific version of the terms of service - * Obtain the contents of this server's terms of service, for a specified date, if configured. - * @see {@link https://docs.joinmastodon.org/methods/instance/terms_of_service_date} - */ + * View a specific version of the terms of service + * Obtain the contents of this server's terms of service, for a specified date, if configured. + * @see {@link https://docs.joinmastodon.org/methods/instance/terms_of_service_date} + */ getInstanceTermsOfServiceForDate: async (date: string) => { const response = await this.request(`/api/v1/instance/terms_of_service/${date}`); @@ -3854,7 +4264,9 @@ class PlApiClient { */ getTrendingTags: async (params?: GetTrendingTags) => { const response = await this.request( - this.features.version.software === PIXELFED ? '/api/v1.1/discover/posts/hashtags' : '/api/v1/trends/tags', + this.features.version.software === PIXELFED + ? '/api/v1.1/discover/posts/hashtags' + : '/api/v1/trends/tags', { params }, ); @@ -3868,7 +4280,9 @@ class PlApiClient { */ getTrendingStatuses: async (params?: GetTrendingStatuses) => { const response = await this.request( - this.features.version.software === PIXELFED ? '/api/pixelfed/v2/discover/posts/trending' : '/api/v1/trends/statuses', + this.features.version.software === PIXELFED + ? '/api/pixelfed/v2/discover/posts/trending' + : '/api/v1/trends/statuses', { params }, ); @@ -3905,9 +4319,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/announcements/#dismiss} */ dismissAnnouncements: async (announcementId: string) => { - const response = await this.request(`/api/v1/announcements/${announcementId}`, { method: 'POST' }); + const response = await this.request(`/api/v1/announcements/${announcementId}`, { + method: 'POST', + }); - return response.json as {}; + return response.json; }, /** @@ -3916,9 +4332,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/announcements/#put-reactions} */ addAnnouncementReaction: async (announcementId: string, emoji: string) => { - const response = await this.request(`/api/v1/announcements/${announcementId}/reactions/${emoji}`, { method: 'PUT' }); + const response = await this.request( + `/api/v1/announcements/${announcementId}/reactions/${emoji}`, + { method: 'PUT' }, + ); - return response.json as {}; + return response.json; }, /** @@ -3927,9 +4346,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/announcements/#delete-reactions} */ deleteAnnouncementReaction: async (announcementId: string, emoji: string) => { - const response = await this.request(`/api/v1/announcements/${announcementId}/reactions/${emoji}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/announcements/${announcementId}/reactions/${emoji}`, + { method: 'DELETE' }, + ); - return response.json as {}; + return response.json; }, }; @@ -3954,26 +4376,32 @@ class PlApiClient { * View all accounts, optionally matching certain criteria for filtering, up to 100 at a time. * @see {@link https://docs.joinmastodon.org/methods/admin/accounts/#v2} */ - getAccounts: async (params?: AdminGetAccountsParams) => { + getAccounts: (params?: AdminGetAccountsParams) => { if (this.features.mastodonAdminV2) { return this.#paginatedGet('/api/v2/admin/accounts', { params }, adminAccountSchema); - } else { - return this.#paginatedPleromaAccounts(params ? { - query: params.username, - name: params.display_name, - email: params.email, - filters: [ - params.origin === 'local' && 'local', - params.origin === 'remote' && 'external', - params.status === 'active' && 'active', - params.status === 'pending' && 'need_approval', - params.status === 'disabled' && 'deactivated', - params.permissions === 'staff' && 'is_admin', - params.permissions === 'staff' && 'is_moderator', - ].filter(filter => filter).join(','), - page_size: 100, - } : { page_size: 100 }); } + + return this.#paginatedPleromaAccounts( + params + ? { + query: params.username, + name: params.display_name, + email: params.email, + filters: [ + params.origin === 'local' && 'local', + params.origin === 'remote' && 'external', + params.status === 'active' && 'active', + params.status === 'pending' && 'need_approval', + params.status === 'disabled' && 'deactivated', + params.permissions === 'staff' && 'is_admin', + params.permissions === 'staff' && 'is_moderator', + ] + .filter((filter) => filter) + .join(','), + page_size: 100, + } + : { page_size: 100 }, + ); }, /** @@ -4002,11 +4430,16 @@ class PlApiClient { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/accounts/${accountId}/approve`, { method: 'POST' }); + response = await this.request(`/api/v1/admin/accounts/${accountId}/approve`, { + method: 'POST', + }); } else { const account = await this.admin.accounts.getAccount(accountId)!; - response = await this.request('/api/v1/pleroma/admin/users/approve', { method: 'PATCH', body: { nicknames: [account.username] } }); + response = await this.request('/api/v1/pleroma/admin/users/approve', { + method: 'PATCH', + body: { nicknames: [account.username] }, + }); response.json = response.json?.users?.[0]; } @@ -4022,13 +4455,18 @@ class PlApiClient { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/accounts/${accountId}/reject`, { method: 'POST' }); + response = await this.request(`/api/v1/admin/accounts/${accountId}/reject`, { + method: 'POST', + }); } else { const account = await this.admin.accounts.getAccount(accountId)!; - response = await this.request('/api/v1/pleroma/admin/users', { method: 'DELETE', body: { - nicknames: [account.username], - } }); + response = await this.request('/api/v1/pleroma/admin/users', { + method: 'DELETE', + body: { + nicknames: [account.username], + }, + }); } return v.safeParse(adminAccountSchema, response.json).output || {}; @@ -4038,12 +4476,18 @@ class PlApiClient { * Requires features{@link Features.pleromaAdminAccounts}. */ createAccount: async (params: AdminCreateAccountParams) => { - const response = await this.request('/api/v1/pleroma/admin/users', { method: 'POST', body: { users: [params] } }); + const response = await this.request('/api/v1/pleroma/admin/users', { + method: 'POST', + body: { users: [params] }, + }); - return v.parse(v.object({ - nickname: v.string(), - email: v.string(), - }), response.json[0]?.data); + return v.parse( + v.object({ + nickname: v.string(), + email: v.string(), + }), + response.json[0]?.data, + ); }, /** @@ -4055,13 +4499,18 @@ class PlApiClient { let response; if (this.features.mastodonAdmin || this.features.version.software === MITRA) { - response = await this.request(`/api/v1/admin/accounts/${accountId}`, { method: 'DELETE' }); + response = await this.request(`/api/v1/admin/accounts/${accountId}`, { + method: 'DELETE', + }); } else { const account = await this.admin.accounts.getAccount(accountId)!; - response = await this.request('/api/v1/pleroma/admin/users', { method: 'DELETE', body: { - nicknames: [account.username], - } }); + response = await this.request('/api/v1/pleroma/admin/users', { + method: 'DELETE', + body: { + nicknames: [account.username], + }, + }); } return v.safeParse(adminAccountSchema, response.json).output || {}; @@ -4072,18 +4521,26 @@ class PlApiClient { * Perform an action against an account and log this action in the moderation history. Also resolves any open reports against this account. * @see {@link https://docs.joinmastodon.org/methods/admin/accounts/#action} */ - performAccountAction: async (accountId: string, type: AdminAccountAction, params?: AdminPerformAccountActionParams) => { + performAccountAction: async ( + accountId: string, + type: AdminAccountAction, + params?: AdminPerformAccountActionParams, + ) => { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/accounts/${accountId}/action`, { body: { ...params, type } }); + response = await this.request(`/api/v1/admin/accounts/${accountId}/action`, { + body: { ...params, type }, + }); } else { const account = await this.admin.accounts.getAccount(accountId)!; switch (type) { case 'disable': case 'suspend': - response = await this.request('/api/v1/pleroma/admin/users/deactivate', { body: { nicknames: [account.username] } }); + response = await this.request('/api/v1/pleroma/admin/users/deactivate', { + body: { nicknames: [account.username] }, + }); break; default: response = { json: {} }; @@ -4092,7 +4549,7 @@ class PlApiClient { if (params?.report_id) await this.admin.reports.resolveReport(params.report_id); } - return response.json as {}; + return response.json; }, /** @@ -4104,10 +4561,15 @@ class PlApiClient { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/accounts/${accountId}/enable`, { method: 'POST' }); + response = await this.request(`/api/v1/admin/accounts/${accountId}/enable`, { + method: 'POST', + }); } else { const account = await this.admin.accounts.getAccount(accountId)!; - response = await this.request('/api/v1/pleroma/admin/users/activate', { method: 'PATCH', body: { nicknames: [account.username] } }); + response = await this.request('/api/v1/pleroma/admin/users/activate', { + method: 'PATCH', + body: { nicknames: [account.username] }, + }); response.json = response.json?.users?.[0]; } @@ -4120,7 +4582,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/accounts/#unsilence} */ unsilenceAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/admin/accounts/${accountId}/unsilence`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/accounts/${accountId}/unsilence`, { + method: 'POST', + }); return v.parse(adminAccountSchema, response.json); }, @@ -4134,11 +4598,16 @@ class PlApiClient { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/accounts/${accountId}/unsuspend`, { method: 'POST' }); + response = await this.request(`/api/v1/admin/accounts/${accountId}/unsuspend`, { + method: 'POST', + }); } else { const { account } = await this.admin.accounts.getAccount(accountId)!; - response = await this.request('/api/v1/pleroma/admin/users/activate', { method: 'PATCH', body: { nicknames: [account!.acct] } }); + response = await this.request('/api/v1/pleroma/admin/users/activate', { + method: 'PATCH', + body: { nicknames: [account!.acct] }, + }); response.json = response.json?.users?.[0]; } @@ -4151,7 +4620,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/accounts/#unsensitive} */ unsensitiveAccount: async (accountId: string) => { - const response = await this.request(`/api/v1/admin/accounts/${accountId}/unsensitive`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/accounts/${accountId}/unsensitive`, { + method: 'POST', + }); return v.parse(adminAccountSchema, response.json); }, @@ -4162,16 +4633,19 @@ class PlApiClient { promoteToAdmin: async (accountId: string) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - await this.request('/api/v1/pleroma/admin/users/permission_group/moderator', { + await this.request('/api/v1/pleroma/admin/users/permission_group/moderator', { method: 'DELETE', body: { nicknames: [account!.acct] }, }); - const response = await this.request('/api/v1/pleroma/admin/users/permission_group/admin', { - method: 'POST', - body: { nicknames: [account!.acct] }, - }); + const response = await this.request( + '/api/v1/pleroma/admin/users/permission_group/admin', + { + method: 'POST', + body: { nicknames: [account!.acct] }, + }, + ); - return response.json as {}; + return response.json; }, /** @@ -4180,12 +4654,19 @@ class PlApiClient { promoteToModerator: async (accountId: string) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - await this.request('/api/v1/pleroma/admin/users/permission_group/admin', { - method: 'DELETE', body: { nicknames: [account!.acct] } }); - const response = await this.request('/api/v1/pleroma/admin/users/permission_group/moderator', { - method: 'POST', body: { nicknames: [account!.acct] } }); + await this.request('/api/v1/pleroma/admin/users/permission_group/admin', { + method: 'DELETE', + body: { nicknames: [account!.acct] }, + }); + const response = await this.request( + '/api/v1/pleroma/admin/users/permission_group/moderator', + { + method: 'POST', + body: { nicknames: [account!.acct] }, + }, + ); - return response.json as {}; + return response.json; }, /** @@ -4194,16 +4675,19 @@ class PlApiClient { demoteToUser: async (accountId: string) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - await this.request('/api/v1/pleroma/admin/users/permission_group/moderator', { - method: 'DELETE', - body: { nicknames: [account!.acct] }, - }); - const response = await this.request('/api/v1/pleroma/admin/users/permission_group/admin', { + await this.request('/api/v1/pleroma/admin/users/permission_group/moderator', { method: 'DELETE', body: { nicknames: [account!.acct] }, }); + const response = await this.request( + '/api/v1/pleroma/admin/users/permission_group/admin', + { + method: 'DELETE', + body: { nicknames: [account!.acct] }, + }, + ); - return response.json as {}; + return response.json; }, /** @@ -4215,12 +4699,12 @@ class PlApiClient { suggestUser: async (accountId: string) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - const response = await this.request('/api/v1/pleroma/admin/users/suggest', { + const response = await this.request('/api/v1/pleroma/admin/users/suggest', { method: 'PATCH', body: { nicknames: [account!.acct] }, }); - return response.json as {}; + return response.json; }, /** @@ -4232,12 +4716,12 @@ class PlApiClient { unsuggestUser: async (accountId: string) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - const response = await this.request('/api/v1/pleroma/admin/users/unsuggest', { + const response = await this.request('/api/v1/pleroma/admin/users/unsuggest', { method: 'PATCH', body: { nicknames: [account!.acct] }, }); - return response.json as {}; + return response.json; }, /** @@ -4249,12 +4733,12 @@ class PlApiClient { tagUser: async (accountId: string, tags: Array) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - const response = await this.request('/api/v1/pleroma/admin/users/tag', { + const response = await this.request('/api/v1/pleroma/admin/users/tag', { method: 'PUT', body: { nicknames: [account!.acct], tags }, }); - return response.json as {}; + return response.json; }, /** @@ -4266,12 +4750,12 @@ class PlApiClient { untagUser: async (accountId: string, tags: Array) => { const { account } = await this.admin.accounts.getAccount(accountId)!; - const response = await this.request('/api/v1/pleroma/admin/users/tag', { + const response = await this.request('/api/v1/pleroma/admin/users/tag', { method: 'DELETE', body: { nicknames: [account!.acct], tags }, }); - return response.json as {}; + return response.json; }, }, @@ -4330,11 +4814,14 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/domain_blocks/#delete} */ deleteDomainBlock: async (domainBlockId: string) => { - const response = await this.request(`/api/v1/admin/domain_blocks/${domainBlockId}`, { - method: 'DELETE', - }); + const response = await this.request( + `/api/v1/admin/domain_blocks/${domainBlockId}`, + { + method: 'DELETE', + }, + ); - return response.json as {}; + return response.json; }, }, @@ -4345,19 +4832,23 @@ class PlApiClient { * View information about all reports. * @see {@link https://docs.joinmastodon.org/methods/admin/reports/#get} */ - getReports: async (params?: AdminGetReportsParams) => { + getReports: (params?: AdminGetReportsParams) => { if (this.features.mastodonAdmin) { - if (params?.resolved === undefined && (this.features.version.software === GOTOSOCIAL || this.features.version.software === PLEROMA)) { + if ( + params?.resolved === undefined && + (this.features.version.software === GOTOSOCIAL || + this.features.version.software === PLEROMA) + ) { if (!params) params = {}; params.resolved = false; } return this.#paginatedGet('/api/v1/admin/reports', { params }, adminReportSchema); - } else { - return this.#paginatedPleromaReports({ - state: params?.resolved === true ? 'resolved' : 'open', - page_size: params?.limit || 100, - }); } + + return this.#paginatedPleromaReports({ + state: params?.resolved === true ? 'resolved' : 'open', + page_size: params?.limit || 100, + }); }, /** @@ -4381,7 +4872,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/reports/#update} */ updateReport: async (reportId: string, params: AdminUpdateReportParams) => { - const response = await this.request(`/api/v1/admin/reports/${reportId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/admin/reports/${reportId}`, { + method: 'PUT', + body: params, + }); return v.parse(adminReportSchema, response.json); }, @@ -4392,7 +4886,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/reports/#assign_to_self} */ assignReportToSelf: async (reportId: string) => { - const response = await this.request(`/api/v1/admin/reports/${reportId}/assign_to_self`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/reports/${reportId}/assign_to_self`, { + method: 'POST', + }); return v.parse(adminReportSchema, response.json); }, @@ -4403,7 +4899,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/reports/#unassign} */ unassignReport: async (reportId: string) => { - const response = await this.request(`/api/v1/admin/reports/${reportId}/unassign`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/reports/${reportId}/unassign`, { + method: 'POST', + }); return v.parse(adminReportSchema, response.json); }, @@ -4420,7 +4918,10 @@ class PlApiClient { resolveReport: async (reportId: string, action_taken_comment?: string) => { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/reports/${reportId}/resolve`, { method: 'POST', body: { action_taken_comment } }); + response = await this.request(`/api/v1/admin/reports/${reportId}/resolve`, { + method: 'POST', + body: { action_taken_comment }, + }); } else { response = await this.request(`/api/v1/pleroma/admin/reports/${reportId}`, { method: 'PATCH', @@ -4439,7 +4940,9 @@ class PlApiClient { reopenReport: async (reportId: string) => { let response; if (this.features.mastodonAdmin) { - response = await this.request(`/api/v1/admin/reports/${reportId}/reopen`, { method: 'POST' }); + response = await this.request(`/api/v1/admin/reports/${reportId}/reopen`, { + method: 'POST', + }); } else { response = await this.request(`/api/v1/pleroma/admin/reports/${reportId}`, { method: 'PATCH', @@ -4460,20 +4963,21 @@ class PlApiClient { * Requires features{@link Features.pleromaAdminStatuses}. * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminstatuses} */ - getStatuses: async (params?: AdminGetStatusesParams) => this.#paginatedPleromaStatuses({ - page_size: params?.limit || 100, - page: 1, - local_only: params?.local_only, - with_reblogs: params?.with_reblogs, - godmode: params?.with_private, - }), + getStatuses: (params?: AdminGetStatusesParams) => + this.#paginatedPleromaStatuses({ + page_size: params?.limit || 100, + page: 1, + local_only: params?.local_only, + with_reblogs: params?.with_reblogs, + godmode: params?.with_private, + }), /** * Show status by id * * Requires features{@link Features.pleromaAdminStatuses}. * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminstatusesid} - */ + */ getStatus: async (statusId: string) => { const response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}`); @@ -4487,7 +4991,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#put-apiv1pleromaadminstatusesid} */ updateStatus: async (statusId: string, params: AdminUpdateStatusParams) => { - const response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}`, { + method: 'PUT', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -4502,19 +5009,29 @@ class PlApiClient { let response; if (this.features.version.software === MITRA) { - response = await this.request(`/api/v1/admin/posts/${statusId}`, { method: 'DELETE' }); + response = await this.request(`/api/v1/admin/posts/${statusId}`, { + method: 'DELETE', + }); } else { - response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}`, { method: 'DELETE' }); + response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}`, { + method: 'DELETE', + }); } - return response.json as {}; + return response.json; }, /** * Requires features{@link Features.pleromaAdminStatusesRedact} */ - redactStatus: async (statusId: string, params: EditStatusParams & { overwrite?: boolean }) => { - const response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}/redact`, { method: 'PATCH', body: params }); + redactStatus: async ( + statusId: string, + params: EditStatusParams & { overwrite?: boolean }, + ) => { + const response = await this.request(`/api/v1/pleroma/admin/statuses/${statusId}/redact`, { + method: 'PATCH', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -4570,15 +5087,21 @@ class PlApiClient { * List all canonical email blocks * @see {@link https://docs.joinmastodon.org/methods/admin/canonical_email_blocks/#get} */ - getCanonicalEmailBlocks: async (params?: AdminGetCanonicalEmailBlocks) => - this.#paginatedGet('/api/v1/admin/canonical_email_blocks', { params }, adminCanonicalEmailBlockSchema), + getCanonicalEmailBlocks: (params?: AdminGetCanonicalEmailBlocks) => + this.#paginatedGet( + '/api/v1/admin/canonical_email_blocks', + { params }, + adminCanonicalEmailBlockSchema, + ), /** * Show a single canonical email block * @see {@link https://docs.joinmastodon.org/methods/admin/canonical_email_blocks/#get-one} */ getCanonicalEmailBlock: async (canonicalEmailBlockId: string) => { - const response = await this.request(`/api/v1/admin/canonical_email_blocks/${canonicalEmailBlockId}`); + const response = await this.request( + `/api/v1/admin/canonical_email_blocks/${canonicalEmailBlockId}`, + ); return v.parse(adminCanonicalEmailBlockSchema, response.json); }, @@ -4589,7 +5112,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/canonical_email_blocks/#test} */ testCanonicalEmailBlock: async (email: string) => { - const response = await this.request('/api/v1/admin/canonical_email_blocks/test', { method: 'POST', body: { email } }); + const response = await this.request('/api/v1/admin/canonical_email_blocks/test', { + method: 'POST', + body: { email }, + }); return v.parse(filteredArray(adminCanonicalEmailBlockSchema), response.json); }, @@ -4599,7 +5125,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/canonical_email_blocks/#create} */ createCanonicalEmailBlock: async (email: string, canonical_email_hash?: string) => { - const response = await this.request('/api/v1/admin/canonical_email_blocks', { method: 'POST', body: { email, canonical_email_hash } }); + const response = await this.request('/api/v1/admin/canonical_email_blocks', { + method: 'POST', + body: { email, canonical_email_hash }, + }); return v.parse(filteredArray(adminCanonicalEmailBlockSchema), response.json); }, @@ -4609,9 +5138,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/canonical_email_blocks/#delete} */ deleteCanonicalEmailBlock: async (canonicalEmailBlockId: string) => { - const response = await this.request(`/api/v1/admin/canonical_email_blocks/${canonicalEmailBlockId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/admin/canonical_email_blocks/${canonicalEmailBlockId}`, + { method: 'DELETE' }, + ); - return response.json as {}; + return response.json; }, }, @@ -4623,7 +5155,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/dimensions/#get} */ getDimensions: async (keys: AdminDimensionKey[], params?: AdminGetDimensionsParams) => { - const response = await this.request('/api/v1/admin/dimensions', { method: 'POST', params: { ...params, keys } }); + const response = await this.request('/api/v1/admin/dimensions', { + method: 'POST', + params: { ...params, keys }, + }); return v.parse(filteredArray(adminDimensionSchema), response.json); }, @@ -4656,7 +5191,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/domain_allows/#create} */ createDomainAllow: async (domain: string) => { - const response = await this.request('/api/v1/admin/domain_allows', { method: 'POST', body: { domain } }); + const response = await this.request('/api/v1/admin/domain_allows', { + method: 'POST', + body: { domain }, + }); return v.parse(adminDomainAllowSchema, response.json); }, @@ -4667,9 +5205,14 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/domain_allows/#delete} */ deleteDomainAllow: async (domainAllowId: string) => { - const response = await this.request(`/api/v1/admin/domain_allows/${domainAllowId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/admin/domain_allows/${domainAllowId}`, + { + method: 'DELETE', + }, + ); - return response.json as {}; + return response.json; }, }, @@ -4681,7 +5224,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/email_domain_blocks/#get} */ getEmailDomainBlocks: (params?: AdminGetEmailDomainBlocksParams) => - this.#paginatedGet('/api/v1/admin/email_domain_blocks', { params }, adminEmailDomainBlockSchema), + this.#paginatedGet( + '/api/v1/admin/email_domain_blocks', + { params }, + adminEmailDomainBlockSchema, + ), /** * Get a single blocked email domain @@ -4689,7 +5236,9 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/email_domain_blocks/#get-one} */ getEmailDomainBlock: async (emailDomainBlockId: string) => { - const response = await this.request(`/api/v1/admin/email_domain_blocks/${emailDomainBlockId}`); + const response = await this.request( + `/api/v1/admin/email_domain_blocks/${emailDomainBlockId}`, + ); return v.parse(adminEmailDomainBlockSchema, response.json); }, @@ -4700,7 +5249,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/email_domain_blocks/#create} */ createEmailDomainBlock: async (domain: string) => { - const response = await this.request('/api/v1/admin/email_domain_blocks', { method: 'POST', body: { domain } }); + const response = await this.request('/api/v1/admin/email_domain_blocks', { + method: 'POST', + body: { domain }, + }); return v.parse(adminEmailDomainBlockSchema, response.json); }, @@ -4711,9 +5263,12 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/email_domain_blocks/#delete} */ deleteEmailDomainBlock: async (emailDomainBlockId: string) => { - const response = await this.request(`/api/v1/admin/email_domain_blocks/${emailDomainBlockId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/admin/email_domain_blocks/${emailDomainBlockId}`, + { method: 'DELETE' }, + ); - return response.json as {}; + return response.json; }, }, @@ -4744,7 +5299,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/ip_blocks/#create} */ createIpBlock: async (params: AdminCreateIpBlockParams) => { - const response = await this.request('/api/v1/admin/ip_blocks', { method: 'POST', body: params }); + const response = await this.request('/api/v1/admin/ip_blocks', { + method: 'POST', + body: params, + }); return v.parse(adminIpBlockSchema, response.json); }, @@ -4755,7 +5313,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/ip_blocks/#update} */ updateIpBlock: async (ipBlockId: string, params: AdminCreateIpBlockParams) => { - const response = await this.request(`/api/v1/admin/ip_blocks/${ipBlockId}`, { method: 'POST', body: params }); + const response = await this.request(`/api/v1/admin/ip_blocks/${ipBlockId}`, { + method: 'POST', + body: params, + }); return v.parse(adminIpBlockSchema, response.json); }, @@ -4766,9 +5327,11 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/ip_blocks/#delete} */ deleteIpBlock: async (ipBlockId: string) => { - const response = await this.request(`/api/v1/admin/ip_blocks/${ipBlockId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/admin/ip_blocks/${ipBlockId}`, { + method: 'DELETE', + }); - return response.json as {}; + return response.json; }, }, @@ -4779,8 +5342,16 @@ class PlApiClient { * Obtain quantitative metrics about the server. * @see {@link https://docs.joinmastodon.org/methods/admin/measures/#get} */ - getMeasures: async (keys: AdminMeasureKey[], start_at: string, end_at: string, params?: AdminGetMeasuresParams) => { - const response = await this.request('/api/v1/admin/measures', { method: 'POST', params: { ...params, keys, start_at, end_at } }); + getMeasures: async ( + keys: AdminMeasureKey[], + start_at: string, + end_at: string, + params?: AdminGetMeasuresParams, + ) => { + const response = await this.request('/api/v1/admin/measures', { + method: 'POST', + params: { ...params, keys, start_at, end_at }, + }); return v.parse(filteredArray(adminMeasureSchema), response.json); }, @@ -4795,7 +5366,10 @@ class PlApiClient { * @see {@link https://docs.joinmastodon.org/methods/admin/retention/#create} */ getRetention: async (start_at: string, end_at: string, frequency: 'day' | 'month') => { - const response = await this.request('/api/v1/admin/retention', { method: 'POST', params: { start_at, end_at, frequency } }); + const response = await this.request('/api/v1/admin/retention', { + method: 'POST', + params: { start_at, end_at, frequency }, + }); return v.parse(filteredArray(adminCohortSchema), response.json); }, @@ -4808,14 +5382,22 @@ class PlApiClient { * Requires features{@link Features.pleromaAdminAnnouncements}. * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminannouncements} */ - getAnnouncements: async (params?: AdminGetAnnouncementsParams): Promise> => { + getAnnouncements: async ( + params?: AdminGetAnnouncementsParams, + ): Promise> => { const response = await this.request('/api/v1/pleroma/admin/announcements', { params }); const items = v.parse(filteredArray(adminAnnouncementSchema), response.json); return { previous: null, - next: items.length ? () => this.admin.announcements.getAnnouncements({ ...params, offset: (params?.offset || 0) + items.length }) : null, + next: items.length + ? () => + this.admin.announcements.getAnnouncements({ + ...params, + offset: (params?.offset || 0) + items.length, + }) + : null, items, partial: false, }; @@ -4828,7 +5410,9 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminannouncementsid} */ getAnnouncement: async (announcementId: string) => { - const response = await this.request(`/api/v1/pleroma/admin/announcements/${announcementId}`); + const response = await this.request( + `/api/v1/pleroma/admin/announcements/${announcementId}`, + ); return v.parse(adminAnnouncementSchema, response.json); }, @@ -4840,7 +5424,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#post-apiv1pleromaadminannouncements} */ createAnnouncement: async (params: AdminCreateAnnouncementParams) => { - const response = await this.request('/api/v1/pleroma/admin/announcements', { method: 'POST', body: params }); + const response = await this.request('/api/v1/pleroma/admin/announcements', { + method: 'POST', + body: params, + }); return v.parse(adminAnnouncementSchema, response.json); }, @@ -4852,7 +5439,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#patch-apiv1pleromaadminannouncementsid} */ updateAnnouncement: async (announcementId: string, params: AdminUpdateAnnouncementParams) => { - const response = await this.request(`/api/v1/pleroma/admin/announcements/${announcementId}`, { method: 'PATCH', body: params }); + const response = await this.request( + `/api/v1/pleroma/admin/announcements/${announcementId}`, + { method: 'PATCH', body: params }, + ); return v.parse(adminAnnouncementSchema, response.json); }, @@ -4864,9 +5454,12 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#delete-apiv1pleromaadminannouncementsid} */ deleteAnnouncement: async (announcementId: string) => { - const response = await this.request(`/api/v1/pleroma/admin/announcements/${announcementId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/pleroma/admin/announcements/${announcementId}`, + { method: 'DELETE' }, + ); - return response.json as {}; + return response.json; }, }, @@ -4888,7 +5481,10 @@ class PlApiClient { * Requires features{@link Features.domains}. */ createDomain: async (params: AdminCreateDomainParams) => { - const response = await this.request('/api/v1/pleroma/admin/domains', { method: 'POST', body: params }); + const response = await this.request('/api/v1/pleroma/admin/domains', { + method: 'POST', + body: params, + }); return v.parse(adminDomainSchema, response.json); }, @@ -4899,7 +5495,10 @@ class PlApiClient { * Requires features{@link Features.domains}. */ updateDomain: async (domainId: string, isPublic: boolean) => { - const response = await this.request(`/api/v1/pleroma/admin/domains/${domainId}`, { method: 'PATCH', body: { public: isPublic } }); + const response = await this.request(`/api/v1/pleroma/admin/domains/${domainId}`, { + method: 'PATCH', + body: { public: isPublic }, + }); return v.parse(adminDomainSchema, response.json); }, @@ -4910,9 +5509,14 @@ class PlApiClient { * Requires features{@link Features.domains}. */ deleteDomain: async (domainId: string) => { - const response = await this.request(`/api/v1/pleroma/admin/domains/${domainId}`, { method: 'DELETE' }); + const response = await this.request( + `/api/v1/pleroma/admin/domains/${domainId}`, + { + method: 'DELETE', + }, + ); - return response.json as {}; + return response.json; }, }, @@ -4922,15 +5526,30 @@ class PlApiClient { * * Requires features{@link Features.pleromaAdminModerationLog}. * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminmoderation_log} - */ - getModerationLog: async ({ limit, ...params }: AdminGetModerationLogParams = {}): Promise> => { - const response = await this.request('/api/v1/pleroma/admin/moderation_log', { params: { page_size: limit, ...params } }); + */ + getModerationLog: async ({ limit, ...params }: AdminGetModerationLogParams = {}): Promise< + PaginatedResponse + > => { + const response = await this.request('/api/v1/pleroma/admin/moderation_log', { + params: { page_size: limit, ...params }, + }); const items = v.parse(filteredArray(adminModerationLogEntrySchema), response.json.items); return { - previous: (params.page && params.page > 1) ? () => this.admin.moderationLog.getModerationLog({ ...params, page: params.page! - 1 }) : null, - next: response.json.total > (params.page || 1) * (limit || 50) ? () => this.admin.moderationLog.getModerationLog({ ...params, page: (params.page || 1) + 1 }) : null, + previous: + params.page && params.page > 1 + ? () => + this.admin.moderationLog.getModerationLog({ ...params, page: params.page! - 1 }) + : null, + next: + response.json.total > (params.page || 1) * (limit || 50) + ? () => + this.admin.moderationLog.getModerationLog({ + ...params, + page: (params.page || 1) + 1, + }) + : null, items, partial: response.status === 206, }; @@ -4957,7 +5576,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#post-apiv1pleromaadminrelay} */ followRelay: async (relayUrl: string) => { - const response = await this.request('/api/v1/pleroma/admin/relay', { method: 'POST', body: { relay_url: relayUrl } }); + const response = await this.request('/api/v1/pleroma/admin/relay', { + method: 'POST', + body: { relay_url: relayUrl }, + }); return v.parse(adminRelaySchema, response.json); }, @@ -4969,7 +5591,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#delete-apiv1pleromaadminrelay} */ unfollowRelay: async (relayUrl: string, force = false) => { - const response = await this.request('/api/v1/pleroma/admin/relay', { method: 'DELETE', body: { relay_url: relayUrl, force } }); + const response = await this.request('/api/v1/pleroma/admin/relay', { + method: 'DELETE', + body: { relay_url: relayUrl, force }, + }); return v.parse(adminRelaySchema, response.json); }, @@ -4983,7 +5608,11 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminrules} */ getRules: async () => { - const response = await this.request(this.features.version.software === GOTOSOCIAL ? '/api/v1/admin/instance/rules' : '/api/v1/pleroma/admin/rules'); + const response = await this.request( + this.features.version.software === GOTOSOCIAL + ? '/api/v1/admin/instance/rules' + : '/api/v1/pleroma/admin/rules', + ); return v.parse(filteredArray(adminRuleSchema), response.json); }, @@ -4996,7 +5625,9 @@ class PlApiClient { */ createRule: async (params: AdminCreateRuleParams) => { const response = await this.request( - this.features.version.software === GOTOSOCIAL ? '/api/v1/admin/instance/rules' : '/api/v1/pleroma/admin/rules', + this.features.version.software === GOTOSOCIAL + ? '/api/v1/admin/instance/rules' + : '/api/v1/pleroma/admin/rules', { method: 'POST', body: params }, ); @@ -5025,12 +5656,12 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#delete-apiv1pleromaadminrulesid} */ deleteRule: async (ruleId: string) => { - const response = await this.request( + const response = await this.request( `/api/v1/${this.features.version.software === GOTOSOCIAL ? 'admin/instance' : 'pleroma/admin'}/rules/${ruleId}`, { method: 'DELETE' }, ); - return response.json as {}; + return response.json; }, }, @@ -5042,7 +5673,10 @@ class PlApiClient { }, updatePleromaConfig: async (params: PleromaConfig['configs']) => { - const response = await this.request('/api/v1/pleroma/admin/config', { method: 'POST', body: { configs: params } }); + const response = await this.request('/api/v1/pleroma/admin/config', { + method: 'POST', + body: { configs: params }, + }); return v.parse(pleromaConfigSchema, response.json); }, @@ -5077,19 +5711,21 @@ class PlApiClient { * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} */ createCustomEmoji: async (params: AdminCreateCustomEmojiParams) => { - const response = await this.request( - '/api/v1/admin/custom_emojis', - { method: 'POST', body: params, contentType: '' }, - ); + const response = await this.request('/api/v1/admin/custom_emojis', { + method: 'POST', + body: params, + contentType: '', + }); return v.parse(adminCustomEmojiSchema, response.json); }, updateCustomEmoji: async (emojiId: string, params: AdminUpdateCustomEmojiParams) => { - const response = await this.request( - `/api/v1/admin/custom_emojis/${emojiId}`, - { method: 'PATCH', body: params, contentType: '' }, - ); + const response = await this.request(`/api/v1/admin/custom_emojis/${emojiId}`, { + method: 'PATCH', + body: params, + contentType: '', + }); return v.parse(adminCustomEmojiSchema, response.json); }, @@ -5101,10 +5737,9 @@ class PlApiClient { * @see {@link https://docs.gotosocial.org/en/latest/api/swagger/} */ deleteCustomEmoji: async (emojiId: string) => { - const response = await this.request( - `/api/v1/admin/custom_emojis/${emojiId}`, - { method: 'DELETE' }, - ); + const response = await this.request(`/api/v1/admin/custom_emojis/${emojiId}`, { + method: 'DELETE', + }); return v.parse(adminCustomEmojiSchema, response.json); }, @@ -5119,18 +5754,21 @@ class PlApiClient { getOembed: async (url: string, maxwidth?: number, maxheight?: number) => { const response = await this.request('/api/oembed', { params: { url, maxwidth, maxheight } }); - return v.parse(v.object({ - type: v.fallback(v.string(), 'rich'), - version: v.fallback(v.string(), ''), - author_name: v.fallback(v.string(), ''), - author_url: v.fallback(v.string(), ''), - provider_name: v.fallback(v.string(), ''), - provider_url: v.fallback(v.string(), ''), - cache_age: v.number(), - html: v.string(), - width: v.fallback(v.nullable(v.number()), null), - height: v.fallback(v.nullable(v.number()), null), - }), response.json); + return v.parse( + v.object({ + type: v.fallback(v.string(), 'rich'), + version: v.fallback(v.string(), ''), + author_name: v.fallback(v.string(), ''), + author_url: v.fallback(v.string(), ''), + provider_name: v.fallback(v.string(), ''), + provider_url: v.fallback(v.string(), ''), + cache_age: v.number(), + html: v.string(), + width: v.fallback(v.nullable(v.number()), null), + height: v.fallback(v.nullable(v.number()), null), + }), + response.json, + ); }, }; @@ -5141,7 +5779,9 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/chats/#creating-or-getting-a-chat} */ createChat: async (accountId: string) => { - const response = await this.request(`/api/v1/pleroma/chats/by-account-id/${accountId}`, { method: 'POST' }); + const response = await this.request(`/api/v1/pleroma/chats/by-account-id/${accountId}`, { + method: 'POST', + }); return v.parse(chatSchema, response.json); }, @@ -5161,7 +5801,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/chats/#marking-a-chat-as-read} */ markChatAsRead: async (chatId: string, last_read_id: string) => { - const response = await this.request(`/api/v1/pleroma/chats/${chatId}/read`, { method: 'POST', body: { last_read_id } }); + const response = await this.request(`/api/v1/pleroma/chats/${chatId}/read`, { + method: 'POST', + body: { last_read_id }, + }); return v.parse(chatSchema, response.json); }, @@ -5172,7 +5815,10 @@ class PlApiClient { * https://docs.pleroma.social/backend/development/API/chats/#marking-a-single-chat-message-as-read */ markChatMessageAsRead: async (chatId: string, chatMessageId: string) => { - const response = await this.request(`/api/v1/pleroma/chats/${chatId}/messages/${chatMessageId}/read`, { method: 'POST' }); + const response = await this.request( + `/api/v1/pleroma/chats/${chatId}/messages/${chatMessageId}/read`, + { method: 'POST' }, + ); return v.parse(chatSchema, response.json); }, @@ -5182,14 +5828,14 @@ class PlApiClient { * This will return a list of chats that you have been involved in, sorted by their last update (so new chats will be at the top). * @see {@link https://docs.pleroma.social/backend/development/API/chats/#getting-a-list-of-chats} */ - getChats: async (params?: GetChatsParams) => + getChats: (params?: GetChatsParams) => this.#paginatedGet('/api/v2/pleroma/chats', { params }, chatSchema), /** * Getting the messages for a Chat * For a given Chat id, you can get the associated messages with */ - getChatMessages: async (chatId: string, params?: GetChatMessagesParams) => + getChatMessages: (chatId: string, params?: GetChatMessagesParams) => this.#paginatedGet(`/api/v1/pleroma/chats/${chatId}/messages`, { params }, chatMessageSchema), /** @@ -5198,7 +5844,10 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/chats/#posting-a-chat-message} */ createChatMessage: async (chatId: string, params: CreateChatMessageParams) => { - const response = await this.request(`/api/v1/pleroma/chats/${chatId}/messages`, { method: 'POST', body: params }); + const response = await this.request(`/api/v1/pleroma/chats/${chatId}/messages`, { + method: 'POST', + body: params, + }); return v.parse(chatMessageSchema, response.json); }, @@ -5209,7 +5858,9 @@ class PlApiClient { * @see {@link https://docs.pleroma.social/backend/development/API/chats/#deleting-a-chat-message} */ deleteChatMessage: async (chatId: string, messageId: string) => { - const response = await this.request(`/api/v1/pleroma/chats/${chatId}/messages/${messageId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/pleroma/chats/${chatId}/messages/${messageId}`, { + method: 'DELETE', + }); return v.parse(chatMessageSchema, response.json); }, @@ -5227,10 +5878,16 @@ class PlApiClient { }; public readonly shoutbox = { - connect: (token: string, { onMessage, onMessages }: { - onMessages: (messages: Array) => void; - onMessage: (message: ShoutMessage) => void; - }) => { + connect: ( + token: string, + { + onMessage, + onMessages, + }: { + onMessages: (messages: Array) => void; + onMessage: (message: ShoutMessage) => void; + }, + ) => { let counter = 2; let intervalId: NodeJS.Timeout; if (this.#shoutSocket) return this.#shoutSocket; @@ -5265,7 +5922,7 @@ class PlApiClient { this.#shoutSocket = { message: (text: string) => { // guess this is meant to be incremented on each call but idk - ws.send(JSON.stringify(['3', `${++counter}`, 'chat:public', 'new_msg', { 'text': text }])); + ws.send(JSON.stringify(['3', `${++counter}`, 'chat:public', 'new_msg', { text: text }])); }, close: () => { ws.close(); @@ -5284,7 +5941,10 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events} */ createEvent: async (params: CreateEventParams) => { - const response = await this.request('/api/v1/pleroma/events', { method: 'POST', body: params }); + const response = await this.request('/api/v1/pleroma/events', { + method: 'POST', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -5294,7 +5954,10 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id} */ editEvent: async (statusId: string, params: EditEventParams) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/pleroma/events/${statusId}`, { + method: 'PUT', + body: params, + }); return v.parse(statusSchema, response.json); }, @@ -5303,32 +5966,50 @@ class PlApiClient { * Gets user's joined events * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-joined_events} */ - getJoinedEvents: async (state?: 'pending' | 'reject' | 'accept', params?: GetJoinedEventsParams) => - this.#paginatedGet('/api/v1/pleroma/events/joined_events', { params: { ...params, state } }, statusSchema), + getJoinedEvents: (state?: 'pending' | 'reject' | 'accept', params?: GetJoinedEventsParams) => + this.#paginatedGet( + '/api/v1/pleroma/events/joined_events', + { params: { ...params, state } }, + statusSchema, + ), /** * Gets event participants * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-participations} */ - getEventParticipations: async (statusId: string, params?: GetEventParticipationsParams) => - this.#paginatedGet(`/api/v1/pleroma/events/${statusId}/participations`, { params }, accountSchema), + getEventParticipations: (statusId: string, params?: GetEventParticipationsParams) => + this.#paginatedGet( + `/api/v1/pleroma/events/${statusId}/participations`, + { params }, + accountSchema, + ), /** * Gets event participation requests * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-participation_requests} */ - getEventParticipationRequests: async (statusId: string, params?: GetEventParticipationRequestsParams) => - this.#paginatedGet(`/api/v1/pleroma/events/${statusId}/participation_requests`, { params }, v.object({ - account: accountSchema, - participation_message: v.fallback(v.string(), ''), - })), + getEventParticipationRequests: ( + statusId: string, + params?: GetEventParticipationRequestsParams, + ) => + this.#paginatedGet( + `/api/v1/pleroma/events/${statusId}/participation_requests`, + { params }, + v.object({ + account: accountSchema, + participation_message: v.fallback(v.string(), ''), + }), + ), /** * Accepts user to the event * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-participation_requests-participant_id-authorize} */ acceptEventParticipationRequest: async (statusId: string, accountId: string) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}/participation_requests/${accountId}/authorize`, { method: 'POST' }); + const response = await this.request( + `/api/v1/pleroma/events/${statusId}/participation_requests/${accountId}/authorize`, + { method: 'POST' }, + ); return v.parse(statusSchema, response.json); }, @@ -5338,7 +6019,10 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-participation_requests-participant_id-reject} */ rejectEventParticipationRequest: async (statusId: string, accountId: string) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}/participation_requests/${accountId}/reject`, { method: 'POST' }); + const response = await this.request( + `/api/v1/pleroma/events/${statusId}/participation_requests/${accountId}/reject`, + { method: 'POST' }, + ); return v.parse(statusSchema, response.json); }, @@ -5348,7 +6032,10 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-join} */ joinEvent: async (statusId: string, participation_message?: string) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}/join`, { method: 'POST', body: { participation_message } }); + const response = await this.request(`/api/v1/pleroma/events/${statusId}/join`, { + method: 'POST', + body: { participation_message }, + }); return v.parse(statusSchema, response.json); }, @@ -5358,7 +6045,9 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#api-v1-pleroma-events-id-leave} */ leaveEvent: async (statusId: string) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}/leave`, { method: 'POST' }); + const response = await this.request(`/api/v1/pleroma/events/${statusId}/leave`, { + method: 'POST', + }); return v.parse(statusSchema, response.json); }, @@ -5368,7 +6057,9 @@ class PlApiClient { * @see {@link https://codeberg.org/mkljczk/nicolex/src/branch/develop/docs/development/API/pleroma_api.md#event-ics-file} */ getEventIcs: async (statusId: string) => { - const response = await this.request(`/api/v1/pleroma/events/${statusId}/ics`, { contentType: '' }); + const response = await this.request(`/api/v1/pleroma/events/${statusId}/ics`, { + contentType: '', + }); return response.data; }, @@ -5380,7 +6071,7 @@ class PlApiClient { * * Requires features{@link Features.interactionRequests}. */ - getInteractionRequests: async (params?: GetInteractionRequestsParams) => + getInteractionRequests: (params?: GetInteractionRequestsParams) => this.#paginatedGet('/api/v1/interaction_requests', { params }, interactionRequestSchema), /** @@ -5400,7 +6091,10 @@ class PlApiClient { * Requires features{@link Features.interactionRequests}. */ authorizeInteractionRequest: async (interactionRequestId: string) => { - const response = await this.request(`/api/v1/interaction_requests/${interactionRequestId}/authorize`, { method: 'POST' }); + const response = await this.request( + `/api/v1/interaction_requests/${interactionRequestId}/authorize`, + { method: 'POST' }, + ); return v.parse(interactionRequestSchema, response.json); }, @@ -5411,7 +6105,10 @@ class PlApiClient { * Requires features{@link Features.interactionRequests}. */ rejectInteractionRequest: async (interactionRequestId: string) => { - const response = await this.request(`/api/v1/interaction_requests/${interactionRequestId}/authorize`, { method: 'POST' }); + const response = await this.request( + `/api/v1/interaction_requests/${interactionRequestId}/authorize`, + { method: 'POST' }, + ); return v.parse(interactionRequestSchema, response.json); }, @@ -5449,7 +6146,10 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ updateAntenna: async (antennaId: string, params: UpdateAntennaParams) => { - const response = await this.request(`/api/v1/antennas/${antennaId}`, { method: 'PUT', body: params }); + const response = await this.request(`/api/v1/antennas/${antennaId}`, { + method: 'PUT', + body: params, + }); return v.parse(antennaSchema, response.json); }, @@ -5458,7 +6158,9 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ deleteAntenna: async (antennaId: string) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/antennas/${antennaId}`, { + method: 'DELETE', + }); return response.json; }, @@ -5466,14 +6168,14 @@ class PlApiClient { /** * Requires features{@link Features.antennas}. */ - getAntennaAccounts: async (antennaId: string) => + getAntennaAccounts: (antennaId: string) => this.#paginatedGet(`/api/v1/antennas/${antennaId}/accounts`, {}, accountSchema), /** * Requires features{@link Features.antennas}. */ addAntennaAccounts: async (antennaId: string, accountIds: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/accounts`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/accounts`, { method: 'POST', body: { account_ids: accountIds }, }); @@ -5485,7 +6187,7 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaAccounts: async (antennaId: string, accountIds: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/accounts`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/accounts`, { method: 'DELETE', body: { account_ids: accountIds }, }); @@ -5496,17 +6198,20 @@ class PlApiClient { /** * Requires features{@link Features.antennas}. */ - getAntennaExcludedAccounts: async (antennaId: string) => + getAntennaExcludedAccounts: (antennaId: string) => this.#paginatedGet(`/api/v1/antennas/${antennaId}/exclude_accounts`, {}, accountSchema), /** * Requires features{@link Features.antennas}. */ addAntennaExcludedAccounts: async (antennaId: string, accountIds: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_accounts`, { - method: 'POST', - body: { account_ids: accountIds }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_accounts`, + { + method: 'POST', + body: { account_ids: accountIds }, + }, + ); return response.json; }, @@ -5515,10 +6220,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaExcludedAccounts: async (antennaId: string, accountIds: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_accounts`, { - method: 'DELETE', - body: { account_ids: accountIds }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_accounts`, + { + method: 'DELETE', + body: { account_ids: accountIds }, + }, + ); return response.json; }, @@ -5529,17 +6237,20 @@ class PlApiClient { getAntennaDomains: async (antennaId: string) => { const response = await this.request(`/api/v1/antennas/${antennaId}/domains`); - return v.parse(v.object({ - domains: filteredArray(v.string()), - exclude_domains: filteredArray(v.string()), - }), response.json); + return v.parse( + v.object({ + domains: filteredArray(v.string()), + exclude_domains: filteredArray(v.string()), + }), + response.json, + ); }, /** * Requires features{@link Features.antennas}. */ addAntennaDomains: async (antennaId: string, domains: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/domains`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/domains`, { method: 'POST', body: { domains }, }); @@ -5551,7 +6262,7 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaDomains: async (antennaId: string, domains: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/domains`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/domains`, { method: 'DELETE', body: { domains }, }); @@ -5563,10 +6274,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ addAntennaExcludedDomains: async (antennaId: string, domains: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_domains`, { - method: 'POST', - body: { domains }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_domains`, + { + method: 'POST', + body: { domains }, + }, + ); return response.json; }, @@ -5575,10 +6289,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaExcludedDomains: async (antennaId: string, domains: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_domains`, { - method: 'DELETE', - body: { domains }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_domains`, + { + method: 'DELETE', + body: { domains }, + }, + ); return response.json; }, @@ -5589,17 +6306,20 @@ class PlApiClient { getAntennaKeywords: async (antennaId: string) => { const response = await this.request(`/api/v1/antennas/${antennaId}/keywords`); - return v.parse(v.object({ - keywords: filteredArray(v.string()), - exclude_keywords: filteredArray(v.string()), - }), response.json); + return v.parse( + v.object({ + keywords: filteredArray(v.string()), + exclude_keywords: filteredArray(v.string()), + }), + response.json, + ); }, /** * Requires features{@link Features.antennas}. */ addAntennaKeywords: async (antennaId: string, keywords: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/keywords`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/keywords`, { method: 'POST', body: { keywords }, }); @@ -5611,7 +6331,7 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaKeywords: async (antennaId: string, keywords: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/keywords`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/keywords`, { method: 'DELETE', body: { keywords }, }); @@ -5623,10 +6343,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ addAntennaExcludedKeywords: async (antennaId: string, keywords: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_keywords`, { - method: 'POST', - body: { keywords }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_keywords`, + { + method: 'POST', + body: { keywords }, + }, + ); return response.json; }, @@ -5635,10 +6358,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaExcludedKeywords: async (antennaId: string, keywords: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_keywords`, { - method: 'DELETE', - body: { keywords }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_keywords`, + { + method: 'DELETE', + body: { keywords }, + }, + ); return response.json; }, @@ -5649,17 +6375,20 @@ class PlApiClient { getAntennaTags: async (antennaId: string) => { const response = await this.request(`/api/v1/antennas/${antennaId}/tags`); - return v.parse(v.object({ - tags: filteredArray(v.string()), - exclude_tags: filteredArray(v.string()), - }), response.json); + return v.parse( + v.object({ + tags: filteredArray(v.string()), + exclude_tags: filteredArray(v.string()), + }), + response.json, + ); }, /** * Requires features{@link Features.antennas}. */ addAntennaTag: async (antennaId: string, tag: string) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/tags`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/tags`, { method: 'POST', body: { tags: [tag] }, }); @@ -5671,7 +6400,7 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaTag: async (antennaId: string, tag: string) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/tags`, { + const response = await this.request(`/api/v1/antennas/${antennaId}/tags`, { method: 'DELETE', body: { tags: [tag] }, }); @@ -5683,10 +6412,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ addAntennaExcludedTags: async (antennaId: string, tags: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_tags`, { - method: 'POST', - body: { tags }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_tags`, + { + method: 'POST', + body: { tags }, + }, + ); return response.json; }, @@ -5695,10 +6427,13 @@ class PlApiClient { * Requires features{@link Features.antennas}. */ removeAntennaExcludedTags: async (antennaId: string, tags: Array) => { - const response = await this.request<{}>(`/api/v1/antennas/${antennaId}/exclude_tags`, { - method: 'DELETE', - body: { tags }, - }); + const response = await this.request( + `/api/v1/antennas/${antennaId}/exclude_tags`, + { + method: 'DELETE', + body: { tags }, + }, + ); return response.json; }, @@ -5736,7 +6471,10 @@ class PlApiClient { * Requires features{@link Features.circles}. */ updateCircle: async (circleId: string, title: string) => { - const response = await this.request(`/api/v1/circles/${circleId}`, { method: 'PUT', body: { title } }); + const response = await this.request(`/api/v1/circles/${circleId}`, { + method: 'PUT', + body: { title }, + }); return v.parse(circleSchema, response.json); }, @@ -5745,7 +6483,9 @@ class PlApiClient { * Requires features{@link Features.circles}. */ deleteCircle: async (circleId: string) => { - const response = await this.request<{}>(`/api/v1/circles/${circleId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/circles/${circleId}`, { + method: 'DELETE', + }); return response.json; }, @@ -5754,7 +6494,7 @@ class PlApiClient { * View accounts in a circle * Requires features{@link Features.circles}. */ - getCircleAccounts: async (circleId: string, params?: GetCircleAccountsParams) => + getCircleAccounts: (circleId: string, params?: GetCircleAccountsParams) => this.#paginatedGet(`/api/v1/circles/${circleId}/accounts`, { params }, accountSchema), /** @@ -5763,11 +6503,12 @@ class PlApiClient { * Requires features{@link Features.circles}. */ addCircleAccounts: async (circleId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/circles/${circleId}/accounts`, { - method: 'POST', body: { account_ids: accountIds }, + const response = await this.request(`/api/v1/circles/${circleId}/accounts`, { + method: 'POST', + body: { account_ids: accountIds }, }); - return response.json as {}; + return response.json; }, /** @@ -5776,11 +6517,12 @@ class PlApiClient { * Requires features{@link Features.circles}. */ deleteCircleAccounts: async (circleId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/circles/${circleId}/accounts`, { - method: 'DELETE', body: { account_ids: accountIds }, + const response = await this.request(`/api/v1/circles/${circleId}/accounts`, { + method: 'DELETE', + body: { account_ids: accountIds }, }); - return response.json as {}; + return response.json; }, getCircleStatuses: (circleId: string, params: GetCircleStatusesParams) => @@ -5801,7 +6543,10 @@ class PlApiClient { * Requires features{@link Features.rssFeedSubscriptions}. */ createRssFeedSubscription: async (url: string) => { - const response = await this.request('/api/v1/pleroma/rss_feed_subscriptions', { method: 'POST', body: { url } }); + const response = await this.request('/api/v1/pleroma/rss_feed_subscriptions', { + method: 'POST', + body: { url }, + }); return v.parse(rssFeedSchema, response.json); }, @@ -5810,7 +6555,10 @@ class PlApiClient { * Requires features{@link Features.rssFeedSubscriptions}. */ deleteRssFeedSubscription: async (url: string) => { - const response = await this.request<{}>('/api/v1/pleroma/rss_feed_subscriptions', { method: 'DELETE', body: { url } }); + const response = await this.request('/api/v1/pleroma/rss_feed_subscriptions', { + method: 'DELETE', + body: { url }, + }); return response.json; }, @@ -5824,8 +6572,11 @@ class PlApiClient { * @param subscriberId - The subscriber ID. * @param duration - The subscription duration (in seconds). */ - createSubscription: async(subscriberId: string, duration: number) => { - const response = await this.request('/api/v1/subscriptions', { method: 'POST', body: { subscriber_id: subscriberId, duration } }); + createSubscription: async (subscriberId: string, duration: number) => { + const response = await this.request('/api/v1/subscriptions', { + method: 'POST', + body: { subscriber_id: subscriberId, duration }, + }); return v.parse(subscriptionDetailsSchema, response.json); }, @@ -5850,8 +6601,16 @@ class PlApiClient { * @param price - Subscription price (only for Monero) * @param payoutAddress - Payout address (only for Monero) */ - updateSubscription: async(type: 'monero', chainId?: string, price?: number, payoutAddress?: string) => { - const response = await this.request('/api/v1/subscriptions/options', { method: 'POST', body: { type, chain_id: chainId, price, payout_address: payoutAddress } }); + updateSubscription: async ( + type: 'monero', + chainId?: string, + price?: number, + payoutAddress?: string, + ) => { + const response = await this.request('/api/v1/subscriptions/options', { + method: 'POST', + body: { type, chain_id: chainId, price, payout_address: payoutAddress }, + }); return v.parse(accountSchema, response.json); }, @@ -5863,8 +6622,10 @@ class PlApiClient { * @param senderId - Sender ID. * @param recipientId - Recipient ID. */ - findSubscription: async(senderId: string, recipientId: string) => { - const response = await this.request('/api/v1/subscriptions/find', { params: { sender_id: senderId, recipient_id: recipientId } }); + findSubscription: async (senderId: string, recipientId: string) => { + const response = await this.request('/api/v1/subscriptions/find', { + params: { sender_id: senderId, recipient_id: recipientId }, + }); return v.parse(subscriptionDetailsSchema, response.json); }, @@ -5878,11 +6639,19 @@ class PlApiClient { * @param chainId - CAIP-2 chain ID. * @param amount - Requested payment amount (in atomic units). */ - createInvoice: async(senderId: string, recipientId: string, chainId: string, amount: number) => { + createInvoice: async ( + senderId: string, + recipientId: string, + chainId: string, + amount: number, + ) => { const response = await this.request('/api/v1/subscriptions/invoices', { method: 'POST', body: { - sender_id: senderId, recipient_id: recipientId, chain_id: chainId, amount, + sender_id: senderId, + recipient_id: recipientId, + chain_id: chainId, + amount, }, }); @@ -5895,7 +6664,7 @@ class PlApiClient { * Requires features{@link Features.invoices}. * @param invoiceId - Invoice ID */ - getInvoice: async(invoiceId: string) => { + getInvoice: async (invoiceId: string) => { const response = await this.request(`/api/v1/subscriptions/invoices/${invoiceId}`); return v.parse(subscriptionInvoiceSchema, response.json); @@ -5907,7 +6676,7 @@ class PlApiClient { * Requires features{@link Features.invoices}. * @param invoiceId - Invoice ID */ - cancelInvoice: async(invoiceId: string) => { + cancelInvoice: async (invoiceId: string) => { const response = await this.request(`/api/v1/subscriptions/invoices/${invoiceId}`, { method: 'DELETE', }); @@ -5958,7 +6727,7 @@ class PlApiClient { deleteFolder: async (id: string) => { await this.#getIceshrimpAccessToken(); - const response = await this.request<{}>(`/api/iceshrimp/drive/folder/${id}`, { + const response = await this.request(`/api/iceshrimp/drive/folder/${id}`, { method: 'DELETE', }); @@ -6011,7 +6780,7 @@ class PlApiClient { deleteFile: async (id: string) => { await this.#getIceshrimpAccessToken(); - const response = await this.request<{}>(`/api/iceshrimp/drive/${id}`, { + const response = await this.request>(`/api/iceshrimp/drive/${id}`, { method: 'DELETE', }); @@ -6074,7 +6843,7 @@ class PlApiClient { }, markStoryAsViewed: async (storyId: string) => { - const response = await this.request<{}>('/api/web/stories/v1/viewed', { + const response = await this.request('/api/web/stories/v1/viewed', { method: 'POST', body: { id: storyId }, }); @@ -6083,7 +6852,7 @@ class PlApiClient { }, createStoryReaction: async (storyId: string, emoji: string) => { - const response = await this.request<{}>('/api/web/stories/v1/react', { + const response = await this.request('/api/web/stories/v1/react', { method: 'POST', body: { sid: storyId, reaction: emoji }, }); @@ -6092,7 +6861,7 @@ class PlApiClient { }, createStoryComment: async (storyId: string, comment: string) => { - const response = await this.request<{}>('/api/web/stories/v1/comment', { + const response = await this.request('/api/web/stories/v1/comment', { method: 'POST', body: { sid: storyId, caption: comment }, }); @@ -6101,7 +6870,7 @@ class PlApiClient { }, createStoryPoll: async (params: CreateStoryPollParams) => { - const response = await this.request<{}>('/api/web/stories/v1/publish/poll', { + const response = await this.request('/api/web/stories/v1/publish/poll', { method: 'POST', body: params, }); @@ -6110,7 +6879,7 @@ class PlApiClient { }, storyPollVote: async (storyId: string, choiceId: number) => { - const response = await this.request<{}>('/api/web/stories/v1/publish/poll', { + const response = await this.request('/api/web/stories/v1/publish/poll', { method: 'POST', body: { sid: storyId, ci: choiceId }, }); @@ -6119,7 +6888,7 @@ class PlApiClient { }, reportStory: async (storyId: string, type: StoryReportType) => { - const response = await this.request<{}>('/api/web/stories/v1/report', { + const response = await this.request('/api/web/stories/v1/report', { method: 'POST', body: { id: storyId, type }, }); @@ -6138,7 +6907,7 @@ class PlApiClient { }, cropPhoto: async (mediaId: string, params: CropStoryPhotoParams) => { - const response = await this.request<{}>('/api/web/stories/v1/crop', { + const response = await this.request('/api/web/stories/v1/crop', { method: 'POST', body: { media_id: mediaId, ...params }, }); @@ -6147,7 +6916,7 @@ class PlApiClient { }, createStory: async (mediaId: string, params: CreateStoryParams) => { - const response = await this.request<{}>('/api/web/stories/v1/publish', { + const response = await this.request('/api/web/stories/v1/publish', { method: 'POST', body: { media_id: mediaId, ...params }, }); @@ -6156,7 +6925,7 @@ class PlApiClient { }, deleteStory: async (storyId: string) => { - const response = await this.request<{}>(`/api/web/stories/v1/delete/${storyId}`, { + const response = await this.request(`/api/web/stories/v1/delete/${storyId}`, { method: 'DELETE', }); @@ -6167,7 +6936,7 @@ class PlApiClient { /** Routes that are not part of any stable release */ public readonly experimental = { admin: { - /** @see {@link https://github.com/mastodon/mastodon/pull/19059} */ + /** @see {@link https://github.com/mastodon/mastodon/pull/19059} */ groups: { /** list groups known to the instance. Mimics the interface of `/api/v1/admin/accounts` */ getGroups: async (params?: AdminGetGroupsParams) => { @@ -6185,21 +6954,27 @@ class PlApiClient { /** suspends a group */ suspendGroup: async (groupId: string) => { - const response = await this.request(`/api/v1/admin/groups/${groupId}/suspend`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/groups/${groupId}/suspend`, { + method: 'POST', + }); return v.parse(groupSchema, response.json); }, /** lift a suspension */ unsuspendGroup: async (groupId: string) => { - const response = await this.request(`/api/v1/admin/groups/${groupId}/unsuspend`, { method: 'POST' }); + const response = await this.request(`/api/v1/admin/groups/${groupId}/unsuspend`, { + method: 'POST', + }); return v.parse(groupSchema, response.json); }, /** deletes an already-suspended group */ deleteGroup: async (groupId: string) => { - const response = await this.request(`/api/v1/admin/groups/${groupId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/admin/groups/${groupId}`, { + method: 'DELETE', + }); return v.parse(groupSchema, response.json); }, @@ -6227,7 +7002,12 @@ class PlApiClient { if (this.features.version.software === PIXELFED) { response = await this.request('/api/v0/groups/create', { method: 'POST', - body: { ...params, name: params.display_name, description: params.note, membership: 'public' }, + body: { + ...params, + name: params.display_name, + description: params.note, + membership: 'public', + }, contentType: params.avatar || params.header ? '' : undefined, }); @@ -6274,67 +7054,94 @@ class PlApiClient { let response; if (this.features.version.software === PIXELFED) { - response = await this.request('/api/v0/groups/delete', { method: 'POST', params: { gid: groupId } }); + response = await this.request('/api/v0/groups/delete', { + method: 'POST', + params: { gid: groupId }, + }); } else { - response = await this.request(`/api/v1/groups/${groupId}`, { method: 'DELETE' }); + response = await this.request(`/api/v1/groups/${groupId}`, { + method: 'DELETE', + }); } - return response.json as {}; + return response.json; }, /** Has an optional role attribute that can be used to filter by role (valid roles are `"admin"`, `"moderator"`, `"user"`). */ - getGroupMemberships: async (groupId: string, role?: GroupRole, params?: GetGroupMembershipsParams) => + getGroupMemberships: ( + groupId: string, + role?: GroupRole, + params?: GetGroupMembershipsParams, + ) => this.#paginatedGet( - this.features.version.software === PIXELFED ? `/api/v0/groups/members/list?gid=${groupId}` : `/api/v1/groups/${groupId}/memberships`, + this.features.version.software === PIXELFED + ? `/api/v0/groups/members/list?gid=${groupId}` + : `/api/v1/groups/${groupId}/memberships`, { params: { ...params, role } }, groupMemberSchema, ), /** returns an array of `Account` entities representing pending requests to join a group */ - getGroupMembershipRequests: async (groupId: string, params?: GetGroupMembershipRequestsParams) => + getGroupMembershipRequests: (groupId: string, params?: GetGroupMembershipRequestsParams) => this.#paginatedGet( - this.features.version.software === PIXELFED ? `/api/v0/groups/members/requests?gid=${groupId}` : `/api/v1/groups/${groupId}/membership_requests`, + this.features.version.software === PIXELFED + ? `/api/v0/groups/members/requests?gid=${groupId}` + : `/api/v1/groups/${groupId}/membership_requests`, { params }, accountSchema, ), /** accept a pending request to become a group member */ acceptGroupMembershipRequest: async (groupId: string, accountId: string) => { - const response = await this.request(`/api/v1/groups/${groupId}/membership_requests/${accountId}/authorize`, { method: 'POST' }); + const response = await this.request( + `/api/v1/groups/${groupId}/membership_requests/${accountId}/authorize`, + { method: 'POST' }, + ); - return response.json as {}; + return response.json; }, /** reject a pending request to become a group member */ rejectGroupMembershipRequest: async (groupId: string, accountId: string) => { - const response = await this.request(`/api/v1/groups/${groupId}/membership_requests/${accountId}/reject`, { method: 'POST' }); + const response = await this.request( + `/api/v1/groups/${groupId}/membership_requests/${accountId}/reject`, + { method: 'POST' }, + ); - return response.json as {}; + return response.json; }, /** delete a group post (actually marks it as `revoked` if it is a local post) */ deleteGroupStatus: async (groupId: string, statusId: string) => { - const response = await this.request(`/api/v1/groups/${groupId}/statuses/${statusId}`, { method: 'DELETE' }); + const response = await this.request(`/api/v1/groups/${groupId}/statuses/${statusId}`, { + method: 'DELETE', + }); return v.parse(statusSchema, response.json); }, /** list accounts blocked from interacting with the group */ - getGroupBlocks: async (groupId: string, params?: GetGroupBlocksParams) => + getGroupBlocks: (groupId: string, params?: GetGroupBlocksParams) => this.#paginatedGet(`/api/v1/groups/${groupId}/blocks`, { params }, accountSchema), /** block one or more users. If they were in the group, they are also kicked of it */ blockGroupUsers: async (groupId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/groups/${groupId}/blocks`, { method: 'POST', params: { account_ids: accountIds } }); + const response = await this.request(`/api/v1/groups/${groupId}/blocks`, { + method: 'POST', + params: { account_ids: accountIds }, + }); - return response.json as {}; + return response.json; }, /** block one or more users. If they were in the group, they are also kicked of it */ unblockGroupUsers: async (groupId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/groups/${groupId}/blocks`, { method: 'DELETE', params: { account_ids: accountIds } }); + const response = await this.request(`/api/v1/groups/${groupId}/blocks`, { + method: 'DELETE', + params: { account_ids: accountIds }, + }); - return response.json as {}; + return response.json; }, /** joins (or request to join) a given group */ @@ -6353,27 +7160,38 @@ class PlApiClient { /** kick one or more group members */ kickGroupUsers: async (groupId: string, accountIds: string[]) => { - const response = await this.request(`/api/v1/groups/${groupId}/kick`, { method: 'POST', params: { account_ids: accountIds } }); + const response = await this.request(`/api/v1/groups/${groupId}/kick`, { + method: 'POST', + params: { account_ids: accountIds }, + }); - return response.json as {}; + return response.json; }, /** promote one or more accounts to role `new_role`. An error is returned if any of those accounts has a higher role than `new_role` already, or if the role is higher than the issuing user's. Valid roles are `admin`, and `moderator` and `user`. */ promoteGroupUsers: async (groupId: string, accountIds: string[], role: GroupRole) => { - const response = await this.request(`/api/v1/groups/${groupId}/promote`, { method: 'POST', params: { account_ids: accountIds, role } }); + const response = await this.request(`/api/v1/groups/${groupId}/promote`, { + method: 'POST', + params: { account_ids: accountIds, role }, + }); return v.parse(filteredArray(groupMemberSchema), response.json); }, /** demote one or more accounts to role `new_role`. Returns an error unless every of the target account has a strictly lower role than the user (you cannot demote someone with the same role as you), or if any target account already has a role lower than `new_role`. Valid roles are `admin`, `moderator` and `user`. */ demoteGroupUsers: async (groupId: string, accountIds: string[], role: GroupRole) => { - const response = await this.request(`/api/v1/groups/${groupId}/demote`, { method: 'POST', params: { account_ids: accountIds, role } }); + const response = await this.request(`/api/v1/groups/${groupId}/demote`, { + method: 'POST', + params: { account_ids: accountIds, role }, + }); return v.parse(filteredArray(groupMemberSchema), response.json); }, getGroupRelationships: async (groupIds: string[]) => { - const response = await this.request('/api/v1/groups/relationships', { params: { id: groupIds } }); + const response = await this.request('/api/v1/groups/relationships', { + params: { id: groupIds }, + }); return v.parse(filteredArray(groupRelationshipSchema), response.json); }, @@ -6400,7 +7218,7 @@ class PlApiClient { return this.#accessToken; } - set accessToken(accessToken: string | undefined) { + set accessToken(accessToken: string | undefined) { if (this.#accessToken === accessToken) return; this.#socket?.close(); @@ -6417,17 +7235,13 @@ class PlApiClient { return this.#customAuthorizationToken; } - set customAuthorizationToken(token: string | undefined) { + set customAuthorizationToken(token: string | undefined) { this.#customAuthorizationToken = token; } get instanceInformation() { return this.#instance; } - } -export { - PlApiClient, - PlApiClient as default, -}; +export { PlApiClient as default }; diff --git a/packages/pl-api/lib/directory-client.ts b/packages/pl-api/lib/directory-client.ts index 86cc29c0e..3dfe59cd4 100644 --- a/packages/pl-api/lib/directory-client.ts +++ b/packages/pl-api/lib/directory-client.ts @@ -25,7 +25,6 @@ interface Params { * @category Clients */ class PlApiDirectoryClient { - /** Unused. */ accessToken: string | undefined = undefined; /** Unused. */ @@ -68,10 +67,6 @@ class PlApiDirectoryClient { return v.parse(filteredArray(directoryServerSchema), response.json); } - } -export { - PlApiDirectoryClient, - PlApiDirectoryClient as default, -}; +export { PlApiDirectoryClient, PlApiDirectoryClient as default }; diff --git a/packages/pl-api/lib/entities/account-warning.ts b/packages/pl-api/lib/entities/account-warning.ts index 9ec3eea5b..3abd2c328 100644 --- a/packages/pl-api/lib/entities/account-warning.ts +++ b/packages/pl-api/lib/entities/account-warning.ts @@ -12,10 +12,18 @@ const appealSchema = v.object({ /** * @category Schemas * @see {@link https://docs.joinmastodon.org/entities/AccountWarning/} -*/ + */ const accountWarningSchema = v.object({ id: v.string(), - action: v.picklist(['none', 'disable', 'mark_statuses_as_sensitive', 'delete_statuses', 'sensitive', 'silence', 'suspend']), + action: v.picklist([ + 'none', + 'disable', + 'mark_statuses_as_sensitive', + 'delete_statuses', + 'sensitive', + 'silence', + 'suspend', + ]), text: v.fallback(v.string(), ''), status_ids: v.fallback(v.array(v.string()), []), target_account: accountSchema, diff --git a/packages/pl-api/lib/entities/account.ts b/packages/pl-api/lib/entities/account.ts index a8b220d3e..912718183 100644 --- a/packages/pl-api/lib/entities/account.ts +++ b/packages/pl-api/lib/entities/account.ts @@ -10,9 +10,15 @@ import { roleSchema } from './role'; import { coerceObject, datetimeSchema, filteredArray } from './utils'; const filterBadges = (tags?: string[]) => - tags?.filter(tag => tag.startsWith('badge:')).map(tag => v.parse(roleSchema, { id: tag, name: tag.replace(/^badge:/, '') })); + tags + ?.filter((tag) => tag.startsWith('badge:')) + .map((tag) => v.parse(roleSchema, { id: tag, name: tag.replace(/^badge:/, '') })); -const MKLJCZK_ACCOUNTS = ['https://pl.fediverse.pl/users/mkljczk', 'https://gts.mkljczk.pl/users/mkljczk', 'https://gts.mkljczk.pl/@mkljczk']; +const MKLJCZK_ACCOUNTS = [ + 'https://pl.fediverse.pl/users/mkljczk', + 'https://gts.mkljczk.pl/users/mkljczk', + 'https://gts.mkljczk.pl/@mkljczk', +]; const paymentOptionSchema = v.variant('type', [ v.object({ @@ -47,7 +53,9 @@ const preprocessAccount = v.transform((account: any) => { const fqn = account.fqn || guessFqn(account); const domain = fqn.split('@')[1] || ''; - const isCat = (account.pleroma?.is_cat ?? account.is_cat) || MKLJCZK_ACCOUNTS.includes(account.uri ?? account.url); + const isCat = + (account.pleroma?.is_cat ?? account.is_cat) || + MKLJCZK_ACCOUNTS.includes(account.uri ?? account.url); const speakAsCat = account.pleroma?.speak_as_cat ?? account.speak_as_cat ?? isCat; return { @@ -58,14 +66,19 @@ const preprocessAccount = v.transform((account: any) => { header: account.header || account.header_static, avatar_default: isDefaultAvatar(account.avatar || account.avatar_static || ''), header_default: isDefaultHeader(account.header || account.header_static || ''), - local: typeof account.pleroma?.is_local === 'boolean' ? account.pleroma.is_local : account.acct.split('@')[1] === undefined, + local: + typeof account.pleroma?.is_local === 'boolean' + ? account.pleroma.is_local + : account.acct.split('@')[1] === undefined, discoverable: account.discoverable || account.pleroma?.source?.discoverable, verified: account.verified || account.pleroma?.tags?.includes('verified'), - ...(account.role?.permissions ? { - is_admin: (account.role?.permissions & 0x1) === 0x1, - } : {}), + ...(account.role?.permissions + ? { + is_admin: (account.role?.permissions & 0x1) === 0x1, + } + : {}), ap_id: account.pleroma?.ap_id ?? account.actor_id, - ...(pick(account.pleroma || {}, [ + ...pick(account.pleroma || {}, [ 'background_image', 'relationship', 'is_moderator', @@ -90,21 +103,32 @@ const preprocessAccount = v.transform((account: any) => { 'notification_settings', 'location', - ])), - ...(pick(account.akkoma || {}, [ - 'permit_followback', - ])), + ]), + ...pick(account.akkoma || {}, ['permit_followback']), is_cat: isCat, speak_as_cat: speakAsCat, ...(pick(account.other_settings || {}), ['birthday', 'location']), __meta: pick(account, ['pleroma', 'source']), ...account, - display_name: account.display_name?.replace(/^[\s\u180E\u200B-\u200D\u2060\uFEFF]+|[\s\u180E\u200B-\u200D\u2060\uFEFF]+$/g, '').trim() || username, + display_name: + account.display_name + ?.replace( + /^[\s\u180E\u200B-\u200D\u2060\uFEFF]+|[\s\u180E\u200B-\u200D\u2060\uFEFF]+$/g, + '', + ) + .trim() || username, roles: account.roles?.length ? account.roles : filterBadges(account.pleroma?.tags), source: account.source - ? { ...(pick(account.pleroma?.source || {}, [ - 'show_role', 'no_rich_text', 'discoverable', 'actor_type', 'show_birthday', - ])), ...account.source } + ? { + ...pick(account.pleroma?.source || {}, [ + 'show_role', + 'no_rich_text', + 'discoverable', + 'actor_type', + 'show_birthday', + ]), + ...account.source, + } : undefined, }; }); @@ -121,7 +145,13 @@ const baseAccountSchema = v.object({ acct: v.fallback(v.string(), ''), url: v.pipe(v.string(), v.url()), display_name: v.fallback(v.string(), ''), - note: v.fallback(v.pipe(v.string(), v.transform(note => note === '

' ? '' : note)), ''), + note: v.fallback( + v.pipe( + v.string(), + v.transform((note) => (note === '

' ? '' : note)), + ), + '', + ), avatar: v.fallback(v.string(), ''), avatar_static: v.fallback(v.pipe(v.string(), v.url()), ''), header: v.fallback(v.pipe(v.string(), v.url()), ''), @@ -182,14 +212,16 @@ const baseAccountSchema = v.object({ /** The reported subscribers of this user */ subscribers_count: v.fallback(v.number(), 0), /** Identity proofs */ - identity_proofs: filteredArray(v.object({ - /** The key of a given field's key-value pair */ - name: v.fallback(v.string(), ''), - /** The value associated with the name key */ - value: v.fallback(v.string(), ''), - /** Timestamp of when the server verified the field value */ - verified_at: v.fallback(datetimeSchema, new Date().toISOString()), - })), + identity_proofs: filteredArray( + v.object({ + /** The key of a given field's key-value pair */ + name: v.fallback(v.string(), ''), + /** The value associated with the name key */ + value: v.fallback(v.string(), ''), + /** Timestamp of when the server verified the field value */ + verified_at: v.fallback(datetimeSchema, new Date().toISOString()), + }), + ), /** Payment options */ payment_options: filteredArray(paymentOptionSchema), @@ -209,7 +241,10 @@ const baseAccountSchema = v.object({ const accountWithMovedAccountSchema = v.object({ ...baseAccountSchema.entries, - moved: v.fallback(v.nullable(v.lazy((): typeof baseAccountSchema => accountWithMovedAccountSchema as any)), null), + moved: v.fallback( + v.nullable(v.lazy((): typeof baseAccountSchema => accountWithMovedAccountSchema as any)), + null, + ), }); /** @see {@link https://docs.joinmastodon.org/entities/Account/} */ @@ -229,44 +264,67 @@ type Account = v.InferOutput & WithMoved; */ const accountSchema: v.BaseSchema> = untypedAccountSchema as any; -const untypedCredentialAccountSchema = v.pipe(v.any(), preprocessAccount, v.object({ - ...accountWithMovedAccountSchema.entries, - source: v.fallback(v.nullable(coerceObject({ - attribution_domains: v.fallback(v.optional(v.nullable(v.array(v.string()))), null), - note: v.fallback(v.optional(v.string()), ''), - fields: v.fallback(v.optional(filteredArray(fieldSchema)), []), - privacy: v.fallback(v.optional(v.picklist(['public', 'unlisted', 'private', 'direct'])), 'public'), - sensitive: v.fallback(v.optional(v.boolean()), false), - language: v.fallback(v.optional(v.nullable(v.string())), null), - follow_requests_count: v.fallback(v.optional(v.pipe(v.number(), v.integer(), v.minValue(0))), 0), - hide_collections: v.fallback(v.optional(v.boolean()), undefined), - discoverable: v.fallback(v.optional(v.boolean()), undefined), - indexable: v.fallback(v.nullable(v.boolean()), null), - quote_policy: v.fallback(v.nullable(v.picklist(['public', 'followers', 'nobody'])), null), +const untypedCredentialAccountSchema = v.pipe( + v.any(), + preprocessAccount, + v.object({ + ...accountWithMovedAccountSchema.entries, + source: v.fallback( + v.nullable( + coerceObject({ + attribution_domains: v.fallback(v.optional(v.nullable(v.array(v.string()))), null), + note: v.fallback(v.optional(v.string()), ''), + fields: v.fallback(v.optional(filteredArray(fieldSchema)), []), + privacy: v.fallback( + v.optional(v.picklist(['public', 'unlisted', 'private', 'direct'])), + 'public', + ), + sensitive: v.fallback(v.optional(v.boolean()), false), + language: v.fallback(v.optional(v.nullable(v.string())), null), + follow_requests_count: v.fallback( + v.optional(v.pipe(v.number(), v.integer(), v.minValue(0))), + 0, + ), + hide_collections: v.fallback(v.optional(v.boolean()), undefined), + discoverable: v.fallback(v.optional(v.boolean()), undefined), + indexable: v.fallback(v.nullable(v.boolean()), null), + quote_policy: v.fallback(v.nullable(v.picklist(['public', 'followers', 'nobody'])), null), - show_role: v.fallback(v.optional(v.nullable(v.boolean())), undefined), - no_rich_text: v.fallback(v.optional(v.nullable(v.boolean())), undefined), - actor_type: v.fallback(v.optional(v.string()), undefined), - show_birthday: v.fallback(v.optional(v.boolean()), undefined), + show_role: v.fallback(v.optional(v.nullable(v.boolean())), undefined), + no_rich_text: v.fallback(v.optional(v.nullable(v.boolean())), undefined), + actor_type: v.fallback(v.optional(v.string()), undefined), + show_birthday: v.fallback(v.optional(v.boolean()), undefined), - also_known_as_uris: v.fallback(v.optional(v.array(v.string())), undefined), - status_content_type: v.fallback(v.optional(v.string()), undefined), - web_include_boosts: v.fallback(v.optional(v.boolean()), undefined), - web_layout: v.fallback(v.optional(v.picklist(['microblog', 'gallery'])), undefined), - web_visibility: v.fallback(v.optional(v.picklist(['public', 'unlisted', 'none'])), undefined), - })), null), - role: v.fallback(v.nullable(roleSchema), null), + also_known_as_uris: v.fallback(v.optional(v.array(v.string())), undefined), + status_content_type: v.fallback(v.optional(v.string()), undefined), + web_include_boosts: v.fallback(v.optional(v.boolean()), undefined), + web_layout: v.fallback(v.optional(v.picklist(['microblog', 'gallery'])), undefined), + web_visibility: v.fallback( + v.optional(v.picklist(['public', 'unlisted', 'none'])), + undefined, + ), + }), + ), + null, + ), + role: v.fallback(v.nullable(roleSchema), null), - settings_store: v.fallback(v.optional(v.record(v.string(), v.any())), undefined), - chat_token: v.fallback(v.optional(v.string()), undefined), - allow_following_move: v.fallback(v.optional(v.boolean()), undefined), - unread_conversation_count: v.fallback(v.optional(v.number()), undefined), - unread_notifications_count: v.fallback(v.optional(v.number()), undefined), - notification_settings: v.fallback(v.optional(v.object({ - block_from_strangers: v.fallback(v.boolean(), false), - hide_notification_contents: v.fallback(v.boolean(), false), - })), undefined), -})); + settings_store: v.fallback(v.optional(v.record(v.string(), v.any())), undefined), + chat_token: v.fallback(v.optional(v.string()), undefined), + allow_following_move: v.fallback(v.optional(v.boolean()), undefined), + unread_conversation_count: v.fallback(v.optional(v.number()), undefined), + unread_notifications_count: v.fallback(v.optional(v.number()), undefined), + notification_settings: v.fallback( + v.optional( + v.object({ + block_from_strangers: v.fallback(v.boolean(), false), + hide_notification_contents: v.fallback(v.boolean(), false), + }), + ), + undefined, + ), + }), +); /** * @category Entity types @@ -276,12 +334,20 @@ type CredentialAccount = v.InferOutput & /** * @category Schemas */ -const credentialAccountSchema: v.BaseSchema> = untypedCredentialAccountSchema as any; +const credentialAccountSchema: v.BaseSchema< + any, + CredentialAccount, + v.BaseIssue +> = untypedCredentialAccountSchema as any; -const untypedBlockedAccountSchema = v.pipe(v.any(), preprocessAccount, v.object({ - ...accountWithMovedAccountSchema.entries, - block_expires_at: v.fallback(v.nullable(datetimeSchema), null), -})); +const untypedBlockedAccountSchema = v.pipe( + v.any(), + preprocessAccount, + v.object({ + ...accountWithMovedAccountSchema.entries, + block_expires_at: v.fallback(v.nullable(datetimeSchema), null), + }), +); /** * @category Entity types @@ -291,12 +357,20 @@ type BlockedAccount = v.InferOutput & WithMo /** * @category Schemas */ -const blockedAccountSchema: v.BaseSchema> = untypedBlockedAccountSchema as any; +const blockedAccountSchema: v.BaseSchema< + any, + BlockedAccount, + v.BaseIssue +> = untypedBlockedAccountSchema as any; -const untypedMutedAccountSchema = v.pipe(v.any(), preprocessAccount, v.object({ - ...accountWithMovedAccountSchema.entries, - mute_expires_at: v.fallback(v.nullable(datetimeSchema), null), -})); +const untypedMutedAccountSchema = v.pipe( + v.any(), + preprocessAccount, + v.object({ + ...accountWithMovedAccountSchema.entries, + mute_expires_at: v.fallback(v.nullable(datetimeSchema), null), + }), +); /** * @category Entity types @@ -306,7 +380,11 @@ type MutedAccount = v.InferOutput & WithMoved; /** * @category Schemas */ -const mutedAccountSchema: v.BaseSchema> = untypedMutedAccountSchema as any; +const mutedAccountSchema: v.BaseSchema< + any, + MutedAccount, + v.BaseIssue +> = untypedMutedAccountSchema as any; export { accountSchema, diff --git a/packages/pl-api/lib/entities/admin/account.ts b/packages/pl-api/lib/entities/admin/account.ts index acff02537..0914a672f 100644 --- a/packages/pl-api/lib/entities/admin/account.ts +++ b/packages/pl-api/lib/entities/admin/account.ts @@ -14,10 +14,10 @@ const adminAccountSchema = v.pipe( v.any(), v.transform((account: any) => { if (!account.account) { - /** - * Convert Pleroma account schema - * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminusers} - */ + /** + * Convert Pleroma account schema + * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminusers} + */ return { id: account.id, account: null, @@ -29,8 +29,8 @@ const adminAccountSchema = v.pipe( role: account.roles?.is_admin ? v.parse(roleSchema, { name: 'Admin' }) : account.roles?.moderator - ? v.parse(roleSchema, { name: 'Moderator ' }) : - null, + ? v.parse(roleSchema, { name: 'Moderator ' }) + : null, confirmed: account.is_confirmed, approved: account.is_approved, disabled: !account.is_active, @@ -74,7 +74,4 @@ const adminAccountSchema = v.pipe( */ type AdminAccount = v.InferOutput; -export { - adminAccountSchema, - type AdminAccount, -}; +export { adminAccountSchema, type AdminAccount }; diff --git a/packages/pl-api/lib/entities/admin/canonical-email-block.ts b/packages/pl-api/lib/entities/admin/canonical-email-block.ts index 1ed511266..2f15fce62 100644 --- a/packages/pl-api/lib/entities/admin/canonical-email-block.ts +++ b/packages/pl-api/lib/entities/admin/canonical-email-block.ts @@ -14,7 +14,4 @@ const adminCanonicalEmailBlockSchema = v.object({ */ type AdminCanonicalEmailBlock = v.InferOutput; -export { - adminCanonicalEmailBlockSchema, - type AdminCanonicalEmailBlock, -}; +export { adminCanonicalEmailBlockSchema, type AdminCanonicalEmailBlock }; diff --git a/packages/pl-api/lib/entities/admin/cohort.ts b/packages/pl-api/lib/entities/admin/cohort.ts index 824f240e9..e933a7ffb 100644 --- a/packages/pl-api/lib/entities/admin/cohort.ts +++ b/packages/pl-api/lib/entities/admin/cohort.ts @@ -9,11 +9,13 @@ import { datetimeSchema } from '../utils'; const adminCohortSchema = v.object({ period: datetimeSchema, frequency: v.picklist(['day', 'month']), - data: v.array(v.object({ - date: datetimeSchema, - rate: v.number(), - value: v.pipe(v.unknown(), v.transform(Number)), - })), + data: v.array( + v.object({ + date: datetimeSchema, + rate: v.number(), + value: v.pipe(v.unknown(), v.transform(Number)), + }), + ), }); /** @@ -21,7 +23,4 @@ const adminCohortSchema = v.object({ */ type AdminCohort = v.InferOutput; -export { - adminCohortSchema, - type AdminCohort, -}; +export { adminCohortSchema, type AdminCohort }; diff --git a/packages/pl-api/lib/entities/admin/dimension.ts b/packages/pl-api/lib/entities/admin/dimension.ts index 4682bcc09..7eab9c52a 100644 --- a/packages/pl-api/lib/entities/admin/dimension.ts +++ b/packages/pl-api/lib/entities/admin/dimension.ts @@ -6,13 +6,15 @@ import * as v from 'valibot'; */ const adminDimensionSchema = v.object({ key: v.string(), - data: v.array(v.object({ - key: v.string(), - human_key: v.string(), - value: v.string(), - unit: v.fallback(v.optional(v.string()), undefined), - human_value: v.fallback(v.optional(v.string()), undefined), - })), + data: v.array( + v.object({ + key: v.string(), + human_key: v.string(), + value: v.string(), + unit: v.fallback(v.optional(v.string()), undefined), + human_value: v.fallback(v.optional(v.string()), undefined), + }), + ), }); /** @@ -20,7 +22,4 @@ const adminDimensionSchema = v.object({ */ type AdminDimension = v.InferOutput; -export { - adminDimensionSchema, - type AdminDimension, -}; +export { adminDimensionSchema, type AdminDimension }; diff --git a/packages/pl-api/lib/entities/admin/domain-allow.ts b/packages/pl-api/lib/entities/admin/domain-allow.ts index 109500052..3c1c5f9d8 100644 --- a/packages/pl-api/lib/entities/admin/domain-allow.ts +++ b/packages/pl-api/lib/entities/admin/domain-allow.ts @@ -17,7 +17,4 @@ const adminDomainAllowSchema = v.object({ */ type AdminDomainAllow = v.InferOutput; -export { - adminDomainAllowSchema, - type AdminDomainAllow, -}; +export { adminDomainAllowSchema, type AdminDomainAllow }; diff --git a/packages/pl-api/lib/entities/admin/domain-block.ts b/packages/pl-api/lib/entities/admin/domain-block.ts index 0a79df86d..ac557004e 100644 --- a/packages/pl-api/lib/entities/admin/domain-block.ts +++ b/packages/pl-api/lib/entities/admin/domain-block.ts @@ -24,7 +24,4 @@ const adminDomainBlockSchema = v.object({ */ type AdminDomainBlock = v.InferOutput; -export { - adminDomainBlockSchema, - type AdminDomainBlock, -}; +export { adminDomainBlockSchema, type AdminDomainBlock }; diff --git a/packages/pl-api/lib/entities/admin/domain.ts b/packages/pl-api/lib/entities/admin/domain.ts index 4a6da0611..e0ead48cf 100644 --- a/packages/pl-api/lib/entities/admin/domain.ts +++ b/packages/pl-api/lib/entities/admin/domain.ts @@ -16,6 +16,6 @@ const adminDomainSchema = v.object({ /** * @category Admin entity types */ -type AdminDomain = v.InferOutput +type AdminDomain = v.InferOutput; export { adminDomainSchema, type AdminDomain }; diff --git a/packages/pl-api/lib/entities/admin/email-domain-block.ts b/packages/pl-api/lib/entities/admin/email-domain-block.ts index f731574be..1c3587b56 100644 --- a/packages/pl-api/lib/entities/admin/email-domain-block.ts +++ b/packages/pl-api/lib/entities/admin/email-domain-block.ts @@ -10,11 +10,13 @@ const adminEmailDomainBlockSchema = v.object({ id: v.string(), domain: v.string(), created_at: datetimeSchema, - history: v.array(v.object({ - day: v.pipe(v.unknown(), v.transform(String)), - accounts: v.pipe(v.unknown(), v.transform(String)), - uses: v.pipe(v.unknown(), v.transform(String)), - })), + history: v.array( + v.object({ + day: v.pipe(v.unknown(), v.transform(String)), + accounts: v.pipe(v.unknown(), v.transform(String)), + uses: v.pipe(v.unknown(), v.transform(String)), + }), + ), }); /** @@ -22,7 +24,4 @@ const adminEmailDomainBlockSchema = v.object({ */ type AdminEmailDomainBlock = v.InferOutput; -export { - adminEmailDomainBlockSchema, - type AdminEmailDomainBlock, -}; +export { adminEmailDomainBlockSchema, type AdminEmailDomainBlock }; diff --git a/packages/pl-api/lib/entities/admin/ip-block.ts b/packages/pl-api/lib/entities/admin/ip-block.ts index b76bd685f..aa0161a9f 100644 --- a/packages/pl-api/lib/entities/admin/ip-block.ts +++ b/packages/pl-api/lib/entities/admin/ip-block.ts @@ -20,7 +20,4 @@ const adminIpBlockSchema = v.object({ */ type AdminIpBlock = v.InferOutput; -export { - adminIpBlockSchema, - type AdminIpBlock, -}; +export { adminIpBlockSchema, type AdminIpBlock }; diff --git a/packages/pl-api/lib/entities/admin/ip.ts b/packages/pl-api/lib/entities/admin/ip.ts index 1a323a144..d8825de71 100644 --- a/packages/pl-api/lib/entities/admin/ip.ts +++ b/packages/pl-api/lib/entities/admin/ip.ts @@ -16,7 +16,4 @@ const adminIpSchema = v.object({ */ type AdminIp = v.InferOutput; -export { - adminIpSchema, - type AdminIp, -}; +export { adminIpSchema, type AdminIp }; diff --git a/packages/pl-api/lib/entities/admin/measure.ts b/packages/pl-api/lib/entities/admin/measure.ts index 95d69fb2f..0af3a7258 100644 --- a/packages/pl-api/lib/entities/admin/measure.ts +++ b/packages/pl-api/lib/entities/admin/measure.ts @@ -12,10 +12,12 @@ const adminMeasureSchema = v.object({ total: v.pipe(v.unknown(), v.transform(Number)), human_value: v.fallback(v.optional(v.string()), undefined), previous_total: v.fallback(v.optional(v.pipe(v.unknown(), v.transform(Number))), undefined), - data: v.array(v.object({ - date: dateSchema, - value: v.pipe(v.unknown(), v.transform(Number)), - })), + data: v.array( + v.object({ + date: dateSchema, + value: v.pipe(v.unknown(), v.transform(Number)), + }), + ), }); /** @@ -23,7 +25,4 @@ const adminMeasureSchema = v.object({ */ type AdminMeasure = v.InferOutput; -export { - adminMeasureSchema, - type AdminMeasure, -}; +export { adminMeasureSchema, type AdminMeasure }; diff --git a/packages/pl-api/lib/entities/admin/moderation-log-entry.ts b/packages/pl-api/lib/entities/admin/moderation-log-entry.ts index 5c36c6b1e..5b33d6339 100644 --- a/packages/pl-api/lib/entities/admin/moderation-log-entry.ts +++ b/packages/pl-api/lib/entities/admin/moderation-log-entry.ts @@ -14,6 +14,6 @@ const adminModerationLogEntrySchema = v.object({ /** * @category Admin entity types */ -type AdminModerationLogEntry = v.InferOutput +type AdminModerationLogEntry = v.InferOutput; export { adminModerationLogEntrySchema, type AdminModerationLogEntry }; diff --git a/packages/pl-api/lib/entities/admin/pleroma-config.ts b/packages/pl-api/lib/entities/admin/pleroma-config.ts index 8621dc3da..7b0876ac6 100644 --- a/packages/pl-api/lib/entities/admin/pleroma-config.ts +++ b/packages/pl-api/lib/entities/admin/pleroma-config.ts @@ -4,17 +4,19 @@ import * as v from 'valibot'; * @category Admin schemas */ const pleromaConfigSchema = v.object({ - configs: v.array(v.object({ - value: v.any(), - group: v.string(), - key: v.string(), - })), + configs: v.array( + v.object({ + value: v.any(), + group: v.string(), + key: v.string(), + }), + ), need_reboot: v.boolean(), }); /** * @category Admin entity types */ -type PleromaConfig = v.InferOutput +type PleromaConfig = v.InferOutput; export { pleromaConfigSchema, type PleromaConfig }; diff --git a/packages/pl-api/lib/entities/admin/relay.ts b/packages/pl-api/lib/entities/admin/relay.ts index c2b5ded52..4cfd9ede7 100644 --- a/packages/pl-api/lib/entities/admin/relay.ts +++ b/packages/pl-api/lib/entities/admin/relay.ts @@ -16,6 +16,6 @@ const adminRelaySchema = v.pipe( /** * @category Admin entity types */ -type AdminRelay = v.InferOutput +type AdminRelay = v.InferOutput; export { adminRelaySchema, type AdminRelay }; diff --git a/packages/pl-api/lib/entities/admin/report.ts b/packages/pl-api/lib/entities/admin/report.ts index dffe682fc..fc769b6e5 100644 --- a/packages/pl-api/lib/entities/admin/report.ts +++ b/packages/pl-api/lib/entities/admin/report.ts @@ -15,17 +15,17 @@ const adminReportSchema = v.pipe( v.any(), v.transform((report: any) => { if (report.actor) { - /** - * Convert Pleroma report schema - * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminreports} - */ + /** + * Convert Pleroma report schema + * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminreports} + */ return { action_taken: report.state !== 'open', comment: report.content, updated_at: report.created_at, account: report.actor, target_account: report.account, - ...(pick(report, ['id', 'assigned_account', 'created_at', 'rules', 'statuses'])), + ...pick(report, ['id', 'assigned_account', 'created_at', 'rules', 'statuses']), }; } return report; diff --git a/packages/pl-api/lib/entities/admin/tag.ts b/packages/pl-api/lib/entities/admin/tag.ts index e4320fc01..9b36749db 100644 --- a/packages/pl-api/lib/entities/admin/tag.ts +++ b/packages/pl-api/lib/entities/admin/tag.ts @@ -19,7 +19,4 @@ const adminTagSchema = v.object({ */ type AdminTag = v.InferOutput; -export { - adminTagSchema, - type AdminTag, -}; +export { adminTagSchema, type AdminTag }; diff --git a/packages/pl-api/lib/entities/announcement.ts b/packages/pl-api/lib/entities/announcement.ts index 683aba701..a81b92eb1 100644 --- a/packages/pl-api/lib/entities/announcement.ts +++ b/packages/pl-api/lib/entities/announcement.ts @@ -21,9 +21,13 @@ const announcementSchema = v.object({ reactions: filteredArray(announcementReactionSchema), statuses: v.pipe( v.any(), - v.transform((statuses: any) => Array.isArray(statuses) - ? Object.fromEntries(statuses.map((status: any) => [status.url, status.account?.acct]) || []) - : statuses), + v.transform((statuses: any) => + Array.isArray(statuses) + ? Object.fromEntries( + statuses.map((status: any) => [status.url, status.account?.acct]) || [], + ) + : statuses, + ), v.record(v.string(), v.string()), ), mentions: filteredArray(mentionSchema), diff --git a/packages/pl-api/lib/entities/antenna.ts b/packages/pl-api/lib/entities/antenna.ts index b51e3bc3f..992fbea47 100644 --- a/packages/pl-api/lib/entities/antenna.ts +++ b/packages/pl-api/lib/entities/antenna.ts @@ -30,6 +30,6 @@ const antennaSchema: v.BaseSchema> = v.object */ type Antenna = v.InferOutput & { list: List | null; -} +}; export { antennaSchema, type Antenna }; diff --git a/packages/pl-api/lib/entities/application.ts b/packages/pl-api/lib/entities/application.ts index ad40c1dad..0fd4533a9 100644 --- a/packages/pl-api/lib/entities/application.ts +++ b/packages/pl-api/lib/entities/application.ts @@ -6,21 +6,25 @@ import { filteredArray } from './utils'; * @category Schemas * @see {@link https://docs.joinmastodon.org/entities/Application/} */ -const applicationSchema = v.pipe(v.any(), v.transform((application) => ({ - redirect_uris: [application.redirect_uri], - ...application, -})), v.object({ - name: v.fallback(v.string(), ''), - website: v.fallback(v.optional(v.string()), undefined), - redirect_uris: filteredArray(v.string()), +const applicationSchema = v.pipe( + v.any(), + v.transform((application) => ({ + redirect_uris: [application.redirect_uri], + ...application, + })), + v.object({ + name: v.fallback(v.string(), ''), + website: v.fallback(v.optional(v.string()), undefined), + redirect_uris: filteredArray(v.string()), - id: v.fallback(v.optional(v.string()), undefined), + id: v.fallback(v.optional(v.string()), undefined), - /** @deprecated */ - redirect_uri: v.fallback(v.optional(v.string()), undefined), - /** @deprecated */ - vapid_key: v.fallback(v.optional(v.string()), undefined), -})); + /** @deprecated */ + redirect_uri: v.fallback(v.optional(v.string()), undefined), + /** @deprecated */ + vapid_key: v.fallback(v.optional(v.string()), undefined), + }), +); type Application = v.InferOutput; @@ -35,7 +39,10 @@ const credentialApplicationSchema = v.pipe( ...applicationSchema.pipe[2].entries, client_id: v.string(), client_secret: v.string(), - client_secret_expires_at: v.fallback(v.nullable(v.pipe(v.unknown(), v.transform(Number))), null), + client_secret_expires_at: v.fallback( + v.nullable(v.pipe(v.unknown(), v.transform(Number))), + null, + ), }), ); @@ -44,4 +51,9 @@ const credentialApplicationSchema = v.pipe( */ type CredentialApplication = v.InferOutput; -export { applicationSchema, credentialApplicationSchema, type Application, type CredentialApplication }; +export { + applicationSchema, + credentialApplicationSchema, + type Application, + type CredentialApplication, +}; diff --git a/packages/pl-api/lib/entities/bookmark-folder.ts b/packages/pl-api/lib/entities/bookmark-folder.ts index 77dc5fd75..681ad1b6f 100644 --- a/packages/pl-api/lib/entities/bookmark-folder.ts +++ b/packages/pl-api/lib/entities/bookmark-folder.ts @@ -3,15 +3,19 @@ import * as v from 'valibot'; /** * @category Schemas */ -const bookmarkFolderSchema = v.pipe(v.any(), v.transform((data) => ({ - name: data.title, - ...data, -})), v.object({ - id: v.pipe(v.unknown(), v.transform(String)), - name: v.fallback(v.string(), ''), - emoji: v.fallback(v.nullable(v.string()), null), - emoji_url: v.fallback(v.nullable(v.string()), null), -})); +const bookmarkFolderSchema = v.pipe( + v.any(), + v.transform((data) => ({ + name: data.title, + ...data, + })), + v.object({ + id: v.pipe(v.unknown(), v.transform(String)), + name: v.fallback(v.string(), ''), + emoji: v.fallback(v.nullable(v.string()), null), + emoji_url: v.fallback(v.nullable(v.string()), null), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/drive-file.ts b/packages/pl-api/lib/entities/drive-file.ts index 9409adad9..f7126d527 100644 --- a/packages/pl-api/lib/entities/drive-file.ts +++ b/packages/pl-api/lib/entities/drive-file.ts @@ -2,24 +2,28 @@ import * as v from 'valibot'; /** * @category Schemas -*/ -const driveFileSchema = v.pipe(v.any(), v.transform((file) => ({ - ...file, - thumbnail_url: file.thumbnailUrl, - content_type: file.contentType, - is_avatar: file.isAvatar, - is_banner: file.isBanner, -})), v.object({ - id: v.string(), - url: v.string(), - thumbnail_url: v.string(), - filename: v.string(), - content_type: v.string(), - sensitive: v.boolean(), - description: v.fallback(v.nullable(v.string()), null), - is_avatar: v.boolean(), - is_banner: v.boolean(), -})); + */ +const driveFileSchema = v.pipe( + v.any(), + v.transform((file) => ({ + ...file, + thumbnail_url: file.thumbnailUrl, + content_type: file.contentType, + is_avatar: file.isAvatar, + is_banner: file.isBanner, + })), + v.object({ + id: v.string(), + url: v.string(), + thumbnail_url: v.string(), + filename: v.string(), + content_type: v.string(), + sensitive: v.boolean(), + description: v.fallback(v.nullable(v.string()), null), + is_avatar: v.boolean(), + is_banner: v.boolean(), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/drive-folder.ts b/packages/pl-api/lib/entities/drive-folder.ts index db6e85961..853a84310 100644 --- a/packages/pl-api/lib/entities/drive-folder.ts +++ b/packages/pl-api/lib/entities/drive-folder.ts @@ -19,18 +19,22 @@ const baseDriveFolderSchema = v.object({ /** * @category Schemas -*/ -const driveFolderSchema: v.BaseSchema> = v.pipe(v.any(), v.transform((folder) => ({ - ...folder, - parent_id: folder.parentId, - path: folder.path?.map((entry: any) => ({ - ...entry, - parent_id: entry.parentId, + */ +const driveFolderSchema: v.BaseSchema> = v.pipe( + v.any(), + v.transform((folder) => ({ + ...folder, + parent_id: folder.parentId, + path: folder.path?.map((entry: any) => ({ + ...entry, + parent_id: entry.parentId, + })), })), -})), v.object({ - ...baseDriveFolderSchema.entries, - folders: filteredArray(v.lazy(() => driveFolderSchema)), -})) as any; + v.object({ + ...baseDriveFolderSchema.entries, + folders: filteredArray(v.lazy(() => driveFolderSchema)), + }), +) as any; /** * @category Entity types @@ -41,6 +45,6 @@ type DriveFolder = { parent_id: string | null; files: Array; folders: Array; -} +}; export { driveFolderSchema, type DriveFolder }; diff --git a/packages/pl-api/lib/entities/drive-status.ts b/packages/pl-api/lib/entities/drive-status.ts index f711708de..7f2ecfe19 100644 --- a/packages/pl-api/lib/entities/drive-status.ts +++ b/packages/pl-api/lib/entities/drive-status.ts @@ -2,15 +2,19 @@ import * as v from 'valibot'; /** * @category Schemas -*/ -const driveStatusSchema = v.pipe(v.any(), v.transform((status) => ({ - file_count: status.fileCount, - used_size: status.usedSize, - ...status, -})), v.object({ - file_count: v.fallback(v.number(), 0), - used_size: v.fallback(v.number(), 0), -})); + */ +const driveStatusSchema = v.pipe( + v.any(), + v.transform((status) => ({ + file_count: status.fileCount, + used_size: status.usedSize, + ...status, + })), + v.object({ + file_count: v.fallback(v.number(), 0), + used_size: v.fallback(v.number(), 0), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/emoji-reaction.ts b/packages/pl-api/lib/entities/emoji-reaction.ts index 058a27904..1c8e96ccc 100644 --- a/packages/pl-api/lib/entities/emoji-reaction.ts +++ b/packages/pl-api/lib/entities/emoji-reaction.ts @@ -25,15 +25,19 @@ const customEmojiReactionSchema = v.object({ * * @category Schemas * @see {@link https://docs.pleroma.social/backend/development/API/differences_in_mastoapi_responses/#statuses} -*/ + */ const emojiReactionSchema = v.pipe( v.any(), - v.transform((reaction: any) => reaction ? { - url: reaction.url, - static_url: reaction.url, - account_ids: reaction.accounts?.map((account: any) => account?.id), - ...reaction, - } : null), + v.transform((reaction: any) => + reaction + ? { + url: reaction.url, + static_url: reaction.url, + account_ids: reaction.accounts?.map((account: any) => account?.id), + ...reaction, + } + : null, + ), v.union([baseEmojiReactionSchema, customEmojiReactionSchema]), ); diff --git a/packages/pl-api/lib/entities/familiar-followers.ts b/packages/pl-api/lib/entities/familiar-followers.ts index 519f9fe48..0f9856c93 100644 --- a/packages/pl-api/lib/entities/familiar-followers.ts +++ b/packages/pl-api/lib/entities/familiar-followers.ts @@ -15,6 +15,6 @@ const familiarFollowersSchema = v.object({ /** * @category Entity types */ -type FamiliarFollowers = v.InferOutput +type FamiliarFollowers = v.InferOutput; export { familiarFollowersSchema, type FamiliarFollowers }; diff --git a/packages/pl-api/lib/entities/filter.ts b/packages/pl-api/lib/entities/filter.ts index 7314ed755..b54737f7f 100644 --- a/packages/pl-api/lib/entities/filter.ts +++ b/packages/pl-api/lib/entities/filter.ts @@ -42,11 +42,13 @@ const filterSchema = v.pipe( return { ...filter, title: filter.phrase, - keywords: [{ - id: '1', - keyword: filter.phrase, - whole_word: filter.whole_word, - }], + keywords: [ + { + id: '1', + keyword: filter.phrase, + whole_word: filter.whole_word, + }, + ], filter_action: filter.irreversible ? 'hide' : 'warn', }; } diff --git a/packages/pl-api/lib/entities/group-member.ts b/packages/pl-api/lib/entities/group-member.ts index 026a87cb2..1ec0f99c2 100644 --- a/packages/pl-api/lib/entities/group-member.ts +++ b/packages/pl-api/lib/entities/group-member.ts @@ -5,33 +5,38 @@ import { accountSchema } from './account'; enum GroupRoles { OWNER = 'owner', ADMIN = 'admin', - USER = 'user' + USER = 'user', } /** * @category Entity types */ -type GroupRole =`${GroupRoles}`; +type GroupRole = `${GroupRoles}`; /** * @category Schemas */ -const groupMemberSchema = v.pipe(v.any(), v.transform((groupMember: any) => { - if (!groupMember.account) { - return { - id: groupMember.id, - account: groupMember, - role: { - founder: 'owner', - admin: 'admin', - }[groupMember.role as string] || 'user', - }; - } -}), v.object({ - id: v.string(), - account: accountSchema, - role: v.enum(GroupRoles), -})); +const groupMemberSchema = v.pipe( + v.any(), + v.transform((groupMember: any) => { + if (!groupMember.account) { + return { + id: groupMember.id, + account: groupMember, + role: + { + founder: 'owner', + admin: 'admin', + }[groupMember.role as string] || 'user', + }; + } + }), + v.object({ + id: v.string(), + account: accountSchema, + role: v.enum(GroupRoles), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/group.ts b/packages/pl-api/lib/entities/group.ts index a46d8369a..7bb1317e0 100644 --- a/packages/pl-api/lib/entities/group.ts +++ b/packages/pl-api/lib/entities/group.ts @@ -10,61 +10,74 @@ import { datetimeSchema, filteredArray } from './utils'; /** * @category Schemas */ -const groupSchema = v.pipe(v.any(), v.transform((group: any) => { - const domain = getDomainFromURL(group); +const groupSchema = v.pipe( + v.any(), + v.transform((group: any) => { + const domain = getDomainFromURL(group); - if (group?.config) { - group = { - display_name: group.name, - members_count: group.member_count, - note: group.short_description, - relationship: group.self ? { - ...group.self, - member: group.self.is_member, - role: { - founder: 'owner', - admin: 'admin', - }[group.self.role as string] || 'user', - id: group.id, - } : null, + if (group?.config) { + group = { + display_name: group.name, + members_count: group.member_count, + note: group.short_description, + relationship: group.self + ? { + ...group.self, + member: group.self.is_member, + role: + { + founder: 'owner', + admin: 'admin', + }[group.self.role as string] || 'user', + id: group.id, + } + : null, + ...group, + }; + } + + return { + domain, ...group, + avatar: group.avatar || group.avatar_static, + header: group.header || group.header_static, + avatar_default: isDefaultAvatar(group.avatar || group.avatar_static || ''), + header_default: isDefaultHeader(group.header || group.header_static || ''), }; - } + }), + v.object({ + avatar: v.fallback(v.string(), ''), + avatar_static: v.fallback(v.string(), ''), + created_at: v.fallback(datetimeSchema, new Date().toISOString()), + display_name: v.fallback(v.string(), ''), + domain: v.fallback(v.string(), ''), + emojis: filteredArray(customEmojiSchema), + header: v.fallback(v.string(), ''), + header_static: v.fallback(v.string(), ''), + id: v.pipe(v.unknown(), v.transform(String)), + locked: v.fallback(v.boolean(), false), + membership_required: v.fallback(v.boolean(), false), + members_count: v.fallback(v.number(), 0), + owner: v.fallback(v.nullable(v.object({ id: v.string() })), null), + note: v.fallback( + v.pipe( + v.string(), + v.transform((note) => (note === '

' ? '' : note)), + ), + '', + ), + relationship: v.fallback(v.nullable(groupRelationshipSchema), null), + statuses_visibility: v.fallback(v.string(), 'public'), + uri: v.fallback(v.string(), ''), + url: v.fallback(v.string(), ''), - return { - domain, - ...group, - avatar: group.avatar || group.avatar_static, - header: group.header || group.header_static, - avatar_default: isDefaultAvatar(group.avatar || group.avatar_static || ''), - header_default: isDefaultHeader(group.header || group.header_static || ''), - }; -}), v.object({ - avatar: v.fallback(v.string(), ''), - avatar_static: v.fallback(v.string(), ''), - created_at: v.fallback(datetimeSchema, new Date().toISOString()), - display_name: v.fallback(v.string(), ''), - domain: v.fallback(v.string(), ''), - emojis: filteredArray(customEmojiSchema), - header: v.fallback(v.string(), ''), - header_static: v.fallback(v.string(), ''), - id: v.pipe(v.unknown(), v.transform(String)), - locked: v.fallback(v.boolean(), false), - membership_required: v.fallback(v.boolean(), false), - members_count: v.fallback(v.number(), 0), - owner: v.fallback(v.nullable(v.object({ id: v.string() })), null), - note: v.fallback(v.pipe(v.string(), v.transform(note => note === '

' ? '' : note)), ''), - relationship: v.fallback(v.nullable(groupRelationshipSchema), null), - statuses_visibility: v.fallback(v.string(), 'public'), - uri: v.fallback(v.string(), ''), - url: v.fallback(v.string(), ''), + avatar_description: v.fallback(v.string(), ''), + header_description: v.fallback(v.string(), ''), - avatar_description: v.fallback(v.string(), ''), - header_description: v.fallback(v.string(), ''), - - avatar_default: v.fallback(v.boolean(), false), - header_default: v.fallback(v.boolean(), false), -})); + avatar_default: v.fallback(v.boolean(), false), + header_default: v.fallback(v.boolean(), false), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/grouped-notifications-results.ts b/packages/pl-api/lib/entities/grouped-notifications-results.ts index 702f2618d..5d51c6c19 100644 --- a/packages/pl-api/lib/entities/grouped-notifications-results.ts +++ b/packages/pl-api/lib/entities/grouped-notifications-results.ts @@ -46,7 +46,16 @@ const mentionNotificationGroupSchema = v.object({ const statusNotificationGroupSchema = v.object({ ...baseNotificationGroupSchema.entries, - type: v.picklist(['status', 'reblog', 'favourite', 'poll', 'update', 'event_reminder', 'quote', 'quoted_update']), + type: v.picklist([ + 'status', + 'reblog', + 'favourite', + 'poll', + 'update', + 'event_reminder', + 'quote', + 'quoted_update', + ]), status_id: v.string(), }); @@ -105,11 +114,12 @@ const notificationGroupSchema: v.BaseSchema; +>; /** * @category Schemas @@ -156,4 +167,9 @@ const groupedNotificationsResultsSchema = v.object({ */ type GroupedNotificationsResults = v.InferOutput; -export { notificationGroupSchema, groupedNotificationsResultsSchema, type NotificationGroup, type GroupedNotificationsResults }; +export { + notificationGroupSchema, + groupedNotificationsResultsSchema, + type NotificationGroup, + type GroupedNotificationsResults, +}; diff --git a/packages/pl-api/lib/entities/instance.ts b/packages/pl-api/lib/entities/instance.ts index 93bdd0ddd..6de041054 100644 --- a/packages/pl-api/lib/entities/instance.ts +++ b/packages/pl-api/lib/entities/instance.ts @@ -8,14 +8,19 @@ const SNAC_REGEX = /^([0-9.]*) \(not true; really snac\/([\w.]*)\)/; const WORDPRESS_REGEX = /^WordPress\/[\w+.-]*, EMA\/([\w+.-]*)/; const getApiVersions = (instance: any): Record => ({ - ...Object.fromEntries(instance.pleroma?.metadata?.features?.map((feature: string) => { - let string = `${feature}.pleroma.pl-api`; - if (string.startsWith('pleroma:') || string.startsWith('pleroma_')) string = string.slice(8); - if (string.startsWith('akkoma:')) string = string.slice(7); - if (string.startsWith('pl:')) string = string.slice(3); - return [string, 1]; - }) || []), - ...Object.fromEntries(instance.fedibird_capabilities?.map((feature: string) => [`${feature}.fedibird.pl-api`, 1]) || []), + ...Object.fromEntries( + instance.pleroma?.metadata?.features?.map((feature: string) => { + let string = `${feature}.pleroma.pl-api`; + if (string.startsWith('pleroma:') || string.startsWith('pleroma_')) string = string.slice(8); + if (string.startsWith('akkoma:')) string = string.slice(7); + if (string.startsWith('pl:')) string = string.slice(3); + return [string, 1]; + }) || [], + ), + ...Object.fromEntries( + instance.fedibird_capabilities?.map((feature: string) => [`${feature}.fedibird.pl-api`, 1]) || + [], + ), ...instance.api_versions, }); @@ -49,7 +54,7 @@ const instanceV1ToV2 = (data: any) => { return { ...instance, - account_domain: instance.account_domain || uri, + account_domain: instance.account_domain || uri, configuration: { ...configuration, media_attachments: { @@ -59,7 +64,8 @@ const instanceV1ToV2 = (data: any) => { }, polls: { ...configuration.polls, - max_characters_per_option: poll_limits.max_option_chars ?? configuration.polls.max_characters_per_option, + max_characters_per_option: + poll_limits.max_option_chars ?? configuration.polls.max_characters_per_option, max_expiration: poll_limits.max_expiration ?? configuration.polls.max_expiration, max_options: poll_limits.max_options ?? configuration.polls.max_options, min_expiration: poll_limits.min_expiration ?? configuration.polls.min_expiration, @@ -67,7 +73,8 @@ const instanceV1ToV2 = (data: any) => { statuses: { ...configuration.statuses, max_characters: max_toot_chars ?? configuration.statuses.max_characters, - max_media_attachments: max_media_attachments ?? configuration.statuses.max_media_attachments, + max_media_attachments: + max_media_attachments ?? configuration.statuses.max_media_attachments, }, urls: { streaming: urls.streaming_api, @@ -97,7 +104,11 @@ const instanceV1ToV2 = (data: any) => { }; }; -const software: Array<[string, string]> = [['takahe', 'Takahe'], ['neodb', 'NeoDB'], ['egregoros', 'Egregoros']]; +const software: Array<[string, string]> = [ + ['takahe', 'Takahe'], + ['neodb', 'NeoDB'], + ['egregoros', 'Egregoros'], +]; const fixVersion = (version: string) => { // Handle Mastodon release candidates @@ -128,11 +139,16 @@ const fixVersion = (version: string) => { }; const configurationSchema = coerceObject({ - accounts: v.fallback(v.nullable(v.object({ - allow_custom_css: v.boolean(), - max_featured_tags: v.pipe(v.number(), v.integer()), - max_profile_fields: v.pipe(v.number(), v.integer()), - })), null), + accounts: v.fallback( + v.nullable( + v.object({ + allow_custom_css: v.boolean(), + max_featured_tags: v.pipe(v.number(), v.integer()), + max_profile_fields: v.pipe(v.number(), v.integer()), + }), + ), + null, + ), chats: coerceObject({ max_characters: v.fallback(v.number(), 5000), }), @@ -162,7 +178,6 @@ const configurationSchema = coerceObject({ characters_reserved_per_url: v.fallback(v.optional(v.number()), undefined), max_characters: v.fallback(v.number(), 500), max_media_attachments: v.fallback(v.number(), 4), - }), translation: coerceObject({ enabled: v.fallback(v.boolean(), false), @@ -211,36 +226,40 @@ const pleromaSchema = coerceObject({ federation: coerceObject({ enabled: v.fallback(v.boolean(), true), // Assume true unless explicitly false mrf_policies: v.fallback(v.optional(v.array(v.string())), undefined), - mrf_simple: coerceObject(v.entriesFromList( - [ - 'accept', - 'avatar_removal', - 'banner_removal', - 'federated_timeline_removal', - 'followers_only', - 'media_nsfw', - 'media_removal', - 'reject', - 'reject_deletes', - 'report_removal', - ], - v.fallback(v.array(v.string()), []), - )), - mrf_simple_info: coerceObject(v.entriesFromList( - [ - 'accept', - 'avatar_removal', - 'banner_removal', - 'federated_timeline_removal', - 'followers_only', - 'media_nsfw', - 'media_removal', - 'reject', - 'reject_deletes', - 'report_removal', - ], - v.fallback(v.array(v.tuple([v.string(), v.string()])), []), - )), + mrf_simple: coerceObject( + v.entriesFromList( + [ + 'accept', + 'avatar_removal', + 'banner_removal', + 'federated_timeline_removal', + 'followers_only', + 'media_nsfw', + 'media_removal', + 'reject', + 'reject_deletes', + 'report_removal', + ], + v.fallback(v.array(v.string()), []), + ), + ), + mrf_simple_info: coerceObject( + v.entriesFromList( + [ + 'accept', + 'avatar_removal', + 'banner_removal', + 'federated_timeline_removal', + 'followers_only', + 'media_nsfw', + 'media_removal', + 'reject', + 'reject_deletes', + 'report_removal', + ], + v.fallback(v.array(v.tuple([v.string(), v.string()])), []), + ), + ), }), fields_limits: coerceObject({ max_fields: v.fallback(v.pipe(v.number(), v.integer(), v.minValue(0)), 4), @@ -253,13 +272,15 @@ const pleromaSchema = coerceObject({ }), migration_cooldown_period: v.fallback(v.optional(v.number()), undefined), multitenancy: coerceObject({ - domains: v.optional(v.array( - v.object({ - domain: v.pipe(v.unknown(), v.transform(String)), - id: v.string(), - public: v.fallback(v.boolean(), false), - }), - )), + domains: v.optional( + v.array( + v.object({ + domain: v.pipe(v.unknown(), v.transform(String)), + id: v.string(), + public: v.fallback(v.boolean(), false), + }), + ), + ), enabled: v.fallback(v.boolean(), false), }), post_formats: v.fallback(v.array(v.string()), ['text/plain']), @@ -376,7 +397,11 @@ const instanceSchema = v.pipe( if (!data.pleroma) { data.pleroma = { metadata: { - post_formats: data.configuration?.statuses?.supported_mime_types || (apiVersions['kmyblue_markdown.fedibird.pl-api'] ? ['text/plain', 'text/markdown'] : []), + post_formats: + data.configuration?.statuses?.supported_mime_types || + (apiVersions['kmyblue_markdown.fedibird.pl-api'] + ? ['text/plain', 'text/markdown'] + : []), }, }; } @@ -390,10 +415,18 @@ const instanceSchema = v.pipe( data.configuration.timelines_access = { ...data.configuration.timelines_access, live_feeds: { - bubble: timelines.bubble ? 'authenticated' : features.includes('bubble_timeline') ? 'public' : 'disabled', + bubble: timelines.bubble + ? 'authenticated' + : features.includes('bubble_timeline') + ? 'public' + : 'disabled', local: timelines.local ? 'authenticated' : 'public', remote: timelines.federated ? 'authenticated' : 'public', - wrenched: timelines.wrenched ? 'authenticated' : features.includes('pleroma:wrenched_timeline') ? 'public' : 'disabled', + wrenched: timelines.wrenched + ? 'authenticated' + : features.includes('pleroma:wrenched_timeline') + ? 'public' + : 'disabled', }, }; } @@ -410,10 +443,12 @@ const instanceSchema = v.pipe( description: v.fallback(v.string(), ''), domain: v.fallback(v.string(), ''), feature_quote: v.fallback(v.boolean(), false), - icons: filteredArray(v.object({ - size: v.pipe(v.string(), v.regex(/^[0-9]+x[0-9]+$/)), - src: v.string(), - })), + icons: filteredArray( + v.object({ + size: v.pipe(v.string(), v.regex(/^[0-9]+x[0-9]+$/)), + src: v.string(), + }), + ), languages: v.fallback(v.array(v.string()), []), pleroma: pleromaSchema, registrations, @@ -423,17 +458,24 @@ const instanceSchema = v.pipe( title: v.fallback(v.string(), ''), usage: usageSchema, version: v.pipe(v.fallback(v.string(), '0.0.0'), v.transform(fixVersion)), - blockchains: v.fallback(v.optional(filteredArray(v.object({ - chain_id: v.fallback(v.nullable(v.string()), null), - chain_metadata: coerceObject({ - is_forwarding_required: v.fallback(v.boolean(), false), - description: v.fallback(v.string(), ''), - payment_amount_min: v.number(), - }), - features: coerceObject({ - subscriptions: v.fallback(v.boolean(), false), - }), - }))), undefined), + blockchains: v.fallback( + v.optional( + filteredArray( + v.object({ + chain_id: v.fallback(v.nullable(v.string()), null), + chain_metadata: coerceObject({ + is_forwarding_required: v.fallback(v.boolean(), false), + description: v.fallback(v.string(), ''), + payment_amount_min: v.number(), + }), + features: coerceObject({ + subscriptions: v.fallback(v.boolean(), false), + }), + }), + ), + ), + undefined, + ), }), ); diff --git a/packages/pl-api/lib/entities/interaction-policy.ts b/packages/pl-api/lib/entities/interaction-policy.ts index 36df12137..78f17de70 100644 --- a/packages/pl-api/lib/entities/interaction-policy.ts +++ b/packages/pl-api/lib/entities/interaction-policy.ts @@ -2,7 +2,15 @@ import * as v from 'valibot'; import { coerceObject } from './utils'; -const interactionPolicyEntrySchema = v.picklist(['public', 'followers', 'following', 'mutuals', 'mentioned', 'author', 'me']); +const interactionPolicyEntrySchema = v.picklist([ + 'public', + 'followers', + 'following', + 'mutuals', + 'mentioned', + 'author', + 'me', +]); /** * @category Entity types @@ -44,5 +52,10 @@ const interactionPoliciesSchema = coerceObject({ */ type InteractionPolicies = v.InferOutput; -export { interactionPolicySchema, interactionPoliciesSchema, type InteractionPolicyEntry, type InteractionPolicy, type InteractionPolicies }; - +export { + interactionPolicySchema, + interactionPoliciesSchema, + type InteractionPolicyEntry, + type InteractionPolicy, + type InteractionPolicies, +}; diff --git a/packages/pl-api/lib/entities/item.ts b/packages/pl-api/lib/entities/item.ts index fc1c80930..273a18f5b 100644 --- a/packages/pl-api/lib/entities/item.ts +++ b/packages/pl-api/lib/entities/item.ts @@ -11,20 +11,33 @@ const baseItemSchema = v.object({ uuid: v.string(), url: v.string(), api_url: v.string(), - category: v.picklist(['book', 'movie', 'tv', 'music', 'game', 'podcast', 'performance', 'collection']), + category: v.picklist([ + 'book', + 'movie', + 'tv', + 'music', + 'game', + 'podcast', + 'performance', + 'collection', + ]), parent_uuid: v.nullable(v.string()), display_title: v.string(), external_resources: v.nullable(filteredArray(externalResourceSchema)), title: v.string(), description: v.string(), - localized_title: filteredArray(v.object({ - lang: v.string(), - text: v.string(), - })), - localized_description: filteredArray(v.object({ - lang: v.string(), - text: v.string(), - })), + localized_title: filteredArray( + v.object({ + lang: v.string(), + text: v.string(), + }), + ), + localized_description: filteredArray( + v.object({ + lang: v.string(), + text: v.string(), + }), + ), conver_image_url: v.nullable(v.string()), rating: v.nullable(v.number()), rating_count: v.nullable(v.number()), @@ -214,17 +227,17 @@ const itemSchema: v.BaseSchema> = v.pipe( * @category Entity types */ type Item = v.InferOutput< -| typeof editionSchema -| typeof tvShowSchema -| typeof tvSeasonSchema -| typeof movieSchema -| typeof albumSchema -| typeof podcastSchema -| typeof gameSchema -| typeof performanceSchema -| typeof podcastEpisodeSchema -| typeof performanceProductionSchema -| typeof tvEpisodeSchema + | typeof editionSchema + | typeof tvShowSchema + | typeof tvSeasonSchema + | typeof movieSchema + | typeof albumSchema + | typeof podcastSchema + | typeof gameSchema + | typeof performanceSchema + | typeof podcastEpisodeSchema + | typeof performanceProductionSchema + | typeof tvEpisodeSchema >; export { diff --git a/packages/pl-api/lib/entities/location.ts b/packages/pl-api/lib/entities/location.ts index 731e95ec9..6023038e7 100644 --- a/packages/pl-api/lib/entities/location.ts +++ b/packages/pl-api/lib/entities/location.ts @@ -15,10 +15,15 @@ const locationSchema = v.object({ origin_provider: v.fallback(v.string(), ''), type: v.fallback(v.string(), ''), timezone: v.fallback(v.string(), ''), - geom: v.fallback(v.nullable(v.object({ - coordinates: v.fallback(v.nullable(v.tuple([v.number(), v.number()])), null), - srid: v.fallback(v.string(), ''), - })), null), + geom: v.fallback( + v.nullable( + v.object({ + coordinates: v.fallback(v.nullable(v.tuple([v.number(), v.number()])), null), + srid: v.fallback(v.string(), ''), + }), + ), + null, + ), }); /** diff --git a/packages/pl-api/lib/entities/marker.ts b/packages/pl-api/lib/entities/marker.ts index a0b370f21..f71e5a2e9 100644 --- a/packages/pl-api/lib/entities/marker.ts +++ b/packages/pl-api/lib/entities/marker.ts @@ -8,10 +8,14 @@ import { datetimeSchema } from './utils'; */ const markerSchema = v.pipe( v.any(), - v.transform((marker: any) => marker ? ({ - unread_count: marker.pleroma?.unread_count, - ...marker, - }) : null), + v.transform((marker: any) => + marker + ? { + unread_count: marker.pleroma?.unread_count, + ...marker, + } + : null, + ), v.object({ last_read_id: v.string(), version: v.pipe(v.number(), v.integer()), @@ -35,9 +39,4 @@ const markersSchema = v.record(v.string(), markerSchema); */ type Markers = v.InferOutput; -export { - markerSchema, - markersSchema, - type Marker, - type Markers, -}; +export { markerSchema, markersSchema, type Marker, type Markers }; diff --git a/packages/pl-api/lib/entities/media-attachment.ts b/packages/pl-api/lib/entities/media-attachment.ts index 187909889..8f9ff760d 100644 --- a/packages/pl-api/lib/entities/media-attachment.ts +++ b/packages/pl-api/lib/entities/media-attachment.ts @@ -6,10 +6,10 @@ import { mimeSchema } from './utils'; /** * @category Schemas */ -const blurhashSchema = v.pipe(v.string(), v.check( - (value) => isBlurhashValid(value).result, - 'invalid blurhash', -)); +const blurhashSchema = v.pipe( + v.string(), + v.check((value) => isBlurhashValid(value).result, 'invalid blurhash'), +); const baseAttachmentSchema = v.object({ id: v.string(), @@ -33,60 +33,97 @@ const imageMetaSchema = v.object({ const imageAttachmentSchema = v.object({ ...baseAttachmentSchema.entries, type: v.literal('image'), - meta: v.fallback(v.object({ - original: v.fallback(v.optional(imageMetaSchema), undefined), - small: v.fallback(v.optional(imageMetaSchema), undefined), - focus: v.fallback(v.optional(v.object({ - x: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), - y: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), - })), undefined), - }), {}), + meta: v.fallback( + v.object({ + original: v.fallback(v.optional(imageMetaSchema), undefined), + small: v.fallback(v.optional(imageMetaSchema), undefined), + focus: v.fallback( + v.optional( + v.object({ + x: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), + y: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), + }), + ), + undefined, + ), + }), + {}, + ), }); const videoAttachmentSchema = v.object({ ...baseAttachmentSchema.entries, type: v.literal('video'), - meta: v.fallback(v.object({ - duration: v.fallback(v.optional(v.number()), undefined), - original: v.fallback(v.optional(v.object({ - ...imageMetaSchema.entries, - frame_rate: v.fallback(v.nullable(v.pipe(v.string(), v.regex(/\d+\/\d+$/))), null), - duration: v.fallback(v.nullable(v.pipe(v.number(), v.minValue(0))), null), - })), undefined), - small: v.fallback(v.optional(imageMetaSchema), undefined), - // WIP: add rest - }), {}), + meta: v.fallback( + v.object({ + duration: v.fallback(v.optional(v.number()), undefined), + original: v.fallback( + v.optional( + v.object({ + ...imageMetaSchema.entries, + frame_rate: v.fallback(v.nullable(v.pipe(v.string(), v.regex(/\d+\/\d+$/))), null), + duration: v.fallback(v.nullable(v.pipe(v.number(), v.minValue(0))), null), + }), + ), + undefined, + ), + small: v.fallback(v.optional(imageMetaSchema), undefined), + // WIP: add rest + }), + {}, + ), }); const gifvAttachmentSchema = v.object({ ...baseAttachmentSchema.entries, type: v.literal('gifv'), - meta: v.fallback(v.object({ - duration: v.fallback(v.optional(v.number()), undefined), - original: v.fallback(v.optional(imageMetaSchema), undefined), - focus: v.fallback(v.optional(v.object({ - x: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), - y: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), - })), undefined), - }), {}), + meta: v.fallback( + v.object({ + duration: v.fallback(v.optional(v.number()), undefined), + original: v.fallback(v.optional(imageMetaSchema), undefined), + focus: v.fallback( + v.optional( + v.object({ + x: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), + y: v.pipe(v.number(), v.minValue(-1), v.maxValue(1)), + }), + ), + undefined, + ), + }), + {}, + ), }); const audioAttachmentSchema = v.object({ ...baseAttachmentSchema.entries, type: v.literal('audio'), - meta: v.fallback(v.object({ - duration: v.fallback(v.optional(v.number()), undefined), - colors: v.fallback(v.optional(v.object({ - background: v.fallback(v.optional(v.string()), undefined), - foreground: v.fallback(v.optional(v.string()), undefined), - accent: v.fallback(v.optional(v.string()), undefined), + meta: v.fallback( + v.object({ duration: v.fallback(v.optional(v.number()), undefined), - })), undefined), - original: v.fallback(v.optional(v.object({ - duration: v.fallback(v.optional(v.number()), undefined), - bitrate: v.fallback(v.optional(v.pipe(v.number(), v.minValue(0))), undefined), - })), undefined), - }), {}), + colors: v.fallback( + v.optional( + v.object({ + background: v.fallback(v.optional(v.string()), undefined), + foreground: v.fallback(v.optional(v.string()), undefined), + accent: v.fallback(v.optional(v.string()), undefined), + duration: v.fallback(v.optional(v.number()), undefined), + }), + ), + undefined, + ), + original: v.fallback( + v.optional( + v.object({ + duration: v.fallback(v.optional(v.number()), undefined), + bitrate: v.fallback(v.optional(v.pipe(v.number(), v.minValue(0))), undefined), + }), + ), + undefined, + ), + }), + {}, + ), }); const unknownAttachmentSchema = v.object({ diff --git a/packages/pl-api/lib/entities/notification.ts b/packages/pl-api/lib/entities/notification.ts index 138c6a3a4..e260045fe 100644 --- a/packages/pl-api/lib/entities/notification.ts +++ b/packages/pl-api/lib/entities/notification.ts @@ -34,7 +34,16 @@ const mentionNotificationSchema = v.object({ const statusNotificationSchema = v.object({ ...baseNotificationSchema.entries, - type: v.picklist(['status', 'reblog', 'favourite', 'poll', 'update', 'quote', 'quoted_update', 'event_reminder']), + type: v.picklist([ + 'status', + 'reblog', + 'favourite', + 'poll', + 'update', + 'quote', + 'quoted_update', + 'event_reminder', + ]), status: statusSchema, }); @@ -99,11 +108,12 @@ const notificationSchema: v.BaseSchema> group_key: `ungrouped-${notification.id}`, ...pick(notification.pleroma || {}, ['is_muted', 'is_seen']), ...notification, - type: notification.type === 'pleroma:report' - ? 'admin.report' - : notification.type === 'reaction' - ? 'emoji_reaction' - : notification.type?.replace(/^pleroma:/, ''), + type: + notification.type === 'pleroma:report' + ? 'admin.report' + : notification.type === 'reaction' + ? 'emoji_reaction' + : notification.type?.replace(/^pleroma:/, ''), })), v.variant('type', [ accountNotificationSchema, @@ -117,23 +127,24 @@ const notificationSchema: v.BaseSchema> chatMentionNotificationSchema, eventParticipationRequestNotificationSchema, biteNotificationSchema, - ])) as any; + ]), +) as any; /** * @category Entity types */ type Notification = v.InferOutput< -| typeof accountNotificationSchema -| typeof mentionNotificationSchema -| typeof statusNotificationSchema -| typeof reportNotificationSchema -| typeof severedRelationshipNotificationSchema -| typeof moderationWarningNotificationSchema -| typeof moveNotificationSchema -| typeof emojiReactionNotificationSchema -| typeof chatMentionNotificationSchema -| typeof eventParticipationRequestNotificationSchema -| typeof biteNotificationSchema + | typeof accountNotificationSchema + | typeof mentionNotificationSchema + | typeof statusNotificationSchema + | typeof reportNotificationSchema + | typeof severedRelationshipNotificationSchema + | typeof moderationWarningNotificationSchema + | typeof moveNotificationSchema + | typeof emojiReactionNotificationSchema + | typeof chatMentionNotificationSchema + | typeof eventParticipationRequestNotificationSchema + | typeof biteNotificationSchema >; export { notificationSchema, type Notification }; diff --git a/packages/pl-api/lib/entities/quote.ts b/packages/pl-api/lib/entities/quote.ts index ae246a352..70efe36bb 100644 --- a/packages/pl-api/lib/entities/quote.ts +++ b/packages/pl-api/lib/entities/quote.ts @@ -2,7 +2,17 @@ import * as v from 'valibot'; import { statusSchema } from './status'; -const quoteStateSchema = v.picklist(['pending', 'accepted', 'rejected', 'revoked', 'deleted', 'unauthorized', 'blocked_account', 'blocked_domain', 'muted-account']); +const quoteStateSchema = v.picklist([ + 'pending', + 'accepted', + 'rejected', + 'revoked', + 'deleted', + 'unauthorized', + 'blocked_account', + 'blocked_domain', + 'muted-account', +]); /** * @category Schemas diff --git a/packages/pl-api/lib/entities/review.ts b/packages/pl-api/lib/entities/review.ts index 3b498607e..f07ee8236 100644 --- a/packages/pl-api/lib/entities/review.ts +++ b/packages/pl-api/lib/entities/review.ts @@ -24,7 +24,4 @@ const reviewSchema = v.object({ */ type Review = v.InferOutput; -export { - reviewSchema, - type Review, -}; +export { reviewSchema, type Review }; diff --git a/packages/pl-api/lib/entities/role.ts b/packages/pl-api/lib/entities/role.ts index 14584738e..a26f356e7 100644 --- a/packages/pl-api/lib/entities/role.ts +++ b/packages/pl-api/lib/entities/role.ts @@ -18,7 +18,4 @@ const roleSchema = v.object({ */ type Role = v.InferOutput; -export { - roleSchema, - type Role, -}; +export { roleSchema, type Role }; diff --git a/packages/pl-api/lib/entities/rule.ts b/packages/pl-api/lib/entities/rule.ts index aea0fd4f0..410fbac00 100644 --- a/packages/pl-api/lib/entities/rule.ts +++ b/packages/pl-api/lib/entities/rule.ts @@ -4,10 +4,16 @@ const baseRuleSchema = v.object({ id: v.string(), text: v.fallback(v.string(), ''), hint: v.fallback(v.string(), ''), - translations: v.optional(v.record(v.string(), v.object({ - text: v.fallback(v.string(), ''), - hint: v.fallback(v.string(), ''), - })), undefined), + translations: v.optional( + v.record( + v.string(), + v.object({ + text: v.fallback(v.string(), ''), + hint: v.fallback(v.string(), ''), + }), + ), + undefined, + ), }); /** diff --git a/packages/pl-api/lib/entities/scheduled-status.ts b/packages/pl-api/lib/entities/scheduled-status.ts index 17bb70716..be136785c 100644 --- a/packages/pl-api/lib/entities/scheduled-status.ts +++ b/packages/pl-api/lib/entities/scheduled-status.ts @@ -12,12 +12,17 @@ const scheduledStatusSchema = v.object({ scheduled_at: datetimeSchema, params: v.object({ text: v.fallback(v.nullable(v.string()), null), - poll: v.fallback(v.nullable(v.object({ - options: v.array(v.string()), - expires_in: v.pipe(v.unknown(), v.transform(String)), - multiple: v.fallback(v.optional(v.boolean()), undefined), - hide_totals: v.fallback(v.optional(v.boolean()), undefined), - })), null), + poll: v.fallback( + v.nullable( + v.object({ + options: v.array(v.string()), + expires_in: v.pipe(v.unknown(), v.transform(String)), + multiple: v.fallback(v.optional(v.boolean()), undefined), + hide_totals: v.fallback(v.optional(v.boolean()), undefined), + }), + ), + null, + ), media_ids: v.fallback(v.nullable(v.string()), null), sensitive: v.fallback(v.nullable(v.pipe(v.unknown(), v.transform(Boolean))), null), spoiler_text: v.fallback(v.nullable(v.string()), null), diff --git a/packages/pl-api/lib/entities/scrobble.ts b/packages/pl-api/lib/entities/scrobble.ts index b1b2d50ac..271077eb6 100644 --- a/packages/pl-api/lib/entities/scrobble.ts +++ b/packages/pl-api/lib/entities/scrobble.ts @@ -8,10 +8,14 @@ import { datetimeSchema } from './utils'; */ const scrobbleSchema = v.pipe( v.any(), - v.transform((scrobble: any) => scrobble ? { - external_link: scrobble.externalLink, - ...scrobble, - } : null), + v.transform((scrobble: any) => + scrobble + ? { + external_link: scrobble.externalLink, + ...scrobble, + } + : null, + ), v.object({ id: v.pipe(v.unknown(), v.transform(String)), account: accountSchema, diff --git a/packages/pl-api/lib/entities/status-edit.ts b/packages/pl-api/lib/entities/status-edit.ts index 46a3c159c..f45627a2b 100644 --- a/packages/pl-api/lib/entities/status-edit.ts +++ b/packages/pl-api/lib/entities/status-edit.ts @@ -15,11 +15,18 @@ const statusEditSchema = v.object({ sensitive: v.pipe(v.unknown(), v.transform(Boolean)), created_at: v.fallback(datetimeSchema, new Date().toISOString()), account: accountSchema, - poll: v.fallback(v.nullable(v.object({ - options: v.array(v.object({ - title: v.string(), - })), - })), null), + poll: v.fallback( + v.nullable( + v.object({ + options: v.array( + v.object({ + title: v.string(), + }), + ), + }), + ), + null, + ), media_attachments: filteredArray(mediaAttachmentSchema), emojis: filteredArray(customEmojiSchema), }); diff --git a/packages/pl-api/lib/entities/status.ts b/packages/pl-api/lib/entities/status.ts index 859624fc6..3547fb52a 100644 --- a/packages/pl-api/lib/entities/status.ts +++ b/packages/pl-api/lib/entities/status.ts @@ -46,19 +46,35 @@ const baseStatusSchema = v.object({ id: v.string(), uri: v.fallback(v.pipe(v.string(), v.url()), ''), created_at: v.fallback(datetimeSchema, new Date().toISOString()), - account: v.pipe(v.unknown(), v.transform((account) => { - if ((window as any).__PL_API_FALLBACK_ACCOUNT && JSON.stringify(account) === '{}') return (window as any).__PL_API_FALLBACK_ACCOUNT; - return account; - }), accountSchema), - content: v.fallback(v.pipe(v.string(), v.transform((note => note === '

' ? '' : note))), ''), + account: v.pipe( + v.unknown(), + v.transform((account) => { + if ((window as any).__PL_API_FALLBACK_ACCOUNT && JSON.stringify(account) === '{}') + return (window as any).__PL_API_FALLBACK_ACCOUNT; + return account; + }), + accountSchema, + ), + content: v.fallback( + v.pipe( + v.string(), + v.transform((note) => (note === '

' ? '' : note)), + ), + '', + ), visibility: v.fallback(v.string(), 'public'), sensitive: v.pipe(v.unknown(), v.transform(Boolean)), spoiler_text: v.fallback(v.string(), ''), media_attachments: filteredArray(mediaAttachmentSchema), - application: v.fallback(v.nullable(v.object({ - name: v.string(), - website: v.fallback(v.nullable(v.pipe(v.string(), v.url())), null), - })), null), + application: v.fallback( + v.nullable( + v.object({ + name: v.string(), + website: v.fallback(v.nullable(v.pipe(v.string(), v.url())), null), + }), + ), + null, + ), mentions: filteredArray(mentionSchema), tags: filteredArray(tagSchema), emojis: filteredArray(customEmojiSchema), @@ -121,13 +137,16 @@ const baseStatusSchema = v.object({ const preprocess = (status: any) => { if (!status) return null; - let quote: { - state: string; - quoted_status: any; - } | { - state: string; - quoted_status_id: string; - } | null = null; + let quote: + | { + state: string; + quoted_status: any; + } + | { + state: string; + quoted_status_id: string; + } + | null = null; const quotedStatus = status.quote ?? status.pleroma?.quote; let quotedStatusId = quotedStatus?.id ?? status.quote_id ?? status.pleroma?.quote_id; @@ -149,9 +168,9 @@ const preprocess = (status: any) => { } status = { - // @ts-ignore + // @ts-expect-error only overrides if present in pleroma object emoji_reactions: status.reactions, - ...(pick(status.pleroma || {}, [ + ...pick(status.pleroma || {}, [ 'local', 'conversation_id', 'direct_conversation_id', @@ -171,11 +190,8 @@ const preprocess = (status: any) => { 'translation', 'rss_feed', 'location', - ])), - ...(pick(status.friendica || {}, [ - 'dislikes_count', - 'disliked', - ])), + ]), + ...pick(status.friendica || {}, ['dislikes_count', 'disliked']), ...status, quote, quote_id: quotedStatusId, @@ -195,29 +211,39 @@ const preprocess = (status: any) => { /** * @category Schemas */ -const statusSchema: v.BaseSchema> = v.pipe(v.any(), v.transform(preprocess), v.object({ - ...baseStatusSchema.entries, - reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), +const statusSchema: v.BaseSchema> = v.pipe( + v.any(), + v.transform(preprocess), + v.object({ + ...baseStatusSchema.entries, + reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), - quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), -})) as any; + quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), + }), +) as any; /** * @category Schemas */ -const statusWithoutAccountSchema = v.pipe(v.any(), v.transform(preprocess), v.object({ - ...(v.omit(baseStatusSchema, ['account']).entries), - account: v.fallback(v.nullable(accountSchema), null), - reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), +const statusWithoutAccountSchema = v.pipe( + v.any(), + v.transform(preprocess), + v.object({ + ...v.omit(baseStatusSchema, ['account']).entries, + account: v.fallback(v.nullable(accountSchema), null), + reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), - quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), -})); + quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), + }), +); -const partialStatusSchema = v.partial(v.object({ - ...baseStatusSchema.entries, - reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), - quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), -})); +const partialStatusSchema = v.partial( + v.object({ + ...baseStatusSchema.entries, + reblog: v.fallback(v.nullable(v.lazy(() => statusSchema)), null), + quote: v.fallback(v.nullable(v.lazy(() => v.union([quoteSchema, shallowQuoteSchema]))), null), + }), +); /** * @category Entity types @@ -226,7 +252,7 @@ type StatusWithoutAccount = Omit, 'accoun account: Account | null; reblog: Status | null; quote: Quote | ShallowQuote | null; -} +}; /** * @category Entity types @@ -234,6 +260,12 @@ type StatusWithoutAccount = Omit, 'accoun type Status = v.InferOutput & { reblog: Status | null; quote: Quote | ShallowQuote | null; -} +}; -export { statusSchema, statusWithoutAccountSchema, partialStatusSchema, type Status, type StatusWithoutAccount }; +export { + statusSchema, + statusWithoutAccountSchema, + partialStatusSchema, + type Status, + type StatusWithoutAccount, +}; diff --git a/packages/pl-api/lib/entities/story-carousel-item.ts b/packages/pl-api/lib/entities/story-carousel-item.ts index 241b48698..7bb61a04d 100644 --- a/packages/pl-api/lib/entities/story-carousel-item.ts +++ b/packages/pl-api/lib/entities/story-carousel-item.ts @@ -3,24 +3,28 @@ import * as v from 'valibot'; /** * @category Schemas */ -const storyCarouselItemSchema = v.pipe(v.any(), v.transform((item) => ({ - account_id: item.pid, - story_id: item.sid, - ...item, -})), v.object({ - account_id: v.string(), - avatar: v.string(), - local: v.boolean(), - username: v.string(), - latest: v.object({ - id: v.pipe(v.unknown(), v.transform(String)), - type: v.string(), - preview_url: v.string(), +const storyCarouselItemSchema = v.pipe( + v.any(), + v.transform((item) => ({ + account_id: item.pid, + story_id: item.sid, + ...item, + })), + v.object({ + account_id: v.string(), + avatar: v.string(), + local: v.boolean(), + username: v.string(), + latest: v.object({ + id: v.pipe(v.unknown(), v.transform(String)), + type: v.string(), + preview_url: v.string(), + }), + url: v.string(), + seen: v.boolean(), + story_id: v.pipe(v.unknown(), v.transform(String)), }), - url: v.string(), - seen: v.boolean(), - story_id: v.pipe(v.unknown(), v.transform(String)), -})); +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/story-media.ts b/packages/pl-api/lib/entities/story-media.ts index 0f42fa4b0..f3e7aaee0 100644 --- a/packages/pl-api/lib/entities/story-media.ts +++ b/packages/pl-api/lib/entities/story-media.ts @@ -3,15 +3,19 @@ import * as v from 'valibot'; /** * @category Schemas */ -const storyMediaSchema = v.pipe(v.any(), v.transform((media) => ({ - id: media.media_id, - url: media.media_url, - type: media.media_type, -})), v.object({ - id: v.string(), - url: v.string(), - type: v.picklist(['photo', 'video']), -})); +const storyMediaSchema = v.pipe( + v.any(), + v.transform((media) => ({ + id: media.media_id, + url: media.media_url, + type: media.media_type, + })), + v.object({ + id: v.string(), + url: v.string(), + type: v.picklist(['photo', 'video']), + }), +); /** * @category Entity types diff --git a/packages/pl-api/lib/entities/streaming-event.ts b/packages/pl-api/lib/entities/streaming-event.ts index c971d02c9..ec2eef477 100644 --- a/packages/pl-api/lib/entities/streaming-event.ts +++ b/packages/pl-api/lib/entities/streaming-event.ts @@ -38,7 +38,11 @@ const baseStreamingEventSchema = v.object({ const statusStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.picklist(['update', 'status.update']), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), statusSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + statusSchema, + ), }); const stringStreamingEventSchema = v.object({ @@ -50,7 +54,11 @@ const stringStreamingEventSchema = v.object({ const notificationStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('notification'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), notificationSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + notificationSchema, + ), }); const emptyStreamingEventSchema = v.object({ @@ -61,46 +69,74 @@ const emptyStreamingEventSchema = v.object({ const conversationStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('conversation'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), conversationSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + conversationSchema, + ), }); const announcementStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('announcement'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), announcementSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + announcementSchema, + ), }); const announcementReactionStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('announcement.reaction'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), announcementReactionSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + announcementReactionSchema, + ), }); const chatUpdateStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('chat_update'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), chatSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + chatSchema, + ), }); const followRelationshipsUpdateStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('follow_relationships_update'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), followRelationshipUpdateSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + followRelationshipUpdateSchema, + ), }); const respondStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('respond'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), v.object({ - type: v.string(), - result: v.picklist(['success', 'ignored', 'error']), - })), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + v.object({ + type: v.string(), + result: v.picklist(['success', 'ignored', 'error']), + }), + ), }); const markerStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('marker'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), markersSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + markersSchema, + ), }); const notificationsMergedEventSchema = v.object({ @@ -111,7 +147,11 @@ const notificationsMergedEventSchema = v.object({ const emojiReactionStreamingEventSchema = v.object({ ...baseStreamingEventSchema.entries, event: v.literal('emoji_reaction'), - payload: v.pipe(v.any(), v.transform((payload: any) => JSON.parse(payload)), emojiReactionSchema), + payload: v.pipe( + v.any(), + v.transform((payload: any) => JSON.parse(payload)), + emojiReactionSchema, + ), }); /** @@ -145,18 +185,18 @@ const streamingEventSchema: v.BaseSchema; export { diff --git a/packages/pl-api/lib/entities/subscription-details.ts b/packages/pl-api/lib/entities/subscription-details.ts index 1bb5fd8a0..29665ec72 100644 --- a/packages/pl-api/lib/entities/subscription-details.ts +++ b/packages/pl-api/lib/entities/subscription-details.ts @@ -17,7 +17,4 @@ const subscriptionDetailsSchema = v.object({ */ type SubscriptionDetails = v.InferOutput; -export { - subscriptionDetailsSchema, - type SubscriptionDetails, -}; +export { subscriptionDetailsSchema, type SubscriptionDetails }; diff --git a/packages/pl-api/lib/entities/subscription-invoice.ts b/packages/pl-api/lib/entities/subscription-invoice.ts index 47aa4e283..2d6f09ae7 100644 --- a/packages/pl-api/lib/entities/subscription-invoice.ts +++ b/packages/pl-api/lib/entities/subscription-invoice.ts @@ -19,7 +19,16 @@ const subscriptionInvoiceSchema = v.object({ /** Requested payment amount (in atomic units). */ amount: v.number(), /** Invoice status. */ - status: v.picklist(['open', 'paid', 'forwarded', 'timeout', 'cancelled', 'underpaid', 'completed', 'failed']), + status: v.picklist([ + 'open', + 'paid', + 'forwarded', + 'timeout', + 'cancelled', + 'underpaid', + 'completed', + 'failed', + ]), /** The date when invoice was created. */ created_at: datetimeSchema, /** The date when invoice times out. */ @@ -31,7 +40,4 @@ const subscriptionInvoiceSchema = v.object({ */ type SubscriptionInvoice = v.InferOutput; -export { - subscriptionInvoiceSchema, - type SubscriptionInvoice, -}; +export { subscriptionInvoiceSchema, type SubscriptionInvoice }; diff --git a/packages/pl-api/lib/entities/subscription-option.ts b/packages/pl-api/lib/entities/subscription-option.ts index 9b1ba02a4..6f4958c7f 100644 --- a/packages/pl-api/lib/entities/subscription-option.ts +++ b/packages/pl-api/lib/entities/subscription-option.ts @@ -21,7 +21,4 @@ const subscriptionOptionSchema = v.variant('type', [ */ type SubscriptionOption = v.InferOutput; -export { - subscriptionOptionSchema, - type SubscriptionOption, -}; +export { subscriptionOptionSchema, type SubscriptionOption }; diff --git a/packages/pl-api/lib/entities/suggestion.ts b/packages/pl-api/lib/entities/suggestion.ts index 897f42cf2..9f61c8cb8 100644 --- a/packages/pl-api/lib/entities/suggestion.ts +++ b/packages/pl-api/lib/entities/suggestion.ts @@ -9,17 +9,18 @@ import { accountSchema } from './account'; const suggestionSchema = v.pipe( v.any(), v.transform((suggestion: any) => { - /** - * Support `/api/v1/suggestions` - * @see {@link https://docs.joinmastodon.org/methods/suggestions/#v1} - */ + /** + * Support `/api/v1/suggestions` + * @see {@link https://docs.joinmastodon.org/methods/suggestions/#v1} + */ if (!suggestion) return null; - if (suggestion?.acct) return { - source: 'staff', - sources: ['featured'], - account: suggestion, - }; + if (suggestion?.acct) + return { + source: 'staff', + sources: ['featured'], + account: suggestion, + }; if (!suggestion.sources) { suggestion.sources = []; diff --git a/packages/pl-api/lib/entities/tag.ts b/packages/pl-api/lib/entities/tag.ts index 2895ee193..2363d5dc3 100644 --- a/packages/pl-api/lib/entities/tag.ts +++ b/packages/pl-api/lib/entities/tag.ts @@ -3,18 +3,24 @@ import * as v from 'valibot'; /** * @category Schemas */ -const historySchema = v.array(v.object({ - day: v.pipe(v.unknown(), v.transform(Number)), - accounts: v.pipe(v.unknown(), v.transform(Number)), - uses: v.pipe(v.unknown(), v.transform(Number)), -})); +const historySchema = v.array( + v.object({ + day: v.pipe(v.unknown(), v.transform(Number)), + accounts: v.pipe(v.unknown(), v.transform(Number)), + uses: v.pipe(v.unknown(), v.transform(Number)), + }), +); /** * @category Schemas * @see {@link https://docs.joinmastodon.org/entities/tag} */ const tagSchema = v.object({ - name: v.pipe(v.string(), v.transform(name => name.startsWith('#') ? name.slice(1) : name), v.minLength(1)), + name: v.pipe( + v.string(), + v.transform((name) => (name.startsWith('#') ? name.slice(1) : name)), + v.minLength(1), + ), url: v.fallback(v.pipe(v.string(), v.url()), ''), history: v.fallback(v.nullable(historySchema), null), following: v.fallback(v.optional(v.boolean()), undefined), diff --git a/packages/pl-api/lib/entities/translation.ts b/packages/pl-api/lib/entities/translation.ts index 08945bf36..7be26d583 100644 --- a/packages/pl-api/lib/entities/translation.ts +++ b/packages/pl-api/lib/entities/translation.ts @@ -4,9 +4,11 @@ import { filteredArray } from './utils'; const translationPollSchema = v.object({ id: v.string(), - options: v.array(v.object({ - title: v.string(), - })), + options: v.array( + v.object({ + title: v.string(), + }), + ), }); const translationMediaAttachment = v.object({ @@ -21,14 +23,15 @@ const translationMediaAttachment = v.object({ const translationSchema = v.pipe( v.any(), v.transform((translation: any) => { - /** - * handle Akkoma - * @see {@link https://akkoma.dev/AkkomaGang/akkoma/src/branch/develop/lib/pleroma/web/mastodon_api/controllers/status_controller.ex#L504} - */ - if (translation?.text) return { - content: translation.text, - detected_source_language: translation.detected_language, - }; + /** + * handle Akkoma + * @see {@link https://akkoma.dev/AkkomaGang/akkoma/src/branch/develop/lib/pleroma/web/mastodon_api/controllers/status_controller.ex#L504} + */ + if (translation?.text) + return { + content: translation.text, + detected_source_language: translation.detected_language, + }; return translation; }), diff --git a/packages/pl-api/lib/entities/utils.ts b/packages/pl-api/lib/entities/utils.ts index 3c54d0202..c131694aa 100644 --- a/packages/pl-api/lib/entities/utils.ts +++ b/packages/pl-api/lib/entities/utils.ts @@ -9,18 +9,24 @@ const datetimeSchema = v.pipe( v.regex(/^\d{4}-\d{2}-\d{2}T([01]\d|2[0-3]):[0-5]\d:[0-5]\d(\.\d+)?(([+-]\d{2}:?\d{2})|(Z)?)$/), ); -const dateSchema = v.pipe(v.string(), v.transform((value) => value.slice(0, 10)), v.regex(/^\d{4}-\d{2}-\d{2}$/)); +const dateSchema = v.pipe( + v.string(), + v.transform((value) => value.slice(0, 10)), + v.regex(/^\d{4}-\d{2}-\d{2}$/), +); /** Validates individual items in an array, dropping any that aren't valid. */ const filteredArray = (schema: v.BaseSchema>) => v.pipe( v.fallback(v.array(v.any()), []), - v.transform((arr) => ( - (arr || []).map((item) => { - const parsed = v.safeParse(schema, item); - return parsed.success ? parsed.output : undefined; - }).filter((item): item is T => Boolean(item)) - )), + v.transform((arr) => + (arr || []) + .map((item) => { + const parsed = v.safeParse(schema, item); + return parsed.success ? parsed.output : undefined; + }) + .filter((item): item is T => Boolean(item)), + ), ); /** Validates the string as an emoji. */ @@ -34,7 +40,7 @@ const coerceObject = (shape: T): v.ObjectSchema typeof input === 'object' && input !== null ? input : {}), + v.transform((input) => (typeof input === 'object' && input !== null ? input : {})), v.object(shape), ), {}, diff --git a/packages/pl-api/lib/features.ts b/packages/pl-api/lib/features.ts index efe99522d..64bd38534 100644 --- a/packages/pl-api/lib/features.ts +++ b/packages/pl-api/lib/features.ts @@ -212,20 +212,13 @@ const getFeatures = (instance: Instance) => { * @see GET /api/v1/pleroma/backups * @see POST /api/v1/pleroma/backups */ - accountBackups: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + accountBackups: any([v.software === AKKOMA, v.software === PLEROMA]), /** * The accounts API allows an acct instead of an ID. * @see GET /api/v1/accounts/:acct_or_id */ - accountByUsername: any([ - v.software === AKKOMA, - v.software === MITRA, - v.software === PLEROMA, - ]), + accountByUsername: any([v.software === AKKOMA, v.software === MITRA, v.software === PLEROMA]), /** * Ability to create accounts. @@ -270,9 +263,7 @@ const getFeatures = (instance: Instance) => { * Ability to set one's location on their profile. * @see PATCH /api/v1/accounts/update_credentials */ - accountLocation: any([ - instance.api_versions['account_location.pleroma.pl-api'] >= 1, - ]), + accountLocation: any([instance.api_versions['account_location.pleroma.pl-api'] >= 1]), /** * Look up an account by the acct. @@ -300,18 +291,13 @@ const getFeatures = (instance: Instance) => { /** * @see PATCH /api/v1/accounts/update_credentials */ - accountMentionPolicy: any([ - v.software === MITRA, - ]), + accountMentionPolicy: any([v.software === MITRA]), /** * Move followers to a different ActivityPub account. * @see POST /api/pleroma/move_account */ - accountMoving: any([ - v.software === AKKOMA, - v.software === PLEROMA && gte(v.version, '2.5.0'), - ]), + accountMoving: any([v.software === AKKOMA, v.software === PLEROMA && gte(v.version, '2.5.0')]), /** * Ability to subscribe to notifications every time an account posts. @@ -332,25 +318,18 @@ const getFeatures = (instance: Instance) => { /** * @see PATCH /api/v1/accounts/update_credentials */ - accountWebLayout: any([ - v.software === GOTOSOCIAL && gte(v.version, '0.19.0'), - ]), + accountWebLayout: any([v.software === GOTOSOCIAL && gte(v.version, '0.19.0')]), /** - * @see PATCH /api/v1/accounts/update_credentials - */ - accountWebVisibility: any([ - v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), - ]), + * @see PATCH /api/v1/accounts/update_credentials + */ + accountWebVisibility: any([v.software === GOTOSOCIAL && gte(v.version, '0.17.0')]), /** * Ability to address a status to a list of users. * @see POST /api/v1/statuses */ - addressableLists: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + addressableLists: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see GET /api/v1/admin/custom_emojis @@ -373,14 +352,9 @@ const getFeatures = (instance: Instance) => { * @see PATCH /api/v1/admin/instance/rules/:id * @see DELETE /api/v1/admin/instance/rules/:id */ - adminRules: any([ - v.software === GOTOSOCIAL, - v.software === PLEROMA && gte(v.version, '2.7.0'), - ]), + adminRules: any([v.software === GOTOSOCIAL, v.software === PLEROMA && gte(v.version, '2.7.0')]), - adminRulesPriority: any([ - v.software === PLEROMA && gte(v.version, '2.7.0'), - ]), + adminRulesPriority: any([v.software === PLEROMA && gte(v.version, '2.7.0')]), /** * Can display announcements set by admins. @@ -452,7 +426,8 @@ const getFeatures = (instance: Instance) => { instance.api_versions['kmyblue_bookmark_category.fedibird.pl-api'] >= 1, ]), - bookmarkFoldersMultiple: instance.api_versions['kmyblue_bookmark_category.fedibird.pl-api'] >= 1, + bookmarkFoldersMultiple: + instance.api_versions['kmyblue_bookmark_category.fedibird.pl-api'] >= 1, /** * Can bookmark statuses. @@ -541,9 +516,7 @@ const getFeatures = (instance: Instance) => { * Ability to delete a chat. * @see DELETE /api/v1/pleroma/chats/:id */ - chatsDelete: any([ - instance.api_versions['chat_delete.pleroma.pl-api'] >= 1, - ]), + chatsDelete: any([instance.api_versions['chat_delete.pleroma.pl-api'] >= 1]), circles: instance.api_versions['kmyblue_circle_history.fedibird.pl-api'] >= 1, @@ -576,10 +549,7 @@ const getFeatures = (instance: Instance) => { /** * @see GET /api/v1/conversations */ - conversationsByRecipients: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + conversationsByRecipients: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to post statuses to the recipients of parent post. @@ -590,10 +560,7 @@ const getFeatures = (instance: Instance) => { /** * @see POST /api/v1/statuses */ - createStatusExpiration: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + createStatusExpiration: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to address recipients of a status explicitly (with `to`). @@ -607,19 +574,13 @@ const getFeatures = (instance: Instance) => { /** * @see POST /api/v1/statuses */ - createStatusReplyToConversation: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + createStatusReplyToConversation: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to address a status to a list of users. * @see POST /api/v1/statuses */ - createStatusListScope: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + createStatusListScope: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see POST /api/v1/statuses @@ -646,11 +607,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/statuses * @see POST /api/v1/statuses/preview */ - createStatusPreview: any([ - v.software === AKKOMA, - v.software === PLEROMA, - v.software === MITRA, - ]), + createStatusPreview: any([v.software === AKKOMA, v.software === PLEROMA, v.software === MITRA]), /** * Ability to add non-standard reactions to a status. @@ -666,11 +623,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/accounts/delete * @see POST /api/pleroma/delete_account */ - deleteAccount: any([ - v.software === AKKOMA, - v.software === GOTOSOCIAL, - v.software === PLEROMA, - ]), + deleteAccount: any([v.software === AKKOMA, v.software === GOTOSOCIAL, v.software === PLEROMA]), /** * @see POST /api/v1/settings/delete_account @@ -782,9 +735,9 @@ const getFeatures = (instance: Instance) => { events: instance.api_versions['events.pleroma.pl-api'] >= 1, /** - * Export blocks to CSV file - * @see GET /api/v1/exports/blocks.csv - */ + * Export blocks to CSV file + * @see GET /api/v1/exports/blocks.csv + */ exportBlocks: v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), /** @@ -808,15 +761,15 @@ const getFeatures = (instance: Instance) => { ]), /** - * Export lists to CSV file - * @see GET /api/v1/exports/lists.csv - */ + * Export lists to CSV file + * @see GET /api/v1/exports/lists.csv + */ exportLists: v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), /** - * Export mutes to CSV file - * @see GET /api/v1/exports/mutes.csv - */ + * Export mutes to CSV file + * @see GET /api/v1/exports/mutes.csv + */ exportMutes: v.software === GOTOSOCIAL && gte(v.version, '0.17.0'), /** Whether the accounts who favourited or emoji-reacted to a status can be viewed through the API. */ @@ -897,10 +850,7 @@ const getFeatures = (instance: Instance) => { * Allows setting the focal point of a media attachment. * @see {@link https://docs.joinmastodon.org/methods/media/} */ - focalPoint: any([ - v.software === GOTOSOCIAL, - v.software === MASTODON, - ]), + focalPoint: any([v.software === GOTOSOCIAL, v.software === MASTODON]), /** * TODO @@ -1002,10 +952,7 @@ const getFeatures = (instance: Instance) => { * @see POST /api/v1/admin/groups/:group_id/unsuspend * @see DELETE /api/v1/admin/groups/:group_id */ - groups: any([ - v.software === PIXELFED, - instance.api_versions['groups.pleroma.pl-api'] >= 1, - ]), + groups: any([v.software === PIXELFED, instance.api_versions['groups.pleroma.pl-api'] >= 1]), groupsSlugs: instance.api_versions['groups.pleroma.pl-api'] >= 1, @@ -1034,9 +981,7 @@ const getFeatures = (instance: Instance) => { * Move followers from remote alias. * @see POST /api/v1/settings/import_followers */ - importFollowers: any([ - v.software === MITRA && gte(v.version, '2.18.0'), - ]), + importFollowers: any([v.software === MITRA && gte(v.version, '2.18.0')]), /** * Import a .csv file with a list of followed users. @@ -1081,7 +1026,7 @@ const getFeatures = (instance: Instance) => { * Mastodon server information API v2. * @see GET /api/v2/instance * @see {@link https://docs.joinmastodon.org/methods/instance/#v2} - */ + */ instanceV2: any([ v.software === FIREFISH, v.software === GOTOSOCIAL, @@ -1171,10 +1116,9 @@ const getFeatures = (instance: Instance) => { * Ability to post statuses that don't federate. * @see POST /api/v1/statuses */ - localOnlyStatuses: federation && any([ - v.software === GOTOSOCIAL, - v.software === MASTODON && v.build === HOMETOWN, - ]), + localOnlyStatuses: + federation && + any([v.software === GOTOSOCIAL, v.software === MASTODON && v.build === HOMETOWN]), /** * Can sign in using username instead of e-mail address. @@ -1192,10 +1136,7 @@ const getFeatures = (instance: Instance) => { * @see GET /api/pleroma/aliases * @see PATCH /api/v1/accounts/update_credentials */ - manageAccountAliases: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + manageAccountAliases: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see GET /api/pleroma/accounts/mfa @@ -1212,18 +1153,12 @@ const getFeatures = (instance: Instance) => { /** * @see GET /api/pleroma/accounts/mfa/backup_codes */ - manageMfaBackupCodes: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + manageMfaBackupCodes: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see POST /api/v1/user/2fa/enable */ - manageMfaRequiresPassword: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + manageMfaRequiresPassword: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Can perform moderation actions with account and reports. @@ -1288,10 +1223,7 @@ const getFeatures = (instance: Instance) => { * Ability to hide notifications from people you don't follow. * @see PUT /api/pleroma/notification_settings */ - muteStrangers: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + muteStrangers: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to mute users. @@ -1347,10 +1279,7 @@ const getFeatures = (instance: Instance) => { /** * @see DELETE /api/v1/notifications/destroy_multiple */ - notificationsDismissMultiple: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + notificationsDismissMultiple: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see GET /api/v1/notifications @@ -1360,10 +1289,7 @@ const getFeatures = (instance: Instance) => { /** * @see GET /api/v1/notifications */ - notificationsExcludeVisibilities: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + notificationsExcludeVisibilities: any([v.software === AKKOMA, v.software === PLEROMA]), /** * @see GET /api/v1/notifications/unread_count @@ -1409,10 +1335,7 @@ const getFeatures = (instance: Instance) => { instance.api_versions['outgoing_follow_requests.pleroma.pl-api'] >= 1, ]), - pleromaAdminAccounts: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaAdminAccounts: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to manage announcements by admins. @@ -1423,25 +1346,13 @@ const getFeatures = (instance: Instance) => { * @see DELETE /api/v1/pleroma/admin/announcements/:id * @see {@link https://docs.pleroma.social/backend/development/API/admin_api/#get-apiv1pleromaadminannouncements} */ - pleromaAdminAnnouncements: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaAdminAnnouncements: any([v.software === AKKOMA, v.software === PLEROMA]), - pleromaAdminModerationLog: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaAdminModerationLog: any([v.software === AKKOMA, v.software === PLEROMA]), - pleromaAdminRelays: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaAdminRelays: any([v.software === AKKOMA, v.software === PLEROMA]), - pleromaAdminStatuses: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaAdminStatuses: any([v.software === AKKOMA, v.software === PLEROMA]), pleromaAdminStatusesRedact: instance.api_versions['admin_statuses_redact.pleroma.pl-api'] >= 1, @@ -1449,10 +1360,7 @@ const getFeatures = (instance: Instance) => { * Displays a form to follow a user when logged out. * @see POST /main/ostatus */ - pleromaRemoteFollow: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + pleromaRemoteFollow: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Can add polls to statuses. @@ -1531,10 +1439,7 @@ const getFeatures = (instance: Instance) => { * Returns favorites timeline of any user * @see GET /api/v1/pleroma/accounts/:id/favourites */ - publicFavourites: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + publicFavourites: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Can display a timeline of all known public statuses. @@ -1611,10 +1516,7 @@ const getFeatures = (instance: Instance) => { * Can request a password reset email through the API. * @see POST /auth/password */ - resetPassword: any([ - v.software === AKKOMA, - v.software === PLEROMA, - ]), + resetPassword: any([v.software === AKKOMA, v.software === PLEROMA]), /** * Ability to post statuses in Markdown, BBCode, and HTML. @@ -1772,9 +1674,7 @@ const getFeatures = (instance: Instance) => { * Remove an account from follow suggestions * @see DELETE /api/v1/suggestions/:account_id */ - suggestionsDismiss: any([ - v.software === MASTODON, - ]), + suggestionsDismiss: any([v.software === MASTODON]), /** * Supports V2 suggested accounts. @@ -1844,11 +1744,7 @@ const getFeatures = (instance: Instance) => { * Whether the backend allows adding users you don't follow to lists. * @see POST /api/v1/lists/:id/accounts */ - unrestrictedLists: any([ - v.software === AKKOMA, - v.software === PLEROMA, - v.software === SNAC, - ]), + unrestrictedLists: any([v.software === AKKOMA, v.software === PLEROMA, v.software === SNAC]), /** * Can display a timeline of most recently wrenched statuses. @@ -1879,9 +1775,12 @@ const parseVersion = (version: string): Backend => { const match = regex.exec(version.replace('/', ' ')); const semverString = match && (match[3] || match[1]); - const semver = match ? semverParse(semverString) || semverCoerce(semverString, { - loose: true, - }) : null; + const semver = match + ? semverParse(semverString) || + semverCoerce(semverString, { + loose: true, + }) + : null; const compat = match ? semverParse(match[1]) || semverCoerce(match[1]) : null; if (match && semver && compat) { return { @@ -1890,16 +1789,15 @@ const parseVersion = (version: string): Backend => { software: match[2] || MASTODON, version: semver.version.split('-')[0], }; - } else { - // If we can't parse the version, this is a new and exotic backend. - // Fall back to minimal featureset. - return { - build: null, - compatVersion: '0.0.0', - software: null, - version: '0.0.0', - }; } + // If we can't parse the version, this is a new and exotic backend. + // Fall back to minimal featureset. + return { + build: null, + compatVersion: '0.0.0', + software: null, + version: '0.0.0', + }; }; export { diff --git a/packages/pl-api/lib/main.ts b/packages/pl-api/lib/main.ts index 9d4abc3d4..639273eae 100644 --- a/packages/pl-api/lib/main.ts +++ b/packages/pl-api/lib/main.ts @@ -1,4 +1,4 @@ -export { PlApiClient } from './client'; +export { default as PlApiClient } from './client'; export { PlApiDirectoryClient } from './directory-client'; export { type Response as PlApiResponse } from './request'; export * from './entities'; diff --git a/packages/pl-api/lib/params/accounts.ts b/packages/pl-api/lib/params/accounts.ts index 37c1dc365..e809b7757 100644 --- a/packages/pl-api/lib/params/accounts.ts +++ b/packages/pl-api/lib/params/accounts.ts @@ -1,4 +1,11 @@ -import type { LanguageParam, OnlyEventsParam, OnlyMediaParam, PaginationParams, WithMutedParam, WithRelationshipsParam } from './common'; +import type { + LanguageParam, + OnlyEventsParam, + OnlyMediaParam, + PaginationParams, + WithMutedParam, + WithRelationshipsParam, +} from './common'; /** * @category Request params @@ -8,7 +15,8 @@ type GetAccountParams = WithMutedParam; /** * @category Request params */ -interface GetAccountStatusesParams extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { +interface GetAccountStatusesParams + extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { /** Boolean. Filter out statuses in reply to a different account. */ exclude_replies?: boolean; /** Boolean. Filter out boosts from the response. */ @@ -48,7 +56,7 @@ interface FollowAccountParams { /** * Array of String (ISO 639-1 language two-letter code). Filter received statuses for these languages. If not provided, you will receive this account’s posts in all languages. * Requires features{@link Features['followAccountLanguages']}. - */ + */ languages?: string[]; } diff --git a/packages/pl-api/lib/params/admin.ts b/packages/pl-api/lib/params/admin.ts index b320ad458..51dd152b2 100644 --- a/packages/pl-api/lib/params/admin.ts +++ b/packages/pl-api/lib/params/admin.ts @@ -130,7 +130,16 @@ type AdminGetCanonicalEmailBlocks = PaginationParams; /** * @category Request params */ -type AdminDimensionKey = 'languages' | 'sources' | 'servers' | 'space_usage' | 'software_versions' | 'tag_servers' | 'tag_languages' | 'instance_accounts' | 'instance_languages'; +type AdminDimensionKey = + | 'languages' + | 'sources' + | 'servers' + | 'space_usage' + | 'software_versions' + | 'tag_servers' + | 'tag_languages' + | 'instance_accounts' + | 'instance_languages'; /** * @category Request params @@ -197,7 +206,21 @@ type AdminUpdateIpBlockParams = Partial; /** * @category Request params */ -type AdminMeasureKey = 'active_users' | 'new_users' | 'interactions' | 'opened_reports' | 'resolved_reports' | 'tag_accounts' | 'tag_uses' | 'tag_servers' | 'instance_accounts' | 'instance_media_attachments' | 'instance_reports' | 'instance_statuses' | 'instance_follows' | 'instance_followers'; +type AdminMeasureKey = + | 'active_users' + | 'new_users' + | 'interactions' + | 'opened_reports' + | 'resolved_reports' + | 'tag_accounts' + | 'tag_uses' + | 'tag_servers' + | 'instance_accounts' + | 'instance_media_attachments' + | 'instance_reports' + | 'instance_statuses' + | 'instance_follows' + | 'instance_followers'; /** * @category Request params @@ -333,8 +356,7 @@ interface AdminUpdateCustomEmojiParams { /** * @category Request params */ -interface AdminGetGroupsParams { -} +interface AdminGetGroupsParams {} export type { AdminGetAccountsParams, diff --git a/packages/pl-api/lib/params/antennas.ts b/packages/pl-api/lib/params/antennas.ts index 6af57834d..8293565a0 100644 --- a/packages/pl-api/lib/params/antennas.ts +++ b/packages/pl-api/lib/params/antennas.ts @@ -17,7 +17,4 @@ interface CreateAntennaParams { */ type UpdateAntennaParams = Partial; -export { - type CreateAntennaParams, - type UpdateAntennaParams, -}; +export { type CreateAntennaParams, type UpdateAntennaParams }; diff --git a/packages/pl-api/lib/params/apps.ts b/packages/pl-api/lib/params/apps.ts index 17e5a839d..367a17fa6 100644 --- a/packages/pl-api/lib/params/apps.ts +++ b/packages/pl-api/lib/params/apps.ts @@ -12,6 +12,4 @@ interface CreateApplicationParams { website?: string; } -export type { - CreateApplicationParams, -}; +export type { CreateApplicationParams }; diff --git a/packages/pl-api/lib/params/chats.ts b/packages/pl-api/lib/params/chats.ts index c9e16a5db..348f392eb 100644 --- a/packages/pl-api/lib/params/chats.ts +++ b/packages/pl-api/lib/params/chats.ts @@ -13,16 +13,14 @@ type GetChatMessagesParams = PaginationParams; /** * @category Request params */ -type CreateChatMessageParams = { - content?: string; - media_id: string; -} | { - content: string; - media_id?: string; -}; +type CreateChatMessageParams = + | { + content?: string; + media_id: string; + } + | { + content: string; + media_id?: string; + }; -export type { - GetChatsParams, - GetChatMessagesParams, - CreateChatMessageParams, -}; +export type { GetChatsParams, GetChatMessagesParams, CreateChatMessageParams }; diff --git a/packages/pl-api/lib/params/circles.ts b/packages/pl-api/lib/params/circles.ts index 249614889..422f3ddb6 100644 --- a/packages/pl-api/lib/params/circles.ts +++ b/packages/pl-api/lib/params/circles.ts @@ -10,7 +10,4 @@ type GetCircleStatusesParams = PaginationParams; */ type GetCircleAccountsParams = PaginationParams; -export type { - GetCircleStatusesParams, - GetCircleAccountsParams, -}; +export type { GetCircleStatusesParams, GetCircleAccountsParams }; diff --git a/packages/pl-api/lib/params/instance.ts b/packages/pl-api/lib/params/instance.ts index 4d5652573..acd6f46d3 100644 --- a/packages/pl-api/lib/params/instance.ts +++ b/packages/pl-api/lib/params/instance.ts @@ -12,6 +12,4 @@ interface ProfileDirectoryParams { local?: boolean; } -export type { - ProfileDirectoryParams, -}; +export type { ProfileDirectoryParams }; diff --git a/packages/pl-api/lib/params/interaction-requests.ts b/packages/pl-api/lib/params/interaction-requests.ts index b5c53fac5..cb06ce92a 100644 --- a/packages/pl-api/lib/params/interaction-requests.ts +++ b/packages/pl-api/lib/params/interaction-requests.ts @@ -14,6 +14,4 @@ interface GetInteractionRequestsParams extends PaginationParams { reblogs?: boolean; } -export type { - GetInteractionRequestsParams, -}; +export type { GetInteractionRequestsParams }; diff --git a/packages/pl-api/lib/params/lists.ts b/packages/pl-api/lib/params/lists.ts index 2536302a6..520a174c5 100644 --- a/packages/pl-api/lib/params/lists.ts +++ b/packages/pl-api/lib/params/lists.ts @@ -13,12 +13,12 @@ interface CreateListParams { /** * Boolean. Whether to receive notifications for new posts in the list. * Requires features{@link Features['listsNotifications']} - */ + */ notify?: boolean; /** * Boolean. Whether the list should appear in the navigation bar. * Requires features{@link Features['listsFavourites']} - */ + */ favourite?: boolean; } @@ -32,8 +32,4 @@ type UpdateListParams = Partial; */ type GetListAccountsParams = PaginationParams; -export type { - CreateListParams, - UpdateListParams, - GetListAccountsParams, -}; +export type { CreateListParams, UpdateListParams, GetListAccountsParams }; diff --git a/packages/pl-api/lib/params/media.ts b/packages/pl-api/lib/params/media.ts index 973c0a13e..caedfcd12 100644 --- a/packages/pl-api/lib/params/media.ts +++ b/packages/pl-api/lib/params/media.ts @@ -30,7 +30,4 @@ interface UpdateMediaParams { focus?: string; } -export type { - UploadMediaParams, - UpdateMediaParams, -}; +export type { UploadMediaParams, UpdateMediaParams }; diff --git a/packages/pl-api/lib/params/oauth.ts b/packages/pl-api/lib/params/oauth.ts index 354540f8a..a9013674e 100644 --- a/packages/pl-api/lib/params/oauth.ts +++ b/packages/pl-api/lib/params/oauth.ts @@ -60,9 +60,4 @@ interface MfaChallengeParams { code: string; } -export type { - OauthAuthorizeParams, - GetTokenParams, - RevokeTokenParams, - MfaChallengeParams, -}; +export type { OauthAuthorizeParams, GetTokenParams, RevokeTokenParams, MfaChallengeParams }; diff --git a/packages/pl-api/lib/params/scheduled-statuses.ts b/packages/pl-api/lib/params/scheduled-statuses.ts index 4fdb0fa5b..dee2ef8d3 100644 --- a/packages/pl-api/lib/params/scheduled-statuses.ts +++ b/packages/pl-api/lib/params/scheduled-statuses.ts @@ -5,6 +5,4 @@ import type { PaginationParams } from './common'; */ type GetScheduledStatusesParams = PaginationParams; -export type { - GetScheduledStatusesParams, -}; +export type { GetScheduledStatusesParams }; diff --git a/packages/pl-api/lib/params/search.ts b/packages/pl-api/lib/params/search.ts index 4f3df33ea..ac54f6cd0 100644 --- a/packages/pl-api/lib/params/search.ts +++ b/packages/pl-api/lib/params/search.ts @@ -18,6 +18,4 @@ interface SearchParams extends Exclude, WithRelati offset?: number; } -export type { - SearchParams, -}; +export type { SearchParams }; diff --git a/packages/pl-api/lib/params/settings.ts b/packages/pl-api/lib/params/settings.ts index 28159eea2..a748fbdf1 100644 --- a/packages/pl-api/lib/params/settings.ts +++ b/packages/pl-api/lib/params/settings.ts @@ -38,12 +38,15 @@ type CreateAccountParams = { /** Invite code */ invite_code?: string; -} & ({ - /** EIP-4361 message */ - message: string; - /** EIP-4361 signature (required if message is present) */ - signature: string; -} | {}) +} & ( + | { + /** EIP-4361 message */ + message: string; + /** EIP-4361 signature (required if message is present) */ + signature: string; + } + | Record +); /** * @category Request params @@ -71,12 +74,15 @@ interface UpdateCredentialsParams { /** Boolean. Whether public posts should be searchable to anyone. */ indexable?: boolean; /** Hash. The profile fields to be set. Inside this hash, the key is an integer cast to a string (although the exact integer does not matter), and the value is another hash including name and value. By default, max 4 fields. */ - fields_attributes?: Record; + fields_attributes?: Record< + string, + { + /** String. The name of the profile field. By default, max 255 characters. */ + name: string; + /** String. The value of the profile field. By default, max 255 characters. */ + value: string; + } + >; source?: { /** String. Default post privacy for authored statuses. Can be `public`, `unlisted`, or `private`. */ privacy?: string; @@ -140,7 +146,7 @@ interface UpdateCredentialsParams { /** * Enable RSS feed for this account's Public posts at `/[username]/feed.rss` * Requires features{@link Features.accountEnableRss}. - */ + */ enable_rss?: boolean; /** * Include boosts created by the account on the web view of the account. @@ -199,7 +205,9 @@ type UpdateInteractionPoliciesParams = Record< 'can_favourite' | 'can_reblog' | 'can_reply', Record< 'always' | 'with_approval', - Array<'public' | 'followers' | 'following' | 'mutuals' | 'mentioned' | 'author' | 'me' | string> + Array< + 'public' | 'followers' | 'following' | 'mutuals' | 'mentioned' | 'author' | 'me' | string + > > > >; diff --git a/packages/pl-api/lib/params/statuses.ts b/packages/pl-api/lib/params/statuses.ts index 5b1f27b6b..9a8ef8e9c 100644 --- a/packages/pl-api/lib/params/statuses.ts +++ b/packages/pl-api/lib/params/statuses.ts @@ -71,7 +71,7 @@ interface CreateStatusOptionalParams { /** * A list of nicknames (like `lain@soykaf.club` or `lain` on the local server) that will be used to determine who is going to be addressed by this post. Using this will disable the implicit addressing by mentioned names in the `status` body, only the people in the `to` list will be addressed. The normal rules for post visibility are not affected by this and will still apply. * Requires features{@link Features['createStatusExplicitAddressing']}. - */ + */ to?: string[]; /** * The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour. @@ -116,7 +116,8 @@ interface CreateStatusOptionalParams { /** * @category Request params */ -type CreateStatusParams = (CreateStatusWithContent | CreateStatusWithMedia) & CreateStatusOptionalParams; +type CreateStatusParams = (CreateStatusWithContent | CreateStatusWithMedia) & + CreateStatusOptionalParams; /** * @category Request params @@ -144,22 +145,26 @@ type GetStatusContextParams = LanguageParam; /** * @category Request params */ -type GetRebloggedByParams = Omit +type GetRebloggedByParams = Omit; /** * @category Request params */ -type GetFavouritedByParams = Omit +type GetFavouritedByParams = Omit; /** * @category Request params */ -type EditStatusOptionalParams = Pick; +type EditStatusOptionalParams = Pick< + CreateStatusOptionalParams, + 'content_type' | 'sensitive' | 'spoiler_text' | 'language' | 'quote_approval_policy' +>; /** * @category Request params */ -type EditStatusParams = (CreateStatusWithContent | CreateStatusWithMedia) & EditStatusOptionalParams; +type EditStatusParams = (CreateStatusWithContent | CreateStatusWithMedia) & + EditStatusOptionalParams; /** * @category Request params @@ -199,4 +204,3 @@ export type { GetStatusReferencesParams, GetStatusMentionedUsersParams, }; - diff --git a/packages/pl-api/lib/params/stories.ts b/packages/pl-api/lib/params/stories.ts index eb68782aa..fa054eb85 100644 --- a/packages/pl-api/lib/params/stories.ts +++ b/packages/pl-api/lib/params/stories.ts @@ -7,7 +7,15 @@ interface CreateStoryPollParams { can_react: boolean; } -type StoryReportType = 'spam' | 'sensitive' | 'abusive' | 'underage' | 'copyright' | 'impersonation' | 'scam' | 'terrorism'; +type StoryReportType = + | 'spam' + | 'sensitive' + | 'abusive' + | 'underage' + | 'copyright' + | 'impersonation' + | 'scam' + | 'terrorism'; interface CropStoryPhotoParams { width: number; diff --git a/packages/pl-api/lib/params/timelines.ts b/packages/pl-api/lib/params/timelines.ts index 4beba8590..a8892d115 100644 --- a/packages/pl-api/lib/params/timelines.ts +++ b/packages/pl-api/lib/params/timelines.ts @@ -1,9 +1,16 @@ -import type { LanguageParam, OnlyEventsParam, OnlyMediaParam, PaginationParams, WithMutedParam } from './common'; +import type { + LanguageParam, + OnlyEventsParam, + OnlyMediaParam, + PaginationParams, + WithMutedParam, +} from './common'; /** * @category Request params */ -interface PublicTimelineParams extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { +interface PublicTimelineParams + extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { /** Boolean. Show only local statuses? Defaults to false. */ local?: boolean; /** Boolean. Show only remote statuses? Defaults to false. */ @@ -19,7 +26,8 @@ interface PublicTimelineParams extends PaginationParams, WithMutedParam, OnlyEve /** * @category Request params */ -interface HashtagTimelineParams extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { +interface HashtagTimelineParams + extends PaginationParams, WithMutedParam, OnlyEventsParam, OnlyMediaParam, LanguageParam { /** Array of String. Return statuses that contain any of these additional tags. */ any?: string[]; /** Array of String. Return statuses that contain all of these additional tags. */ @@ -85,12 +93,20 @@ type GroupTimelineParams = PaginationParams & WithMutedParam & OnlyMediaParam & /** * @category Request params */ -type BubbleTimelineParams = PaginationParams & WithMutedParam & OnlyEventsParam & OnlyMediaParam & LanguageParam; +type BubbleTimelineParams = PaginationParams & + WithMutedParam & + OnlyEventsParam & + OnlyMediaParam & + LanguageParam; /** * @category Request params */ -type WrenchedTimelineParams = PaginationParams & WithMutedParam & OnlyEventsParam & OnlyMediaParam & LanguageParam; +type WrenchedTimelineParams = PaginationParams & + WithMutedParam & + OnlyEventsParam & + OnlyMediaParam & + LanguageParam; export type { PublicTimelineParams, diff --git a/packages/pl-api/lib/params/trends.ts b/packages/pl-api/lib/params/trends.ts index 9f5cc6680..2c643f11c 100644 --- a/packages/pl-api/lib/params/trends.ts +++ b/packages/pl-api/lib/params/trends.ts @@ -30,8 +30,4 @@ interface GetTrendingStatuses extends GetTrends { */ type GetTrendingLinks = GetTrends; -export type { - GetTrendingTags, - GetTrendingStatuses, - GetTrendingLinks, -}; +export type { GetTrendingTags, GetTrendingStatuses, GetTrendingLinks }; diff --git a/packages/pl-api/lib/request.ts b/packages/pl-api/lib/request.ts index fa3577cc8..3c7ed8d84 100644 --- a/packages/pl-api/lib/request.ts +++ b/packages/pl-api/lib/request.ts @@ -25,10 +25,10 @@ const getLinks = (response: Pick): LinkHeader => new LinkHeader(response.headers?.get('link') || undefined); const getNextLink = (response: Pick): string | null => - getLinks(response).refs.find(link => link.rel.toLocaleLowerCase() === 'next')?.uri || null; + getLinks(response).refs.find((link) => link.rel.toLocaleLowerCase() === 'next')?.uri || null; const getPrevLink = (response: Pick): string | null => - getLinks(response).refs.find(link => link.rel.toLocaleLowerCase() === 'prev')?.uri || null; + getLinks(response).refs.find((link) => link.rel.toLocaleLowerCase() === 'prev')?.uri || null; interface AsyncRefreshHeader { id: string; @@ -56,7 +56,7 @@ const getAsyncRefreshHeader = (response: Pick): AsyncRefres if (val.startsWith('"')) { typedValue = val.slice(1, -1); } else { - typedValue = parseInt(val); + typedValue = parseInt(val, 10); } asyncRefreshHeader[key] = typedValue; @@ -82,22 +82,31 @@ interface RequestBody> { type RequestMeta = Pick; -function request(this: Pick, input: URL | RequestInfo, { - body, - method = body ? 'POST' : 'GET', - params, - onUploadProgress, - signal, - contentType = 'application/json', - idempotencyKey, -}: RequestBody = {}) { +function request( + this: Pick< + PlApiClient, + 'accessToken' | 'customAuthorizationToken' | 'iceshrimpAccessToken' | 'baseURL' + >, + input: URL | RequestInfo, + { + body, + method = body ? 'POST' : 'GET', + params, + onUploadProgress, + signal, + contentType = 'application/json', + idempotencyKey, + }: RequestBody = {}, +) { input = input.toString(); const fullPath = buildFullPath(input, this.baseURL, params); const headers = new Headers(); - if (input.startsWith('/api/iceshrimp/') && this.iceshrimpAccessToken) headers.set('Authorization', `Bearer ${this.iceshrimpAccessToken}`); + if (input.startsWith('/api/iceshrimp/') && this.iceshrimpAccessToken) + headers.set('Authorization', `Bearer ${this.iceshrimpAccessToken}`); else if (this.accessToken) headers.set('Authorization', `Bearer ${this.accessToken}`); - else if (this.customAuthorizationToken) headers.set('Authorization', this.customAuthorizationToken); + else if (this.customAuthorizationToken) + headers.set('Authorization', this.customAuthorizationToken); if (contentType !== '' && body) headers.set('Content-Type', contentType); if (idempotencyKey) headers.set('Idempotency-Key', idempotencyKey); @@ -117,19 +126,21 @@ function request(this: Pick= 400) reject({ response: { - status: xhr.status, - statusText: xhr.statusText, - url: xhr.responseURL, - data, - json, - - } }); - resolve({ status: xhr.status, data, json } as any as Response); + if (xhr.status >= 400) + reject({ + response: { + status: xhr.status, + statusText: xhr.statusText, + url: xhr.responseURL, + data, + json, + }, + }); + else resolve({ status: xhr.status, data, json } as any as Response); }); xhr.open(method, fullPath, true); @@ -177,6 +188,5 @@ export { getNextLink, getPrevLink, getAsyncRefreshHeader, - request, request as default, }; diff --git a/packages/pl-api/lib/responses.ts b/packages/pl-api/lib/responses.ts index fc5f528fa..361e838c5 100644 --- a/packages/pl-api/lib/responses.ts +++ b/packages/pl-api/lib/responses.ts @@ -9,6 +9,4 @@ interface PaginatedResponse { total?: number; } -export type { - PaginatedResponse, -}; +export type { PaginatedResponse }; diff --git a/packages/pl-api/lib/utils/accounts.ts b/packages/pl-api/lib/utils/accounts.ts index 6a87b2a2d..83cd29322 100644 --- a/packages/pl-api/lib/utils/accounts.ts +++ b/packages/pl-api/lib/utils/accounts.ts @@ -10,7 +10,11 @@ const DEFAULT_HEADERS: Array = [ ]; /** Check if the avatar is a default avatar */ -const isDefaultHeader = (url: string = '') => url === '' || DEFAULT_HEADERS.some(header => typeof header === 'string' ? url.endsWith(header) : header.test(url)); +const isDefaultHeader = (url: string = '') => + url === '' || + DEFAULT_HEADERS.some((header) => + typeof header === 'string' ? url.endsWith(header) : header.test(url), + ); /** Default avatar filenames from various backends */ const DEFAULT_AVATARS: Array = [ @@ -23,9 +27,10 @@ const DEFAULT_AVATARS: Array = [ ]; /** Check if the avatar is a default avatar */ -const isDefaultAvatar = (url: string = '') => url === '' || DEFAULT_AVATARS.some(avatar => typeof avatar === 'string' ? url.endsWith(avatar) : avatar.test(url)); +const isDefaultAvatar = (url: string = '') => + url === '' || + DEFAULT_AVATARS.some((avatar) => + typeof avatar === 'string' ? url.endsWith(avatar) : avatar.test(url), + ); -export { - isDefaultHeader, - isDefaultAvatar, -}; +export { isDefaultHeader, isDefaultAvatar }; diff --git a/packages/pl-api/lib/utils/domain.ts b/packages/pl-api/lib/utils/domain.ts index 111fcc863..11e2b4b70 100644 --- a/packages/pl-api/lib/utils/domain.ts +++ b/packages/pl-api/lib/utils/domain.ts @@ -15,9 +15,8 @@ const guessFqn = (account: Pick): string => { if (domain) { return acct; - } else { - return [user, getDomainFromURL(account)].join('@'); } + return [user, getDomainFromURL(account)].join('@'); }; export { getDomainFromURL, guessFqn }; diff --git a/packages/pl-api/lib/utils/url.ts b/packages/pl-api/lib/utils/url.ts index d9cc6c4d9..49a2d9fa5 100644 --- a/packages/pl-api/lib/utils/url.ts +++ b/packages/pl-api/lib/utils/url.ts @@ -3,12 +3,12 @@ import queryString from 'query-string'; // Adapted from Axios https://github.com/axios/axios/blob/v1.x/lib/core/buildFullPath.js const isAbsoluteURL = (url: string) => /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); -const combineURLs = (baseURL: string, relativeURL: string) => relativeURL - ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; +const combineURLs = (baseURL: string, relativeURL: string) => + relativeURL ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; const buildFullPath = (requestedURL: string, baseURL?: string, params?: Record) => { - const path = (baseURL && !isAbsoluteURL(requestedURL)) ? combineURLs(baseURL, requestedURL) : requestedURL; + const path = + baseURL && !isAbsoluteURL(requestedURL) ? combineURLs(baseURL, requestedURL) : requestedURL; if (params && Object.entries(params).length) { const { url, query } = queryString.parseUrl(path); @@ -18,6 +18,4 @@ const buildFullPath = (requestedURL: string, baseURL?: string, params?: Record=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.32.0': + resolution: {integrity: sha512-w1cmNXf9zs0vKLuNgyUF3hZ9VUAS1hBmQGndYJv1OmcVqStBtRTRNxSWkWM0TMkrA9UbvIvM9gfN+ib4Wy6lkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.32.0': + resolution: {integrity: sha512-m6wQojz/hn94XdZugFPtdFbOvXbOSYEqPsR2gyLyID3BvcrC2QsJyT1o3gb4BZEGtZrG1NiKVGwDRLM0dHd2mg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.32.0': + resolution: {integrity: sha512-hN966Uh6r3Erkg2MvRcrJWaB6QpBzP15rxWK/QtkUyD47eItJLsAQ2Hrm88zMIpFZ3COXZLuN3hqgSlUtvB0Xw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.32.0': + resolution: {integrity: sha512-g5UZPGt8tJj263OfSiDGdS54HPa0KgFfspLVAUivVSdoOgsk6DkwVS9nO16xQTDztzBPGxTvrby8WuufF0g86Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.32.0': + resolution: {integrity: sha512-F4ZY83/PVQo9ZJhtzoMqbmjqEyTVEZjbaw4x1RhzdfUhddB41ZB2Vrt4eZi7b4a4TP85gjPRHgQBeO0c1jbtaw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.32.0': + resolution: {integrity: sha512-olR37eG16Lzdj9OBSvuoT5RxzgM5xfQEHm1OEjB3M7Wm4KWa5TDWIT13Aiy74GvAN77Hq1+kUKcGVJ/0ynf75g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.32.0': + resolution: {integrity: sha512-eZhk6AIjRCDeLoXYBhMW7qq/R1YyVi+tGnGfc3kp7AZQrMsFaWtP/bgdCJCTNXMpbMwymtVz0qhSQvR5w2sKcg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.32.0': + resolution: {integrity: sha512-UYiqO9MlipntFbdbUKOIo84vuyzrK4TVIs7Etat91WNMFSW54F6OnHq08xa5ZM+K9+cyYMgQPXvYCopuP+LyKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.32.0': + resolution: {integrity: sha512-IDH/fxMv+HmKsMtsjEbXqhScCKDIYp38sgGEcn0QKeXMxrda67PPZA7HMfoUwEtFUG+jsO1XJxTrQsL+kQ90xQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.32.0': + resolution: {integrity: sha512-bQFGPDa0buYWJFeK2I7ah8wRZjrAgamaG2OAGv+Ua5UMYEnHxmHcv+r8lWUUrwP2oqQGvp1SB8JIVtBbYuAueQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.32.0': + resolution: {integrity: sha512-3vFp9DW1ItEKWltADzCFqG5N7rYFToT4ztlhg8wALoo2E2VhveLD88uAF4FF9AxD9NhgHDGmPCV+WZl/Qlj8cQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.32.0': + resolution: {integrity: sha512-Fub2y8S9ImuPzAzpbgkoz/EVTWFFBolxFZYCMRhRZc8cJZI2gl/NlZswqhvJd/U0Jopnwgm/OJ2x128vVzFFWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.32.0': + resolution: {integrity: sha512-XufwsnV3BF81zO2ofZvhT4FFaMmLTzZEZnC9HpFz/quPeg9C948+kbLlZnsfjmp+1dUxKMCpfmRMqOfF4AOLsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.32.0': + resolution: {integrity: sha512-u2f9tC2qYfikKmA2uGpnEJgManwmk0ZXWs5BB4ga4KDu2JNLdA3i634DGHeMLK9wY9+iRf3t7IYpgN3OVFrvDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.32.0': + resolution: {integrity: sha512-5ZXb1wrdbZ1YFXuNXNUCePLlmLDy4sUt4evvzD4Cgumbup5wJgS9PIe5BOaLywUg9f1wTH6lwltj3oT7dFpIGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.32.0': + resolution: {integrity: sha512-IGSMm/Agq+IA0++aeAV/AGPfjcBdjrsajB5YpM3j7cMcwoYgUTi/k2YwAmsHH3ueZUE98pSM/Ise2J7HtyRjOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.32.0': + resolution: {integrity: sha512-H/9gsuqXmceWMsVoCPZhtJG2jLbnBeKr7xAXm2zuKpxLVF7/2n0eh7ocOLB6t+L1ARE76iORuUsRMnuGjj8FjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.32.0': + resolution: {integrity: sha512-fF8VIOeligq+mA6KfKvWtFRXbf0EFy73TdR6ZnNejdJRM8VWN1e3QFhYgIwD7O8jBrQsd7EJbUpkAr/YlUOokg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxlint/binding-android-arm-eabi@1.47.0': resolution: {integrity: sha512-UHqo3te9K/fh29brCuQdHjN+kfpIi9cnTPABuD5S9wb9ykXYRGTOOMVuSV/CK43sOhU4wwb2nT1RVjcbrrQjFw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5204,6 +5297,11 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxfmt@0.32.0: + resolution: {integrity: sha512-KArQhGzt/Y8M1eSAX98Y8DLtGYYDQhkR55THUPY5VNcpFQ+9nRZkL3ULXhagHMD2hIvjy8JSeEQEP5/yYJSrLA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + oxlint@1.47.0: resolution: {integrity: sha512-v7xkK1iv1qdvTxJGclM97QzN8hHs5816AneFAQ0NGji1BMUquhiDAhXpMwp8+ls16uRVJtzVHxP9pAAXblDeGA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6463,6 +6561,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tldts-core@7.0.19: resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} @@ -8557,6 +8659,63 @@ snapshots: '@oxc-project/types@0.113.0': {} + '@oxfmt/binding-android-arm-eabi@0.32.0': + optional: true + + '@oxfmt/binding-android-arm64@0.32.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.32.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.32.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.32.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.32.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.32.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.32.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.32.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.32.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.32.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.32.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.32.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.32.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.32.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.32.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.32.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.32.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.32.0': + optional: true + '@oxlint/binding-android-arm-eabi@1.47.0': optional: true @@ -9115,18 +9274,6 @@ snapshots: - supports-color - typescript - '@stylistic/eslint-plugin@3.1.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 - transitivePeerDependencies: - - supports-color - - typescript - '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: ejs: 3.1.10 @@ -9425,23 +9572,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.38.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 @@ -9467,18 +9597,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1 - eslint: 8.57.1 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.7.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.7.3) @@ -9488,15 +9606,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.3 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 @@ -9511,10 +9620,6 @@ snapshots: dependencies: typescript: 5.7.3 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) @@ -9539,18 +9644,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.38.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - debug: 4.4.1 - eslint: 8.57.1 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@7.18.0': {} '@typescript-eslint/types@8.38.0': {} @@ -9586,22 +9679,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) @@ -9624,17 +9701,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - eslint: 8.57.1 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 @@ -10805,7 +10871,7 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10831,17 +10897,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - eslint-plugin-compat@6.0.2(eslint@8.57.1): dependencies: '@mdn/browser-compat-data': 5.7.6 @@ -10929,35 +10984,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.38.0(eslint@8.57.1)(typescript@5.9.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jsdoc@50.8.0(eslint@8.57.1): dependencies: '@es-joy/jsdoccomment': 0.50.2 @@ -12245,6 +12271,30 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxfmt@0.32.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.32.0 + '@oxfmt/binding-android-arm64': 0.32.0 + '@oxfmt/binding-darwin-arm64': 0.32.0 + '@oxfmt/binding-darwin-x64': 0.32.0 + '@oxfmt/binding-freebsd-x64': 0.32.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.32.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.32.0 + '@oxfmt/binding-linux-arm64-gnu': 0.32.0 + '@oxfmt/binding-linux-arm64-musl': 0.32.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.32.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.32.0 + '@oxfmt/binding-linux-riscv64-musl': 0.32.0 + '@oxfmt/binding-linux-s390x-gnu': 0.32.0 + '@oxfmt/binding-linux-x64-gnu': 0.32.0 + '@oxfmt/binding-linux-x64-musl': 0.32.0 + '@oxfmt/binding-openharmony-arm64': 0.32.0 + '@oxfmt/binding-win32-arm64-msvc': 0.32.0 + '@oxfmt/binding-win32-ia32-msvc': 0.32.0 + '@oxfmt/binding-win32-x64-msvc': 0.32.0 + oxlint@1.47.0: optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.47.0 @@ -13578,6 +13628,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinypool@2.1.0: {} + tldts-core@7.0.19: {} tldts@7.0.19: @@ -13608,10 +13660,6 @@ snapshots: dependencies: typescript: 5.7.3 - ts-api-utils@2.1.0(typescript@5.9.2): - dependencies: - typescript: 5.9.2 - ts-interface-checker@0.1.13: {} tsconfig-paths@3.15.0: From 6ee90c7c266343b1c17ab2f8fd22754864503c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 15 Feb 2026 03:06:56 +0100 Subject: [PATCH 11/74] pl-api: enable perf rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-api/.oxlintrc.json | 3 ++- packages/pl-api/lib/client.ts | 27 ++++++++++++++++++-------- packages/pl-api/lib/params/settings.ts | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/pl-api/.oxlintrc.json b/packages/pl-api/.oxlintrc.json index ad54a5067..98a967302 100644 --- a/packages/pl-api/.oxlintrc.json +++ b/packages/pl-api/.oxlintrc.json @@ -4,7 +4,8 @@ "categories": { "correctness": "error", "suspicious": "error", - "pedantic": "warn" + "pedantic": "warn", + "perf": "warn", }, "rules": { "max-dependencies": "off", diff --git a/packages/pl-api/lib/client.ts b/packages/pl-api/lib/client.ts index b2276cdce..2e252ea4b 100644 --- a/packages/pl-api/lib/client.ts +++ b/packages/pl-api/lib/client.ts @@ -948,14 +948,25 @@ class PlApiClient { let response: any; if (this.features.version.software === PIXELFED) { - response = []; - for (const accountId of accountIds) { - const accounts = (await this.request(`/api/v1.1/accounts/mutuals/${accountId}`)).json; - response.push({ - id: accountId, - accounts, - }); - } + const settledResponse = await Promise.allSettled( + accountIds.map(async (accountId) => { + const accounts = (await this.request(`/api/v1.1/accounts/mutuals/${accountId}`)).json; + + return { + id: accountId, + accounts, + }; + }), + ); + + response = settledResponse.map((result, index) => + result.status === 'fulfilled' + ? result.value + : { + id: accountIds[index], + accounts: [], + }, + ); } else { response = ( await this.request('/api/v1/accounts/familiar_followers', { params: { id: accountIds } }) diff --git a/packages/pl-api/lib/params/settings.ts b/packages/pl-api/lib/params/settings.ts index a748fbdf1..94d1633d0 100644 --- a/packages/pl-api/lib/params/settings.ts +++ b/packages/pl-api/lib/params/settings.ts @@ -45,7 +45,7 @@ type CreateAccountParams = { /** EIP-4361 signature (required if message is present) */ signature: string; } - | Record + | {} ); /** From 81132cbd574486e50d4e8246a6c477dad0cc18c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 15 Feb 2026 13:18:46 +0100 Subject: [PATCH 12/74] nicolium: oxlint migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/pl-fe/.oxlintrc.json | 84 ++ packages/pl-fe/package.json | 3 + packages/pl-fe/src/actions/accounts.ts | 6 +- packages/pl-fe/src/actions/admin.ts | 2 +- packages/pl-fe/src/actions/apps.ts | 2 +- packages/pl-fe/src/actions/auth.ts | 26 +- packages/pl-fe/src/actions/chats.ts | 2 +- packages/pl-fe/src/actions/circle.ts | 4 +- packages/pl-fe/src/actions/compose.ts | 802 +++++++++++------- packages/pl-fe/src/actions/consumer-auth.ts | 2 +- packages/pl-fe/src/actions/conversations.ts | 2 +- packages/pl-fe/src/actions/emoji-reacts.ts | 6 +- packages/pl-fe/src/actions/events.ts | 30 +- packages/pl-fe/src/actions/export-data.ts | 40 +- packages/pl-fe/src/actions/external-auth.ts | 2 +- packages/pl-fe/src/actions/frontend-config.ts | 4 +- packages/pl-fe/src/actions/instance.ts | 2 +- packages/pl-fe/src/actions/me.ts | 20 +- packages/pl-fe/src/actions/media.ts | 12 +- packages/pl-fe/src/actions/moderation.tsx | 12 +- packages/pl-fe/src/actions/notifications.ts | 16 +- packages/pl-fe/src/actions/oauth.ts | 2 +- packages/pl-fe/src/actions/preload.ts | 2 +- .../actions/push-notifications/registerer.ts | 11 +- packages/pl-fe/src/actions/remote-timeline.ts | 4 +- packages/pl-fe/src/actions/reports.ts | 4 +- packages/pl-fe/src/actions/settings.ts | 2 +- packages/pl-fe/src/actions/statuses.ts | 11 +- packages/pl-fe/src/actions/timelines.ts | 74 +- .../pl-fe/src/api/hooks/admin/use-suggest.ts | 4 +- .../pl-fe/src/api/hooks/admin/use-verify.ts | 4 +- .../pl-fe/src/api/hooks/groups/use-group.ts | 2 +- .../hooks/streaming/use-timeline-stream.ts | 2 +- packages/pl-fe/src/api/index.ts | 2 +- packages/pl-fe/src/build-config.ts | 2 +- packages/pl-fe/src/columns/search.tsx | 8 +- packages/pl-fe/src/columns/trends.tsx | 2 +- .../src/components/account-hover-card.tsx | 2 +- .../src/components/account-local-time.tsx | 2 +- packages/pl-fe/src/components/account.tsx | 12 +- .../pl-fe/src/components/alt-indicator.tsx | 2 +- .../announcements/announcement-content.tsx | 2 +- .../announcements/announcements-panel.tsx | 4 +- .../src/components/announcements/emoji.tsx | 2 +- .../src/components/announcements/reaction.tsx | 8 +- .../src/components/attachment-thumbs.tsx | 4 +- .../components/authorize-reject-buttons.tsx | 8 +- .../src/components/autosuggest-input.tsx | 4 +- .../pl-fe/src/components/birthday-input.tsx | 4 +- .../dropdown-menu/dropdown-menu-item.tsx | 4 +- .../dropdown-menu/dropdown-menu.tsx | 16 +- .../src/components/dropdown-navigation.tsx | 14 +- .../groups/popover/group-popover.tsx | 2 +- .../pl-fe/src/components/hashtags-bar.tsx | 4 +- .../src/components/hover-account-wrapper.tsx | 4 +- .../src/components/hover-status-wrapper.tsx | 4 +- packages/pl-fe/src/components/load-gap.tsx | 4 +- packages/pl-fe/src/components/load-more.tsx | 2 +- .../pl-fe/src/components/location-search.tsx | 2 +- .../pl-fe/src/components/media-gallery.tsx | 36 +- packages/pl-fe/src/components/modal-root.tsx | 12 +- .../pl-fe/src/components/parsed-content.tsx | 22 +- packages/pl-fe/src/components/parsed-mfm.tsx | 12 +- .../src/components/polls/poll-footer.tsx | 10 +- .../src/components/polls/poll-option.tsx | 6 +- packages/pl-fe/src/components/polls/poll.tsx | 9 +- .../pl-fe/src/components/preview-card.tsx | 16 +- .../components/quoted-status-indicator.tsx | 2 +- .../pl-fe/src/components/quoted-status.tsx | 2 +- packages/pl-fe/src/components/scrobble.tsx | 4 +- .../src/components/scroll-top-button.tsx | 2 +- .../components/sidebar-navigation-link.tsx | 2 +- .../src/components/sidebar-navigation.tsx | 18 +- packages/pl-fe/src/components/site-error.tsx | 10 +- .../src/components/status-action-bar.tsx | 62 +- .../src/components/status-action-button.tsx | 2 +- .../pl-fe/src/components/status-content.tsx | 10 +- .../src/components/status-language-picker.tsx | 4 +- packages/pl-fe/src/components/status-list.tsx | 16 +- .../pl-fe/src/components/status-media.tsx | 7 +- .../pl-fe/src/components/status-mention.tsx | 4 +- .../src/components/status-reactions-bar.tsx | 4 +- .../src/components/status-reply-mentions.tsx | 7 +- packages/pl-fe/src/components/status.tsx | 10 +- .../statuses/sensitive-content-overlay.tsx | 4 +- .../src/components/statuses/status-info.tsx | 2 +- packages/pl-fe/src/components/still-image.tsx | 2 +- .../src/components/thumb-navigation-link.tsx | 2 +- .../pl-fe/src/components/translate-button.tsx | 8 +- .../pl-fe/src/components/trending-link.tsx | 2 +- packages/pl-fe/src/components/ui/avatar.tsx | 8 +- .../pl-fe/src/components/ui/button/index.tsx | 2 +- .../components/ui/button/useButtonStyles.ts | 4 +- packages/pl-fe/src/components/ui/emoji.tsx | 6 +- .../pl-fe/src/components/ui/icon-button.tsx | 2 +- packages/pl-fe/src/components/ui/icon.tsx | 2 +- .../src/components/ui/inline-multiselect.tsx | 4 +- packages/pl-fe/src/components/ui/modal.tsx | 6 +- .../pl-fe/src/components/ui/multiselect.tsx | 16 +- packages/pl-fe/src/components/ui/popover.tsx | 2 +- .../pl-fe/src/components/ui/streamfield.tsx | 4 +- .../pl-fe/src/components/ui/tag-input.tsx | 4 +- packages/pl-fe/src/components/ui/tag.tsx | 4 +- packages/pl-fe/src/components/ui/textarea.tsx | 2 +- packages/pl-fe/src/components/ui/toast.tsx | 4 +- packages/pl-fe/src/components/ui/tooltip.tsx | 2 +- packages/pl-fe/src/components/ui/widget.tsx | 4 +- packages/pl-fe/src/components/upload.tsx | 10 +- packages/pl-fe/src/contexts/chat-context.tsx | 6 +- .../hooks/use-batched-entities.ts | 2 +- .../entity-store/hooks/use-create-entity.ts | 2 +- .../src/entity-store/hooks/use-entities.ts | 4 +- .../src/entity-store/hooks/use-entity.ts | 2 +- packages/pl-fe/src/entity-store/reducer.ts | 34 +- .../features/account/components/header.tsx | 62 +- .../src/features/admin/components/counter.tsx | 6 +- .../admin/components/unapproved-account.tsx | 10 +- packages/pl-fe/src/features/audio/index.tsx | 24 +- .../pl-fe/src/features/audio/visualizer.ts | 2 +- .../auth-login/components/consumers-list.tsx | 5 +- .../auth-login/components/otp-auth-form.tsx | 4 +- .../components/registration-form.tsx | 8 +- .../chats/components/chat-composer.tsx | 10 +- .../chats/components/chat-list-item.tsx | 10 +- .../chats/components/chat-list-shoutbox.tsx | 4 +- .../features/chats/components/chat-list.tsx | 10 +- .../chats/components/chat-message-list.tsx | 2 +- .../chats/components/chat-message.tsx | 20 +- .../components/chat-search/chat-search.tsx | 10 +- .../chats/components/chat-search/results.tsx | 12 +- .../chats/components/chat-textarea.tsx | 2 +- .../chats/components/chat-upload-preview.tsx | 2 +- .../components/chat-widget/chat-settings.tsx | 8 +- .../src/features/chats/components/chat.tsx | 10 +- .../components/blankslate-empty.tsx | 5 +- .../chats-page/components/chats-page-chat.tsx | 4 +- .../components/chats-page-settings.tsx | 4 +- .../components/shoutbox-message-list.tsx | 2 +- .../features/chats/components/shoutbox.tsx | 4 +- .../compose-event/tabs/edit-event.tsx | 18 +- .../tabs/manage-pending-participants.tsx | 40 +- .../components/clear-link-suggestion.tsx | 8 +- .../compose/components/compose-form.tsx | 8 +- .../compose/components/drive-button.tsx | 44 +- .../compose/components/language-dropdown.tsx | 6 +- .../compose/components/location-form.tsx | 6 +- .../components/polls/duration-selector.tsx | 12 +- .../compose/components/polls/poll-form.tsx | 12 +- .../compose/components/spoiler-input.tsx | 2 +- .../compose/components/upload-button.tsx | 2 +- .../src/features/compose/editor/index.tsx | 6 +- .../compose/editor/nodes/image-component.tsx | 4 +- .../editor/plugins/autosuggest-plugin.tsx | 11 +- .../floating-block-type-toolbar-plugin.tsx | 4 +- .../plugins/floating-link-editor-plugin.tsx | 8 +- .../floating-text-format-toolbar-plugin.tsx | 20 +- .../compose/editor/plugins/state-plugin.tsx | 6 +- .../src/features/compose/util/url-regex.ts | 8 +- .../components/conversations-list.tsx | 4 +- .../crypto-donate/components/crypto-icon.tsx | 4 +- .../components/draft-status.tsx | 5 +- .../edit-profile/components/avatar-picker.tsx | 6 +- .../edit-profile/components/header-picker.tsx | 6 +- .../components/emoji-picker-dropdown.tsx | 2 +- .../emoji-picker-dropdown-container.tsx | 2 +- packages/pl-fe/src/features/emoji/index.ts | 2 +- .../event/components/event-action-button.tsx | 4 +- .../event/components/event-header.tsx | 24 +- .../components/external-login-form.tsx | 6 +- .../components/instance-restrictions.tsx | 2 +- .../group/components/group-action-button.tsx | 3 +- .../group/components/group-header-image.tsx | 4 +- .../group/components/group-header.tsx | 4 +- .../components/group-member-list-item.tsx | 10 +- .../group/components/group-options-button.tsx | 3 +- .../notifications/components/notification.tsx | 22 +- .../components/icon-picker-menu.tsx | 4 +- .../components/placeholder-media-gallery.tsx | 6 +- .../pl-fe/src/features/preferences/index.tsx | 38 +- .../scheduled-status-action-bar.tsx | 4 +- .../settings/components/messages-settings.tsx | 2 +- .../status/components/detailed-status.tsx | 2 +- .../src/features/status/components/thread.tsx | 34 +- .../theme-editor/components/palette.tsx | 2 +- .../features/ui/components/action-button.tsx | 8 +- .../features/ui/components/compose-button.tsx | 8 +- .../src/features/ui/components/modal-root.tsx | 2 +- .../components/panels/account-note-panel.tsx | 6 +- .../ui/components/panels/my-groups-panel.tsx | 2 +- .../components/panels/profile-info-panel.tsx | 2 +- .../ui/components/panels/sign-up-panel.tsx | 4 +- .../features/ui/components/profile-field.tsx | 2 +- .../ui/components/subscription-button.tsx | 16 +- .../src/features/ui/components/timeline.tsx | 6 +- packages/pl-fe/src/features/ui/index.tsx | 17 +- .../pl-fe/src/features/ui/router/index.tsx | 2 +- .../pl-fe/src/features/ui/util/fullscreen.ts | 2 +- .../src/features/ui/util/global-hotkeys.tsx | 2 +- .../ui/util/pending-status-builder.ts | 6 +- packages/pl-fe/src/features/video/index.tsx | 6 +- .../pl-fe/src/hooks/forms/use-image-field.ts | 6 +- .../pl-fe/src/hooks/forms/use-text-field.ts | 4 +- .../pl-fe/src/hooks/use-account-gallery.ts | 4 +- packages/pl-fe/src/hooks/use-debounce.ts | 4 +- packages/pl-fe/src/hooks/use-loading.ts | 8 +- packages/pl-fe/src/hooks/use-system-theme.ts | 2 +- packages/pl-fe/src/hooks/use-theme-css.ts | 6 +- packages/pl-fe/src/init/pl-fe-head.tsx | 2 +- packages/pl-fe/src/layouts/event-layout.tsx | 2 +- packages/pl-fe/src/layouts/group-layout.tsx | 2 +- packages/pl-fe/src/layouts/profile-layout.tsx | 2 +- packages/pl-fe/src/main.tsx | 1 - packages/pl-fe/src/modals/alt-text-modal.tsx | 12 +- .../pl-fe/src/modals/antenna-editor-modal.tsx | 10 +- .../pl-fe/src/modals/block-mute-modal.tsx | 22 +- .../pl-fe/src/modals/circle-editor-modal.tsx | 8 +- .../compose-interaction-policy-modal.tsx | 4 +- .../src/modals/edit-announcement-modal.tsx | 24 +- .../src/modals/edit-bookmark-folder-modal.tsx | 4 +- .../pl-fe/src/modals/edit-domain-modal.tsx | 12 +- .../src/modals/edit-federation-modal.tsx | 8 +- packages/pl-fe/src/modals/embed-modal.tsx | 2 +- packages/pl-fe/src/modals/hotkeys-modal.tsx | 4 +- .../pl-fe/src/modals/join-event-modal.tsx | 8 +- .../list-adder-modal/components/list.tsx | 8 +- .../list-editor-modal/components/account.tsx | 12 +- .../components/edit-list-form.tsx | 26 +- .../components/list-members-form.tsx | 8 +- .../src/modals/list-editor-modal/index.tsx | 4 +- .../manage-group-modal/steps/details-step.tsx | 10 +- packages/pl-fe/src/modals/media-modal.tsx | 28 +- packages/pl-fe/src/modals/mentions-modal.tsx | 2 +- .../src/modals/missing-description-modal.tsx | 4 +- packages/pl-fe/src/modals/reactions-modal.tsx | 16 +- .../components/status-check-box.tsx | 4 +- .../report-modal/steps/other-actions-step.tsx | 10 +- .../modals/report-modal/steps/reason-step.tsx | 4 +- .../modals/select-bookmark-folder-modal.tsx | 12 +- .../src/modals/select-drive-file-modal.tsx | 16 +- .../pl-fe/src/modals/text-field-modal.tsx | 10 +- packages/pl-fe/src/normalizers/status.ts | 10 +- .../src/pages/account-lists/antennas.tsx | 4 +- .../pl-fe/src/pages/account-lists/circles.tsx | 2 +- .../pages/account-lists/follow-requests.tsx | 8 +- .../pl-fe/src/pages/account-lists/lists.tsx | 2 +- .../src/pages/accounts/account-gallery.tsx | 6 +- .../src/pages/accounts/account-timeline.tsx | 14 +- packages/pl-fe/src/pages/auth/login.tsx | 2 +- packages/pl-fe/src/pages/auth/logout.tsx | 4 +- .../pl-fe/src/pages/auth/password-reset.tsx | 2 +- .../pl-fe/src/pages/dashboard/account.tsx | 12 +- .../src/pages/dashboard/announcements.tsx | 12 +- .../src/pages/dashboard/awaiting-approval.tsx | 2 +- .../src/pages/dashboard/frontend-config.tsx | 14 +- packages/pl-fe/src/pages/dashboard/relays.tsx | 2 +- packages/pl-fe/src/pages/dashboard/report.tsx | 8 +- .../pl-fe/src/pages/dashboard/reports.tsx | 2 +- packages/pl-fe/src/pages/dashboard/rules.tsx | 10 +- .../src/pages/dashboard/theme-editor.tsx | 4 +- .../pl-fe/src/pages/dashboard/user-index.tsx | 2 +- .../pl-fe/src/pages/developers/create-app.tsx | 4 +- .../pl-fe/src/pages/developers/developers.tsx | 4 +- .../pages/developers/service-worker-info.tsx | 9 +- packages/pl-fe/src/pages/drive/drive.tsx | 102 ++- packages/pl-fe/src/pages/fun/circle.tsx | 4 +- .../pages/groups/group-blocked-members.tsx | 7 +- .../pl-fe/src/pages/groups/group-members.tsx | 8 +- .../groups/group-membership-requests.tsx | 52 +- packages/pl-fe/src/pages/groups/groups.tsx | 4 +- .../pl-fe/src/pages/groups/manage-group.tsx | 3 +- packages/pl-fe/src/pages/search/search.tsx | 22 +- packages/pl-fe/src/pages/settings/aliases.tsx | 4 +- .../src/pages/settings/auth-token-list.tsx | 2 +- .../pl-fe/src/pages/settings/edit-filter.tsx | 54 +- .../src/pages/settings/edit-password.tsx | 8 +- .../pl-fe/src/pages/settings/edit-profile.tsx | 28 +- .../pl-fe/src/pages/settings/import-data.tsx | 4 +- .../pages/settings/interaction-policies.tsx | 26 +- packages/pl-fe/src/pages/settings/privacy.tsx | 48 +- .../pages/status-lists/bookmark-folders.tsx | 4 +- .../pl-fe/src/pages/status-lists/events.tsx | 8 +- .../status-lists/interaction-requests.tsx | 44 +- .../pages/status-lists/pinned-statuses.tsx | 2 +- .../src/pages/statuses/compose-event.tsx | 8 +- .../src/pages/statuses/event-discussion.tsx | 4 +- .../src/pages/statuses/event-information.tsx | 8 +- packages/pl-fe/src/pages/statuses/status.tsx | 14 +- .../src/pages/timelines/home-timeline.tsx | 10 +- packages/pl-fe/src/pages/utils/about.tsx | 16 +- .../queries/accounts/use-follow-requests.ts | 2 +- .../src/queries/accounts/use-relationship.ts | 40 +- .../pl-fe/src/queries/admin/use-accounts.ts | 4 +- .../src/queries/admin/use-moderation-log.ts | 4 +- .../pl-fe/src/queries/admin/use-reports.ts | 4 +- .../announcements/use-announcements.ts | 2 +- packages/pl-fe/src/queries/chats.ts | 5 +- .../src/queries/drive/use-drive-folder.ts | 2 +- .../instance/use-translation-languages.ts | 2 +- .../pl-fe/src/queries/search/use-search.ts | 2 +- .../src/queries/settings/domain-blocks.ts | 2 +- .../queries/settings/use-account-aliases.ts | 8 +- .../settings/use-interaction-policies.ts | 2 +- .../status-lists/use-pinned-statuses.ts | 2 +- .../queries/statuses/use-draft-statuses.ts | 12 +- .../statuses/use-interaction-requests.ts | 6 +- .../statuses/use-local-status-translation.ts | 2 +- .../statuses/use-status-interactions.ts | 10 +- .../timelines/use-account-media-timeline.ts | 2 +- packages/pl-fe/src/queries/utils/filter-id.ts | 2 +- .../make-paginated-response-query-options.ts | 2 +- .../utils/make-paginated-response-query.ts | 4 +- packages/pl-fe/src/reducers/admin.ts | 4 +- packages/pl-fe/src/reducers/auth.ts | 36 +- packages/pl-fe/src/reducers/compose.ts | 42 +- packages/pl-fe/src/reducers/contexts.ts | 49 +- packages/pl-fe/src/reducers/conversations.ts | 14 +- .../pl-fe/src/reducers/frontend-config.ts | 4 +- packages/pl-fe/src/reducers/instance.ts | 2 +- packages/pl-fe/src/reducers/me.ts | 5 +- .../pl-fe/src/reducers/pending-statuses.ts | 8 +- packages/pl-fe/src/reducers/statuses.ts | 18 +- packages/pl-fe/src/reducers/timelines.ts | 83 +- packages/pl-fe/src/selectors/index.ts | 27 +- packages/pl-fe/src/sentry.ts | 2 +- packages/pl-fe/src/service-worker/sw.ts | 8 +- .../pl-fe/src/stores/account-hover-card.ts | 30 +- .../src/stores/language-model-availability.ts | 16 +- packages/pl-fe/src/stores/modals.ts | 40 +- packages/pl-fe/src/stores/settings.ts | 152 ++-- packages/pl-fe/src/stores/shoutbox.ts | 38 +- .../pl-fe/src/stores/status-hover-card.ts | 30 +- packages/pl-fe/src/stores/status-meta.ts | 116 +-- packages/pl-fe/src/stores/ui.ts | 16 +- packages/pl-fe/src/toast.tsx | 21 +- packages/pl-fe/src/utils/auth.ts | 2 +- packages/pl-fe/src/utils/code.ts | 2 +- packages/pl-fe/src/utils/config-db.ts | 6 +- packages/pl-fe/src/utils/emoji-reacts.ts | 8 +- packages/pl-fe/src/utils/emoji.ts | 2 +- packages/pl-fe/src/utils/favicon-service.ts | 2 +- packages/pl-fe/src/utils/input.ts | 3 +- packages/pl-fe/src/utils/media.ts | 4 +- packages/pl-fe/src/utils/queries.ts | 6 +- packages/pl-fe/src/utils/redirect.ts | 2 +- packages/pl-fe/src/utils/resize-image.ts | 16 +- packages/pl-fe/src/utils/timelines.ts | 2 +- packages/pl-fe/src/utils/url-purify.ts | 2 +- packages/pl-fe/tailwind.config.ts | 4 +- packages/pl-fe/tailwind/colors.ts | 2 +- packages/pl-fe/tsconfig.json | 3 +- packages/pl-fe/vite.config.ts | 4 +- pnpm-lock.yaml | 81 +- 352 files changed, 2838 insertions(+), 1694 deletions(-) create mode 100644 packages/pl-fe/.oxlintrc.json diff --git a/packages/pl-fe/.oxlintrc.json b/packages/pl-fe/.oxlintrc.json new file mode 100644 index 000000000..653ddbe26 --- /dev/null +++ b/packages/pl-fe/.oxlintrc.json @@ -0,0 +1,84 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import", "promise"], + "jsPlugins": ["eslint-plugin-formatjs"], + "categories": { + "correctness": "error", + "suspicious": "error", + "pedantic": "warn", + "perf": "warn" + }, + "rules": { + "always-return": "off", + "ban-types": "off", + "ban-ts-comment": "off", + "max-dependencies": "off", + "max-lines": "off", + "max-lines-per-function": "off", + "no-await-in-loop": "off", + "no-else-return": "off", + "no-inline-comments": "off", + "no-named-as-default": "off", + "no-negated-condition": "off", + "no-new": "warn", + "no-non-null-asserted-optional-chain": "warn", + "no-promise-executor-return": "off", + "no-unassigned-import": "off", + "no-unused-vars": [ + "error", + { + "vars": "all", + "args": "none", + "ignoreRestSiblings": true, + "caughtErrors": "none", + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "prefer-ts-expect-error": "off", + "sort-vars": "off", + + "no-floating-promises": "warn", + "no-redundant-type-constituents": "warn", + "no-unsafe-type-assertion": "warn", + "require-array-sort-compare": "off", + "unbound-method": "warn", + + "formatjs/enforce-default-message": "error", + "formatjs/enforce-id": "error", + "formatjs/no-literal-string-in-jsx": "warn" + }, + "settings": { + "jsx-a11y": { + "polymorphicPropName": null, + "components": {}, + "attributes": {} + }, + "next": { + "rootDir": [] + }, + "react": { + "formComponents": [], + "linkComponents": [], + "version": null, + "componentWrapperFunctions": [] + }, + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + } + }, + "env": { + "builtin": true, + "browser": true, + "es6": true + }, + "globals": {}, + "ignorePatterns": [] +} diff --git a/packages/pl-fe/package.json b/packages/pl-fe/package.json index 3731739b5..4dbdc5103 100644 --- a/packages/pl-fe/package.json +++ b/packages/pl-fe/package.json @@ -163,6 +163,9 @@ "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-tailwindcss": "^3.17.5", "globals": "^15.14.0", + "oxfmt": "^0.32.0", + "oxlint": "^1.47.0", + "oxlint-tsgolint": "^0.12.2", "rollup-plugin-bundle-stats": "^4.21.10", "stylelint": "^16.12.0", "stylelint-config-standard-scss": "^12.0.0", diff --git a/packages/pl-fe/src/actions/accounts.ts b/packages/pl-fe/src/actions/accounts.ts index e5d82eac2..fcf68ab64 100644 --- a/packages/pl-fe/src/actions/accounts.ts +++ b/packages/pl-fe/src/actions/accounts.ts @@ -16,7 +16,7 @@ const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS' as const; const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS' as const; const createAccount = (params: CreateAccountParams) => - async (dispatch: AppDispatch, getState: () => RootState) => + (dispatch: AppDispatch, getState: () => RootState) => getClient(getState()).settings.createAccount(params).then((response) => ({ params, response }), ); @@ -79,7 +79,9 @@ const fetchRelationships = (accountIds: string[]) => const fetcher = batcher.relationships(getClient(getState())).fetch; return Promise.all(newAccountIds.map(fetcher)) - .then(response => dispatch(importEntities({ relationships: response }))); + .then(response =>{ + dispatch(importEntities({ relationships: response })); + }); }; const accountLookup = (acct: string, signal?: AbortSignal) => diff --git a/packages/pl-fe/src/actions/admin.ts b/packages/pl-fe/src/actions/admin.ts index 4653dd88b..3c4808b2c 100644 --- a/packages/pl-fe/src/actions/admin.ts +++ b/packages/pl-fe/src/actions/admin.ts @@ -125,7 +125,7 @@ const setRole = (accountId: string, role: 'user' | 'moderator' | 'admin') => const redactStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - const status = state.statuses[statusId]!; + const status = state.statuses[statusId]; const poll = status.poll_id ? queryClient.getQueryData(['statuses', 'polls', status.poll_id]) : undefined; return getClient(state).statuses.getStatusSource(statusId).then(response => { diff --git a/packages/pl-fe/src/actions/apps.ts b/packages/pl-fe/src/actions/apps.ts index 44402bf6e..c8bf94aa4 100644 --- a/packages/pl-fe/src/actions/apps.ts +++ b/packages/pl-fe/src/actions/apps.ts @@ -11,7 +11,7 @@ import { PlApiClient, type CreateApplicationParams } from 'pl-api'; import * as BuildConfig from '@/build-config'; const createApp = (params: CreateApplicationParams, baseURL?: string) => { - const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); + const client = new PlApiClient((baseURL ?? BuildConfig.BACKEND_URL) || ''); return client.apps.createApplication(params); }; diff --git a/packages/pl-fe/src/actions/auth.ts b/packages/pl-fe/src/actions/auth.ts index 8a3e4aa40..698dc7665 100644 --- a/packages/pl-fe/src/actions/auth.ts +++ b/packages/pl-fe/src/actions/auth.ts @@ -59,7 +59,9 @@ const messages = defineMessages({ invalidCredentials: { id: 'auth.invalid_credentials', defaultMessage: 'Wrong username or password' }, }); -const noOp = () => new Promise(f => f(undefined)); +const noOp = () => new Promise(f =>{ + f(undefined); +}); const createAppAndToken = () => (dispatch: AppDispatch) => @@ -97,8 +99,8 @@ const createAppToken = () => const app = getState().auth.app!; const params = { - client_id: app.client_id!, - client_secret: app.client_secret!, + client_id: app.client_id, + client_secret: app.client_secret, redirect_uri: 'urn:ietf:wg:oauth:2.0:oob', grant_type: 'client_credentials', scope: getScopes(getState()), @@ -216,10 +218,10 @@ const logIn = (username: string, password: string) => (dispatch: AppDispatch) => dispatch(createAuthApp()).then(() => dispatch(createUserToken(normalizeUsername(username), password)), ).catch((error: { response: PlfeResponse }) => { - if ((error.response?.json as any)?.error === 'mfa_required') { + if ((error.response?.json)?.error === 'mfa_required') { // If MFA is required, throw the error and handle it in the component. throw error; - } else if ((error.response?.json as any)?.identifier === 'awaiting_approval') { + } else if ((error.response?.json)?.identifier === 'awaiting_approval') { toast.error(messages.awaitingApproval); } else { // Return "wrong password" message. @@ -242,11 +244,11 @@ const logOut = () => if (!account) return dispatch(noOp); - const token = state.auth.users[account.url]!.access_token; + const token = state.auth.users[account.url].access_token; const params = { - client_id: state.auth.tokens[token]?.client_id || state.auth.app?.client_id!, - client_secret: state.auth.tokens[token]?.client_secret || state.auth.app?.client_secret!, + client_id: state.auth.tokens[token]?.client_id ?? state.auth.app?.client_id!, + client_secret: state.auth.tokens[token]?.client_secret ?? state.auth.app?.client_secret!, token, }; @@ -285,11 +287,13 @@ const switchAccount = (accountId: string) => const fetchOwnAccounts = () => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - return Object.values(state.auth.users).forEach((user) => { + Object.values(state.auth.users).forEach((user) => { const account = selectAccount(state, user.id); if (!account) { dispatch(verifyCredentials(user.access_token, user.url)) - .catch(() => console.warn(`Failed to load account: ${user.url}`)); + .catch(() =>{ + console.warn(`Failed to load account: ${user.url}`); + }); } }); }; @@ -321,7 +325,7 @@ interface AuthLoggedInAction { const authLoggedIn = (token: Token, app?: CredentialApplication | null) => (dispatch: AppDispatch) => { - dispatch({ type: AUTH_LOGGED_IN, token, app: app || undefined }); + dispatch({ type: AUTH_LOGGED_IN, token, app: app ?? undefined }); return token; }; diff --git a/packages/pl-fe/src/actions/chats.ts b/packages/pl-fe/src/actions/chats.ts index c0aed4191..7e1017ea2 100644 --- a/packages/pl-fe/src/actions/chats.ts +++ b/packages/pl-fe/src/actions/chats.ts @@ -7,7 +7,7 @@ const toggleChatPane = () => (dispatch: AppDispatch, getState: () => RootState) => { const main = useSettingsStore.getState().settings.chats.mainWindow; const state = main === 'minimized' ? 'open' : 'minimized'; - return dispatch(changeSetting(['chats', 'mainWindow'], state)); + dispatch(changeSetting(['chats', 'mainWindow'], state)); }; export { diff --git a/packages/pl-fe/src/actions/circle.ts b/packages/pl-fe/src/actions/circle.ts index ae96a1b74..480fa6104 100644 --- a/packages/pl-fe/src/actions/circle.ts +++ b/packages/pl-fe/src/actions/circle.ts @@ -37,7 +37,7 @@ const processCircle = (setProgress: (progress: { }; const fetchStatuses = async (next: (() => Promise>) | null) => { - const response = await (next?.() || client.accounts.getAccountStatuses(me, { limit: 40 })); + const response = await (next?.() ?? client.accounts.getAccountStatuses(me, { limit: 40 })); response.items.forEach((status) => { if (status.reblog) { @@ -64,7 +64,7 @@ const processCircle = (setProgress: (progress: { }; const fetchFavourites = async (next: (() => Promise>) | null) => { // limit 40 - const response = await (next?.() || client.myAccount.getFavourites({ limit: 40 })); + const response = await (next?.() ?? client.myAccount.getFavourites({ limit: 40 })); response.items.forEach((status) => { if (status.account.id === me) return; diff --git a/packages/pl-fe/src/actions/compose.ts b/packages/pl-fe/src/actions/compose.ts index 8bdabf44a..568eb2180 100644 --- a/packages/pl-fe/src/actions/compose.ts +++ b/packages/pl-fe/src/actions/compose.ts @@ -26,7 +26,20 @@ import type { ClearLinkSuggestion } from '@/reducers/compose'; import type { AppDispatch, RootState } from '@/store'; import type { LinkOptions } from '@tanstack/react-router'; import type { EditorState } from 'lexical'; -import type { Account, CreateStatusParams, CustomEmoji, Group, MediaAttachment, Status as BaseStatus, Tag, Poll, ScheduledStatus, InteractionPolicy, UpdateMediaParams, Location } from 'pl-api'; +import type { + Account, + CreateStatusParams, + CustomEmoji, + Group, + MediaAttachment, + Status as BaseStatus, + Tag, + Poll, + ScheduledStatus, + InteractionPolicy, + UpdateMediaParams, + Location, +} from 'pl-api'; let cancelFetchComposeSuggestions = new AbortController(); @@ -93,14 +106,16 @@ const COMPOSE_CHANGE_MEDIA_ORDER = 'COMPOSE_CHANGE_MEDIA_ORDER' as const; const COMPOSE_ADD_SUGGESTED_QUOTE = 'COMPOSE_ADD_SUGGESTED_QUOTE' as const; const COMPOSE_ADD_SUGGESTED_LANGUAGE = 'COMPOSE_ADD_SUGGESTED_LANGUAGE' as const; -const COMPOSE_INTERACTION_POLICY_OPTION_CHANGE = 'COMPOSE_INTERACTION_POLICY_OPTION_CHANGE' as const; +const COMPOSE_INTERACTION_POLICY_OPTION_CHANGE = + 'COMPOSE_INTERACTION_POLICY_OPTION_CHANGE' as const; const COMPOSE_QUOTE_POLICY_OPTION_CHANGE = 'COMPOSE_QUOTE_POLICY_OPTION_CHANGE' as const; const COMPOSE_CLEAR_LINK_SUGGESTION_CREATE = 'COMPOSE_CLEAR_LINK_SUGGESTION_CREATE' as const; const COMPOSE_CLEAR_LINK_SUGGESTION_IGNORE = 'COMPOSE_CLEAR_LINK_SUGGESTION_IGNORE' as const; const COMPOSE_HASHTAG_CASING_SUGGESTION_SET = 'COMPOSE_HASHTAG_CASING_SUGGESTION_SET' as const; -const COMPOSE_HASHTAG_CASING_SUGGESTION_IGNORE = 'COMPOSE_HASHTAG_CASING_SUGGESTION_IGNORE' as const; +const COMPOSE_HASHTAG_CASING_SUGGESTION_IGNORE = + 'COMPOSE_HASHTAG_CASING_SUGGESTION_IGNORE' as const; const COMPOSE_REDACTING_OVERWRITE_CHANGE = 'COMPOSE_REDACTING_OVERWRITE_CHANGE' as const; @@ -108,22 +123,46 @@ const COMPOSE_SET_LOCATION = 'COMPOSE_SET_LOCATION' as const; const COMPOSE_SET_SHOW_LOCATION_PICKER = 'COMPOSE_SET_SHOW_LOCATION_PICKER' as const; const messages = defineMessages({ - scheduleError: { id: 'compose.invalid_schedule', defaultMessage: 'You must schedule a post at least 5 minutes out.' }, + scheduleError: { + id: 'compose.invalid_schedule', + defaultMessage: 'You must schedule a post at least 5 minutes out.', + }, success: { id: 'compose.submit_success', defaultMessage: 'Your post was sent!' }, editSuccess: { id: 'compose.edit_success', defaultMessage: 'Your post was edited' }, redactSuccess: { id: 'compose.redact_success', defaultMessage: 'The post was redacted' }, scheduledSuccess: { id: 'compose.scheduled_success', defaultMessage: 'Your post was scheduled' }, uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' }, - uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' }, + uploadErrorPoll: { + id: 'upload_error.poll', + defaultMessage: 'File upload not allowed with polls.', + }, view: { id: 'toast.view', defaultMessage: 'View' }, replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' }, - replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' }, + replyMessage: { + id: 'confirmations.reply.message', + defaultMessage: + 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?', + }, }); interface ComposeSetStatusAction { type: typeof COMPOSE_SET_STATUS; composeId: string; - status: Pick; + status: Pick< + Status, + | 'id' + | 'account' + | 'content' + | 'group_id' + | 'in_reply_to_id' + | 'language' + | 'media_attachments' + | 'mentions' + | 'quote_id' + | 'sensitive' + | 'spoiler_text' + | 'visibility' + >; poll?: Poll | null; rawText: string; explicitAddressing: boolean; @@ -135,36 +174,39 @@ interface ComposeSetStatusAction { redacting?: boolean; } -const setComposeToStatus = ( - status: ComposeSetStatusAction['status'], - poll: Poll | null | undefined, - rawText: string, - spoilerText?: string, - contentType?: string | false, - withRedraft?: boolean, - draftId?: string, - editorState?: string | null, - redacting?: boolean, -) => - (dispatch: AppDispatch, getState: () => RootState) => { - const { features } = getClient(getState); - const explicitAddressing = features.createStatusExplicitAddressing && !useSettingsStore.getState().settings.forceImplicitAddressing; +const setComposeToStatus = + ( + status: ComposeSetStatusAction['status'], + poll: Poll | null | undefined, + rawText: string, + spoilerText?: string, + contentType?: string | false, + withRedraft?: boolean, + draftId?: string, + editorState?: string | null, + redacting?: boolean, + ) => + (dispatch: AppDispatch, getState: () => RootState) => { + const { features } = getClient(getState); + const explicitAddressing = + features.createStatusExplicitAddressing && + !useSettingsStore.getState().settings.forceImplicitAddressing; - dispatch({ - type: COMPOSE_SET_STATUS, - composeId: 'compose-modal', - status, - poll, - rawText, - explicitAddressing, - spoilerText, - contentType, - withRedraft, - draftId, - editorState, - redacting, - }); - }; + dispatch({ + type: COMPOSE_SET_STATUS, + composeId: 'compose-modal', + status, + poll, + rawText, + explicitAddressing, + spoilerText, + contentType, + withRedraft, + draftId, + editorState, + redacting, + }); + }; const changeCompose = (composeId: string, text: string) => ({ type: COMPOSE_CHANGE, @@ -175,7 +217,17 @@ const changeCompose = (composeId: string, text: string) => ({ interface ComposeReplyAction { type: typeof COMPOSE_REPLY; composeId: string; - status: Pick; + status: Pick< + Status, + | 'id' + | 'account' + | 'group_id' + | 'list_id' + | 'local_only' + | 'mentions' + | 'spoiler_text' + | 'visibility' + >; account: Pick; explicitAddressing: boolean; preserveSpoilers: boolean; @@ -184,33 +236,34 @@ interface ComposeReplyAction { conversationScope: boolean; } -const replyCompose = ( - status: ComposeReplyAction['status'], - rebloggedBy?: ComposeReplyAction['rebloggedBy'], - approvalRequired?: ComposeReplyAction['approvalRequired'], -) => - (dispatch: AppDispatch, getState: () => RootState) => { - const state = getState(); - const { features } = getClient(getState); - const { forceImplicitAddressing, preserveSpoilers } = useSettingsStore.getState().settings; - const explicitAddressing = features.createStatusExplicitAddressing && !forceImplicitAddressing; - const account = selectOwnAccount(state); +const replyCompose = + ( + status: ComposeReplyAction['status'], + rebloggedBy?: ComposeReplyAction['rebloggedBy'], + approvalRequired?: ComposeReplyAction['approvalRequired'], + ) => + (dispatch: AppDispatch, getState: () => RootState) => { + const state = getState(); + const { features } = getClient(getState); + const { forceImplicitAddressing, preserveSpoilers } = useSettingsStore.getState().settings; + const explicitAddressing = features.createStatusExplicitAddressing && !forceImplicitAddressing; + const account = selectOwnAccount(state); - if (!account) return; + if (!account) return; - dispatch({ - type: COMPOSE_REPLY, - composeId: 'compose-modal', - status, - account, - explicitAddressing, - preserveSpoilers, - rebloggedBy, - approvalRequired, - conversationScope: features.createStatusConversationScope, - }); - useModalsStore.getState().actions.openModal('COMPOSE'); - }; + dispatch({ + type: COMPOSE_REPLY, + composeId: 'compose-modal', + status, + account, + explicitAddressing, + preserveSpoilers, + rebloggedBy, + approvalRequired, + conversationScope: features.createStatusConversationScope, + }); + useModalsStore.getState().actions.openModal('COMPOSE'); + }; const cancelReplyCompose = () => ({ type: COMPOSE_REPLY_CANCEL, @@ -226,11 +279,12 @@ interface ComposeQuoteAction { conversationScope: boolean; } -const quoteCompose = (status: ComposeQuoteAction['status']) => - (dispatch: AppDispatch, getState: () => RootState) => { +const quoteCompose = + (status: ComposeQuoteAction['status']) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const { forceImplicitAddressing } = useSettingsStore.getState().settings; - const { createStatusConversationScope, createStatusExplicitAddressing } = state.auth.client.features; + const { createStatusConversationScope, createStatusExplicitAddressing } = + state.auth.client.features; const explicitAddressing = createStatusExplicitAddressing && !forceImplicitAddressing; dispatch({ @@ -249,13 +303,12 @@ const cancelQuoteCompose = (composeId: string) => ({ composeId, }); -const groupComposeModal = (group: Pick) => - (dispatch: AppDispatch) => { - const composeId = `group:${group.id}`; +const groupComposeModal = (group: Pick) => (dispatch: AppDispatch) => { + const composeId = `group:${group.id}`; - dispatch(groupCompose(composeId, group.id)); - useModalsStore.getState().actions.openModal('COMPOSE', { composeId }); - }; + dispatch(groupCompose(composeId, group.id)); + useModalsStore.getState().actions.openModal('COMPOSE', { composeId }); +}; const resetCompose = (composeId = 'compose-modal') => ({ type: COMPOSE_RESET, @@ -268,17 +321,18 @@ interface ComposeMentionAction { account: Pick; } -const mentionCompose = (account: ComposeMentionAction['account']) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!getState().me) return; +const mentionCompose = + (account: ComposeMentionAction['account']) => + (dispatch: AppDispatch, getState: () => RootState) => { + if (!getState().me) return; - dispatch({ - type: COMPOSE_MENTION, - composeId: 'compose-modal', - account: account, - }); - useModalsStore.getState().actions.openModal('COMPOSE'); - }; + dispatch({ + type: COMPOSE_MENTION, + composeId: 'compose-modal', + account: account, + }); + useModalsStore.getState().actions.openModal('COMPOSE'); + }; interface ComposeDirectAction { type: typeof COMPOSE_DIRECT; @@ -286,23 +340,30 @@ interface ComposeDirectAction { account: Pick; } -const directCompose = (account: ComposeDirectAction['account']) => - (dispatch: AppDispatch) => { - dispatch({ - type: COMPOSE_DIRECT, - composeId: 'compose-modal', - account, - }); - useModalsStore.getState().actions.openModal('COMPOSE'); - }; +const directCompose = (account: ComposeDirectAction['account']) => (dispatch: AppDispatch) => { + dispatch({ + type: COMPOSE_DIRECT, + composeId: 'compose-modal', + account, + }); + useModalsStore.getState().actions.openModal('COMPOSE'); +}; -const handleComposeSubmit = (dispatch: AppDispatch, getState: () => RootState, composeId: string, data: BaseStatus | ScheduledStatus, status: string, edit?: boolean, redact?: boolean) => { +const handleComposeSubmit = ( + dispatch: AppDispatch, + getState: () => RootState, + composeId: string, + data: BaseStatus | ScheduledStatus, + status: string, + edit?: boolean, + redact?: boolean, +) => { if (!dispatch || !getState) return; const state = getState(); const accountUrl = selectOwnAccount(state)!.url; - const draftId = getState().compose[composeId]!.draftId; + const draftId = getState().compose[composeId].draftId; dispatch(submitComposeSuccess(composeId, data)); @@ -311,13 +372,20 @@ const handleComposeSubmit = (dispatch: AppDispatch, getState: () => RootState, c } if (data.scheduled_at === null) { - const linkOptions: LinkOptions = (data.visibility === 'direct' && getClient(getState()).features.conversations) - ? { to: '/conversations' } - : { to: '/@{$username}/posts/$statusId', params: { username: data.account.acct, statusId: data.id } }; - toast.success(redact ? messages.redactSuccess : edit ? messages.editSuccess : messages.success, { - actionLabel: messages.view, - actionLinkOptions: linkOptions, - }); + const linkOptions: LinkOptions = + data.visibility === 'direct' && getClient(getState()).features.conversations + ? { to: '/conversations' } + : { + to: '/@{$username}/posts/$statusId', + params: { username: data.account.acct, statusId: data.id }, + }; + toast.success( + redact ? messages.redactSuccess : edit ? messages.editSuccess : messages.success, + { + actionLabel: messages.view, + actionLinkOptions: linkOptions, + }, + ); } else { toast.success(messages.scheduledSuccess, { actionLabel: messages.view, @@ -327,10 +395,10 @@ const handleComposeSubmit = (dispatch: AppDispatch, getState: () => RootState, c }; const needsDescriptions = (state: RootState, composeId: string) => { - const media = state.compose[composeId]!.mediaAttachments; + const media = state.compose[composeId].mediaAttachments; const missingDescriptionModal = useSettingsStore.getState().settings.missingDescriptionModal; - const hasMissing = media.filter(item => !item.description).length > 0; + const hasMissing = media.filter((item) => !item.description).length > 0; return missingDescriptionModal && hasMissing; }; @@ -341,7 +409,11 @@ const validateSchedule = (state: RootState, composeId: string) => { const fiveMinutesFromNow = new Date(new Date().getTime() + 300000); - return scheduledAt.getTime() > fiveMinutesFromNow.getTime() || (state.auth.client.features.scheduledStatusesBackwards && scheduledAt.getTime() < new Date().getTime()); + return ( + scheduledAt.getTime() > fiveMinutesFromNow.getTime() || + (state.auth.client.features.scheduledStatusesBackwards && + scheduledAt.getTime() < new Date().getTime()) + ); }; interface SubmitComposeOpts { @@ -349,131 +421,160 @@ interface SubmitComposeOpts { onSuccess?: () => void; } -const submitCompose = (composeId: string, opts: SubmitComposeOpts = {}, preview = false) => - async (dispatch: AppDispatch, getState: () => RootState) => { - const { force = false, onSuccess } = opts; +const submitCompose = + (composeId: string, opts: SubmitComposeOpts = {}, preview = false) => + async (dispatch: AppDispatch, getState: () => RootState) => { + const { force = false, onSuccess } = opts; - if (!isLoggedIn(getState)) return; - const state = getState(); + if (!isLoggedIn(getState)) return; + const state = getState(); - const compose = state.compose[composeId]!; + const compose = state.compose[composeId]; - const status = compose.text; - const media = compose.mediaAttachments; - const editedId = compose.editedId; - let to = compose.to; - const { forceImplicitAddressing } = useSettingsStore.getState().settings; - const explicitAddressing = state.auth.client.features.createStatusExplicitAddressing && !forceImplicitAddressing; + const status = compose.text; + const media = compose.mediaAttachments; + const editedId = compose.editedId; + let to = compose.to; + const { forceImplicitAddressing } = useSettingsStore.getState().settings; + const explicitAddressing = + state.auth.client.features.createStatusExplicitAddressing && !forceImplicitAddressing; - if (!preview) { - if (!validateSchedule(state, composeId)) { - toast.error(messages.scheduleError); - return; + if (!preview) { + if (!validateSchedule(state, composeId)) { + toast.error(messages.scheduleError); + return; + } + + if ((!status || !status.length) && media.length === 0) { + return; + } + + if (!force && needsDescriptions(state, composeId)) { + useModalsStore.getState().actions.openModal('MISSING_DESCRIPTION', { + onContinue: () => { + useModalsStore.getState().actions.closeModal('MISSING_DESCRIPTION'); + dispatch(submitCompose(composeId, { force: true, onSuccess })); + }, + }); + return; + } } - if ((!status || !status.length) && media.length === 0) { - return; + // https://stackoverflow.com/a/30007882 for domain regex + const mentions: string[] | null = status.match( + /(?:^|\s)@([a-z\d_-]+(?:@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]+)?)/gi, + ); + + if (mentions) { + to = [ + ...new Set([ + ...to, + ...mentions.map((mention) => + mention + .replace(/ /g, '') + .trim() + .slice(1), + ), + ]), + ]; } - if (!force && needsDescriptions(state, composeId)) { - useModalsStore.getState().actions.openModal('MISSING_DESCRIPTION', { - onContinue: () => { - useModalsStore.getState().actions.closeModal('MISSING_DESCRIPTION'); - dispatch(submitCompose(composeId, { force: true, onSuccess })); - }, - }); - return; + if (!preview) { + dispatch(submitComposeRequest(composeId)); + + useModalsStore.getState().actions.closeModal('COMPOSE'); + + if (compose.language && !editedId && !preview) { + useSettingsStore.getState().actions.rememberLanguageUse(compose.language); + dispatch(saveSettings()); + } } - } - // https://stackoverflow.com/a/30007882 for domain regex - const mentions: string[] | null = status.match(/(?:^|\s)@([a-z\d_-]+(?:@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]+)?)/gi); + const idempotencyKey = compose.idempotencyKey; + const contentType = compose.contentType === 'wysiwyg' ? 'text/markdown' : compose.contentType; - if (mentions) { - to = [...new Set([...to, ...mentions.map(mention => mention.replace(/ /g, '').trim().slice(1))])]; - } - - if (!preview) { - dispatch(submitComposeRequest(composeId)); - - useModalsStore.getState().actions.closeModal('COMPOSE'); - - if (compose.language && !editedId && !preview) { - useSettingsStore.getState().actions.rememberLanguageUse(compose.language); - dispatch(saveSettings()); - } - } - - const idempotencyKey = compose.idempotencyKey; - const contentType = compose.contentType === 'wysiwyg' ? 'text/markdown' : compose.contentType; - - const params: CreateStatusParams = { - status, - in_reply_to_id: compose.inReplyToId || undefined, - quote_id: compose.quoteId || undefined, - media_ids: media.map(item => item.id), - sensitive: compose.sensitive, - spoiler_text: compose.spoilerText, - visibility: compose.visibility, - content_type: contentType, - scheduled_at: preview ? undefined : compose.scheduledAt?.toISOString(), - language: compose.language || compose.suggestedLanguage || undefined, - to: explicitAddressing && to.length ? to : undefined, - local_only: compose.localOnly, - interaction_policy: ['public', 'unlisted', 'private'].includes(compose.visibility) && compose.interactionPolicy || undefined, - quote_approval_policy: compose.quoteApprovalPolicy || undefined, - location_id: compose.location?.origin_id || undefined, - preview, - }; - - if (compose.poll) { - params.poll = { - options: compose.poll.options, - expires_in: compose.poll.expires_in, - multiple: compose.poll.multiple, - hide_totals: compose.poll.hide_totals, - options_map: compose.poll.options_map, + const params: CreateStatusParams = { + status, + in_reply_to_id: compose.inReplyToId ?? undefined, + quote_id: compose.quoteId ?? undefined, + media_ids: media.map((item) => item.id), + sensitive: compose.sensitive, + spoiler_text: compose.spoilerText, + visibility: compose.visibility, + content_type: contentType, + scheduled_at: preview ? undefined : compose.scheduledAt?.toISOString(), + language: (compose.language ?? compose.suggestedLanguage) ?? undefined, + to: explicitAddressing && to.length ? to : undefined, + local_only: compose.localOnly, + interaction_policy: + (['public', 'unlisted', 'private'].includes(compose.visibility) && + compose.interactionPolicy) ?? + undefined, + quote_approval_policy: compose.quoteApprovalPolicy ?? undefined, + location_id: compose.location?.origin_id ?? undefined, + preview, }; - } - if (compose.language && Object.keys(compose.textMap).length) { - params.status_map = compose.textMap; - params.status_map[compose.language] = status; - - if (params.spoiler_text) { - params.spoiler_text_map = compose.spoilerTextMap; - params.spoiler_text_map[compose.language] = compose.spoilerText; + if (compose.poll) { + params.poll = { + options: compose.poll.options, + expires_in: compose.poll.expires_in, + multiple: compose.poll.multiple, + hide_totals: compose.poll.hide_totals, + options_map: compose.poll.options_map, + }; } - const poll = params.poll; - if (poll?.options_map) { - poll.options.forEach((option, index: number) => poll.options_map![index][compose.language!] = option); + if (compose.language && Object.keys(compose.textMap).length) { + params.status_map = compose.textMap; + params.status_map[compose.language] = status; + + if (params.spoiler_text) { + params.spoiler_text_map = compose.spoilerTextMap; + params.spoiler_text_map[compose.language] = compose.spoilerText; + } + + const poll = params.poll; + if (poll?.options_map) { + poll.options.forEach( + (option, index: number) => (poll.options_map![index][compose.language!] = option), + ); + } } - } - if (compose.visibility === 'group' && compose.groupId) { - params.group_id = compose.groupId; - } + if (compose.visibility === 'group' && compose.groupId) { + params.group_id = compose.groupId; + } - if (preview) { - getClient(state).statuses.previewStatus(params).then((data) => { + if (preview) { + const data = await getClient(state).statuses.previewStatus(params); dispatch(previewComposeSuccess(composeId, data)); onSuccess?.(); - }).catch(() => {}); - } else { - if (compose.redacting) { - // @ts-ignore - params.overwrite = compose.redactingOverwrite; - } + } else { + if (compose.redacting) { + // @ts-ignore + params.overwrite = compose.redactingOverwrite; + } - return dispatch(createStatus(params, idempotencyKey, editedId, compose.redacting)).then((data) => { - handleComposeSubmit(dispatch, getState, composeId, data, status, !!editedId, compose.redacting); - onSuccess?.(); - }).catch((error) => { - dispatch(submitComposeFail(composeId, error)); - }); - } - }; + try { + const data = await dispatch( + createStatus(params, idempotencyKey, editedId, compose.redacting), + ); + handleComposeSubmit( + dispatch, + getState, + composeId, + data, + status, + !!editedId, + compose.redacting, + ); + onSuccess?.(); + } catch (error) { + dispatch(submitComposeFail(composeId, error)); + } + } + }; const submitComposeRequest = (composeId: string) => ({ type: COMPOSE_SUBMIT_REQUEST, @@ -503,41 +604,49 @@ const cancelPreviewCompose = (composeId: string) => ({ composeId, }); -const uploadCompose = (composeId: string, files: FileList, intl: IntlShape) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return; - const attachmentLimit = getState().instance.configuration.statuses.max_media_attachments; +const uploadCompose = + (composeId: string, files: FileList, intl: IntlShape) => + (dispatch: AppDispatch, getState: () => RootState) => { + if (!isLoggedIn(getState)) return; + const attachmentLimit = getState().instance.configuration.statuses.max_media_attachments; - const media = getState().compose[composeId]?.mediaAttachments; - const progress = new Array(files.length).fill(0); - let total = Array.from(files).reduce((a, v) => a + v.size, 0); + const media = getState().compose[composeId]?.mediaAttachments; + const progress = new Array(files.length).fill(0); + let total = Array.from(files).reduce((a, v) => a + v.size, 0); - const mediaCount = media ? media.length : 0; + const mediaCount = media ? media.length : 0; - if (files.length + mediaCount > attachmentLimit) { - toast.error(messages.uploadErrorLimit); - return; - } + if (files.length + mediaCount > attachmentLimit) { + toast.error(messages.uploadErrorLimit); + return; + } - dispatch(uploadComposeRequest(composeId)); + dispatch(uploadComposeRequest(composeId)); - Array.from(files).forEach(async (f, i) => { - if (mediaCount + i > attachmentLimit - 1) return; + Array.from(files).forEach((f, i) => { + if (mediaCount + i > attachmentLimit - 1) return; - dispatch(uploadFile( - f, - intl, - (data) => dispatch(uploadComposeSuccess(composeId, data)), - (error) => dispatch(uploadComposeFail(composeId, error)), - ({ loaded }) => { - progress[i] = loaded; - dispatch(uploadComposeProgress(composeId, progress.reduce((a, v) => a + v, 0), total)); - }, - (value) => total += value, - )); - - }); - }; + dispatch( + uploadFile( + f, + intl, + (data) => dispatch(uploadComposeSuccess(composeId, data)), + (error) => dispatch(uploadComposeFail(composeId, error)), + ({ loaded }) => { + progress[i] = loaded; + dispatch( + uploadComposeProgress( + composeId, + progress.reduce((a, v) => a + v, 0), + total, + ), + ); + }, + (value) => (total += value), + ), + ); + }); + }; const uploadComposeRequest = (composeId: string) => ({ type: COMPOSE_UPLOAD_REQUEST, @@ -563,18 +672,21 @@ const uploadComposeFail = (composeId: string, error: unknown) => ({ error, }); -const changeUploadCompose = (composeId: string, mediaId: string, params: UpdateMediaParams) => - (dispatch: AppDispatch, getState: () => RootState) => { - if (!isLoggedIn(getState)) return Promise.resolve(); +const changeUploadCompose = + (composeId: string, mediaId: string, params: UpdateMediaParams) => + (dispatch: AppDispatch, getState: () => RootState) => { + if (!isLoggedIn(getState)) return Promise.resolve(); - dispatch(changeUploadComposeRequest(composeId)); + dispatch(changeUploadComposeRequest(composeId)); - return dispatch(updateMedia(mediaId, params)).then(response => { - dispatch(changeUploadComposeSuccess(composeId, response)); - }).catch(error => { - dispatch(changeUploadComposeFail(composeId, mediaId, error)); - }); - }; + return dispatch(updateMedia(mediaId, params)) + .then((response) => { + dispatch(changeUploadComposeSuccess(composeId, response)); + }) + .catch((error) => { + dispatch(changeUploadComposeFail(composeId, mediaId, error)); + }); + }; const changeUploadComposeRequest = (composeId: string) => ({ type: COMPOSE_UPLOAD_CHANGE_REQUEST, @@ -617,24 +729,30 @@ const clearComposeSuggestions = (composeId: string) => { }; }; -const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, composeId, token) => { - if (cancelFetchComposeSuggestions) { - cancelFetchComposeSuggestions.abort(); - cancelFetchComposeSuggestions = new AbortController(); - } +const fetchComposeSuggestionsAccounts = throttle( + (dispatch, getState, composeId, token) => { + if (cancelFetchComposeSuggestions) { + cancelFetchComposeSuggestions.abort(); + cancelFetchComposeSuggestions = new AbortController(); + } - const signal = cancelFetchComposeSuggestions.signal; + const signal = cancelFetchComposeSuggestions.signal; - return getClient(getState).accounts.searchAccounts(token.slice(1), { resolve: false, limit: 10 }, { signal }) - .then(response => { - dispatch(importEntities({ accounts: response })); - dispatch(readyComposeSuggestionsAccounts(composeId, token, response)); - }).catch(error => { - if (!signal.aborted) { - toast.showAlertForError(error); - } - }); -}, 200, { leading: true, trailing: true }); + return getClient(getState) + .accounts.searchAccounts(token.slice(1), { resolve: false, limit: 10 }, { signal }) + .then((response) => { + dispatch(importEntities({ accounts: response })); + dispatch(readyComposeSuggestionsAccounts(composeId, token, response)); + }) + .catch((error) => { + if (!signal.aborted) { + toast.showAlertForError(error); + } + }); + }, + 200, + { leading: true, trailing: true }, +); const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, composeId: string, token: string) => { const customEmojis = queryClient.getQueryData>(['instance', 'customEmojis']); @@ -643,7 +761,12 @@ const fetchComposeSuggestionsEmojis = (dispatch: AppDispatch, composeId: string, dispatch(readyComposeSuggestionsEmojis(composeId, token, results)); }; -const fetchComposeSuggestionsTags = (dispatch: AppDispatch, getState: () => RootState, composeId: string, token: string) => { +const fetchComposeSuggestionsTags = ( + dispatch: AppDispatch, + getState: () => RootState, + composeId: string, + token: string, +) => { const signal = cancelFetchComposeSuggestions.signal; if (cancelFetchComposeSuggestions) { @@ -656,22 +779,25 @@ const fetchComposeSuggestionsTags = (dispatch: AppDispatch, getState: () => Root const { trends } = state.auth.client.features; if (trends) { - const currentTrends = queryClient.getQueryData>(['trends', 'tags']) || []; + const currentTrends = queryClient.getQueryData>(['trends', 'tags']) ?? []; return dispatch(updateSuggestionTags(composeId, token, currentTrends)); } - return getClient(state).search.search(token.slice(1), { limit: 10, type: 'hashtags' }, { signal }).then(response => { - dispatch(updateSuggestionTags(composeId, token, response.hashtags)); - }).catch(error => { - if (!signal.aborted) { - toast.showAlertForError(error); - } - }); + return getClient(state) + .search.search(token.slice(1), { limit: 10, type: 'hashtags' }, { signal }) + .then((response) => { + dispatch(updateSuggestionTags(composeId, token, response.hashtags)); + }) + .catch((error) => { + if (!signal.aborted) { + toast.showAlertForError(error); + } + }); }; -const fetchComposeSuggestions = (composeId: string, token: string) => - (dispatch: AppDispatch, getState: () => RootState) => { +const fetchComposeSuggestions = + (composeId: string, token: string) => (dispatch: AppDispatch, getState: () => RootState) => { switch (token[0]) { case ':': fetchComposeSuggestionsEmojis(dispatch, composeId, token); @@ -700,7 +826,11 @@ const readyComposeSuggestionsEmojis = (composeId: string, token: string, emojis: emojis, }); -const readyComposeSuggestionsAccounts = (composeId: string, token: string, accounts: Account[]) => ({ +const readyComposeSuggestionsAccounts = ( + composeId: string, + token: string, + accounts: Account[], +) => ({ type: COMPOSE_SUGGESTIONS_READY, composeId, token, @@ -716,33 +846,41 @@ interface ComposeSuggestionSelectAction { path: ['spoiler_text'] | ['poll', 'options', number]; } -const selectComposeSuggestion = (composeId: string, position: number, token: string | null, suggestion: AutoSuggestion, path: ComposeSuggestionSelectAction['path']) => - (dispatch: AppDispatch, getState: () => RootState) => { - let completion = '', startPosition = position; +const selectComposeSuggestion = + ( + composeId: string, + position: number, + token: string | null, + suggestion: AutoSuggestion, + path: ComposeSuggestionSelectAction['path'], + ) => + (dispatch: AppDispatch, getState: () => RootState) => { + let completion = '', + startPosition = position; - if (typeof suggestion === 'object' && 'id' in suggestion) { - completion = isNativeEmoji(suggestion) ? suggestion.native : suggestion.colons; - startPosition = position - 1; + if (typeof suggestion === 'object' && 'id' in suggestion) { + completion = isNativeEmoji(suggestion) ? suggestion.native : suggestion.colons; + startPosition = position - 1; - useSettingsStore.getState().actions.rememberEmojiUse(suggestion); - dispatch(saveSettings()); - } else if (typeof suggestion === 'string' && suggestion[0] === '#') { - completion = suggestion; - startPosition = position - 1; - } else if (typeof suggestion === 'string') { - completion = selectAccount(getState(), suggestion)!.acct; - startPosition = position; - } + useSettingsStore.getState().actions.rememberEmojiUse(suggestion); + dispatch(saveSettings()); + } else if (typeof suggestion === 'string' && suggestion[0] === '#') { + completion = suggestion; + startPosition = position - 1; + } else if (typeof suggestion === 'string') { + completion = selectAccount(getState(), suggestion)!.acct; + startPosition = position; + } - dispatch({ - type: COMPOSE_SUGGESTION_SELECT, - composeId, - position: startPosition, - token, - completion, - path, - }); - }; + dispatch({ + type: COMPOSE_SUGGESTION_SELECT, + composeId, + position: startPosition, + token, + completion, + path, + }); + }; const updateSuggestionTags = (composeId: string, token: string, tags: Array) => ({ type: COMPOSE_SUGGESTION_TAGS_UPDATE, @@ -850,12 +988,13 @@ const changePollSettings = (composeId: string, expiresIn?: number, isMultiple?: isMultiple, }); -const openComposeWithText = (composeId: string, text = '') => - (dispatch: AppDispatch) => { - dispatch(resetCompose(composeId)); - useModalsStore.getState().actions.openModal('COMPOSE'); - dispatch(changeCompose(composeId, text)); - }; +const openComposeWithText = + (composeId: string, text = '') => + (dispatch: AppDispatch) => { + dispatch(resetCompose(composeId)); + useModalsStore.getState().actions.openModal('COMPOSE'); + dispatch(changeCompose(composeId, text)); + }; interface ComposeAddToMentionsAction { type: typeof COMPOSE_ADD_TO_MENTIONS; @@ -863,8 +1002,8 @@ interface ComposeAddToMentionsAction { account: string; } -const addToMentions = (composeId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { +const addToMentions = + (composeId: string, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const account = selectAccount(state, accountId); if (!account) return; @@ -882,8 +1021,8 @@ interface ComposeRemoveFromMentionsAction { account: string; } -const removeFromMentions = (composeId: string, accountId: string) => - (dispatch: AppDispatch, getState: () => RootState) => { +const removeFromMentions = + (composeId: string, accountId: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const account = selectAccount(state, accountId); if (!account) return; @@ -903,22 +1042,28 @@ interface ComposeEventReplyAction { explicitAddressing: boolean; } -const eventDiscussionCompose = (composeId: string, status: ComposeEventReplyAction['status']) => - (dispatch: AppDispatch, getState: () => RootState) => { - const state = getState(); - const { forceImplicitAddressing } = useSettingsStore.getState().settings; - const explicitAddressing = state.auth.client.features.createStatusExplicitAddressing && !forceImplicitAddressing; +const eventDiscussionCompose = + (composeId: string, status: ComposeEventReplyAction['status']) => + (dispatch: AppDispatch, getState: () => RootState) => { + const state = getState(); + const { forceImplicitAddressing } = useSettingsStore.getState().settings; + const explicitAddressing = + state.auth.client.features.createStatusExplicitAddressing && !forceImplicitAddressing; - return dispatch({ - type: COMPOSE_EVENT_REPLY, - composeId, - status, - account: selectOwnAccount(state), - explicitAddressing, - }); - }; + return dispatch({ + type: COMPOSE_EVENT_REPLY, + composeId, + status, + account: selectOwnAccount(state), + explicitAddressing, + }); + }; -const setEditorState = (composeId: string, editorState: EditorState | string | null, text?: string) => ({ +const setEditorState = ( + composeId: string, + editorState: EditorState | string | null, + text?: string, +) => ({ type: COMPOSE_EDITOR_STATE_SET, composeId, editorState, @@ -949,7 +1094,13 @@ const changeComposeFederated = (composeId: string) => ({ composeId, }); -const changeComposeInteractionPolicyOption = (composeId: string, policy: Policy, rule: Rule, value: Scope[], initial: InteractionPolicy) => ({ +const changeComposeInteractionPolicyOption = ( + composeId: string, + policy: Policy, + rule: Rule, + value: Scope[], + initial: InteractionPolicy, +) => ({ type: COMPOSE_INTERACTION_POLICY_OPTION_CHANGE, composeId, policy, @@ -958,7 +1109,10 @@ const changeComposeInteractionPolicyOption = (composeId: string, policy: Policy, initial, }); -const changeComposeQuotePolicyOption = (composeId: string, value: CreateStatusParams['quote_approval_policy']) => ({ +const changeComposeQuotePolicyOption = ( + composeId: string, + value: CreateStatusParams['quote_approval_policy'], +) => ({ type: COMPOSE_QUOTE_POLICY_OPTION_CHANGE, composeId, value, @@ -1006,7 +1160,7 @@ const setComposeShowLocationPicker = (composeId: string, showLocation: boolean) }); type ComposeAction = - ComposeSetStatusAction + | ComposeSetStatusAction | ReturnType | ComposeReplyAction | ReturnType diff --git a/packages/pl-fe/src/actions/consumer-auth.ts b/packages/pl-fe/src/actions/consumer-auth.ts index 228a17326..226035eba 100644 --- a/packages/pl-fe/src/actions/consumer-auth.ts +++ b/packages/pl-fe/src/actions/consumer-auth.ts @@ -10,7 +10,7 @@ import { createApp } from './apps'; import type { AppDispatch, RootState } from '@/store'; const createProviderApp = () => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const scopes = getScopes(getState(), undefined, true); const params = { diff --git a/packages/pl-fe/src/actions/conversations.ts b/packages/pl-fe/src/actions/conversations.ts index e0ba97a4c..7fe537784 100644 --- a/packages/pl-fe/src/actions/conversations.ts +++ b/packages/pl-fe/src/actions/conversations.ts @@ -47,7 +47,7 @@ const expandConversations = (expand = true) => (dispatch: AppDispatch, getState: dispatch(expandConversationsRequest()); - return (state.conversations.next?.() || getClient(state).timelines.getConversations()) + return (state.conversations.next?.() ?? getClient(state).timelines.getConversations()) .then(response => { dispatch(importEntities({ accounts: response.items.reduce((aggr: Array, item) => aggr.concat(item.accounts), []), diff --git a/packages/pl-fe/src/actions/emoji-reacts.ts b/packages/pl-fe/src/actions/emoji-reacts.ts index 075c20fac..7320460ab 100644 --- a/packages/pl-fe/src/actions/emoji-reacts.ts +++ b/packages/pl-fe/src/actions/emoji-reacts.ts @@ -20,7 +20,9 @@ const messages = defineMessages({ unsupported: { id: 'emoji_reactions.unsupported_by_remote', defaultMessage: '@{acct}’s instance most likely doesn’t understand emoji reactions. The user will not get notified of the reaction.' }, }); -const noOp = () => () => new Promise(f => f(undefined)); +const noOp = () => () => new Promise(f =>{ + f(undefined); +}); const emojiReact = (statusId: string, emoji: string, custom: string | undefined = undefined, intl: IntlShape) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -34,7 +36,7 @@ const emojiReact = (statusId: string, emoji: string, custom: string | undefined const checkEmojiReactsSupport = !response.account.local && useSettingsStore.getState().settings.checkEmojiReactsSupport; if (checkEmojiReactsSupport) { - supportsEmojiReacts(response.account.ap_id || response.account.url).then((result) => { + supportsEmojiReacts(response.account.ap_id ?? response.account.url).then((result) => { if (result === 'false') { toast.info(intl.formatMessage(messages.unsupported, { acct: response.account.acct })); } diff --git a/packages/pl-fe/src/actions/events.ts b/packages/pl-fe/src/actions/events.ts index c19690245..4c5560c74 100644 --- a/packages/pl-fe/src/actions/events.ts +++ b/packages/pl-fe/src/actions/events.ts @@ -66,25 +66,25 @@ const submitEvent = ({ if (banner) params.banner_id = banner.id; if (location) params.location_id = location.origin_id; - return ( + const data = await ( statusId === null ? getClient(state).events.createEvent(params) : getClient(state).events.editEvent(statusId, params) - ).then((data) => { - dispatch(importEntities({ statuses: [data] })); - toast.success( - statusId ? messages.editSuccess : messages.success, - { - actionLabel: messages.view, - actionLinkOptions: { - to: '/@{$username}/events/$statusId', - params: { username: data.account.acct, statusId: data.id }, - }, - }, - ); + ); - return data; - }); + dispatch(importEntities({ statuses: [data] })); + toast.success( + statusId ? messages.editSuccess : messages.success, + { + actionLabel: messages.view, + actionLinkOptions: { + to: '/@{$username}/events/$statusId', + params: { username: data.account.acct, statusId: data.id }, + }, + }, + ); + + return data; }; interface JoinEventRequest { diff --git a/packages/pl-fe/src/actions/export-data.ts b/packages/pl-fe/src/actions/export-data.ts index a14e5778f..486ef47ec 100644 --- a/packages/pl-fe/src/actions/export-data.ts +++ b/packages/pl-fe/src/actions/export-data.ts @@ -39,34 +39,30 @@ const exportFollows = () => async (_dispatch: AppDispatch, getState: () => RootS const me = getState().me; if (!me) return; - return getClient(getState()).accounts.getAccountFollowing(me, { limit: 40 }) - .then(listAccounts) - .then((followings) => { - followings = followings.map(fqn => fqn + ',true'); - followings.unshift('Account address,Show boosts'); - fileExport(followings.join('\n'), 'export_followings.csv'); + const response = await getClient(getState()).accounts.getAccountFollowing(me, { limit: 40 }); + const followings = await listAccounts(response); + const followingsCsv = followings.map(fqn => fqn + ',true'); + followingsCsv.unshift('Account address,Show boosts'); + fileExport(followingsCsv.join('\n'), 'export_followings.csv'); - toast.success(messages.followersSuccess); - }); + toast.success(messages.followersSuccess); }; -const exportBlocks = () => (_dispatch: AppDispatch, getState: () => RootState) => - getClient(getState()).filtering.getBlocks({ limit: 40 }) - .then(listAccounts) - .then((blocks) => { - fileExport(blocks.join('\n'), 'export_block.csv'); +const exportBlocks = () => async (_dispatch: AppDispatch, getState: () => RootState) => { + const response = await getClient(getState()).filtering.getBlocks({ limit: 40 }); + const blocks = await listAccounts(response); + fileExport(blocks.join('\n'), 'export_block.csv'); - toast.success(messages.blocksSuccess); - }); + toast.success(messages.blocksSuccess); +}; -const exportMutes = () => (_dispatch: AppDispatch, getState: () => RootState) => - getClient(getState()).filtering.getMutes({ limit: 40 }) - .then(listAccounts) - .then((mutes) => { - fileExport(mutes.join('\n'), 'export_mutes.csv'); +const exportMutes = () => async (_dispatch: AppDispatch, getState: () => RootState) => { + const response = await getClient(getState()).filtering.getMutes({ limit: 40 }); + const mutes = await listAccounts(response); + fileExport(mutes.join('\n'), 'export_mutes.csv'); - toast.success(messages.mutesSuccess); - }); + toast.success(messages.mutesSuccess); +}; export { exportFollows, diff --git a/packages/pl-fe/src/actions/external-auth.ts b/packages/pl-fe/src/actions/external-auth.ts index f800d388f..8e9769873 100644 --- a/packages/pl-fe/src/actions/external-auth.ts +++ b/packages/pl-fe/src/actions/external-auth.ts @@ -50,7 +50,7 @@ const externalAuthorize = (instance: Instance, baseURL: string) => { const query = new URLSearchParams({ client_id, - redirect_uri: redirect_uri || app.redirect_uris[0]!, + redirect_uri: redirect_uri ?? app.redirect_uris[0], response_type: 'code', scope: scopes, }); diff --git a/packages/pl-fe/src/actions/frontend-config.ts b/packages/pl-fe/src/actions/frontend-config.ts index cbad4965b..73b4833ba 100644 --- a/packages/pl-fe/src/actions/frontend-config.ts +++ b/packages/pl-fe/src/actions/frontend-config.ts @@ -78,9 +78,7 @@ const fetchPlFeJson = (host: string | null) => }); const importFrontendConfig = (frontendConfig: APIEntity, host: string | null) => { - if (!frontendConfig.brandColor) { - frontendConfig.brandColor = '#d80482'; - } + frontendConfig.brandColor ??= '#d80482'; useSettingsStore.getState().actions.loadDefaultSettings(frontendConfig?.defaultSettings); diff --git a/packages/pl-fe/src/actions/instance.ts b/packages/pl-fe/src/actions/instance.ts index 02719ce12..681403044 100644 --- a/packages/pl-fe/src/actions/instance.ts +++ b/packages/pl-fe/src/actions/instance.ts @@ -11,7 +11,7 @@ const STANDALONE_CHECK_SUCCESS = 'STANDALONE_CHECK_SUCCESS' as const; /** Figure out the appropriate instance to fetch depending on the state */ const getHost = (state: RootState) => { - const accountUrl = getMeUrl(state) || getAuthUserUrl(state) as string; + const accountUrl = getMeUrl(state) ?? getAuthUserUrl(state) as string; try { return new URL(accountUrl).host; diff --git a/packages/pl-fe/src/actions/me.ts b/packages/pl-fe/src/actions/me.ts index 6a75c3947..3b435aef4 100644 --- a/packages/pl-fe/src/actions/me.ts +++ b/packages/pl-fe/src/actions/me.ts @@ -19,20 +19,22 @@ const ME_FETCH_SKIP = 'ME_FETCH_SKIP' as const; const ME_PATCH_SUCCESS = 'ME_PATCH_SUCCESS' as const; -const noOp = () => new Promise(f => f(undefined)); +const noOp = () => new Promise(f =>{ + f(undefined); +}); -const getMeId = (state: RootState) => state.me || getAuthUserId(state); +const getMeId = (state: RootState) => state.me ?? getAuthUserId(state); const getMeUrl = (state: RootState) => { const accountId = getMeId(state); if (accountId) { - return selectAccount(state, accountId)?.url || getAuthUserUrl(state); + return selectAccount(state, accountId)?.url ?? getAuthUserUrl(state); } }; const getMeToken = (state: RootState) => { // Fallback for upgrading IDs to URLs - const accountUrl = getMeUrl(state) || state.auth.me; + const accountUrl = getMeUrl(state) ?? state.auth.me; return state.auth.users[accountUrl!]?.access_token; }; @@ -60,18 +62,14 @@ const persistAuthAccount = (account: CredentialAccount, params: Record { - const settings = oldAccount?.settings_store || {}; - if (!account.settings_store) { - account.settings_store = settings; - } + const settings = oldAccount?.settings_store ?? {}; + account.settings_store ??= settings; KVStore.setItem(key, account); }) .catch(console.error); } if (account && account.url) { - if (!account.settings_store) { - account.settings_store = params.pleroma_settings_store || {}; - } + account.settings_store ??= params.pleroma_settings_store ?? {}; KVStore.setItem(`authAccount:${account.url}`, account).catch(console.error); } }; diff --git a/packages/pl-fe/src/actions/media.ts b/packages/pl-fe/src/actions/media.ts index cee85992d..e9b2d4f8d 100644 --- a/packages/pl-fe/src/actions/media.ts +++ b/packages/pl-fe/src/actions/media.ts @@ -86,15 +86,21 @@ const uploadFile = ( if (data.url) { onSuccess(data); } else if (data.url === null) { - setTimeout(() => poll(), 1000); + setTimeout(() =>{ + poll(); + }, 1000); } - }).catch(error => onFail(error)); + }).catch(error =>{ + onFail(error); + }); }; poll(); } }); - }).catch(error => onFail(error)); + }).catch(error =>{ + onFail(error); + }); }; export { diff --git a/packages/pl-fe/src/actions/moderation.tsx b/packages/pl-fe/src/actions/moderation.tsx index 97ffc8504..6419f1043 100644 --- a/packages/pl-fe/src/actions/moderation.tsx +++ b/packages/pl-fe/src/actions/moderation.tsx @@ -110,15 +110,15 @@ const deleteUserModal = (intl: IntlShape, accountId: string, afterConfirm = () = const toggleStatusSensitivityModal = (intl: IntlShape, statusId: string, sensitive: boolean, afterConfirm = () => {}) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - const acct = state.statuses[statusId]!.account.acct; + const acct = state.statuses[statusId].account.acct; useModalsStore.getState().actions.openModal('CONFIRM', { - heading: intl.formatMessage(sensitive === false ? messages.markStatusSensitiveHeading : messages.markStatusNotSensitiveHeading), - message: intl.formatMessage(sensitive === false ? messages.markStatusSensitivePrompt : messages.markStatusNotSensitivePrompt, { acct }), - confirm: intl.formatMessage(sensitive === false ? messages.markStatusSensitiveConfirm : messages.markStatusNotSensitiveConfirm), + heading: intl.formatMessage(!sensitive ? messages.markStatusSensitiveHeading : messages.markStatusNotSensitiveHeading), + message: intl.formatMessage(!sensitive ? messages.markStatusSensitivePrompt : messages.markStatusNotSensitivePrompt, { acct }), + confirm: intl.formatMessage(!sensitive ? messages.markStatusSensitiveConfirm : messages.markStatusNotSensitiveConfirm), onConfirm: () => { dispatch(toggleStatusSensitivity(statusId, sensitive)).then(() => { - const message = intl.formatMessage(sensitive === false ? messages.statusMarkedSensitive : messages.statusMarkedNotSensitive, { acct }); + const message = intl.formatMessage(!sensitive ? messages.statusMarkedSensitive : messages.statusMarkedNotSensitive, { acct }); toast.success(message); }).catch(() => {}); afterConfirm(); @@ -129,7 +129,7 @@ const toggleStatusSensitivityModal = (intl: IntlShape, statusId: string, sensiti const deleteStatusModal = (intl: IntlShape, statusId: string, afterConfirm = () => {}) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - const acct = state.statuses[statusId]!.account.acct; + const acct = state.statuses[statusId].account.acct; useModalsStore.getState().actions.openModal('CONFIRM', { heading: intl.formatMessage(messages.deleteStatusHeading), diff --git a/packages/pl-fe/src/actions/notifications.ts b/packages/pl-fe/src/actions/notifications.ts index d494c4de1..ce397174a 100644 --- a/packages/pl-fe/src/actions/notifications.ts +++ b/packages/pl-fe/src/actions/notifications.ts @@ -66,7 +66,7 @@ interface NotificationsUpdateAction { const updateNotifications = (notification: BaseNotification) => (dispatch: AppDispatch) => { const selectedFilter = useSettingsStore.getState().settings.notifications.quickFilter.active; - const showInColumn = selectedFilter === 'all' ? true : (FILTER_TYPES[selectedFilter as FilterType] || [notification.type]).includes(notification.type); + const showInColumn = selectedFilter === 'all' ? true : (FILTER_TYPES[selectedFilter as FilterType] ?? [notification.type]).includes(notification.type); dispatch(importEntities({ accounts: [notification.account, notification.type === 'move' ? notification.target : undefined], @@ -148,12 +148,14 @@ const updateNotificationsQueue = (notification: BaseNotification, intlMessages: const excludeTypesFromFilter = (filters: string[]) => NOTIFICATION_TYPES.filter(item => !filters.includes(item)); -const noOp = () => new Promise(f => f(undefined)); +const noOp = () => new Promise(f =>{ + f(undefined); +}); let abortExpandNotifications = new AbortController(); const expandNotifications = ({ maxId }: Record = {}, done: () => any = noOp, abort?: boolean) => - (dispatch: AppDispatch, getState: () => RootState) => { + async (dispatch: AppDispatch, getState: () => RootState) => { if (!isLoggedIn(getState)) return dispatch(noOp); const state = getState(); @@ -192,7 +194,9 @@ const expandNotifications = ({ maxId }: Record = {}, done: () => an dispatch(expandNotificationsRequest()); - return getClient(state).groupedNotifications.getGroupedNotifications(params, { signal: abortExpandNotifications.signal }).then(({ items: { accounts, statuses, notification_groups }, next }) => { + try { + const { items: { accounts, statuses, notification_groups }, next } = await getClient(state).groupedNotifications.getGroupedNotifications(params, { signal: abortExpandNotifications.signal }); + dispatch(importEntities({ accounts, statuses, @@ -201,10 +205,10 @@ const expandNotifications = ({ maxId }: Record = {}, done: () => an dispatch(expandNotificationsSuccess(notification_groups, next)); fetchRelatedRelationships(dispatch, notification_groups); done(); - }).catch(error => { + } catch (error) { dispatch(expandNotificationsFail(error)); done(); - }); + } }; const expandNotificationsRequest = () => ({ type: NOTIFICATIONS_EXPAND_REQUEST }); diff --git a/packages/pl-fe/src/actions/oauth.ts b/packages/pl-fe/src/actions/oauth.ts index 13e85d0a6..39a16db07 100644 --- a/packages/pl-fe/src/actions/oauth.ts +++ b/packages/pl-fe/src/actions/oauth.ts @@ -14,7 +14,7 @@ import { getBaseURL } from '@/utils/state'; import type { AppDispatch, RootState } from '@/store'; const obtainOAuthToken = async (params: GetTokenParams, baseURL?: string) =>{ - const client = new PlApiClient(baseURL || BuildConfig.BACKEND_URL || ''); + const client = new PlApiClient((baseURL ?? BuildConfig.BACKEND_URL) || ''); await client.instance.getInstance(); return client.oauth.getToken(params); diff --git a/packages/pl-fe/src/actions/preload.ts b/packages/pl-fe/src/actions/preload.ts index 353294295..9ba21fdfd 100644 --- a/packages/pl-fe/src/actions/preload.ts +++ b/packages/pl-fe/src/actions/preload.ts @@ -25,7 +25,7 @@ const pleromaDecoder = (json: string) => decodePleromaData(JSON.parse(json)); // Should be called inside a try-catch. const decodeFromMarkup = (elementId: string, decoder: (json: string) => Record) => { const { textContent } = document.getElementById(elementId)!; - return decoder(textContent as string); + return decoder(textContent); }; const preloadFromMarkup = (elementId: string, decoder: (json: string) => Record, action: (data: Record) => any) => diff --git a/packages/pl-fe/src/actions/push-notifications/registerer.ts b/packages/pl-fe/src/actions/push-notifications/registerer.ts index 1b4016a75..fc741bbc0 100644 --- a/packages/pl-fe/src/actions/push-notifications/registerer.ts +++ b/packages/pl-fe/src/actions/push-notifications/registerer.ts @@ -40,7 +40,9 @@ const unsubscribe = ({ registration, subscription }: { registration: ServiceWorkerRegistration; subscription: PushSubscription | null; }) => - subscription ? subscription.unsubscribe().then(() => registration) : new Promise(r => r(registration)); + subscription ? subscription.unsubscribe().then(() => registration) : new Promise(r =>{ + r(registration); + }); const sendSubscriptionToBackend = (subscription: PushSubscription, me: Me) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -80,7 +82,6 @@ const register = () => getRegistration() .then(getPushSubscription) - // @ts-ignore .then(async ({ registration, subscription }) => { if (subscription !== null) { // We have a subscription, check if it is still valid @@ -94,9 +95,9 @@ const register = () => return subscription; } else { // Something went wrong, try to subscribe again - return unsubscribe({ registration, subscription }) - .then((registration) => subscribe(registration, getState)) - .then((pushSubscription) => dispatch(sendSubscriptionToBackend(pushSubscription, me))); + const swRegistration = await unsubscribe({ registration, subscription }); + const pushSubscription = await subscribe(swRegistration, getState); + await dispatch(sendSubscriptionToBackend(pushSubscription, me)); } } diff --git a/packages/pl-fe/src/actions/remote-timeline.ts b/packages/pl-fe/src/actions/remote-timeline.ts index 86c968622..8d32eba48 100644 --- a/packages/pl-fe/src/actions/remote-timeline.ts +++ b/packages/pl-fe/src/actions/remote-timeline.ts @@ -13,7 +13,7 @@ const pinHost = (host: string) => const state = getState(); const pinnedHosts = getPinnedHosts(state); - return dispatch(changeSetting(['remote_timeline', 'pinnedHosts'], [...pinnedHosts, host])); + dispatch(changeSetting(['remote_timeline', 'pinnedHosts'], [...pinnedHosts, host])); }; const unpinHost = (host: string) => @@ -21,7 +21,7 @@ const unpinHost = (host: string) => const state = getState(); const pinnedHosts = getPinnedHosts(state); - return dispatch(changeSetting(['remote_timeline', 'pinnedHosts'], pinnedHosts.filter(value => value !== host))); + dispatch(changeSetting(['remote_timeline', 'pinnedHosts'], pinnedHosts.filter(value => value !== host))); }; export { diff --git a/packages/pl-fe/src/actions/reports.ts b/packages/pl-fe/src/actions/reports.ts index 01e176ed1..07029b93a 100644 --- a/packages/pl-fe/src/actions/reports.ts +++ b/packages/pl-fe/src/actions/reports.ts @@ -17,9 +17,9 @@ type ReportedEntity = { } const initReport = (entityType: ReportableEntities, account: Pick, entities?: ReportedEntity) => (dispatch: AppDispatch) => { - const { status, statusId } = entities || {}; + const { status, statusId } = entities ?? {}; - return useModalsStore.getState().actions.openModal('REPORT', { + useModalsStore.getState().actions.openModal('REPORT', { accountId: account.id, entityType, statusIds: [status?.id, statusId].filter((id): id is string => !!id), diff --git a/packages/pl-fe/src/actions/settings.ts b/packages/pl-fe/src/actions/settings.ts index 40fbfb579..aa1339dfd 100644 --- a/packages/pl-fe/src/actions/settings.ts +++ b/packages/pl-fe/src/actions/settings.ts @@ -56,7 +56,7 @@ const updateAuthAccount = async (url: string, settings: any) => { const oldAccount: any = await KVStore.getItem(key); try { if (!oldAccount) return; - if (!oldAccount.settings_store) oldAccount.settings_store = {}; + oldAccount.settings_store ??= {}; oldAccount.settings_store[FE_NAME] = settings; await KVStore.setItem(key, oldAccount); } catch (error) { diff --git a/packages/pl-fe/src/actions/statuses.ts b/packages/pl-fe/src/actions/statuses.ts index 845bfccee..8a7d79269 100644 --- a/packages/pl-fe/src/actions/statuses.ts +++ b/packages/pl-fe/src/actions/statuses.ts @@ -90,7 +90,7 @@ const createStatus = (params: CreateStatusParams, idempotencyKey: string, edited const editStatus = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); - const status = state.statuses[statusId]!; + const status = state.statuses[statusId]; const poll = status.poll_id ? queryClient.getQueryData(['statuses', 'polls', status.poll_id]) : undefined; dispatch({ type: STATUS_FETCH_SOURCE_REQUEST }); @@ -122,7 +122,7 @@ const deleteStatus = (statusId: string, groupId?: string, withRedraft = false) = const state = getState(); - const status = state.statuses[statusId]!; + const status = state.statuses[statusId]; const poll = status.poll_id ? queryClient.getQueryData(['statuses', 'polls', status.poll_id]) : undefined; dispatch({ type: STATUS_DELETE_REQUEST, params: status }); @@ -136,7 +136,7 @@ const deleteStatus = (statusId: string, groupId?: string, withRedraft = false) = dispatch(deleteFromTimelines(statusId)); if (withRedraft) { - dispatch(setComposeToStatus(status, poll, response.text || '', response.spoiler_text, (response as StatusSource).content_type, withRedraft)); + dispatch(setComposeToStatus(status, poll, response.text ?? '', response.spoiler_text, (response as StatusSource).content_type, withRedraft)); useModalsStore.getState().actions.openModal('COMPOSE'); } }) @@ -145,8 +145,9 @@ const deleteStatus = (statusId: string, groupId?: string, withRedraft = false) = }); }; -const updateStatus = (status: BaseStatus) => (dispatch: AppDispatch) => +const updateStatus = (status: BaseStatus) => (dispatch: AppDispatch) =>{ dispatch(importEntities({ statuses: [status] })); +}; const fetchContext = (statusId: string, intl?: IntlShape) => (dispatch: AppDispatch, getState: () => RootState) => { @@ -168,7 +169,7 @@ const fetchContext = (statusId: string, intl?: IntlShape) => }; const fetchStatusWithContext = (statusId: string, intl?: IntlShape) => - async (dispatch: AppDispatch) => Promise.all([ + (dispatch: AppDispatch) => Promise.all([ dispatch(fetchContext(statusId, intl)), dispatch(fetchStatus(statusId, intl)), ]); diff --git a/packages/pl-fe/src/actions/timelines.ts b/packages/pl-fe/src/actions/timelines.ts index e30b03ec4..271a7aba7 100644 --- a/packages/pl-fe/src/actions/timelines.ts +++ b/packages/pl-fe/src/actions/timelines.ts @@ -45,7 +45,7 @@ const processTimelineUpdate = (timeline: string, status: BaseStatus) => const shouldSkipQueue = shouldFilter({ in_reply_to_id: status.in_reply_to_id, visibility: status.visibility, - reblog_id: status.reblog?.id || null, + reblog_id: status.reblog?.id ?? null, }, columnSettings); if (ownStatus && hasPendingStatuses) { @@ -100,14 +100,12 @@ const dequeueTimeline = (timelineId: string, expandFunc?: (lastStatusId: string) dispatch(clearTimeline(timelineId)); // @ts-ignore expandFunc(); - } else { - if (timelineId === 'home') { - dispatch(clearTimeline(timelineId)); - dispatch(fetchHomeTimeline()); - } else if (timelineId === 'public:local') { - dispatch(clearTimeline(timelineId)); - dispatch(fetchPublicTimeline({ local: true })); - } + } else if (timelineId === 'home') { + dispatch(clearTimeline(timelineId)); + dispatch(fetchHomeTimeline()); + } else if (timelineId === 'public:local') { + dispatch(clearTimeline(timelineId)); + dispatch(fetchPublicTimeline({ local: true })); } }; @@ -121,11 +119,11 @@ interface TimelineDeleteAction { const deleteFromTimelines = (statusId: string) => (dispatch: AppDispatch, getState: () => RootState) => { - const accountId = getState().statuses[statusId]?.account?.id!; + const accountId = getState().statuses[statusId]?.account?.id; const references: Array<[string, string]> = Object.entries(getState().statuses) .filter(([key, status]) => [key, status.reblog_id === statusId]) .map(([key, status]) => [key, status.account_id]); - const reblogOf = getState().statuses[statusId]?.reblog_id || null; + const reblogOf = getState().statuses[statusId]?.reblog_id ?? null; dispatch({ type: TIMELINE_DELETE, @@ -161,10 +159,12 @@ const deduplicateStatuses = (statuses: Array) => { }; const handleTimelineExpand = (timelineId: string, fn: Promise>, done = noOp, onError?: (error: any) => void) => - (dispatch: AppDispatch) => { + async (dispatch: AppDispatch) => { dispatch(expandTimelineRequest(timelineId)); - return fn.then(response => { + try { + const response = await fn; + dispatch(importEntities({ statuses: response.items })); const statuses = deduplicateStatuses(response.items); @@ -178,15 +178,15 @@ const handleTimelineExpand = (timelineId: string, fn: Promise { + } catch (error) { dispatch(expandTimelineFail(timelineId, error)); done(); onError?.(error); - }); + } }; const fetchHomeTimeline = (expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const params: HomeTimelineParams = {}; @@ -194,13 +194,13 @@ const fetchHomeTimeline = (expand = false, done = noOp) => if (expand && state.timelines.home?.isLoading) return; - const fn = (expand && state.timelines.home?.next?.()) || getClient(state).timelines.homeTimeline(params); + const fn = (expand && state.timelines.home?.next?.()) ?? getClient(state).timelines.homeTimeline(params); return dispatch(handleTimelineExpand('home', fn, done)); }; const fetchPublicTimeline = ({ onlyMedia, local, instance }: Record = {}, expand = false, done = noOp, onError = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `${instance ? 'remote' : 'public'}${local ? ':local' : ''}${onlyMedia ? ':media' : ''}${instance ? `:${instance}` : ''}`; @@ -209,13 +209,13 @@ const fetchPublicTimeline = ({ onlyMedia, local, instance }: Record if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.publicTimeline(params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.publicTimeline(params); return dispatch(handleTimelineExpand(timelineId, fn, done, onError)); }; const fetchBubbleTimeline = ({ onlyMedia }: Record = {}, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `bubble${onlyMedia ? ':media' : ''}`; @@ -224,13 +224,13 @@ const fetchBubbleTimeline = ({ onlyMedia }: Record = {}, expand = f if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.bubbleTimeline(params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.bubbleTimeline(params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchWrenchedTimeline = ({ onlyMedia }: Record = {}, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `wrenched${onlyMedia ? ':media' : ''}`; @@ -239,13 +239,13 @@ const fetchWrenchedTimeline = ({ onlyMedia }: Record = {}, expand = if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.wrenchedTimeline(params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.wrenchedTimeline(params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchAccountTimeline = (accountId: string, { exclude_replies, pinned, only_media, limit }: Record = {}, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `account:${accountId}${!exclude_replies ? ':with_replies' : ''}${pinned ? ':pinned' : only_media ? ':media' : ''}`; @@ -256,13 +256,13 @@ const fetchAccountTimeline = (accountId: string, { exclude_replies, pinned, only if (!expand && state.timelines[timelineId]?.loaded) return; if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).accounts.getAccountStatuses(accountId, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).accounts.getAccountStatuses(accountId, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchListTimeline = (listId: string, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `list:${listId}`; @@ -271,13 +271,13 @@ const fetchListTimeline = (listId: string, expand = false, done = noOp) => if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.listTimeline(listId, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.listTimeline(listId, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchCircleTimeline = (circleId: string, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `circle:${circleId}`; @@ -286,13 +286,13 @@ const fetchCircleTimeline = (circleId: string, expand = false, done = noOp) => if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).circles.getCircleStatuses(circleId, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).circles.getCircleStatuses(circleId, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchAntennaTimeline = (antennaId: string, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `antenna:${antennaId}`; @@ -301,13 +301,13 @@ const fetchAntennaTimeline = (antennaId: string, expand = false, done = noOp) => if (expand && state.timelines[timelineId]?.isLoading) return; - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.antennaTimeline(antennaId, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.antennaTimeline(antennaId, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchGroupTimeline = (groupId: string, { only_media, limit }: Record = {}, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `group:${groupId}${only_media ? ':media' : ''}`; @@ -317,13 +317,13 @@ const fetchGroupTimeline = (groupId: string, { only_media, limit }: Record = {}, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `hashtag:${hashtag}`; @@ -337,13 +337,13 @@ const fetchHashtagTimeline = (hashtag: string, { tags }: Record = { if (useSettingsStore.getState().settings.autoTranslate) params.language = getLocale(); - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.hashtagTimeline(hashtag, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.hashtagTimeline(hashtag, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; const fetchLinkTimeline = (url: string, expand = false, done = noOp) => - async (dispatch: AppDispatch, getState: () => RootState) => { + (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const timelineId = `link:${url}`; @@ -353,7 +353,7 @@ const fetchLinkTimeline = (url: string, expand = false, done = noOp) => if (useSettingsStore.getState().settings.autoTranslate) params.language = getLocale(); - const fn = (expand && state.timelines[timelineId]?.next?.()) || getClient(state).timelines.linkTimeline(url, params); + const fn = (expand && state.timelines[timelineId]?.next?.()) ?? getClient(state).timelines.linkTimeline(url, params); return dispatch(handleTimelineExpand(timelineId, fn, done)); }; diff --git a/packages/pl-fe/src/api/hooks/admin/use-suggest.ts b/packages/pl-fe/src/api/hooks/admin/use-suggest.ts index d9f24324a..88ab9564a 100644 --- a/packages/pl-fe/src/api/hooks/admin/use-suggest.ts +++ b/packages/pl-fe/src/api/hooks/admin/use-suggest.ts @@ -21,7 +21,7 @@ const useSuggest = () => { }); }; - const suggest = async (accountId: string, callbacks?: EntityCallbacks) => { + const suggest = async (accountId: string, callbacks?: EntityCallbacks) => { suggestEffect(accountId, true); try { await client.admin.accounts.suggestUser(accountId); @@ -32,7 +32,7 @@ const useSuggest = () => { } }; - const unsuggest = async (accountId: string, callbacks?: EntityCallbacks) => { + const unsuggest = async (accountId: string, callbacks?: EntityCallbacks) => { suggestEffect(accountId, false); try { await client.admin.accounts.unsuggestUser(accountId); diff --git a/packages/pl-fe/src/api/hooks/admin/use-verify.ts b/packages/pl-fe/src/api/hooks/admin/use-verify.ts index 9afbe25d7..7148ac12f 100644 --- a/packages/pl-fe/src/api/hooks/admin/use-verify.ts +++ b/packages/pl-fe/src/api/hooks/admin/use-verify.ts @@ -26,7 +26,7 @@ const useVerify = () => { }); }; - const verify = async (accountId: string, callbacks?: EntityCallbacks) => { + const verify = async (accountId: string, callbacks?: EntityCallbacks) => { verifyEffect(accountId, true); try { await client.admin.accounts.tagUser(accountId, ['verified']); @@ -37,7 +37,7 @@ const useVerify = () => { } }; - const unverify = async (accountId: string, callbacks?: EntityCallbacks) => { + const unverify = async (accountId: string, callbacks?: EntityCallbacks) => { verifyEffect(accountId, false); try { await client.admin.accounts.untagUser(accountId, ['verified']); diff --git a/packages/pl-fe/src/api/hooks/groups/use-group.ts b/packages/pl-fe/src/api/hooks/groups/use-group.ts index 09514076e..0163ca69d 100644 --- a/packages/pl-fe/src/api/hooks/groups/use-group.ts +++ b/packages/pl-fe/src/api/hooks/groups/use-group.ts @@ -34,7 +34,7 @@ const useGroup = (groupId: string, refetch = true) => { return { ...result, isUnauthorized, - group: group ? { ...group, relationship: relationship || null } : undefined, + group: group ? { ...group, relationship: relationship ?? null } : undefined, }; }; diff --git a/packages/pl-fe/src/api/hooks/streaming/use-timeline-stream.ts b/packages/pl-fe/src/api/hooks/streaming/use-timeline-stream.ts index e8faf1ee1..8c733d137 100644 --- a/packages/pl-fe/src/api/hooks/streaming/use-timeline-stream.ts +++ b/packages/pl-fe/src/api/hooks/streaming/use-timeline-stream.ts @@ -30,7 +30,7 @@ const useTimelineStream = (stream: string, params: { list?: string; tag?: string const accessToken = useAppSelector(getAccessToken); const streamingUrl = instance.configuration.urls.streaming; - const connect = async () => { + const connect = () => { if (!socket.current && streamingUrl) { socket.current = client.streaming.connect(); diff --git a/packages/pl-fe/src/api/index.ts b/packages/pl-fe/src/api/index.ts index 74fe258ca..c93f9c983 100644 --- a/packages/pl-fe/src/api/index.ts +++ b/packages/pl-fe/src/api/index.ts @@ -17,7 +17,7 @@ type PlfeResponse = Response & { data: string; json: T }; * It uses FE_SUBDIRECTORY and parses JSON if possible. * No authorization is needed. */ -const staticFetch = async (input: URL | RequestInfo, init?: RequestInit | undefined) => { +const staticFetch = async (input: URL | RequestInfo, init?: RequestInit) => { const fullPath = buildFullPath(input.toString(), BuildConfig.BACKEND_URL); const response = await fetch(fullPath, init); diff --git a/packages/pl-fe/src/build-config.ts b/packages/pl-fe/src/build-config.ts index c9416a059..f7ff9d701 100644 --- a/packages/pl-fe/src/build-config.ts +++ b/packages/pl-fe/src/build-config.ts @@ -22,7 +22,7 @@ const env = compileTime(() => { const sanitizeBasename = (path: string | undefined = ''): string => `/${path.replace(/^\/+|\/+$/g, '')}`; return { - NODE_ENV: NODE_ENV || 'development', + NODE_ENV: NODE_ENV ?? 'development', BACKEND_URL: sanitizeURL(BACKEND_URL), FE_SUBDIRECTORY: sanitizeBasename(FE_SUBDIRECTORY), WITH_LANDING_PAGE: WITH_LANDING_PAGE === 'true', diff --git a/packages/pl-fe/src/columns/search.tsx b/packages/pl-fe/src/columns/search.tsx index 53630220f..8be0b288a 100644 --- a/packages/pl-fe/src/columns/search.tsx +++ b/packages/pl-fe/src/columns/search.tsx @@ -39,7 +39,7 @@ const SearchColumn: React.FC = ({ type, query, accountId, multiCo statuses: searchStatusesQuery, hashtags: searchHashtagsQuery, links: searchStatusesQuery, - })[type]!; + })[type]; const getCurrentIndex = (id: string): number => resultsIds?.findIndex(key => key === id); @@ -47,14 +47,14 @@ const SearchColumn: React.FC = ({ type, query, accountId, multiCo if (!resultsIds) return; const elementIndex = getCurrentIndex(id) - 1; - selectChild(elementIndex, node, document.getElementById('search-results') || undefined); + selectChild(elementIndex, node, document.getElementById('search-results') ?? undefined); }; const handleMoveDown = (id: string) => { if (!resultsIds) return; const elementIndex = getCurrentIndex(id) + 1; - selectChild(elementIndex, node, document.getElementById('search-results') || undefined, resultsIds.length); + selectChild(elementIndex, node, document.getElementById('search-results') ?? undefined, resultsIds.length); }; const handleLoadMore = () => activeQuery.fetchNextPage({ cancelRefetch: false }); @@ -143,7 +143,7 @@ const SearchColumn: React.FC = ({ type, query, accountId, multiCo })} useWindowScroll={!multiColumn} > - {searchResults || []} + {searchResults ?? []} ); }; diff --git a/packages/pl-fe/src/columns/trends.tsx b/packages/pl-fe/src/columns/trends.tsx index 1e04d8c16..66053395e 100644 --- a/packages/pl-fe/src/columns/trends.tsx +++ b/packages/pl-fe/src/columns/trends.tsx @@ -78,7 +78,7 @@ const TrendsColumn: React.FC = ({ type, multiColumn }) => { })} useWindowScroll={!multiColumn} > - {children || []} + {children ?? []} ); }; diff --git a/packages/pl-fe/src/components/account-hover-card.tsx b/packages/pl-fe/src/components/account-hover-card.tsx index 43eb2442b..35554964d 100644 --- a/packages/pl-fe/src/components/account-hover-card.tsx +++ b/packages/pl-fe/src/components/account-hover-card.tsx @@ -61,7 +61,7 @@ const AccountHoverCard: React.FC = ({ visible = true }) => { const { updateAccountHoverCard, closeAccountHoverCard } = useAccountHoverCardActions(); const me = useAppSelector(state => state.me); - const { account } = useAccount(accountId || undefined, { withRelationship: true }); + const { account } = useAccount(accountId ?? undefined, { withRelationship: true }); const { data: scrobble } = useQuery(accountScrobbleQueryOptions(account?.id)); const badges = getBadges(account); diff --git a/packages/pl-fe/src/components/account-local-time.tsx b/packages/pl-fe/src/components/account-local-time.tsx index 6a1852b0e..84b2b9bac 100644 --- a/packages/pl-fe/src/components/account-local-time.tsx +++ b/packages/pl-fe/src/components/account-local-time.tsx @@ -21,7 +21,7 @@ const getSupportedTimezone = (value: string): string | false => { foundTimezone = supportedTimeZones.find((tz) => tz.toLowerCase() === `etc/gmt${sign === '+' ? '-' : '+'}${+hours}`); } } - return foundTimezone || false; + return foundTimezone ?? false; }; const messages = defineMessages({ diff --git a/packages/pl-fe/src/components/account.tsx b/packages/pl-fe/src/components/account.tsx index b3bfe591b..020991f48 100644 --- a/packages/pl-fe/src/components/account.tsx +++ b/packages/pl-fe/src/components/account.tsx @@ -197,7 +197,7 @@ const Account = ({ useLayoutEffect(() => { const onResize = () => { const style: React.CSSProperties = {}; - const actionWidth = actionRef.current?.clientWidth || 0; + const actionWidth = actionRef.current?.clientWidth ?? 0; if (overflowRef.current) { style.maxWidth = Math.max(0, overflowRef.current.clientWidth - (withAvatar ? avatarSize + 12 : 0) - (actionWidth ? actionWidth + 12 : 0)); @@ -230,7 +230,9 @@ const Account = ({ to: '/@{$username}', params: { username: account.acct }, title: account.acct, - onClick: (event: React.MouseEvent) => event.stopPropagation(), + onClick: (event: React.MouseEvent) =>{ + event.stopPropagation(); + }, } : {}; if (disabled) return ( @@ -366,7 +368,11 @@ const Account = ({ {timestampUrl ? ( - event.stopPropagation()}> + { + event.stopPropagation(); + }} + > ) : ( diff --git a/packages/pl-fe/src/components/alt-indicator.tsx b/packages/pl-fe/src/components/alt-indicator.tsx index fc0b8e07a..9e80f163b 100644 --- a/packages/pl-fe/src/components/alt-indicator.tsx +++ b/packages/pl-fe/src/components/alt-indicator.tsx @@ -16,7 +16,7 @@ const AltIndicator: React.FC = React.forwardRef {warning && } - {message || } + {message ?? } )); diff --git a/packages/pl-fe/src/components/announcements/announcement-content.tsx b/packages/pl-fe/src/components/announcements/announcement-content.tsx index 44fce56d1..b1cf7fce6 100644 --- a/packages/pl-fe/src/components/announcements/announcement-content.tsx +++ b/packages/pl-fe/src/components/announcements/announcement-content.tsx @@ -60,7 +60,7 @@ const AnnouncementContent: React.FC = ({ announcement }) = link.setAttribute('rel', 'nofollow noopener'); link.setAttribute('target', '_blank'); - const mention = announcement.mentions.find(mention => link.href === `${mention.url}`); + const mention = announcement.mentions.find(mention => link.href === mention.url); // Add event listeners on mentions, hashtags and statuses if (mention) { diff --git a/packages/pl-fe/src/components/announcements/announcements-panel.tsx b/packages/pl-fe/src/components/announcements/announcements-panel.tsx index de1135468..1b35a2e13 100644 --- a/packages/pl-fe/src/components/announcements/announcements-panel.tsx +++ b/packages/pl-fe/src/components/announcements/announcements-panel.tsx @@ -45,7 +45,9 @@ const AnnouncementsPanel = () => { ); diff --git a/packages/pl-fe/src/components/location-search.tsx b/packages/pl-fe/src/components/location-search.tsx index f5c123249..16cb79742 100644 --- a/packages/pl-fe/src/components/location-search.tsx +++ b/packages/pl-fe/src/components/location-search.tsx @@ -60,7 +60,7 @@ const LocationSearch: React.FC = ({ onSelected }) => { placeholder={intl.formatMessage(messages.placeholder)} value={value} onChange={handleChange} - suggestions={locationsQuery.data || []} + suggestions={locationsQuery.data ?? []} onSuggestionsFetchRequested={noOp} onSuggestionsClearRequested={noOp} onSuggestionSelected={handleSelected} diff --git a/packages/pl-fe/src/components/media-gallery.tsx b/packages/pl-fe/src/components/media-gallery.tsx index c78f83d24..f5fa91055 100644 --- a/packages/pl-fe/src/components/media-gallery.tsx +++ b/packages/pl-fe/src/components/media-gallery.tsx @@ -104,15 +104,13 @@ const Item: React.FC = ({ if (isIOS() && !e.target.autoPlay) { e.target.autoPlay = true; e.preventDefault(); - } else { - if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { - if (hoverToPlay()) { - e.target.pause(); - e.target.currentTime = 0; - } - e.preventDefault(); - onClick(index); + } else if (e.button === 0 && !(e.ctrlKey || e.metaKey)) { + if (hoverToPlay()) { + e.target.pause(); + e.target.currentTime = 0; } + e.preventDefault(); + onClick(index); } e.stopPropagation(); @@ -140,12 +138,12 @@ const Item: React.FC = ({ if (dimensions) { width = dimensions.w; height = dimensions.h; - top = dimensions.t || 'auto'; - right = dimensions.r || 'auto'; - bottom = dimensions.b || 'auto'; - left = dimensions.l || 'auto'; - float = dimensions.float || 'left'; - position = dimensions.pos || 'relative'; + top = dimensions.t ?? 'auto'; + right = dimensions.r ?? 'auto'; + bottom = dimensions.b ?? 'auto'; + left = dimensions.l ?? 'auto'; + float = dimensions.float ?? 'left'; + position = dimensions.pos ?? 'relative'; } let thumbnail: React.ReactNode = ''; @@ -293,7 +291,7 @@ const Item: React.FC = ({ aria-label={!visible ? attachment.description : undefined} aria-hidden={visible} /> - {(visible || !attachment.blurhash) && thumbnail} + {(visible ?? !attachment.blurhash) && thumbnail}
); }; @@ -348,10 +346,14 @@ const MediaGallery: React.FC = (props) => { return ( {media.map((attachment, index) => ( - handleClick(index)}> + { + handleClick(index); + }} + > {attachment.description || { diff --git a/packages/pl-fe/src/components/modal-root.tsx b/packages/pl-fe/src/components/modal-root.tsx index 2c2f4eb57..af49b35b8 100644 --- a/packages/pl-fe/src/components/modal-root.tsx +++ b/packages/pl-fe/src/components/modal-root.tsx @@ -66,7 +66,7 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type, mo const hasComposeContent = checkComposeContent(compose); if (hasComposeContent && type === 'COMPOSE') { - const isEditing = compose!.editedId !== null; + const isEditing = compose.editedId !== null; openModal('CONFIRM', { heading: isEditing ? @@ -154,7 +154,7 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type, mo } }; - const getSiblings = () => Array(...(ref.current!.parentElement!.childNodes as any as ChildNode[])) + const getSiblings = () => [...(ref.current!.parentElement!.childNodes as any as ChildNode[])] .filter(node => (node as HTMLDivElement).id !== '_rht_toaster') .filter(node => node !== ref.current); @@ -173,7 +173,9 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type, mo useEffect(() => { if (!!children && !prevChildren) { activeElement.current = document.activeElement as HTMLDivElement; - getSiblings().forEach(sibling => (sibling as HTMLDivElement).setAttribute('inert', 'true')); + getSiblings().forEach(sibling =>{ + (sibling as HTMLDivElement).setAttribute('inert', 'true'); + }); handleModalOpen(); } else if (!prevChildren) { @@ -183,7 +185,9 @@ const ModalRoot: React.FC = ({ children, onCancel, onClose, type, mo if (!children && !!prevChildren) { activeElement.current?.focus(); activeElement.current = null; - getSiblings().forEach(sibling => (sibling as HTMLDivElement).removeAttribute('inert')); + getSiblings().forEach(sibling =>{ + (sibling as HTMLDivElement).removeAttribute('inert'); + }); handleModalClose(); } diff --git a/packages/pl-fe/src/components/parsed-content.tsx b/packages/pl-fe/src/components/parsed-content.tsx index 1b03dccda..d49df8277 100644 --- a/packages/pl-fe/src/components/parsed-content.tsx +++ b/packages/pl-fe/src/components/parsed-content.tsx @@ -66,9 +66,9 @@ const ParsedUrl: React.FC = React.memo((props) => { // eslint-disable-next-line prefer-const let { cleanUrls, redirectUrls, displayTargetHost, childrenPlain, ...anchorProps } = props; - if (cleanUrls === undefined) cleanUrls = urlPrivacy.clearLinksInContent; - if (redirectUrls === undefined) redirectUrls = urlPrivacy.redirectLinksMode !== 'off'; - if (displayTargetHost === undefined) displayTargetHost = urlPrivacy.displayTargetHost; + cleanUrls ??= urlPrivacy.clearLinksInContent; + redirectUrls ??= urlPrivacy.redirectLinksMode !== 'off'; + displayTargetHost ??= urlPrivacy.displayTargetHost; let href = props.href; @@ -86,7 +86,9 @@ const ParsedUrl: React.FC = React.memo((props) => { e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} rel='nofollow noopener noreferrer' target='_blank' title={props.href} @@ -130,7 +132,7 @@ const uniqueHashtagsWithCaseHandling = (hashtags: string[]) => { return Object.values(groups).map((tags) => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- we know that the array has at least one element - const firstTag = tags[0]!; + const firstTag = tags[0]; if (tags.length === 1) return firstTag; @@ -255,7 +257,9 @@ function parseContent({ params={{ username: mention.acct }} className='text-primary-600 hover:underline dark:text-primary-400' dir='ltr' - onClick={(e) => e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} > @{mention.username} @@ -353,9 +357,9 @@ const ParsedContent: React.FC = React.memo((props) => { props = { ...props }; - if (props.cleanUrls === undefined) props.cleanUrls = urlPrivacy.clearLinksInContent; - if (props.redirectUrls === undefined) props.redirectUrls = urlPrivacy.redirectLinksMode !== 'off'; - if (props.displayTargetHost === undefined) props.displayTargetHost = urlPrivacy.displayTargetHost; + props.cleanUrls ??= urlPrivacy.clearLinksInContent; + props.redirectUrls ??= urlPrivacy.redirectLinksMode !== 'off'; + props.displayTargetHost ??= urlPrivacy.displayTargetHost; return parseContent(props, false); }, (prevProps, nextProps) => prevProps.html === nextProps.html); diff --git a/packages/pl-fe/src/components/parsed-mfm.tsx b/packages/pl-fe/src/components/parsed-mfm.tsx index 20c60f36a..4a029abf7 100644 --- a/packages/pl-fe/src/components/parsed-mfm.tsx +++ b/packages/pl-fe/src/components/parsed-mfm.tsx @@ -26,7 +26,7 @@ const safeParseFloat = (str: unknown): number | null => { const validTime = (t: string | boolean | null | undefined) => { if (t === null || t === undefined) return null; if (typeof t === 'boolean') return null; - return t.match(/^\-?[0-9.]+s$/) ? t : null; + return t.match(/^-?[0-9.]+s$/) ? t : null; }; const validColor = (c: unknown): string | null => { @@ -414,7 +414,9 @@ const ParsedMfm: React.FC = React.memo(({ text, emojis, mentions, sp params={{ username: mention.acct }} className='text-primary-600 hover:underline dark:text-primary-400' dir='ltr' - onClick={(e) => e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} > @{mention.username} @@ -432,7 +434,9 @@ const ParsedMfm: React.FC = React.memo(({ text, emojis, mentions, sp params={{ username: token.props.acct.slice(1) }} className='text-primary-600 hover:underline dark:text-primary-400' dir='ltr' - onClick={(e) => e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} > @{token.props.username} @@ -449,7 +453,7 @@ const ParsedMfm: React.FC = React.memo(({ text, emojis, mentions, sp case 'blockCode': { return ( -
+            
               {token.props.code}
             
diff --git a/packages/pl-fe/src/components/polls/poll-footer.tsx b/packages/pl-fe/src/components/polls/poll-footer.tsx index e90c99c6e..01b4b1557 100644 --- a/packages/pl-fe/src/components/polls/poll-footer.tsx +++ b/packages/pl-fe/src/components/polls/poll-footer.tsx @@ -34,7 +34,9 @@ const PollFooter: React.FC = ({ poll, showResults, selected, status const { toggleShowPollResults } = useStatusMetaActions(); - const handleVote = () => vote(Object.keys(selected) as any as number[]); + const handleVote = () =>{ + vote(Object.keys(selected) as any as number[]); + }; const handleRefresh: React.EventHandler = (e) => { refetch(); @@ -91,7 +93,11 @@ const PollFooter: React.FC = ({ poll, showResults, selected, status {(!poll.voted && !poll.expired) && ( <> -
diff --git a/packages/pl-fe/src/components/polls/poll.tsx b/packages/pl-fe/src/components/polls/poll.tsx index 79237ac33..04a3d2261 100644 --- a/packages/pl-fe/src/components/polls/poll.tsx +++ b/packages/pl-fe/src/components/polls/poll.tsx @@ -35,11 +35,12 @@ const Poll: React.FC = ({ id, status, language, truncate }): JSX.Element const [selected, setSelected] = useState({} as Selected); - const openUnauthorizedModal = () => + const openUnauthorizedModal = () =>{ openModal('UNAUTHORIZED', { action: 'POLL_VOTE', ap_id: status?.url, }); + }; const toggleOption = (value: number) => { if (isLoggedIn) { @@ -68,7 +69,11 @@ const Poll: React.FC = ({ id, status, language, truncate }): JSX.Element return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions -
e.stopPropagation()}> +
{ + e.stopPropagation(); + }} + > {!showResults && poll.multiple && ( diff --git a/packages/pl-fe/src/components/preview-card.tsx b/packages/pl-fe/src/components/preview-card.tsx index 3e01c05af..3da0e3f99 100644 --- a/packages/pl-fe/src/components/preview-card.tsx +++ b/packages/pl-fe/src/components/preview-card.tsx @@ -119,7 +119,9 @@ const PreviewCard: React.FC = ({ const title = interactive ? ( e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} href={card.url} title={trimmedTitle} rel='noopener' @@ -200,7 +202,9 @@ const PreviewCard: React.FC = ({ {horizontal && ( e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} href={card.url} target='_blank' rel='noopener' @@ -249,7 +253,9 @@ const PreviewCard: React.FC = ({ target='_blank' rel='noopener' ref={setRef} - onClick={e => e.stopPropagation()} + onClick={e =>{ + e.stopPropagation(); + }} > {embed} {description} @@ -268,13 +274,13 @@ const PreviewCard: React.FC = ({ values={{ name: card.authors.map(author => ( - + {author.account && ( )} - + diff --git a/packages/pl-fe/src/components/quoted-status-indicator.tsx b/packages/pl-fe/src/components/quoted-status-indicator.tsx index 04fe07848..c0caad320 100644 --- a/packages/pl-fe/src/components/quoted-status-indicator.tsx +++ b/packages/pl-fe/src/components/quoted-status-indicator.tsx @@ -16,7 +16,7 @@ interface IQuotedStatusIndicator { const QuotedStatusIndicator: React.FC = ({ statusId, statusUrl }) => { const getStatus = useCallback(makeGetStatus(), []); - statusUrl = useAppSelector(state => statusUrl || statusId && getStatus(state, { id: statusId })?.url); + statusUrl = useAppSelector(state => statusUrl ?? (statusId && getStatus(state, { id: statusId })?.url)); if (!statusUrl) return null; diff --git a/packages/pl-fe/src/components/quoted-status.tsx b/packages/pl-fe/src/components/quoted-status.tsx index c849c99a8..a8d2ed75d 100644 --- a/packages/pl-fe/src/components/quoted-status.tsx +++ b/packages/pl-fe/src/components/quoted-status.tsx @@ -21,7 +21,7 @@ interface IQuotedStatus { /** The quoted status entity. */ status?: SelectedStatus; /** Callback when cancelled (during compose). */ - onCancel?: Function; + onCancel?: () => void; /** Whether the status is shown in the post composer. */ compose?: boolean; } diff --git a/packages/pl-fe/src/components/scrobble.tsx b/packages/pl-fe/src/components/scrobble.tsx index 8685c2d62..7ba614ecf 100644 --- a/packages/pl-fe/src/components/scrobble.tsx +++ b/packages/pl-fe/src/components/scrobble.tsx @@ -54,7 +54,9 @@ const Scrobble: React.FC = ({ scrobble }) => { e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} rel='nofollow noopener' target='_blank' > diff --git a/packages/pl-fe/src/components/scroll-top-button.tsx b/packages/pl-fe/src/components/scroll-top-button.tsx index 18cbe529f..03e3f6bf7 100644 --- a/packages/pl-fe/src/components/scroll-top-button.tsx +++ b/packages/pl-fe/src/components/scroll-top-button.tsx @@ -38,7 +38,7 @@ const ScrollTopButton: React.FC = ({ const visible = count > 0 && (!autoloadTimelines || scrolled); /** Number of pixels scrolled down from the top of the page. */ - const getScrollTop = (): number => (document.scrollingElement || document.documentElement).scrollTop; + const getScrollTop = (): number => (document.scrollingElement ?? document.documentElement).scrollTop; /** Unload feed items if scrolled to the top. */ const maybeUnload = useCallback(() => { diff --git a/packages/pl-fe/src/components/sidebar-navigation-link.tsx b/packages/pl-fe/src/components/sidebar-navigation-link.tsx index 912bd8f95..73530a1fe 100644 --- a/packages/pl-fe/src/components/sidebar-navigation-link.tsx +++ b/packages/pl-fe/src/components/sidebar-navigation-link.tsx @@ -55,7 +55,7 @@ const SidebarNavigationLink = React.memo(React.forwardRef((props: ISidebarNaviga aria-hidden > diff --git a/packages/pl-fe/src/components/sidebar-navigation.tsx b/packages/pl-fe/src/components/sidebar-navigation.tsx index 63771153e..325f7d3cf 100644 --- a/packages/pl-fe/src/components/sidebar-navigation.tsx +++ b/packages/pl-fe/src/components/sidebar-navigation.tsx @@ -69,8 +69,8 @@ const SidebarNavigation: React.FC = React.memo(({ shrink }) }), [!!account, features]); const notificationCount = useAppSelector((state) => state.notifications.unread); - const followRequestsCount = useFollowRequestsCount().data || 0; - const interactionRequestsCount = useInteractionRequestsCount().data || 0; + const followRequestsCount = useFollowRequestsCount().data ?? 0; + const interactionRequestsCount = useInteractionRequestsCount().data ?? 0; const { data: awaitingApprovalCount = 0 } = usePendingUsersCount(); const { data: pendingReportsCount = 0 } = usePendingReportsCount(); const dashboardCount = pendingReportsCount + awaitingApprovalCount; @@ -190,7 +190,9 @@ const SidebarNavigation: React.FC = React.memo(({ shrink }) text: intl.formatMessage(messages.help), items: [ { - action: () => openModal('HOTKEYS'), + action: () =>{ + openModal('HOTKEYS'); + }, icon: require('@phosphor-icons/core/regular/keyboard.svg'), text: intl.formatMessage(messages.keyboardShortcuts), }, @@ -323,7 +325,7 @@ const SidebarNavigation: React.FC = React.memo(({ shrink }) text={} /> - {(account.is_admin || account.is_moderator) && ( + {(account.is_admin ?? account.is_moderator) && ( = React.memo(({ shrink }) {(features.publicTimeline) && ( <> - {(features.wrenchedTimeline && (account || !restrictUnauth.timelines.wrenched)) && ( + {(features.wrenchedTimeline && (account ?? !restrictUnauth.timelines.wrenched)) && ( = React.memo(({ shrink }) /> )} - {(account || !restrictUnauth.timelines.local) && ( + {(account ?? !restrictUnauth.timelines.local) && ( = React.memo(({ shrink }) /> )} - {(features.bubbleTimeline && (account || !restrictUnauth.timelines.bubble)) && ( + {(features.bubbleTimeline && (account ?? !restrictUnauth.timelines.bubble)) && ( = React.memo(({ shrink }) /> )} - {(features.federating && (account || !restrictUnauth.timelines.federated)) && ( + {(features.federating && (account ?? !restrictUnauth.timelines.federated)) && ( { const sentryEnabled = Boolean(sentryDsn); const isProduction = NODE_ENV === 'production'; - const errorText = String(error) + (info?.componentStack || ''); + const errorText = String(error) + (info?.componentStack ?? ''); const clearCookies: React.MouseEventHandler = (e) => { localStorage.clear(); @@ -63,11 +63,15 @@ const SiteError: ErrorRouteComponent = ({ error, info }) => { ErrorBoundary: 'yes', }, }) - .then((eventId) => setSentryEventId(eventId)) + .then((eventId) =>{ + setSentryEventId(eventId); + }) .catch(console.error); import('bowser') - .then(({ default: Bowser }) => setBrowser(Bowser.getParser(window.navigator.userAgent))) + .then(({ default: Bowser }) =>{ + setBrowser(Bowser.getParser(window.navigator.userAgent)); + }) .catch(() => {}); }, []); diff --git a/packages/pl-fe/src/components/status-action-bar.tsx b/packages/pl-fe/src/components/status-action-bar.tsx index b0ed7c976..4bf3ef2ab 100644 --- a/packages/pl-fe/src/components/status-action-bar.tsx +++ b/packages/pl-fe/src/components/status-action-bar.tsx @@ -209,7 +209,7 @@ const ReplyButton: React.FC = ({ const intl = useIntl(); const canReply = useCanInteract(status, 'can_reply'); - const { groupRelationship } = useGroupRelationship(status.group_id || undefined); + const { groupRelationship } = useGroupRelationship(status.group_id ?? undefined); let replyTitle; let replyDisabled = false; @@ -227,7 +227,7 @@ const ReplyButton: React.FC = ({ const handleReplyClick: React.MouseEventHandler = (e) => { if (me) { - dispatch(replyCompose(status, rebloggedBy, canReply.approvalRequired || false)); + dispatch(replyCompose(status, rebloggedBy, canReply.approvalRequired ?? false)); } else { onOpenUnauthorizedModal('REPLY'); } @@ -479,7 +479,7 @@ const DislikeButton: React.FC = ({ ); }; -const getLongerWrench = (emojis: Array) => emojis.find(({ shortcode }) => shortcode === 'longestest_wrench') || emojis.find(({ shortcode }) => shortcode === 'longest_wrench'); +const getLongerWrench = (emojis: Array) => emojis.find(({ shortcode }) => shortcode === 'longestest_wrench') ?? emojis.find(({ shortcode }) => shortcode === 'longest_wrench'); const WrenchButton: React.FC = ({ status, @@ -497,7 +497,7 @@ const WrenchButton: React.FC = ({ if (!me || withLabels || !features.emojiReacts || !showWrenchButton) return; - const wrenches = showWrenchButton && status.emoji_reactions.find(emoji => emoji.name === '🔧') || undefined; + const wrenches = showWrenchButton && (status.emoji_reactions.find(emoji => emoji.name === '🔧') ?? undefined); const handleWrenchClick: React.EventHandler = (e) => { if (wrenches?.me) { @@ -523,7 +523,7 @@ const WrenchButton: React.FC = ({ onClick={handleWrenchClick} onLongPress={handleWrenchLongPress} active={wrenches?.me} - count={wrenches?.count || undefined} + count={wrenches?.count ?? undefined} /> ); }; @@ -570,16 +570,16 @@ const MenuButton: React.FC = ({ const { fetchTranslation, hideTranslation } = useStatusMetaActions(); const { targetLanguage } = useStatusMeta(status.id); const { openModal } = useModalsActions(); - const { group } = useGroup((status.group as Group)?.id as string); + const { group } = useGroup((status.group as Group)?.id); const { mutate: blockGroupMember } = useBlockGroupUserMutation(status.group?.id as string, status.account.id); const { getOrCreateChatByAccountId } = useChats(); const { mutate: bookmarkStatus } = useBookmarkStatus(status.id); const { mutate: unbookmarkStatus } = useUnbookmarkStatus(status.id); - const { mutate: pinStatus } = usePinStatus(status?.id!); - const { mutate: unpinStatus } = useUnpinStatus(status?.id!); + const { mutate: pinStatus } = usePinStatus(status?.id); + const { mutate: unpinStatus } = useUnpinStatus(status?.id); const { mutate: unblockAccount } = useUnblockAccountMutation(status.account_id); - const { groupRelationship } = useGroupRelationship(status.group_id || undefined); + const { groupRelationship } = useGroupRelationship(status.group_id ?? undefined); const features = useFeatures(); const instance = useInstance(); const { autoTranslate, deleteModal, knownLanguages } = useSettings(); @@ -594,14 +594,14 @@ const MenuButton: React.FC = ({ allow_unauthenticated: allowUnauthenticated, } = instance.pleroma.metadata.translation; - const renderTranslate = (me || allowUnauthenticated) && (allowRemote || status.account.local) && ['public', 'unlisted'].includes(status.visibility) && status.content.length > 0 && status.language !== null && !knownLanguages.includes(status.language); + const renderTranslate = (me ?? allowUnauthenticated) && (allowRemote || status.account.local) && ['public', 'unlisted'].includes(status.visibility) && status.content.length > 0 && status.language !== null && !knownLanguages.includes(status.language); const supportsLanguages = (translationLanguages[status.language!]?.includes(intl.locale)); return autoTranslate && features.translations && renderTranslate && supportsLanguages; }, [me, status, autoTranslate]); const { account } = useOwnAccount(); - const isStaff = account ? account.is_admin || account.is_moderator : false; + const isStaff = account ? account.is_admin ?? account.is_moderator : false; const isAdmin = account ? account.is_admin : false; const menu = useMemo(() => { @@ -712,8 +712,12 @@ const MenuButton: React.FC = ({ const handleLoadConversationClick = () => { client.statuses.loadConversation(status.id) - .then(() => toast.success(messages.loadConversationSuccess)) - .catch((error) => toast.error(messages.loadConversationError)); + .then(() =>{ + toast.success(messages.loadConversationSuccess); + }) + .catch((error) =>{ + toast.error(messages.loadConversationError); + }); }; const handleCopy: React.EventHandler = (e) => { @@ -883,17 +887,23 @@ const MenuButton: React.FC = ({ items: [ { text: intl.formatMessage(messages.reblog_visibility_public), - action: (e) => handleReblogClick(e, 'public'), + action: (e) =>{ + handleReblogClick(e, 'public'); + }, icon: require('@phosphor-icons/core/regular/globe.svg'), }, { text: intl.formatMessage(messages.reblog_visibility_unlisted), - action: (e) => handleReblogClick(e, 'unlisted'), + action: (e) =>{ + handleReblogClick(e, 'unlisted'); + }, icon: require('@phosphor-icons/core/regular/moon.svg'), }, { text: intl.formatMessage(messages.reblog_visibility_private), - action: (e) => handleReblogClick(e, 'private'), + action: (e) =>{ + handleReblogClick(e, 'private'); + }, icon: require('@phosphor-icons/core/regular/lock.svg'), }, ], @@ -907,14 +917,12 @@ const MenuButton: React.FC = ({ action: handlePinClick, icon: status.pinned ? require('@phosphor-icons/core/regular/push-pin-slash.svg') : require('@phosphor-icons/core/regular/push-pin.svg'), }); - } else { - if (status.visibility === 'private' || status.visibility === 'mutuals_only') { - menu.push({ - text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog_private), - action: handleReblogClick, - icon: require('@phosphor-icons/core/regular/repeat.svg'), - }); - } + } else if (status.visibility === 'private' || status.visibility === 'mutuals_only') { + menu.push({ + text: intl.formatMessage(status.reblogged ? messages.cancel_reblog_private : messages.reblog_private), + action: handleReblogClick, + icon: require('@phosphor-icons/core/regular/repeat.svg'), + }); } menu.push({ @@ -1058,7 +1066,7 @@ const MenuButton: React.FC = ({ if (features.pleromaAdminStatuses) { menu.push({ - text: intl.formatMessage(status.sensitive === false ? messages.markStatusSensitive : messages.markStatusNotSensitive), + text: intl.formatMessage(!status.sensitive ? messages.markStatusSensitive : messages.markStatusNotSensitive), action: handleToggleStatusSensitivity, icon: require('@phosphor-icons/core/regular/warning.svg'), }); @@ -1120,7 +1128,9 @@ const StatusActionBar: React.FC = ({ const publicStatus = useMemo(() => status ? ['public', 'unlisted', 'group'].includes(status.visibility) : false, [status.visibility]); - const onContainerClick: React.MouseEventHandler = useCallback((e) => e.stopPropagation(), []); + const onContainerClick: React.MouseEventHandler = useCallback((e) =>{ + e.stopPropagation(); + }, []); const onOpenUnauthorizedModal = useCallback((action?: UnauthorizedModalAction) => { openModal('UNAUTHORIZED', { diff --git a/packages/pl-fe/src/components/status-action-button.tsx b/packages/pl-fe/src/components/status-action-button.tsx index 769de4fe9..9211f0a5a 100644 --- a/packages/pl-fe/src/components/status-action-button.tsx +++ b/packages/pl-fe/src/components/status-action-button.tsx @@ -48,7 +48,7 @@ const StatusActionButton = React.forwardRef { return ( diff --git a/packages/pl-fe/src/components/status-content.tsx b/packages/pl-fe/src/components/status-content.tsx index 32622ca17..3ea287061 100644 --- a/packages/pl-fe/src/components/status-content.tsx +++ b/packages/pl-fe/src/components/status-content.tsx @@ -89,7 +89,7 @@ const StatusContent: React.FC = React.memo(({ const { data: localTranslation } = useLocalStatusTranslation(status.id, statusMeta.localTargetLanguage); const withSpoiler = status.spoiler_text?.length > 0; - const expanded = !withSpoiler || statusMeta.expanded || false; + const expanded = !withSpoiler || (statusMeta.expanded ?? false); const maybeSetCollapsed = (): void => { if (!contentNode.current) return; @@ -219,7 +219,7 @@ const StatusContent: React.FC = React.memo(({ quote = ( ); - } else if ((status.quote_visible ?? true) === false) { + } else if (!(status.quote_visible ?? true)) { quote = (

@@ -230,9 +230,9 @@ const StatusContent: React.FC = React.memo(({ } } - const media = (quote || status.card || (withMedia && status.media_attachments.length > 0)) && ( + const media = ((quote ?? status.card) ?? (withMedia && status.media_attachments.length > 0)) && ( - {((withMedia && status.media_attachments.length > 0) || (status.card && !quote)) && ( + {((withMedia && status.media_attachments.length > 0) ?? (status.card && !quote)) && (
{withMedia && } @@ -251,7 +251,7 @@ const StatusContent: React.FC = React.memo(({ key='content' className={className} direction={direction} - lang={status.language || undefined} + lang={status.language ?? undefined} size={textSize} > {parsedContent} diff --git a/packages/pl-fe/src/components/status-language-picker.tsx b/packages/pl-fe/src/components/status-language-picker.tsx index 0ddbc3607..f19d2b286 100644 --- a/packages/pl-fe/src/components/status-language-picker.tsx +++ b/packages/pl-fe/src/components/status-language-picker.tsx @@ -37,7 +37,9 @@ const StatusLanguagePicker: React.FC = React.memo(({ stat ({ text: languages[language as Language] || language, - action: () => setStatusLanguage(status.id, language), + action: () =>{ + setStatusLanguage(status.id, language); + }, active: language === currentLanguage, }))} > diff --git a/packages/pl-fe/src/components/status-list.tsx b/packages/pl-fe/src/components/status-list.tsx index 200646679..85533694f 100644 --- a/packages/pl-fe/src/components/status-list.tsx +++ b/packages/pl-fe/src/components/status-list.tsx @@ -66,11 +66,11 @@ const StatusList: React.FC = ({ }) => { const node = useRef(null); - const getFeaturedStatusCount = () => featuredStatusIds?.length || 0; + const getFeaturedStatusCount = () => featuredStatusIds?.length ?? 0; const getCurrentStatusIndex = (id: string, featured: boolean): number => { if (featured) { - return featuredStatusIds?.findIndex(key => key === id) || 0; + return featuredStatusIds?.findIndex(key => key === id) ?? 0; } else { return statusIds.findIndex(key => key === id) + getFeaturedStatusCount(); } @@ -78,23 +78,25 @@ const StatusList: React.FC = ({ const handleMoveUp = (id: string, featured: boolean = false) => { const elementIndex = getCurrentStatusIndex(id, featured) - 1; - selectChild(elementIndex, node, document.getElementById('status-list') || undefined); + selectChild(elementIndex, node, document.getElementById('status-list') ?? undefined); }; const handleMoveDown = (id: string, featured: boolean = false) => { const elementIndex = getCurrentStatusIndex(id, featured) + 1; - selectChild(elementIndex, node, document.getElementById('status-list') || undefined, scrollableContent.length); + selectChild(elementIndex, node, document.getElementById('status-list') ?? undefined, scrollableContent.length); }; const handleLoadOlder = useCallback(debounce(() => { - const maxId = lastStatusId || statusIds.at(-1); + const maxId = lastStatusId ?? statusIds.at(-1); if (onLoadMore && maxId) { onLoadMore(maxId); } }, 300, { leading: true }), [onLoadMore, lastStatusId, statusIds.at(-1)]); const handleSkipPinned = () => { - const skipPinned = () => selectChild(getFeaturedStatusCount(), node, document.getElementById('status-list') || undefined, scrollableContent.length, 'start'); + const skipPinned = () =>{ + selectChild(getFeaturedStatusCount(), node, document.getElementById('status-list') ?? undefined, scrollableContent.length, 'start'); + }; skipPinned(); @@ -112,7 +114,7 @@ const StatusList: React.FC = ({ ); diff --git a/packages/pl-fe/src/components/status-media.tsx b/packages/pl-fe/src/components/status-media.tsx index 693651a80..cdbf3845d 100644 --- a/packages/pl-fe/src/components/status-media.tsx +++ b/packages/pl-fe/src/components/status-media.tsx @@ -88,7 +88,7 @@ const StatusMedia: React.FC = ({ backgroundColor={attachment.meta.colors?.background} foregroundColor={attachment.meta.colors?.foreground} accentColor={attachment.meta.colors?.accent} - duration={attachment.meta.original?.duration || 0} + duration={attachment.meta.original?.duration ?? 0} height={263} /> @@ -122,7 +122,10 @@ const StatusMedia: React.FC = ({ if (media) { return ( // eslint-disable-next-line jsx-a11y/no-static-element-interactions -
e.stopPropagation()}> +
{ + e.stopPropagation(); + }} + > {media}
); diff --git a/packages/pl-fe/src/components/status-mention.tsx b/packages/pl-fe/src/components/status-mention.tsx index fe1331401..835c4ef87 100644 --- a/packages/pl-fe/src/components/status-mention.tsx +++ b/packages/pl-fe/src/components/status-mention.tsx @@ -25,7 +25,9 @@ const StatusMention: React.FC = ({ accountId, fallback }) => { params={{ username: account.acct }} className='text-primary-600 hover:underline dark:text-primary-400' dir='ltr' - onClick={(e) => e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} > @{account.acct} diff --git a/packages/pl-fe/src/components/status-reactions-bar.tsx b/packages/pl-fe/src/components/status-reactions-bar.tsx index b74a091bb..635a28145 100644 --- a/packages/pl-fe/src/components/status-reactions-bar.tsx +++ b/packages/pl-fe/src/components/status-reactions-bar.tsx @@ -89,7 +89,7 @@ const StatusReaction: React.FC = ({ reaction, statusId, obfusca disabled={unauthenticated} {...bind} > - +

@@ -112,7 +112,7 @@ const StatusReactionsBar: React.FC = ({ status, collapsed } if ((demetricator || status.emoji_reactions.length === 0) && collapsed) return null; if (status.emoji_reactions.length === 0 && !features.emojiReacts) return null; - const sortedReactions = status.emoji_reactions.toSorted((a, b) => (b.count || 0) - (a.count || 0)); + const sortedReactions = status.emoji_reactions.toSorted((a, b) => (b.count ?? 0) - (a.count ?? 0)); return (

diff --git a/packages/pl-fe/src/components/status-reply-mentions.tsx b/packages/pl-fe/src/components/status-reply-mentions.tsx index 941e69ef4..14ebb5466 100644 --- a/packages/pl-fe/src/components/status-reply-mentions.tsx +++ b/packages/pl-fe/src/components/status-reply-mentions.tsx @@ -42,7 +42,7 @@ const StatusReplyMentions: React.FC = ({ status, hoverable if (hoverable) { return ( - + = ({ status, hoverable to='/@{$username}' params={{ username: account.acct }} className='inline-block max-w-[200px] truncate align-bottom text-primary-600 no-underline [direction:ltr] hover:text-primary-700 hover:underline dark:text-primary-400 dark:hover:text-primary-400' - onClick={(e) => e.stopPropagation()} + onClick={(e) =>{ + e.stopPropagation(); + }} > @{account.username} @@ -97,7 +99,6 @@ const StatusReplyMentions: React.FC = ({ status, hoverable defaultMessage='Replying to {accounts}' values={{ accounts: , - // @ts-ignore wtf? hover: (children: React.ReactNode) => { if (hoverable) { return ( diff --git a/packages/pl-fe/src/components/status.tsx b/packages/pl-fe/src/components/status.tsx index 4cc55f9a7..7822c65ca 100644 --- a/packages/pl-fe/src/components/status.tsx +++ b/packages/pl-fe/src/components/status.tsx @@ -45,7 +45,11 @@ interface IAccountInfo { const AccountInfo: React.FC = React.memo(({ status }) => (
- event.stopPropagation()}> + { + event.stopPropagation(); + }} + > @@ -156,7 +160,7 @@ const Status: React.FC = (props) => { const node = useRef(null); const getStatus = useMemo(makeGetStatus, []); - const actualStatus = useAppSelector(state => status.reblog_id && getStatus(state, { id: status.reblog_id }) || status)!; + const actualStatus = useAppSelector(state => (status.reblog_id && getStatus(state, { id: status.reblog_id })) ?? status); const { mutate: favouriteStatus } = useFavouriteStatus(actualStatus.id); const { mutate: unfavouriteStatus } = useUnfavouriteStatus(actualStatus.id); @@ -317,7 +321,7 @@ const Status: React.FC = (props) => { /> ); } else if (isReblog) { - const accounts = status.accounts || [status.account]; + const accounts = status.accounts ?? [status.account]; const renderedAccounts = accounts.slice(0, 2).map(account => !!account && ( diff --git a/packages/pl-fe/src/components/statuses/sensitive-content-overlay.tsx b/packages/pl-fe/src/components/statuses/sensitive-content-overlay.tsx index 17625bdd3..e5b2aa77a 100644 --- a/packages/pl-fe/src/components/statuses/sensitive-content-overlay.tsx +++ b/packages/pl-fe/src/components/statuses/sensitive-content-overlay.tsx @@ -17,9 +17,9 @@ const useMediaVisible = (status: Pick return useMemo(() => { let visible = !status.sensitive; - const filterResults = status.filtered?.filter(({ filter }) => filter.filter_action === 'blur') || []; + const filterResults = status.filtered?.filter(({ filter }) => filter.filter_action === 'blur') ?? []; - if (filterResults.length) return [mediaVisible !== undefined ? mediaVisible : false, filterResults]; + if (filterResults.length) return [mediaVisible ?? false, filterResults]; if (mediaVisible !== undefined) visible = mediaVisible; else if (displayMedia === 'show_all') visible = true; diff --git a/packages/pl-fe/src/components/statuses/status-info.tsx b/packages/pl-fe/src/components/statuses/status-info.tsx index 4199047e4..792f314db 100644 --- a/packages/pl-fe/src/components/statuses/status-info.tsx +++ b/packages/pl-fe/src/components/statuses/status-info.tsx @@ -12,7 +12,7 @@ interface IStatusInfo { const StatusInfo = (props: IStatusInfo) => { const { avatarSize, icon, text, className, title } = props; - const onClick = (event: React.MouseEvent) => { + const onClick = (event: React.MouseEvent) => { event.stopPropagation(); }; diff --git a/packages/pl-fe/src/components/still-image.tsx b/packages/pl-fe/src/components/still-image.tsx index 49bff5b5f..f4082f8ae 100644 --- a/packages/pl-fe/src/components/still-image.tsx +++ b/packages/pl-fe/src/components/still-image.tsx @@ -39,7 +39,7 @@ const StillImage: React.FC = ({ const canvas = useRef(null); const img = useRef(null); - const hoverToPlay = src && !autoPlayGif && (isGif || src.endsWith('.gif') || src.startsWith('blob:') || (src && staticSrc && src !== staticSrc)); + const hoverToPlay = src && !autoPlayGif && ((isGif ?? src.endsWith('.gif')) || src.startsWith('blob:') || (src && staticSrc && src !== staticSrc)); const handleImageLoad: React.ReactEventHandler = (e) => { if (hoverToPlay && !staticSrc && canvas.current && img.current) { diff --git a/packages/pl-fe/src/components/thumb-navigation-link.tsx b/packages/pl-fe/src/components/thumb-navigation-link.tsx index 77805f850..43f745764 100644 --- a/packages/pl-fe/src/components/thumb-navigation-link.tsx +++ b/packages/pl-fe/src/components/thumb-navigation-link.tsx @@ -19,7 +19,7 @@ const ThumbNavigationLink: React.FC = ({ count, countMax, const matchRoute = useMatchRoute(); - const icon = (activeSrc && matchRoute({ to: props.to, params: props.params, search: props.search }) !== false && activeSrc) || src; + const icon = (activeSrc && matchRoute({ to: props.to, params: props.params, search: props.search }) !== false && activeSrc) ?? src; return ( diff --git a/packages/pl-fe/src/components/translate-button.tsx b/packages/pl-fe/src/components/translate-button.tsx index 27ab29d05..9c9c87022 100644 --- a/packages/pl-fe/src/components/translate-button.tsx +++ b/packages/pl-fe/src/components/translate-button.tsx @@ -34,14 +34,14 @@ const canRemoteTranslate = (status: ITranslateButton['status'], instance: Instan if (!status.account.local && !allowRemote) return false; - if (!supportedLanguages[status.language!]?.includes(locale)) return false; + if (!supportedLanguages[status.language]?.includes(locale)) return false; return true; }; type Availability = Awaited>; -const localTranslationAvailability = async (status: ITranslateButton['status'], locale: string): Promise => { +const localTranslationAvailability = (status: ITranslateButton['status'], locale: string): Promise => { if (!('Translator' in window)) return 'unavailable'; if (status.content.length < 0) return false; @@ -94,7 +94,9 @@ const TranslateButton: React.FC = ({ status }) => { const handleTranslate: React.MouseEventHandler = (e) => { e.stopPropagation(); - if (localTargetLanguage) return hideLocalTranslation(status.id); + if (localTargetLanguage) { + hideLocalTranslation(status.id); return; + } if (remoteTranslate) { if (targetLanguage) { diff --git a/packages/pl-fe/src/components/trending-link.tsx b/packages/pl-fe/src/components/trending-link.tsx index 9dfba592b..75d2dbcc0 100644 --- a/packages/pl-fe/src/components/trending-link.tsx +++ b/packages/pl-fe/src/components/trending-link.tsx @@ -31,7 +31,7 @@ const TrendingLink: React.FC = ({ trendingLink }) => { hash={trendingLink.blurhash} /> )} - {trendingLink.image_description + {trendingLink.image_description
); } diff --git a/packages/pl-fe/src/components/ui/avatar.tsx b/packages/pl-fe/src/components/ui/avatar.tsx index 5e3319416..3263d5971 100644 --- a/packages/pl-fe/src/components/ui/avatar.tsx +++ b/packages/pl-fe/src/components/ui/avatar.tsx @@ -45,7 +45,9 @@ const Avatar = (props: IAvatar) => { const [color, setColor] = useState(undefined); const [isAvatarMissing, setIsAvatarMissing] = useState(false); - const handleLoadFailure = () => setIsAvatarMissing(true); + const handleLoadFailure = () =>{ + setIsAvatarMissing(true); + }; useEffect(() => { if (!isCat) return; @@ -60,7 +62,9 @@ const Avatar = (props: IAvatar) => { COLOR_CACHE.set(src, color.hex); setColor(color.hex); } - }).catch(() => setColor(undefined)); + }).catch(() =>{ + setColor(undefined); + }); }, [src, isCat]); const style: React.CSSProperties = React.useMemo(() => { diff --git a/packages/pl-fe/src/components/ui/button/index.tsx b/packages/pl-fe/src/components/ui/button/index.tsx index c58a942e1..4cefdedc0 100644 --- a/packages/pl-fe/src/components/ui/button/index.tsx +++ b/packages/pl-fe/src/components/ui/button/index.tsx @@ -47,7 +47,7 @@ const Button = React.forwardRef(({ className, ...props }, ref): JSX.Element => { - const body = text || children; + const body = text ?? children; const themeClass = useButtonStyles({ theme, diff --git a/packages/pl-fe/src/components/ui/button/useButtonStyles.ts b/packages/pl-fe/src/components/ui/button/useButtonStyles.ts index 21f4536ea..2f2f7c4dc 100644 --- a/packages/pl-fe/src/components/ui/button/useButtonStyles.ts +++ b/packages/pl-fe/src/components/ui/button/useButtonStyles.ts @@ -38,8 +38,8 @@ const useButtonStyles = ({ }: IButtonStyles) => { const buttonStyle = clsx({ 'rtl:space-x-reverse inline-flex items-center place-content-center border font-medium rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 appearance-none transition-all disabled:select-none disabled:opacity-75 disabled:cursor-default': true, - [`${themes[theme]}`]: true, - [`${sizes[size]}`]: true, + [themes[theme]]: true, + [sizes[size]]: true, 'flex w-full justify-center': block, }); diff --git a/packages/pl-fe/src/components/ui/emoji.tsx b/packages/pl-fe/src/components/ui/emoji.tsx index d3283e0bd..cfa288f25 100644 --- a/packages/pl-fe/src/components/ui/emoji.tsx +++ b/packages/pl-fe/src/components/ui/emoji.tsx @@ -29,12 +29,12 @@ const Emoji: React.FC = (props): JSX.Element | null => { if (src) { if (disableUserProvidedMedia) return ( <> - {alt || {emoji}} + {alt ?? {emoji}} ); return ( = (props): JSX.Element | null => { return ( {alt diff --git a/packages/pl-fe/src/components/ui/icon-button.tsx b/packages/pl-fe/src/components/ui/icon-button.tsx index 17a8b1e7c..ba9a70d0a 100644 --- a/packages/pl-fe/src/components/ui/icon-button.tsx +++ b/packages/pl-fe/src/components/ui/icon-button.tsx @@ -37,7 +37,7 @@ const IconButton = React.forwardRef((props: IIconButton, ref: React.ForwardedRef 'opacity-50': filteredProps.disabled, }, className)} {...filteredProps} - data-testid={filteredProps['data-testid'] || 'icon-button'} + data-testid={filteredProps['data-testid'] ?? 'icon-button'} {...(props.href ? { target: '_blank' } as any : {})} > diff --git a/packages/pl-fe/src/components/ui/icon.tsx b/packages/pl-fe/src/components/ui/icon.tsx index c6c5aae0b..a5c5239be 100644 --- a/packages/pl-fe/src/components/ui/icon.tsx +++ b/packages/pl-fe/src/components/ui/icon.tsx @@ -28,7 +28,7 @@ interface IIcon extends Pick, 'strokeWidth'> { const Icon: React.FC = React.forwardRef(({ src, alt, count, size, countMax, containerClassName, title, ...filteredProps }, ref): JSX.Element => (
diff --git a/packages/pl-fe/src/components/ui/inline-multiselect.tsx b/packages/pl-fe/src/components/ui/inline-multiselect.tsx index 78f487202..a32700d7c 100644 --- a/packages/pl-fe/src/components/ui/inline-multiselect.tsx +++ b/packages/pl-fe/src/components/ui/inline-multiselect.tsx @@ -30,7 +30,9 @@ const InlineMultiselect = ({ items, value, onChange, disabled type='checkbox' className='sr-only' checked={checked} - onChange={({ target }) => onChange((target.checked ? [...(value || []), target.name] : value?.filter(key => key !== target.name) || []) as Array)} + onChange={({ target }) =>{ + onChange((target.checked ? [...(value ?? []), target.name] : value?.filter(key => key !== target.name) ?? []) as Array); + }} disabled={disabled} /> {label as string} diff --git a/packages/pl-fe/src/components/ui/modal.tsx b/packages/pl-fe/src/components/ui/modal.tsx index b5dd0ba88..6b1374e31 100644 --- a/packages/pl-fe/src/components/ui/modal.tsx +++ b/packages/pl-fe/src/components/ui/modal.tsx @@ -83,7 +83,7 @@ const Modal = React.forwardRef(({ const defaultCloseIcon = useDefaultCloseIcon(); - closeIcon = closeIcon || defaultCloseIcon; + closeIcon = closeIcon ?? defaultCloseIcon; React.useEffect(() => { setFirstRender(false); @@ -141,7 +141,7 @@ const Modal = React.forwardRef(({ className='⁂-modal__action-cancel' onClick={cancelAction} > - {cancelText || } + {cancelText ?? } )}
@@ -158,7 +158,7 @@ const Modal = React.forwardRef(({ )}
@@ -378,7 +380,7 @@ export class Multiselect extends React.Component { type='text' ref={this.searchBox} className='searchBox' - name={`${name || 'search-name'}-input`} + name={`${name ?? 'search-name'}-input`} onChange={this.onChange} onKeyPress={this.onKeyPress} value={inputValue} diff --git a/packages/pl-fe/src/components/ui/popover.tsx b/packages/pl-fe/src/components/ui/popover.tsx index 223c8591e..a15c69915 100644 --- a/packages/pl-fe/src/components/ui/popover.tsx +++ b/packages/pl-fe/src/components/ui/popover.tsx @@ -20,7 +20,7 @@ import React, { useRef, useState } from 'react'; import Portal from './portal'; interface IPopover { - children: React.ReactElement>; + children: React.ReactElement; /** The content of the popover */ content: React.ReactNode; /** Should we remove padding on the Popover */ diff --git a/packages/pl-fe/src/components/ui/streamfield.tsx b/packages/pl-fe/src/components/ui/streamfield.tsx index ad2b71cba..9d97cf78d 100644 --- a/packages/pl-fe/src/components/ui/streamfield.tsx +++ b/packages/pl-fe/src/components/ui/streamfield.tsx @@ -113,7 +113,9 @@ const Streamfield: React.FC = ({ iconClassName='h-4 w-4' className='bg-transparent text-gray-600 hover:text-gray-600' src={require('@phosphor-icons/core/regular/x.svg')} - onClick={() => onRemoveItem(i)} + onClick={() =>{ + onRemoveItem(i); + }} title={intl.formatMessage(messages.remove)} /> )} diff --git a/packages/pl-fe/src/components/ui/tag-input.tsx b/packages/pl-fe/src/components/ui/tag-input.tsx index e31351681..e16717a9f 100644 --- a/packages/pl-fe/src/components/ui/tag-input.tsx +++ b/packages/pl-fe/src/components/ui/tag-input.tsx @@ -58,7 +58,9 @@ const TagInput: React.FC = ({ tags, onChange, placeholder }) => { className='mb-2 h-8 w-32 grow bg-transparent p-1 outline-none' value={input} placeholder={placeholder} - onChange={e => setInput(e.target.value)} + onChange={e =>{ + setInput(e.target.value); + }} onKeyDown={handleKeyDown} /> diff --git a/packages/pl-fe/src/components/ui/tag.tsx b/packages/pl-fe/src/components/ui/tag.tsx index 9f977cf01..ab9037f35 100644 --- a/packages/pl-fe/src/components/ui/tag.tsx +++ b/packages/pl-fe/src/components/ui/tag.tsx @@ -18,7 +18,9 @@ const Tag: React.FC = ({ tag, onDelete }) => ( onDelete(tag)} + onClick={() =>{ + onDelete(tag); + }} />
); diff --git a/packages/pl-fe/src/components/ui/textarea.tsx b/packages/pl-fe/src/components/ui/textarea.tsx index d4559f0b6..0c18bc2df 100644 --- a/packages/pl-fe/src/components/ui/textarea.tsx +++ b/packages/pl-fe/src/components/ui/textarea.tsx @@ -50,7 +50,7 @@ const Textarea = React.forwardRef(({ className, ...props }: ITextarea, ref: React.ForwardedRef) => { - const length = value?.length || 0; + const length = value?.length ?? 0; const [rows, setRows] = useState(autoGrow ? minRows : initialRows); const direction = useLocaleDirection(useLocale()); diff --git a/packages/pl-fe/src/components/ui/toast.tsx b/packages/pl-fe/src/components/ui/toast.tsx index 7a6195fd0..a162314f4 100644 --- a/packages/pl-fe/src/components/ui/toast.tsx +++ b/packages/pl-fe/src/components/ui/toast.tsx @@ -41,7 +41,9 @@ const Toast = (props: IToast) => { const intl = useIntl(); - const dismissToast = () => toast.dismiss(t.id); + const dismissToast = () =>{ + toast.dismiss(t.id); + }; const renderIcon = () => { switch (type) { diff --git a/packages/pl-fe/src/components/ui/tooltip.tsx b/packages/pl-fe/src/components/ui/tooltip.tsx index e5d24bb31..b76df9bbf 100644 --- a/packages/pl-fe/src/components/ui/tooltip.tsx +++ b/packages/pl-fe/src/components/ui/tooltip.tsx @@ -13,7 +13,7 @@ import React, { useRef, useState } from 'react'; interface ITooltip { /** Element to display the tooltip around. */ - children: React.ReactElement>; + children: React.ReactElement; /** Text to display in the tooltip. */ text: string; /** If disabled, it will render the children without wrapping them. */ diff --git a/packages/pl-fe/src/components/ui/widget.tsx b/packages/pl-fe/src/components/ui/widget.tsx index df134b3b9..fe6cf34ad 100644 --- a/packages/pl-fe/src/components/ui/widget.tsx +++ b/packages/pl-fe/src/components/ui/widget.tsx @@ -28,10 +28,10 @@ const Widget: React.FC = ({ className, }): JSX.Element => (
- {(title || action || onActionClick) && ( + {((title ?? action) ?? onActionClick) && (
{title &&

{title}

} - {action || (onActionClick && ( + {action ?? (onActionClick && ( = ({ if (!onDescriptionChange) return; - const focusX = (media.type === 'image' || media.type === 'gifv') && media.meta.focus?.x || 0; - const focusY = (media.type === 'image' || media.type === 'gifv') && media.meta.focus?.y || 0; + const focusX = (media.type === 'image' || media.type === 'gifv') ? (media.meta.focus?.x ?? 0) : 0; + const focusY = (media.type === 'image' || media.type === 'gifv') ? (media.meta.focus?.y ?? 0) : 0; openModal('ALT_TEXT', { media, @@ -136,8 +136,8 @@ const Upload: React.FC = ({ }; const description = media.description; - const focusX = media.type === 'image' && media.meta?.focus?.x || undefined; - const focusY = media.type === 'image' && media.meta?.focus?.y || undefined; + const focusX = (media.type === 'image' && media.meta?.focus?.x) ?? undefined; + const focusY = (media.type === 'image' && media.meta?.focus?.y) ?? undefined; const x = focusX ? ((focusX / 2) + .5) * 100 : undefined; const y = focusY ? ((focusY / -2) + .5) * 100 : undefined; const mediaType = media.type; @@ -155,7 +155,7 @@ const Upload: React.FC = ({ const uploadIcon = mediaType === 'unknown' && ( ); diff --git a/packages/pl-fe/src/contexts/chat-context.tsx b/packages/pl-fe/src/contexts/chat-context.tsx index adf92d5ec..9798f012c 100644 --- a/packages/pl-fe/src/contexts/chat-context.tsx +++ b/packages/pl-fe/src/contexts/chat-context.tsx @@ -41,11 +41,13 @@ const ChatProvider: React.FC = ({ children }) => { const isOpen = chats.mainWindow === 'open'; const changeScreen = (screen: ChatWidgetScreens, currentChatId?: string | null) => { - setCurrentChatId(currentChatId || null); + setCurrentChatId(currentChatId ?? null); setScreen(screen); }; - const handleChatPaneToggle = () => dispatch(toggleChatPane()); + const handleChatPaneToggle = () =>{ + dispatch(toggleChatPane()); + }; const value = useMemo(() => ({ chat, diff --git a/packages/pl-fe/src/entity-store/hooks/use-batched-entities.ts b/packages/pl-fe/src/entity-store/hooks/use-batched-entities.ts index 0415cf7db..17f1e8950 100644 --- a/packages/pl-fe/src/entity-store/hooks/use-batched-entities.ts +++ b/packages/pl-fe/src/entity-store/hooks/use-batched-entities.ts @@ -29,7 +29,7 @@ const useBatchedEntities = ( const getState = useGetState(); const dispatch = useAppDispatch(); const { entityType, listKey, path } = parseEntitiesPath(expandedPath); - const schema = opts.schema || v.custom(() => true); + const schema = opts.schema ?? v.custom(() => true); const isEnabled = opts.enabled ?? true; const isFetching = useListState(path, 'fetching'); diff --git a/packages/pl-fe/src/entity-store/hooks/use-create-entity.ts b/packages/pl-fe/src/entity-store/hooks/use-create-entity.ts index 9574c9f08..b013a9037 100644 --- a/packages/pl-fe/src/entity-store/hooks/use-create-entity.ts +++ b/packages/pl-fe/src/entity-store/hooks/use-create-entity.ts @@ -31,7 +31,7 @@ const useCreateEntity = = {}, ): Promise => { const result = await setPromise(entityFn(data)); - const schema = opts.schema || v.custom(() => true); + const schema = opts.schema ?? v.custom(() => true); let entity: TEntity | TTransformedEntity = v.parse(schema, result); if (opts.transform) entity = opts.transform(entity); diff --git a/packages/pl-fe/src/entity-store/hooks/use-entities.ts b/packages/pl-fe/src/entity-store/hooks/use-entities.ts index a4c3c4e4b..37ed5bda1 100644 --- a/packages/pl-fe/src/entity-store/hooks/use-entities.ts +++ b/packages/pl-fe/src/entity-store/hooks/use-entities.ts @@ -43,7 +43,7 @@ const useEntities = selectEntities(state, path)); - const schema = opts.schema || v.custom(() => true); + const schema = opts.schema ?? v.custom(() => true); const isEnabled = opts.enabled ?? true; const isFetching = useListState(path, 'fetching'); @@ -67,7 +67,7 @@ const useEntities = (() => true); - const schema = opts.schema || defaultSchema; + const schema = opts.schema ?? defaultSchema; const entity = useAppSelector(state => selectEntity(state, entityType, entityId)); diff --git a/packages/pl-fe/src/entity-store/reducer.ts b/packages/pl-fe/src/entity-store/reducer.ts index bc9cae717..7ea136a2e 100644 --- a/packages/pl-fe/src/entity-store/reducer.ts +++ b/packages/pl-fe/src/entity-store/reducer.ts @@ -25,7 +25,7 @@ type State = Immutable<{ /** Import entities into the cache. */ const importEntities = ( draft: Draft, - entityType: string, + entityType: Entities, entities: Entity[], listKey?: string, pos?: ImportPosition, @@ -154,21 +154,37 @@ const doTransaction = (draft: Draft, transaction: EntitiesTransaction) => const reducer = (state: Readonly = {}, action: EntityAction): State => { switch (action.type) { case ENTITIES_IMPORT: - return create(state, draft => importEntities(draft, action.entityType, action.entities, action.listKey, action.pos), { enableAutoFreeze: true }); + return create(state, draft =>{ + importEntities(draft, action.entityType, action.entities, action.listKey, action.pos); + }, { enableAutoFreeze: true }); case ENTITIES_DELETE: - return create(state, draft => deleteEntities(draft, action.entityType, action.ids, action.opts)); + return create(state, draft =>{ + deleteEntities(draft, action.entityType, action.ids, action.opts); + }); case ENTITIES_DISMISS: - return create(state, draft => dismissEntities(draft, action.entityType, action.ids, action.listKey)); + return create(state, draft =>{ + dismissEntities(draft, action.entityType, action.ids, action.listKey); + }); case ENTITIES_FETCH_SUCCESS: - return create(state, draft => importEntities(draft, action.entityType, action.entities, action.listKey, action.pos, action.newState, action.overwrite), { enableAutoFreeze: true }); + return create(state, draft =>{ + importEntities(draft, action.entityType, action.entities, action.listKey, action.pos, action.newState, action.overwrite); + }, { enableAutoFreeze: true }); case ENTITIES_FETCH_REQUEST: - return create(state, draft => setFetching(draft, action.entityType, action.listKey, true)); + return create(state, draft =>{ + setFetching(draft, action.entityType, action.listKey, true); + }); case ENTITIES_FETCH_FAIL: - return create(state, draft => setFetching(draft, action.entityType, action.listKey, false, action.error)); + return create(state, draft =>{ + setFetching(draft, action.entityType, action.listKey, false, action.error); + }); case ENTITIES_INVALIDATE_LIST: - return create(state, draft => invalidateEntityList(draft, action.entityType, action.listKey)); + return create(state, draft =>{ + invalidateEntityList(draft, action.entityType, action.listKey); + }); case ENTITIES_TRANSACTION: - return create(state, draft => doTransaction(draft, action.transaction)); + return create(state, draft =>{ + doTransaction(draft, action.transaction); + }); default: return state; } diff --git a/packages/pl-fe/src/features/account/components/header.tsx b/packages/pl-fe/src/features/account/components/header.tsx index 482e5eb19..fcfad898b 100644 --- a/packages/pl-fe/src/features/account/components/header.tsx +++ b/packages/pl-fe/src/features/account/components/header.tsx @@ -162,7 +162,7 @@ const Header: React.FC = ({ account }) => { const createAndNavigateToChat = useMutation({ mutationFn: (accountId: string) => getOrCreateChatByAccountId(accountId), onError: (error: { response: PlfeResponse }) => { - const data = error.response?.json as any; + const data = error.response.json; toast.error(data?.error); }, onSuccess: (response) => { @@ -220,25 +220,37 @@ const Header: React.FC = ({ account }) => { const onEndorseToggle = () => { if (account.relationship?.endorsed) { unpinAccount(undefined, { - onSuccess: () => toast.success(intl.formatMessage(messages.userUnendorsed, { acct: account.acct })), + onSuccess: () =>{ + toast.success(intl.formatMessage(messages.userUnendorsed, { acct: account.acct })); + }, }); } else { pinAccount(undefined, { - onSuccess: () => toast.success(intl.formatMessage(messages.userEndorsed, { acct: account.acct })), + onSuccess: () =>{ + toast.success(intl.formatMessage(messages.userEndorsed, { acct: account.acct })); + }, }); } }; const onBite = () => { client.accounts.biteAccount(account.id) - .then(() => toast.success(intl.formatMessage(messages.userBit, { acct: account.acct }))) - .catch(() => toast.error(intl.formatMessage(messages.userBiteFail, { acct: account.acct }))); + .then(() =>{ + toast.success(intl.formatMessage(messages.userBit, { acct: account.acct })); + }) + .catch(() =>{ + toast.error(intl.formatMessage(messages.userBiteFail, { acct: account.acct })); + }); }; const onLoadActivities = () => { client.accounts.loadActivities(account.id) - .then(() => toast.success(intl.formatMessage(messages.loadActivitiesSuccess))) - .catch(() => toast.error(intl.formatMessage(messages.loadActivitiesFail))); + .then(() =>{ + toast.success(intl.formatMessage(messages.loadActivitiesSuccess)); + }) + .catch(() =>{ + toast.error(intl.formatMessage(messages.loadActivitiesFail)); + }); }; const onEditNote = () => { @@ -246,11 +258,17 @@ const Header: React.FC = ({ account }) => { heading: , placeholder: intl.formatMessage(messages.notePlaceholder), confirm: , - onConfirm: (value) => updateAccountNote(value, { - onSuccess: () => toast.success(messages.noteSaved), - onError: () => toast.error(messages.noteSaveFailed), - }), - text: account.relationship?.note || '', + onConfirm: (value) =>{ + updateAccountNote(value, { + onSuccess: () =>{ + toast.success(messages.noteSaved); + }, + onError: () =>{ + toast.error(messages.noteSaveFailed); + }, + }); + }, + text: account.relationship?.note ?? '', }); }; @@ -271,7 +289,9 @@ const Header: React.FC = ({ account }) => { heading: , message: {domain} }} />, confirm: intl.formatMessage(messages.blockDomainConfirm), - onConfirm: () => blockDomain(domain), + onConfirm: () =>{ + blockDomain(domain); + }, }); }; @@ -292,7 +312,9 @@ const Header: React.FC = ({ account }) => { heading: @{account.acct} }} />, message: @{account.acct} }} />, confirm: intl.formatMessage(messages.removeFromFollowersConfirm), - onConfirm: () => removeFromFollowers(), + onConfirm: () =>{ + removeFromFollowers(); + }, }); } else { removeFromFollowers(); @@ -550,13 +572,17 @@ const Header: React.FC = ({ account }) => { if (account.relationship?.domain_blocking) { menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), - action: () => onUnblockDomain(domain), + action: () =>{ + onUnblockDomain(domain); + }, icon: require('@phosphor-icons/core/regular/prohibit.svg'), }); } else { menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), - action: () => onBlockDomain(domain), + action: () =>{ + onBlockDomain(domain); + }, icon: require('@phosphor-icons/core/regular/prohibit.svg'), }); } @@ -675,7 +701,9 @@ const Header: React.FC = ({ account }) => { return ( createAndNavigateToChat.mutate(account.id)} + onClick={() =>{ + createAndNavigateToChat.mutate(account.id); + }} title={intl.formatMessage(messages.chat, { name: account.username })} theme='outlined' className='px-2' diff --git a/packages/pl-fe/src/features/admin/components/counter.tsx b/packages/pl-fe/src/features/admin/components/counter.tsx index 79dbeb38e..e9aabbf51 100644 --- a/packages/pl-fe/src/features/admin/components/counter.tsx +++ b/packages/pl-fe/src/features/admin/components/counter.tsx @@ -57,12 +57,12 @@ const Counter: React.FC = ({ ); } else { - const measure = data![0]; + const measure = data[0]; const percentChange = measure.previous_total !== undefined && percIncrease(measure.previous_total * 1, measure.total * 1) || 0; content = ( <> - {measure.human_value || } + {measure.human_value ?? } {measure.previous_total !== undefined && ( 0, 'text-danger-600': percentChange < 0 })}>{percentChange > 0 && '+'})} ); @@ -79,7 +79,7 @@ const Counter: React.FC = ({
- x.value * 1) || []}> + x.value * 1) ?? []}>
diff --git a/packages/pl-fe/src/features/admin/components/unapproved-account.tsx b/packages/pl-fe/src/features/admin/components/unapproved-account.tsx index 2ab5981b3..7b37af906 100644 --- a/packages/pl-fe/src/features/admin/components/unapproved-account.tsx +++ b/packages/pl-fe/src/features/admin/components/unapproved-account.tsx @@ -28,14 +28,18 @@ const UnapprovedAccount: React.FC = ({ accountId }) => { @{account.acct} - {adminAccount?.invite_request || ''} + {adminAccount?.invite_request ?? ''} approveAccount()} - onReject={() => rejectAccount()} + onAuthorize={() =>{ + approveAccount(); + }} + onReject={() =>{ + rejectAccount(); + }} countdown={3000} /> diff --git a/packages/pl-fe/src/features/audio/index.tsx b/packages/pl-fe/src/features/audio/index.tsx index d652483bf..6c76ccf68 100644 --- a/packages/pl-fe/src/features/audio/index.tsx +++ b/packages/pl-fe/src/features/audio/index.tsx @@ -317,26 +317,26 @@ const Audio: React.FC = (props) => { }; const _clear = () => { - visualizer.current?.clear(width || 0, height || 0); + visualizer.current?.clear(width ?? 0, height ?? 0); }; const _draw = () => { - visualizer.current?.draw(_getCX(), _getCY(), _getAccentColor() || '#ffffff', _getRadius(), _getScaleCoefficient()); + visualizer.current?.draw(_getCX(), _getCY(), _getAccentColor() ?? '#ffffff', _getRadius(), _getScaleCoefficient()); }; - const _getRadius = (): number => ((height || props.height || 0) - (PADDING * _getScaleCoefficient()) * 2) / 2; + const _getRadius = (): number => (((height ?? props.height) ?? 0) - (PADDING * _getScaleCoefficient()) * 2) / 2; - const _getScaleCoefficient = (): number => (height || props.height || 0) / 982; + const _getScaleCoefficient = (): number => ((height ?? props.height) ?? 0) / 982; - const _getCX = (): number => Math.floor((width || 0) / 2); + const _getCX = (): number => Math.floor((width ?? 0) / 2); const _getCY = (): number => Math.floor(_getRadius() + (PADDING * _getScaleCoefficient())); - const _getAccentColor = () => accentColor || undefined; + const _getAccentColor = () => accentColor ?? undefined; - const _getBackgroundColor = (): string => backgroundColor || '#000000'; + const _getBackgroundColor = (): string => backgroundColor ?? '#000000'; - const _getForegroundColor = (): string => foregroundColor || '#ffffff'; + const _getForegroundColor = (): string => foregroundColor ?? '#ffffff'; const seekBy = (time: number) => { if (audio.current) { @@ -385,7 +385,7 @@ const Audio: React.FC = (props) => { } }; - const getDuration = () => duration || props.duration || 0; + const getDuration = () => (duration ?? props.duration) ?? 0; const progress = Math.min((currentTime / getDuration()) * 100, 100); @@ -435,11 +435,13 @@ const Audio: React.FC = (props) => { backgroundColor: _getBackgroundColor(), color: _getForegroundColor(), width: '100%', - height: fullscreen ? '100%' : (height || props.height), + height: fullscreen ? '100%' : (height ?? props.height), }} tabIndex={0} onKeyDown={handleKeyDown} - onClick={e => e.stopPropagation()} + onClick={e =>{ + e.stopPropagation(); + }} >