From 7e29d5147c13cd04ce825ce65d91e40b8fe00159 Mon Sep 17 00:00:00 2001 From: Pleasurecruise <3196812536@qq.com> Date: Sun, 18 May 2025 00:47:23 +0800 Subject: [PATCH] fix: code review --- .../components/Popups/MultiSelectionPopup.tsx | 71 +---- src/renderer/src/pages/home/Chat.tsx | 199 +++---------- .../home/Messages/MessageSelectContext.tsx | 158 ++++++++++ .../src/pages/home/Messages/Messages.tsx | 4 +- yarn.lock | 280 +++++++++++++++--- 5 files changed, 436 insertions(+), 276 deletions(-) create mode 100644 src/renderer/src/pages/home/Messages/MessageSelectContext.tsx diff --git a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx index dce5d756f0..8e06a30d6b 100644 --- a/src/renderer/src/components/Popups/MultiSelectionPopup.tsx +++ b/src/renderer/src/components/Popups/MultiSelectionPopup.tsx @@ -1,77 +1,22 @@ import { CloseOutlined, CopyOutlined, DeleteOutlined, SaveOutlined } from '@ant-design/icons' -import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import type { Message } from '@renderer/types/newMessage' +import { useMultiSelect } from '@renderer/pages/home/Messages/MessageSelectContext' +import type { Topic } from '@renderer/types' import { Button, Tooltip } from 'antd' -import { FC, useEffect, useState } from 'react' +import { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' interface MultiSelectActionPopupProps { - visible: boolean - onClose: () => void - onAction?: (action: string, messageIds: string[]) => void - topic: any + topic: Topic } -interface MessageTypeInfo { - hasUserMessages: boolean - hasAssistantMessages: boolean - messageIds: string[] -} - -const MultiSelectActionPopup: FC = ({ visible, onClose, onAction }) => { +const MultiSelectActionPopup: FC = () => { const { t } = useTranslation() - const [, setSelectedMessages] = useState([]) - const [selectedMessageIds, setSelectedMessageIds] = useState([]) - const [, setMessageTypeInfo] = useState({ - hasUserMessages: false, - hasAssistantMessages: false, - messageIds: [] - }) + const { isMultiSelectMode, toggleMultiSelectMode, selectedMessageIds, handleAction } = useMultiSelect() - useEffect(() => { - const handleSelectedMessagesChanged = (messageIds: string[]) => { - setSelectedMessageIds(messageIds) - EventEmitter.emit('REQUEST_SELECTED_MESSAGE_DETAILS', messageIds) - } - - const handleSelectedMessageDetails = (messages: Message[]) => { - setSelectedMessages(messages) - - const hasUserMessages = messages.some((msg) => msg.role === 'user') - const hasAssistantMessages = messages.some((msg) => msg.role === 'assistant') - - setMessageTypeInfo({ - hasUserMessages, - hasAssistantMessages, - messageIds: selectedMessageIds - }) - } - - EventEmitter.on(EVENT_NAMES.SELECTED_MESSAGES_CHANGED, handleSelectedMessagesChanged) - EventEmitter.on('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails) - - return () => { - EventEmitter.off(EVENT_NAMES.SELECTED_MESSAGES_CHANGED, handleSelectedMessagesChanged) - EventEmitter.off('SELECTED_MESSAGE_DETAILS', handleSelectedMessageDetails) - } - }, [selectedMessageIds]) - - const handleAction = (action: string) => { - if (onAction) { - onAction(action, selectedMessageIds) - } - } - - const handleClose = () => { - EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false) - onClose() - } - - if (!visible) return null + if (!isMultiSelectMode) return null // TODO: 视情况调整 - // const isActionDisabled = selectedMessages.some((msg) => msg.role === 'user') const isActionDisabled = false return ( @@ -90,7 +35,7 @@ const MultiSelectActionPopup: FC = ({ visible, onCl - } onClick={handleClose} /> + } onClick={() => toggleMultiSelectMode(false)} /> diff --git a/src/renderer/src/pages/home/Chat.tsx b/src/renderer/src/pages/home/Chat.tsx index e2e15581ab..c708246cb4 100644 --- a/src/renderer/src/pages/home/Chat.tsx +++ b/src/renderer/src/pages/home/Chat.tsx @@ -5,21 +5,16 @@ import { useAssistant } from '@renderer/hooks/useAssistant' import { useSettings } from '@renderer/hooks/useSettings' import { useShortcut } from '@renderer/hooks/useShortcuts' import { useShowTopics } from '@renderer/hooks/useStore' -import { EVENT_NAMES, EventEmitter } from '@renderer/services/EventService' -import { RootState } from '@renderer/store' -import { messageBlocksSelectors } from '@renderer/store/messageBlock' -import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage' import { Assistant, Topic } from '@renderer/types' -import { Flex, Modal } from 'antd' +import { Flex } from 'antd' import { debounce } from 'lodash' -import React, { FC, useEffect, useMemo, useState } from 'react' +import React, { FC, useMemo, useState } from 'react' import { useHotkeys } from 'react-hotkeys-hook' -import { useTranslation } from 'react-i18next' -import { useDispatch, useSelector } from 'react-redux' import styled from 'styled-components' import Inputbar from './Inputbar/Inputbar' import Messages from './Messages/Messages' +import { MultiSelectProvider } from './Messages/MessageSelectContext' import Tabs from './Tabs' interface Props { @@ -33,16 +28,6 @@ const Chat: FC = (props) => { const { assistant } = useAssistant(props.assistant.id) const { topicPosition, messageStyle, showAssistants } = useSettings() const { showTopics } = useShowTopics() - const { t } = useTranslation() - const [isMultiSelectMode, setIsMultiSelectMode] = useState(false) - const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false) - const [messagesToDelete, setMessagesToDelete] = useState([]) - - const dispatch = useDispatch() - // 从 Redux 中获取当前主题的消息 - const messages = useSelector((state: RootState) => selectMessagesForTopic(state, props.activeTopic.id)) - // 获取所有消息块 - const messageBlocks = useSelector(messageBlocksSelectors.selectEntities) const mainRef = React.useRef(null) const contentSearchRef = React.useRef(null) @@ -119,159 +104,43 @@ const Chat: FC = (props) => { firstUpdateOrNoFirstUpdateHandler() } - useEffect(() => { - const handleToggleMultiSelect = (value: boolean) => { - setIsMultiSelectMode(value) - } - - EventEmitter.on(EVENT_NAMES.MESSAGE_MULTI_SELECT, handleToggleMultiSelect) - - return () => { - EventEmitter.off(EVENT_NAMES.MESSAGE_MULTI_SELECT, handleToggleMultiSelect) - } - }, []) - - const handleMultiSelectAction = (actionType: string, messageIds: string[]) => { - if (messageIds.length === 0) { - window.message.warning(t('chat.multiple.select.empty')) - return - } - switch (actionType) { - case 'delete': - setMessagesToDelete(messageIds) - setConfirmDeleteVisible(true) - break - case 'save': { - const assistantMessages = messages.filter((msg) => messageIds.includes(msg.id)) - if (assistantMessages.length > 0) { - const contentToSave = assistantMessages - .map((msg) => { - return msg.blocks - .map((blockId) => { - const block = messageBlocks[blockId] - return block && 'content' in block ? block.content : '' - }) - .filter(Boolean) - .join('\n') - .trim() - }) - .join('\n\n---\n\n') - const fileName = `chat_export_${new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-')}.md` - window.api.file.save(fileName, contentToSave) - window.message.success({ content: t('message.save.success.title'), key: 'save-messages' }) - EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false) - } else { - window.message.warning(t('message.save.no.assistant')) - } - break - } - case 'copy': { - const assistantMessages = messages.filter((msg) => messageIds.includes(msg.id)) - if (assistantMessages.length > 0) { - const contentToCopy = assistantMessages - .map((msg) => { - return msg.blocks - .map((blockId) => { - const block = messageBlocks[blockId] - return block && 'content' in block ? block.content : '' - }) - .filter(Boolean) - .join('\n') - .trim() - }) - .join('\n\n---\n\n') - navigator.clipboard.writeText(contentToCopy) - window.message.success({ content: t('message.copied'), key: 'copy-messages' }) - EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false) - } else { - window.message.warning(t('message.copy.no.assistant')) - } - break - } - default: - break - } - } - - const confirmDelete = async () => { - try { - dispatch( - newMessagesActions.removeMessages({ - topicId: props.activeTopic.id, - messageIds: messagesToDelete - }) - ) - window.message.success(t('message.delete.success')) - setMessagesToDelete([]) - setIsMultiSelectMode(false) - EventEmitter.emit(EVENT_NAMES.MESSAGE_MULTI_SELECT, false) - } catch (error) { - console.error('Failed to delete messages:', error) - window.message.error(t('message.delete.failed')) - } finally { - setConfirmDeleteVisible(false) - setIsMultiSelectMode(false) - } - } - - const cancelDelete = () => { - setConfirmDeleteVisible(false) - setMessagesToDelete([]) - } - return ( -
- } - filter={contentSearchFilter} - includeUser={filterIncludeUser} - onIncludeUserChange={userOutlinedItemClickHandler} - /> - - +
+ } + filter={contentSearchFilter} + includeUser={filterIncludeUser} + onIncludeUserChange={userOutlinedItemClickHandler} /> - - - {isMultiSelectMode ? ( - setIsMultiSelectMode(false)} - onAction={handleMultiSelectAction} + + - ) : ( + + - )} - -
- {topicPosition === 'right' && showTopics && ( - - )} - -

