From fb1f445c07281b306d0aa6a7519f3c5741c72408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 26 Feb 2026 13:36:33 +0100 Subject: [PATCH] nicolium: do some linting but don't enable new rules for now 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/actions/auth.ts | 2 +- .../actions/push-notifications/registerer.ts | 2 +- packages/pl-fe/src/actions/timelines.ts | 4 ++-- packages/pl-fe/src/build-config.ts | 2 +- .../src/components/announcements/emoji.tsx | 3 +-- .../src/components/announcements/reaction.tsx | 2 -- .../announcements/reactions-bar.tsx | 2 +- .../dropdown-menu/dropdown-menu-item.tsx | 2 +- .../dropdown-menu/dropdown-menu.tsx | 6 ++--- .../src/components/extended-video-player.tsx | 2 +- packages/pl-fe/src/components/list.tsx | 2 +- .../pl-fe/src/components/media-gallery.tsx | 4 ++-- .../pl-fe/src/components/parsed-content.tsx | 22 +++++++++--------- packages/pl-fe/src/components/parsed-mfm.tsx | 6 ++--- .../pl-fe/src/components/preview-card.tsx | 10 ++++---- packages/pl-fe/src/components/safe-embed.tsx | 2 +- packages/pl-fe/src/components/scrobble.tsx | 4 ++-- .../src/components/status-reactions-bar.tsx | 2 -- .../pl-fe/src/components/trending-link.tsx | 2 +- .../pl-fe/src/components/ui/button/index.tsx | 2 +- .../pl-fe/src/components/ui/form-group.tsx | 4 ++-- packages/pl-fe/src/components/ui/hstack.tsx | 6 ++--- packages/pl-fe/src/components/ui/stack.tsx | 6 ++--- packages/pl-fe/src/components/ui/tabs.tsx | 23 +++++++------------ .../pl-fe/src/components/ui/tag-input.tsx | 2 +- packages/pl-fe/src/features/audio/index.tsx | 8 +++---- .../pl-fe/src/features/audio/visualizer.ts | 2 +- .../chats/components/chat-message.tsx | 3 ++- .../components/chats-page/chats-page.tsx | 2 +- .../compose/components/language-dropdown.tsx | 6 ++--- .../compose/components/privacy-dropdown.tsx | 8 +------ .../compose/components/schedule-form.tsx | 4 ++-- .../floating-block-type-toolbar-plugin.tsx | 1 - .../compose/editor/plugins/state-plugin.tsx | 2 +- .../compose/editor/transformers/index.ts | 2 +- .../src/features/compose/util/counter.ts | 2 +- .../src/features/compose/util/url-regex.ts | 8 +++---- .../src/features/draft-statuses/builder.tsx | 2 +- packages/pl-fe/src/features/emoji/search.ts | 4 ++-- .../notifications/components/notification.tsx | 2 +- .../components/icon-picker-menu.tsx | 2 +- .../pl-fe/src/features/preferences/index.tsx | 2 +- .../features/scheduled-statuses/builder.tsx | 2 +- .../status/components/detailed-status.tsx | 10 ++++---- .../status/components/thread-status.tsx | 1 - .../theme-editor/components/palette.tsx | 2 +- .../src/features/ui/components/hotkeys.tsx | 2 +- .../features/ui/components/link-footer.tsx | 2 +- .../components/panels/profile-media-panel.tsx | 4 ++-- .../features/ui/components/pending-status.tsx | 2 +- .../ui/components/profile-dropdown.tsx | 4 ++-- .../pl-fe/src/features/ui/util/fullscreen.ts | 6 ++--- .../ui/util/pending-status-builder.ts | 7 ++---- packages/pl-fe/src/features/video/index.tsx | 4 ++-- packages/pl-fe/src/hooks/use-locale.ts | 4 ++-- packages/pl-fe/src/hooks/use-theme-css.ts | 6 ++--- .../compose-interaction-policy-modal.tsx | 4 ++-- packages/pl-fe/src/modals/reactions-modal.tsx | 16 ++++++------- .../modals/report-modal/steps/reason-step.tsx | 2 +- .../pl-fe/src/normalizers/notification.ts | 4 ++-- .../pl-fe/src/pages/account-lists/lists.tsx | 2 +- .../pl-fe/src/pages/dashboard/dashboard.tsx | 4 ++-- .../src/pages/dashboard/frontend-config.tsx | 6 ++--- packages/pl-fe/src/pages/dashboard/report.tsx | 4 ++-- .../pl-fe/src/pages/dashboard/reports.tsx | 2 ++ .../src/pages/settings/auth-token-list.tsx | 2 +- .../status-lists/interaction-requests.tsx | 6 ++--- packages/pl-fe/src/pages/utils/about.tsx | 4 ++-- .../accounts/use-familiar-followers.ts | 2 +- .../queries/accounts/use-follow-requests.ts | 6 ++--- .../pl-fe/src/queries/admin/use-accounts.ts | 2 +- .../pl-fe/src/queries/admin/use-reports.ts | 2 +- .../announcements/use-announcements.ts | 2 +- packages/pl-fe/src/queries/chats.ts | 2 +- .../queries/statuses/scheduled-statuses.ts | 2 +- .../statuses/use-interaction-requests.ts | 6 ++--- packages/pl-fe/src/selectors/index.ts | 4 ++-- packages/pl-fe/src/service-worker/sw.ts | 8 +++---- .../src/service-worker/web-push-locales.ts | 2 +- packages/pl-fe/src/stores/compose.ts | 15 ++++-------- packages/pl-fe/src/utils/auth.ts | 6 +++-- packages/pl-fe/src/utils/code.ts | 4 ++-- packages/pl-fe/src/utils/colors.ts | 4 ++-- packages/pl-fe/src/utils/html.ts | 6 ++--- packages/pl-fe/src/utils/media.ts | 4 ++-- packages/pl-fe/src/utils/nyaize.ts | 22 +++++++++--------- packages/pl-fe/src/utils/queries.ts | 2 +- packages/pl-fe/src/utils/resize-image.ts | 6 ++--- packages/pl-fe/src/utils/rich-content.ts | 2 +- packages/pl-fe/src/utils/rtl.ts | 12 +++++----- packages/pl-fe/src/utils/theme.ts | 2 +- packages/pl-fe/vite.config.ts | 2 +- 92 files changed, 196 insertions(+), 225 deletions(-) diff --git a/packages/pl-fe/src/actions/auth.ts b/packages/pl-fe/src/actions/auth.ts index 317308102..437ee5aa6 100644 --- a/packages/pl-fe/src/actions/auth.ts +++ b/packages/pl-fe/src/actions/auth.ts @@ -132,7 +132,7 @@ const otpVerify = (code: string, mfa_token: string) => (dispatch: AppDispatch, getState: () => RootState) => { const state = getState(); const app = state.auth.app; - const baseUrl = parseBaseURL(state.me) || BuildConfig.BACKEND_URL; + const baseUrl = parseBaseURL(state.me || undefined) || BuildConfig.BACKEND_URL; const client = new PlApiClient(baseUrl); return client.oauth .mfaChallenge({ diff --git a/packages/pl-fe/src/actions/push-notifications/registerer.ts b/packages/pl-fe/src/actions/push-notifications/registerer.ts index ed502ea7d..8516692c2 100644 --- a/packages/pl-fe/src/actions/push-notifications/registerer.ts +++ b/packages/pl-fe/src/actions/push-notifications/registerer.ts @@ -11,7 +11,7 @@ import type { Me } from '@/types/pl-fe'; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String: string) => { const padding = '='.repeat((4 - (base64String.length % 4)) % 4); - const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); + const base64 = (base64String + padding).replaceAll('-', '+').replaceAll('_', '/'); return decodeBase64(base64); }; diff --git a/packages/pl-fe/src/actions/timelines.ts b/packages/pl-fe/src/actions/timelines.ts index fd9eff940..24a86020c 100644 --- a/packages/pl-fe/src/actions/timelines.ts +++ b/packages/pl-fe/src/actions/timelines.ts @@ -106,7 +106,7 @@ const dequeueTimeline = if (typeof expandFunc === 'function') { dispatch(clearTimeline(timelineId)); - // @ts-ignore + // @ts-expect-error expandFunc(); } else if (timelineId === 'home') { dispatch(clearTimeline(timelineId)); @@ -166,7 +166,7 @@ const deduplicateStatuses = (statuses: Array) => { reblogged.accounts.push(status.account); reblogged.id += ':' + status.id; } else if ( - !deduplicatedStatuses.find( + !deduplicatedStatuses.some( (deduplicatedStatus) => deduplicatedStatus.reblog?.id === status.id, ) ) { diff --git a/packages/pl-fe/src/build-config.ts b/packages/pl-fe/src/build-config.ts index 7e2fa6a5f..f796f27ce 100644 --- a/packages/pl-fe/src/build-config.ts +++ b/packages/pl-fe/src/build-config.ts @@ -15,7 +15,7 @@ const env = compileTime(() => { }; const sanitizeBasename = (path: string | undefined = ''): string => - `/${path.replace(/^\/+|\/+$/g, '')}`; + `/${path.replaceAll(/^\/+|\/+$/g, '')}`; return { NODE_ENV: NODE_ENV ?? 'development', diff --git a/packages/pl-fe/src/components/announcements/emoji.tsx b/packages/pl-fe/src/components/announcements/emoji.tsx index a50717bf4..a958e5c10 100644 --- a/packages/pl-fe/src/components/announcements/emoji.tsx +++ b/packages/pl-fe/src/components/announcements/emoji.tsx @@ -15,11 +15,10 @@ interface IEmoji { const Emoji: React.FC = ({ emoji, emojiMap, hovered }) => { const { autoPlayGif, systemEmojiFont } = useSettings(); - // @ts-ignore if (unicodeMapping[emoji]) { if (systemEmojiFont) return <>{emoji}; - // @ts-ignore + // @ts-expect-error const { unified, shortCode } = unicodeMapping[emoji]; const title = shortCode ? `:${shortCode}:` : ''; diff --git a/packages/pl-fe/src/components/announcements/reaction.tsx b/packages/pl-fe/src/components/announcements/reaction.tsx index d02ee1590..f01b6f8d5 100644 --- a/packages/pl-fe/src/components/announcements/reaction.tsx +++ b/packages/pl-fe/src/components/announcements/reaction.tsx @@ -40,9 +40,7 @@ const Reaction: React.FC = ({ announcementId, reaction, emojiMap, sty let shortCode = reaction.name; - // @ts-ignore if (unicodeMapping[shortCode]) { - // @ts-ignore shortCode = unicodeMapping[shortCode].shortcode; } diff --git a/packages/pl-fe/src/components/announcements/reactions-bar.tsx b/packages/pl-fe/src/components/announcements/reactions-bar.tsx index 2dadc621e..463b1924c 100644 --- a/packages/pl-fe/src/components/announcements/reactions-bar.tsx +++ b/packages/pl-fe/src/components/announcements/reactions-bar.tsx @@ -21,7 +21,7 @@ const ReactionsBar: React.FC = ({ announcementId, reactions, emoj const { addReaction } = useAnnouncements(); const handleEmojiPick = (data: Emoji) => { - addReaction({ announcementId, name: (data as NativeEmoji).native.replace(/:/g, '') }); + addReaction({ announcementId, name: (data as NativeEmoji).native.replaceAll(':', '') }); }; const visibleReactions = reactions.filter((x) => x.count > 0); diff --git a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu-item.tsx b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu-item.tsx index 40912d067..d2728c3b4 100644 --- a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu-item.tsx +++ b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu-item.tsx @@ -116,7 +116,7 @@ const DropdownMenuItem = ({ index, item, onClick, autoFocus, onSetTab }: IDropdo if (itemRef.current && (autoFocus ? firstItem : item?.active)) { itemRef.current.focus({ preventScroll: true }); } - }, [itemRef.current, index]); + }, [index]); if (item === null) { return
; diff --git a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx index 697bcabaf..922b8bb60 100644 --- a/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx +++ b/packages/pl-fe/src/components/dropdown-menu/dropdown-menu.tsx @@ -128,7 +128,7 @@ const DropdownMenuContent: React.FC = ({ e.stopPropagation(); } }, - [ref.current], + [], ); const handleDocumentClick = useMemo( @@ -138,7 +138,7 @@ const DropdownMenuContent: React.FC = ({ event.stopPropagation(); } }, - [ref.current], + [], ); useEffect(() => { @@ -153,7 +153,7 @@ const DropdownMenuContent: React.FC = ({ document.removeEventListener('touchend', handleDocumentClick); document.removeEventListener('keydown', handleKeyDown); }; - }, [ref.current]); + }, []); const handleExitSubmenu: React.EventHandler = (event) => { event.stopPropagation(); diff --git a/packages/pl-fe/src/components/extended-video-player.tsx b/packages/pl-fe/src/components/extended-video-player.tsx index 75e8a156e..39fcf65b5 100644 --- a/packages/pl-fe/src/components/extended-video-player.tsx +++ b/packages/pl-fe/src/components/extended-video-player.tsx @@ -35,7 +35,7 @@ const ExtendedVideoPlayer: React.FC = ({ return () => { video.current?.removeEventListener('loadeddata', handleLoadedData); }; - }, [video.current]); + }, []); const handleClick: React.MouseEventHandler = (e) => { e.stopPropagation(); diff --git a/packages/pl-fe/src/components/list.tsx b/packages/pl-fe/src/components/list.tsx index b31a8b3ae..88f05387d 100644 --- a/packages/pl-fe/src/components/list.tsx +++ b/packages/pl-fe/src/components/list.tsx @@ -64,7 +64,7 @@ const ListItem: React.FC = ({ : childDescribedBy; return React.cloneElement(child, { - // @ts-ignore + // @ts-expect-error id: domId, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': ariaDescribedBy, diff --git a/packages/pl-fe/src/components/media-gallery.tsx b/packages/pl-fe/src/components/media-gallery.tsx index 17b55e58a..363a71314 100644 --- a/packages/pl-fe/src/components/media-gallery.tsx +++ b/packages/pl-fe/src/components/media-gallery.tsx @@ -367,7 +367,7 @@ const MediaGallery: React.FC = (props) => { setWidth(offsetWidth); } - }, [node.current]); + }, []); const handleClick = (index: number) => { onOpenMedia(media, index); @@ -655,7 +655,7 @@ const MediaGallery: React.FC = (props) => { if (compact) { return { style: {}, - itemsDimensions: [...new Array(size)].map(() => ({ + itemsDimensions: new Array(size).fill('').map(() => ({ w: 'auto', h: 'auto', top: 'auto', diff --git a/packages/pl-fe/src/components/parsed-content.tsx b/packages/pl-fe/src/components/parsed-content.tsx index cd63ed05d..d2f061266 100644 --- a/packages/pl-fe/src/components/parsed-content.tsx +++ b/packages/pl-fe/src/components/parsed-content.tsx @@ -29,7 +29,7 @@ const GREENTEXT_CLASS = 'dark:text-accent-green text-lime-600'; const checkSuspiciousUrl = (url: string): boolean => { try { const { host } = new URL(url); - return /^verify\.form/.test(host); + return host.startsWith('verify.form'); } catch (e) { return false; } @@ -213,16 +213,16 @@ function parseContent( const options: HTMLReactParserOptions = { replace(domNode) { if (!(domNode instanceof Element)) { - // @ts-ignore + // @ts-expect-error domNode.preGreentext = - // @ts-ignore + // @ts-expect-error (!domNode.prev || domNode.prev.preGreentext) && !domNode.data.trim().length; - // @ts-ignore + // @ts-expect-error const data = domNode.prev?.preGreentext ? domNode.data.trim() : domNode.data; - // @ts-ignore + // @ts-expect-error if (greentext && (data.startsWith('>') || domNode.prev?.greentext)) { - // @ts-ignore + // @ts-expect-error domNode.greentext = true; return {transformText(domNode.data)}; } @@ -239,24 +239,24 @@ function parseContent( } if (domNode.attribs.class?.split(' ').includes('h-card')) { - // @ts-ignore + // @ts-expect-error domNode.preGreentext = !domNode.prev || domNode.prev.preGreentext; } - // @ts-ignore + // @ts-expect-error if (domNode.name !== 'br' && domNode.prev?.greentext) { domNode.attribs.class = `${domNode.attribs.class || ''} ${GREENTEXT_CLASS}`; - // @ts-ignore + // @ts-expect-error domNode.greentext = true; } if (domNode.name === 'a') { const classes = domNode.attribs.class?.split(' '); - // @ts-ignore + // @ts-expect-error if (domNode.prev?.greentext) { classes.push(GREENTEXT_CLASS); - // @ts-ignore + // @ts-expect-error domNode.greentext = true; } diff --git a/packages/pl-fe/src/components/parsed-mfm.tsx b/packages/pl-fe/src/components/parsed-mfm.tsx index f504e3479..11eacdcd7 100644 --- a/packages/pl-fe/src/components/parsed-mfm.tsx +++ b/packages/pl-fe/src/components/parsed-mfm.tsx @@ -26,12 +26,12 @@ 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 /^-?[0-9.]+s$/.test(t) ? t : null; }; const validColor = (c: unknown): string | null => { if (typeof c !== 'string') return null; - return c.match(/^[0-9a-f]{3,6}$/i) ? c : null; + return /^[0-9a-f]{3,6}$/i.test(c) ? c : null; }; interface IParsedMfm { @@ -61,7 +61,7 @@ const ParsedMfm: React.FC = React.memo(({ text, emojis, mentions, sp .map((token): React.JSX.Element | string | (React.JSX.Element | string)[] => { switch (token.type) { case 'text': { - let text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n'); + let text = token.props.text.replaceAll(/(\r\n|\n|\r)/g, '\n'); if (speakAsCat) text = nyaize(text); diff --git a/packages/pl-fe/src/components/preview-card.tsx b/packages/pl-fe/src/components/preview-card.tsx index c3af67034..a53f5d872 100644 --- a/packages/pl-fe/src/components/preview-card.tsx +++ b/packages/pl-fe/src/components/preview-card.tsx @@ -191,7 +191,7 @@ const PreviewCard: React.FC = ({ }} href={href} title={trimmedTitle} - rel='noopener' + rel='noopener noreferrer' target='_blank' dir={direction} > @@ -274,7 +274,7 @@ const PreviewCard: React.FC = ({ }} href={href} target='_blank' - rel='noopener' + rel='noopener noreferrer' className='text-gray-700 hover:text-gray-900 dark:text-gray-200 dark:hover:text-gray-100' title={intl.formatMessage(messages.externalLink)} > @@ -320,7 +320,7 @@ const PreviewCard: React.FC = ({ href={href} className={className} target='_blank' - rel='noopener' + rel='noopener noreferrer' ref={setRef} onClick={(e) => { e.stopPropagation(); @@ -370,7 +370,7 @@ const PreviewCard: React.FC = ({ {linkBody} ) : ( - + {linkBody} )} @@ -396,7 +396,7 @@ const trim = (text: string, len: number): string => { return text; } - return text.substring(0, cut) + (text.length > len ? '…' : ''); + return text.slice(0, cut) + (text.length > len ? '…' : ''); }; export { PreviewCard as default }; diff --git a/packages/pl-fe/src/components/safe-embed.tsx b/packages/pl-fe/src/components/safe-embed.tsx index 48b295d03..ca8605b14 100644 --- a/packages/pl-fe/src/components/safe-embed.tsx +++ b/packages/pl-fe/src/components/safe-embed.tsx @@ -42,7 +42,7 @@ const SafeEmbed: React.FC = ({ className, sandbox, title, html }) => return () => { iframe.current?.contentWindow?.removeEventListener('message', handleMessage); }; - }, [iframe.current, html]); + }, [html]); return (