{t('message.delete.confirm.content', { count: messagesToDelete.length })}

-
+ + +
+ {topicPosition === 'right' && showTopics && ( + + )} + {/* 删除Modal,现在已经移到Provider中 */} +
) } diff --git a/src/renderer/src/pages/home/Messages/MessageSelectContext.tsx b/src/renderer/src/pages/home/Messages/MessageSelectContext.tsx new file mode 100644 index 0000000000..cc7151f181 --- /dev/null +++ b/src/renderer/src/pages/home/Messages/MessageSelectContext.tsx @@ -0,0 +1,158 @@ +import { RootState } from '@renderer/store' +import { messageBlocksSelectors } from '@renderer/store/messageBlock' +import { newMessagesActions, selectMessagesForTopic } from '@renderer/store/newMessage' +import { Topic } from '@renderer/types' +import { Modal } from 'antd' +import { createContext, FC, ReactNode, use, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' + +interface MultiSelectContextType { + isMultiSelectMode: boolean + toggleMultiSelectMode: (value: boolean) => void + selectedMessageIds: string[] + handleMessageSelection: (messageId: string, selected: boolean) => void + handleAction: (action: string) => void +} + +const MultiSelectContext = createContext(undefined) + +export const useMultiSelect = () => { + const context = use(MultiSelectContext) + if (!context) { + throw new Error('useMultiSelect必须在MultiSelectProvider内使用') + } + return context +} + +interface MultiSelectProviderProps { + children: ReactNode + topic: Topic +} + +export const MultiSelectProvider: FC = ({ children, topic }) => { + const { t } = useTranslation() + const dispatch = useDispatch() + const [isMultiSelectMode, setIsMultiSelectMode] = useState(false) + const [selectedMessageIds, setSelectedMessageIds] = useState([]) + const [confirmDeleteVisible, setConfirmDeleteVisible] = useState(false) + + // 获取消息和消息块 + const messages = useSelector((state: RootState) => selectMessagesForTopic(state, topic.id)) + const messageBlocks = useSelector(messageBlocksSelectors.selectEntities) + + const toggleMultiSelectMode = (value: boolean) => { + setIsMultiSelectMode(value) + if (!value) setSelectedMessageIds([]) + } + + const handleMessageSelection = (messageId: string, selected: boolean) => { + setSelectedMessageIds((prev) => (selected ? [...prev, messageId] : prev.filter((id) => id !== messageId))) + } + + // 处理保存、复制、删除等操作 + const handleAction = (action: string) => { + if (selectedMessageIds.length === 0) { + window.message.warning(t('chat.multiple.select.empty')) + return + } + + switch (action) { + case 'delete': + setConfirmDeleteVisible(true) + break + case 'save': { + const assistantMessages = messages.filter((msg) => selectedMessageIds.includes(msg.id)) + if (assistantMessages.length > 0) { + const contentToSave = assistantMessages + .map((msg) => { + return msg.blocks + .map((blockId) => { + const block = messageBlocks[blockId] + return block && 'content' in block ? block.content : '' + }) + .filter(Boolean) + .join('\n') + .trim() + }) + .join('\n\n---\n\n') + + const fileName = `chat_export_${new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-')}.md` + window.api.file.save(fileName, contentToSave) + window.message.success({ content: t('message.save.success.title'), key: 'save-messages' }) + toggleMultiSelectMode(false) + } else { + window.message.warning(t('message.save.no.assistant')) + } + break + } + case 'copy': { + const assistantMessages = messages.filter((msg) => selectedMessageIds.includes(msg.id)) + if (assistantMessages.length > 0) { + const contentToCopy = assistantMessages + .map((msg) => { + return msg.blocks + .map((blockId) => { + const block = messageBlocks[blockId] + return block && 'content' in block ? block.content : '' + }) + .filter(Boolean) + .join('\n') + .trim() + }) + .join('\n\n---\n\n') + + navigator.clipboard.writeText(contentToCopy) + window.message.success({ content: t('message.copied'), key: 'copy-messages' }) + toggleMultiSelectMode(false) + } else { + window.message.warning(t('message.copy.no.assistant')) + } + break + } + } + } + + const confirmDelete = () => { + try { + dispatch( + newMessagesActions.removeMessages({ + topicId: topic.id, + messageIds: selectedMessageIds + }) + ) + window.message.success(t('message.delete.success')) + toggleMultiSelectMode(false) + } catch (error) { + console.error('删除消息失败:', error) + window.message.error(t('message.delete.failed')) + } finally { + setConfirmDeleteVisible(false) + } + } + + return ( + + {children} + + setConfirmDeleteVisible(false)} + okText={t('common.confirm')} + cancelText={t('common.cancel')} + okButtonProps={{ danger: true }} + centered={true}> +

{t('message.delete.confirm.content', { count: selectedMessageIds.length })}

+
+
+ ) +} diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 086607d4c4..9c75ced355 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -382,7 +382,7 @@ const Messages: FC = ({ assistant, topic, setActiveTopic, onCompo style={{ position: 'relative', maxWidth, - paddingTop: showPrompt ? 10 : 0, + paddingTop: showPrompt ? 10 : 0 }} key={assistant.id} $right={topicPosition === 'left'}> @@ -425,7 +425,7 @@ const Messages: FC = ({ assistant, topic, setActiveTopic, onCompo left: Math.min(dragStart.x, dragCurrent.x), top: Math.min(dragStart.y, dragCurrent.y), width: Math.abs(dragCurrent.x - dragStart.x), - height: Math.abs(dragCurrent.y - dragStart.y), + height: Math.abs(dragCurrent.y - dragStart.y) }} /> )} diff --git a/yarn.lock b/yarn.lock index 69b182069d..4644306209 100644 --- a/yarn.lock +++ b/yarn.lock @@ -360,17 +360,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.22.5": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c - languageName: node - linkType: hard - "@babel/plugin-transform-arrow-functions@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" @@ -434,13 +423,6 @@ __metadata: languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^1.0.2": - version: 1.0.2 - resolution: "@bcoe/v8-coverage@npm:1.0.2" - checksum: 10c0/1eb1dc93cc17fb7abdcef21a6e7b867d6aa99a7ec88ec8207402b23d9083ab22a8011213f04b2cf26d535f1d22dc26139b7929e6c2134c254bd1e14ba5e678c3 - languageName: node - linkType: hard - "@braintree/sanitize-url@npm:^7.0.4": version: 7.1.1 resolution: "@braintree/sanitize-url@npm:7.1.1" @@ -2035,16 +2017,7 @@ __metadata: languageName: node linkType: hard -"@iconify-json/svg-spinners@npm:^1.2.2": - version: 1.2.2 - resolution: "@iconify-json/svg-spinners@npm:1.2.2" - dependencies: - "@iconify/types": "npm:*" - checksum: 10c0/61869963c21bc03052d64cd19155f9d596ffc71b3934ccdb468f5b5a1d3f003089c87744bf76145d8b1e946c45a88e1439e1f9470fcfc3a847b88262f1d71c76 - languageName: node - linkType: hard - -"@iconify/types@npm:*, @iconify/types@npm:^2.0.0": +"@iconify/types@npm:^2.0.0": version: 2.0.0 resolution: "@iconify/types@npm:2.0.0" checksum: 10c0/65a3be43500c7ccacf360e136d00e1717f050b7b91da644e94370256ac66f582d59212bdb30d00788aab4fc078262e91c95b805d1808d654b72f6d2072a7e4b2 @@ -3995,6 +3968,13 @@ __metadata: languageName: node linkType: hard +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: 10c0/64e9e9cf161e848067a5bf60cdc04d18495dc28bb63a8d9f8993e4dd99b91ad34e4b563c85de17d91ffb177ec17a0664991d2e115f6543e73236a906068987af + languageName: node + linkType: hard + "@selderee/plugin-htmlparser2@npm:^0.11.0": version: 0.11.0 resolution: "@selderee/plugin-htmlparser2@npm:0.11.0" @@ -4088,20 +4068,27 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0": +"@sindresorhus/is@npm:^4.0.0, @sindresorhus/is@npm:^4.2.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" checksum: 10c0/33b6fb1d0834ec8dd7689ddc0e2781c2bfd8b9c4e4bacbcb14111e0ae00621f2c264b8a7d36541799d74888b5dccdf422a891a5cb5a709ace26325eedc81e22e languageName: node linkType: hard -"@sindresorhus/is@npm:^5.2.0": +"@sindresorhus/is@npm:^5.2.0, @sindresorhus/is@npm:^5.3.0": version: 5.6.0 resolution: "@sindresorhus/is@npm:5.6.0" checksum: 10c0/66727344d0c92edde5760b5fd1f8092b717f2298a162a5f7f29e4953e001479927402d9d387e245fb9dc7d3b37c72e335e93ed5875edfc5203c53be8ecba1b52 languageName: node linkType: hard +"@sindresorhus/is@npm:^7.0.1": + version: 7.0.1 + resolution: "@sindresorhus/is@npm:7.0.1" + checksum: 10c0/6d43a916d70d9b64066394c272883869b22faf21f4748aaf399c1b691ea704ea607d1668ff2eb5704e5be8809c4a7faafe16be048ce5e1a2ba6e8928b8e3461c + languageName: node + linkType: hard + "@strongtz/win32-arm64-msvc@npm:^0.4.7": version: 0.4.7 resolution: "@strongtz/win32-arm64-msvc@npm:0.4.7" @@ -4682,7 +4669,7 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2": +"@types/http-cache-semantics@npm:*, @types/http-cache-semantics@npm:^4.0.2, @types/http-cache-semantics@npm:^4.0.4": version: 4.0.4 resolution: "@types/http-cache-semantics@npm:4.0.4" checksum: 10c0/51b72568b4b2863e0fe8d6ce8aad72a784b7510d72dc866215642da51d84945a9459fa89f49ec48f1e9a1752e6a78e85a4cda0ded06b1c73e727610c925f9ce6 @@ -4967,7 +4954,7 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.4": +"@types/ws@npm:^8, @types/ws@npm:^8.5.4": version: 8.18.1 resolution: "@types/ws@npm:8.18.1" dependencies: @@ -5884,6 +5871,7 @@ __metadata: tiny-pinyin: "npm:^1.3.2" tokenx: "npm:^0.4.1" turndown: "npm:^7.2.0" + turndown-plugin-gfm: "npm:^1.0.2" typescript: "npm:^5.6.2" uuid: "npm:^10.0.0" vite: "npm:6.2.6" @@ -5945,6 +5933,13 @@ __metadata: languageName: node linkType: hard +"adm-zip@npm:^0.5.9": + version: 0.5.16 + resolution: "adm-zip@npm:0.5.16" + checksum: 10c0/6f10119d4570c7ba76dcf428abb8d3f69e63f92e51f700a542b43d4c0130373dd2ddfc8f85059f12d4a843703a90c3970cfd17876844b4f3f48bf042bfa6b49f + languageName: node + linkType: hard + "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -6251,13 +6246,6 @@ __metadata: languageName: node linkType: hard -"applescript@npm:^1.0.0": - version: 1.0.0 - resolution: "applescript@npm:1.0.0" - checksum: 10c0/b535e7df97a3e1272d1b8e8c832494ba3933fbad879847cb83c8990c08aed5bcb097d2af200ba2e0754c3467c2367441706b7864173e1aa9ee4132f5189287f0 - languageName: node - linkType: hard - "aproba@npm:^1.0.3": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -6647,6 +6635,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.21.1": + version: 4.24.5 + resolution: "browserslist@npm:4.24.5" + dependencies: + caniuse-lite: "npm:^1.0.30001716" + electron-to-chromium: "npm:^1.5.149" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.3" + bin: + browserslist: cli.js + checksum: 10c0/f4c1ce1a7d8fdfab5e5b88bb6e93d09e8a883c393f86801537a252da0362dbdcde4dbd97b318246c5d84c6607b2f6b47af732c1b000d6a8a881ee024bad29204 + languageName: node + linkType: hard + "browserslist@npm:^4.24.0": version: 4.24.4 resolution: "browserslist@npm:4.24.4" @@ -6851,6 +6853,21 @@ __metadata: languageName: node linkType: hard +"cacheable-request@npm:^12.0.1": + version: 12.0.1 + resolution: "cacheable-request@npm:12.0.1" + dependencies: + "@types/http-cache-semantics": "npm:^4.0.4" + get-stream: "npm:^9.0.1" + http-cache-semantics: "npm:^4.1.1" + keyv: "npm:^4.5.4" + mimic-response: "npm:^4.0.0" + normalize-url: "npm:^8.0.1" + responselike: "npm:^3.0.0" + checksum: 10c0/3ccc26519c8dd0821fcb21fa00781e55f05ab6e1da1487fbbee9c8c03435a3cf72c29a710a991cebe398fb9a5274e2a772fc488546d402db8dc21310764ed83a + languageName: node + linkType: hard + "cacheable-request@npm:^7.0.2": version: 7.0.4 resolution: "cacheable-request@npm:7.0.4" @@ -6886,13 +6903,20 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0": +"callsites@npm:^3.0.0, callsites@npm:^3.1.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 languageName: node linkType: hard +"callsites@npm:^4.0.0": + version: 4.2.0 + resolution: "callsites@npm:4.2.0" + checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 + languageName: node + linkType: hard + "camelcase@npm:5.0.0": version: 5.0.0 resolution: "camelcase@npm:5.0.0" @@ -6928,6 +6952,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001716": + version: 1.0.30001718 + resolution: "caniuse-lite@npm:1.0.30001718" + checksum: 10c0/67f9ad09bc16443e28d14f265d6e468480cd8dc1900d0d8b982222de80c699c4f2306599c3da8a3fa7139f110d4b30d49dbac78f215470f479abb6ffe141d5d3 + languageName: node + linkType: hard + "caseless@npm:~0.12.0": version: 0.12.0 resolution: "caseless@npm:0.12.0" @@ -8649,6 +8680,15 @@ __metadata: languageName: node linkType: hard +"dot-prop@npm:^7.2.0": + version: 7.2.0 + resolution: "dot-prop@npm:7.2.0" + dependencies: + type-fest: "npm:^2.11.2" + checksum: 10c0/2621702a01e7a47730e3a8e2938a406afc79b62fbb77bd1394e786ff13776673904bf0a4fc6b812eb9849ec71034e9fc1019a9e0bbe91f84010d8a8088cd41a9 + languageName: node + linkType: hard + "dotenv-cli@npm:^7.4.2": version: 7.4.4 resolution: "dotenv-cli@npm:7.4.4" @@ -8829,6 +8869,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.149": + version: 1.5.155 + resolution: "electron-to-chromium@npm:1.5.155" + checksum: 10c0/aee32a0b03282e488352370f6a910de37788b814031020a0e244943450e844e8a41f741d6e5ec70d553dfa4382ef80088034ddc400b48f45de95de331b9ec178 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.73": version: 1.5.137 resolution: "electron-to-chromium@npm:1.5.137" @@ -10255,6 +10302,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^4.0.2": + version: 4.0.2 + resolution: "form-data-encoder@npm:4.0.2" + checksum: 10c0/559d3130e265316452434eaf68d68560fb36392ff4d04614683419de4fb43c3dbe152dc303599fae382ce24d3451a6d3d289d3bcc182ae3d8ad32e7ce8e35e53 + languageName: node + linkType: hard + "form-data@npm:^4.0.0": version: 4.0.2 resolution: "form-data@npm:4.0.2" @@ -10494,6 +10548,16 @@ __metadata: languageName: node linkType: hard +"generative-bayesian-network@npm:^2.1.66": + version: 2.1.66 + resolution: "generative-bayesian-network@npm:2.1.66" + dependencies: + adm-zip: "npm:^0.5.9" + tslib: "npm:^2.4.0" + checksum: 10c0/ea8089492fe447aefc595ce5196d91474c8295d4592b4bcda8fedd2209d30ed897122ff1dc9efefcd7046e210f12cf06f2b6ec36e31f64646323ad3336a83b24 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -10583,6 +10647,16 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^9.0.1": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": "npm:^0.4.1" + is-stream: "npm:^4.0.1" + checksum: 10c0/d70e73857f2eea1826ac570c3a912757dcfbe8a718a033fa0c23e12ac8e7d633195b01710e0559af574cbb5af101009b42df7b6f6b29ceec8dbdf7291931b948 + languageName: node + linkType: hard + "get-uri@npm:^6.0.1": version: 6.0.4 resolution: "get-uri@npm:6.0.4" @@ -10785,6 +10859,21 @@ __metadata: languageName: node linkType: hard +"got-scraping@npm:^4.1.1": + version: 4.1.1 + resolution: "got-scraping@npm:4.1.1" + dependencies: + got: "npm:^14.2.1" + header-generator: "npm:^2.1.41" + http2-wrapper: "npm:^2.2.0" + mimic-response: "npm:^4.0.0" + ow: "npm:^1.1.1" + quick-lru: "npm:^7.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/66b9bd88fea1c7a1248fec6e9c9757300b70e6039d2b2e0cf1c70e44e88be80f02a26e2e36d5f9c3acb4ec963558d72b0d236a7f11a7a6c87b39b5615afcf7db + languageName: node + linkType: hard + "got@npm:13.0.0": version: 13.0.0 resolution: "got@npm:13.0.0" @@ -10823,6 +10912,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^14.2.1": + version: 14.4.7 + resolution: "got@npm:14.4.7" + dependencies: + "@sindresorhus/is": "npm:^7.0.1" + "@szmarczak/http-timer": "npm:^5.0.1" + cacheable-lookup: "npm:^7.0.0" + cacheable-request: "npm:^12.0.1" + decompress-response: "npm:^6.0.0" + form-data-encoder: "npm:^4.0.2" + http2-wrapper: "npm:^2.2.1" + lowercase-keys: "npm:^3.0.0" + p-cancelable: "npm:^4.0.1" + responselike: "npm:^3.0.0" + type-fest: "npm:^4.26.1" + checksum: 10c0/9b5b8dbc0642c78dbc64ab5ff6f12f6edab3e0cb80e89a3a69623a79ba3986f0ff0066a116fba47c0aacce4b0ba1eccf72f923f7fac13a31ce852bf9e2cb8f81 + languageName: node + linkType: hard + "graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.1.9, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" @@ -11129,6 +11237,18 @@ __metadata: languageName: node linkType: hard +"header-generator@npm:^2.1.41": + version: 2.1.66 + resolution: "header-generator@npm:2.1.66" + dependencies: + browserslist: "npm:^4.21.1" + generative-bayesian-network: "npm:^2.1.66" + ow: "npm:^0.28.1" + tslib: "npm:^2.4.0" + checksum: 10c0/86354e65a047b6519b204adc2a4193dff6bb0782ca2c9d69f1c0320319cbd1a46d3eff31e4a32fe9b3dc0e7910351af5ca8ee2d50baade97b6e7dffd813145be + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -11294,7 +11414,7 @@ __metadata: languageName: node linkType: hard -"http2-wrapper@npm:^2.1.10": +"http2-wrapper@npm:^2.1.10, http2-wrapper@npm:^2.2.0, http2-wrapper@npm:^2.2.1": version: 2.2.1 resolution: "http2-wrapper@npm:2.2.1" dependencies: @@ -11823,6 +11943,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: 10c0/2706c7f19b851327ba374687bc4a3940805e14ca496dc672b9629e744d143b1ad9c6f1b162dece81c7bfbc0f83b32b61ccc19ad2e05aad2dd7af347408f60c7f + languageName: node + linkType: hard + "is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -13913,7 +14040,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:^4.0.6": +"mime@npm:^4.0.4, mime@npm:^4.0.6": version: 4.0.7 resolution: "mime@npm:4.0.7" bin: @@ -14491,7 +14618,7 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^8.0.0": +"normalize-url@npm:^8.0.0, normalize-url@npm:^8.0.1": version: 8.0.1 resolution: "normalize-url@npm:8.0.1" checksum: 10c0/eb439231c4b84430f187530e6fdac605c5048ef4ec556447a10c00a91fc69b52d8d8298d9d608e68d3e0f7dc2d812d3455edf425e0f215993667c3183bcab1ef @@ -14817,6 +14944,32 @@ __metadata: languageName: node linkType: hard +"ow@npm:^0.28.1": + version: 0.28.2 + resolution: "ow@npm:0.28.2" + dependencies: + "@sindresorhus/is": "npm:^4.2.0" + callsites: "npm:^3.1.0" + dot-prop: "npm:^6.0.1" + lodash.isequal: "npm:^4.5.0" + vali-date: "npm:^1.0.0" + checksum: 10c0/8d0de10fd3aa1ab69dd844ace087718c31ceb1a25cf79d38a5be4d0a5da46f960b6bc15a95405747899b882fb51dcf5a502d7e6508005d1c57e157d12fa17cdd + languageName: node + linkType: hard + +"ow@npm:^1.1.1": + version: 1.1.1 + resolution: "ow@npm:1.1.1" + dependencies: + "@sindresorhus/is": "npm:^5.3.0" + callsites: "npm:^4.0.0" + dot-prop: "npm:^7.2.0" + lodash.isequal: "npm:^4.5.0" + vali-date: "npm:^1.0.0" + checksum: 10c0/3973f9d6245f2e468a0f1d614ece96f1289632f7425094e8b266b50ddbe79471f2e6cba447b80e90b54bbeb13c20e83671edfb5ef4c0b13c15546ba0710554e1 + languageName: node + linkType: hard + "p-cancelable@npm:^2.0.0": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" @@ -14831,6 +14984,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^4.0.1": + version: 4.0.1 + resolution: "p-cancelable@npm:4.0.1" + checksum: 10c0/12636623f46784ba962b6fe7a1f34d021f1d9a2cc12c43e270baa715ea872d5c8c7d9f086ed420b8b9817e91d9bbe92c14c90e5dddd4a9968c81a2a7aef7089d + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -15725,6 +15885,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^7.0.0": + version: 7.0.1 + resolution: "quick-lru@npm:7.0.1" + checksum: 10c0/631d031d9aba116311b1db57fbf8637874f2b72731f435a9d015cc0405aae5d18206336953563627ca7c9ed971a3824f11cb4dc1575d03283252a8cea22ac8e1 + languageName: node + linkType: hard + "raf-schd@npm:^4.0.3": version: 4.0.3 resolution: "raf-schd@npm:4.0.3" @@ -18609,7 +18776,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.8.1": +"tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -18625,6 +18792,13 @@ __metadata: languageName: node linkType: hard +"turndown-plugin-gfm@npm:^1.0.2": + version: 1.0.2 + resolution: "turndown-plugin-gfm@npm:1.0.2" + checksum: 10c0/eb9bc20dbb08d5335231f9617d7440f14b35781f14a3a393d8f13fc8205afeb11a0a632d52da4548ab0fa353f315ca265462b24d368faf23258dccbe439182b9 + languageName: node + linkType: hard + "turndown@npm:^7.2.0": version: 7.2.0 resolution: "turndown@npm:7.2.0" @@ -18657,13 +18831,20 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.17.0": +"type-fest@npm:^2.11.2, type-fest@npm:^2.17.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" checksum: 10c0/a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb languageName: node linkType: hard +"type-fest@npm:^4.26.1": + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4 + languageName: node + linkType: hard + "type-fest@npm:^4.39.1": version: 4.40.0 resolution: "type-fest@npm:4.40.0" @@ -18957,7 +19138,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": +"update-browserslist-db@npm:^1.1.1, update-browserslist-db@npm:^1.1.3": version: 1.1.3 resolution: "update-browserslist-db@npm:1.1.3" dependencies: @@ -19090,6 +19271,13 @@ __metadata: languageName: node linkType: hard +"vali-date@npm:^1.0.0": + version: 1.0.0 + resolution: "vali-date@npm:1.0.0" + checksum: 10c0/5755215f6734caab535f60af0a32bbbf2052c61b1a40668d773df78fd3754e4fe9da2ea5466731505f3e0a599acc209d5578c4b70488ed120fb03f0c2ab06449 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4"