mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-08 03:28:51 +01:00
ci(backend-review.yml): add linter step to the backend review workflow (#625)
* ci(backend-review.yml): add linter step to the backend review workflow * chore(backend-review.yml): remove prettier from lint-action configuration * chore: apply new linting workflow * chore(lint-staged.config.js): reorder lint-staged tasks for JavaScript and TypeScript files * chore(eslint): update ignorePatterns in .eslintrc.js chore(lint-action): remove prettier option in backend-review.yml chore(package.json): add lint and lint:fix scripts * chore(lint-staged.config.js): remove prettier --write command for js, jsx, ts, tsx files * chore(titleConvo.js): remove unnecessary console.log statement chore(titleConvo.js): add missing comma in options object * chore: apply linting to all files * chore(lint-staged.config.js): update lint-staged configuration to include prettier formatting
This commit is contained in:
parent
637bb6bc11
commit
e5336039fc
231 changed files with 1688 additions and 1526 deletions
|
|
@ -28,7 +28,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
({ snapshot }) =>
|
||||
async (messageId) =>
|
||||
await snapshot.getPromise(store.messagesSiblingIdxFamily(messageId)),
|
||||
[]
|
||||
[],
|
||||
);
|
||||
|
||||
const typeOptions = [
|
||||
|
|
@ -36,7 +36,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
{ value: 'text', display: 'text (.txt)' },
|
||||
{ value: 'markdown', display: 'markdown (.md)' },
|
||||
{ value: 'json', display: 'json (.json)' },
|
||||
{ value: 'csv', display: 'csv (.csv)' }
|
||||
{ value: 'csv', display: 'csv (.csv)' },
|
||||
]; //,, 'webpage'];
|
||||
|
||||
useEffect(() => {
|
||||
|
|
@ -67,7 +67,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message,
|
||||
messages,
|
||||
branches = false,
|
||||
recursive = false
|
||||
recursive = false,
|
||||
}) => {
|
||||
let children = [];
|
||||
if (messages?.length)
|
||||
|
|
@ -79,8 +79,8 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: message,
|
||||
messages: message?.children,
|
||||
branches,
|
||||
recursive
|
||||
})
|
||||
recursive,
|
||||
}),
|
||||
);
|
||||
else {
|
||||
let message = messages[0];
|
||||
|
|
@ -95,8 +95,8 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: message,
|
||||
messages: message?.children,
|
||||
branches,
|
||||
recursive
|
||||
})
|
||||
recursive,
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -126,7 +126,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: null,
|
||||
messages: messagesTree,
|
||||
branches: exportBranches,
|
||||
recursive: false
|
||||
recursive: false,
|
||||
});
|
||||
|
||||
for (const message of messages) {
|
||||
|
|
@ -141,51 +141,51 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
beforeTableEncode: (entries) => [
|
||||
{
|
||||
fieldName: 'sender',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'sender').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'sender').fieldValues,
|
||||
},
|
||||
{ fieldName: 'text', fieldValues: entries.find((e) => e.fieldName == 'text').fieldValues },
|
||||
{
|
||||
fieldName: 'isCreatedByUser',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'isCreatedByUser').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'isCreatedByUser').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'error',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'error').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'error').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'unfinished',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'unfinished').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'unfinished').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'cancelled',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'cancelled').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'cancelled').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'messageId',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'messageId').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'messageId').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'parentMessageId',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'parentMessageId').fieldValues
|
||||
fieldValues: entries.find((e) => e.fieldName == 'parentMessageId').fieldValues,
|
||||
},
|
||||
{
|
||||
fieldName: 'createdAt',
|
||||
fieldValues: entries.find((e) => e.fieldName == 'createdAt').fieldValues
|
||||
}
|
||||
]
|
||||
fieldValues: entries.find((e) => e.fieldName == 'createdAt').fieldValues,
|
||||
},
|
||||
],
|
||||
});
|
||||
};
|
||||
|
||||
const exportMarkdown = async () => {
|
||||
let data =
|
||||
`# Conversation\n` +
|
||||
'# Conversation\n' +
|
||||
`- conversationId: ${conversation?.conversationId}\n` +
|
||||
`- endpoint: ${conversation?.endpoint}\n` +
|
||||
`- title: ${conversation?.title}\n` +
|
||||
`- exportAt: ${new Date().toTimeString()}\n`;
|
||||
|
||||
if (includeOptions) {
|
||||
data += `\n## Options\n`;
|
||||
data += '\n## Options\n';
|
||||
const options = cleanupPreset({ preset: conversation, endpointsConfig });
|
||||
|
||||
for (const key of Object.keys(options)) {
|
||||
|
|
@ -198,15 +198,15 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: null,
|
||||
messages: messagesTree,
|
||||
branches: false,
|
||||
recursive: false
|
||||
recursive: false,
|
||||
});
|
||||
|
||||
data += `\n## History\n`;
|
||||
data += '\n## History\n';
|
||||
for (const message of messages) {
|
||||
data += `**${message?.sender}:**\n${message?.text}\n`;
|
||||
if (message.error) data += `*(This is an error message)*\n`;
|
||||
if (message.unfinished) data += `*(This is an unfinished message)*\n`;
|
||||
if (message.cancelled) data += `*(This is a cancelled message)*\n`;
|
||||
if (message.error) data += '*(This is an error message)*\n';
|
||||
if (message.unfinished) data += '*(This is an unfinished message)*\n';
|
||||
if (message.cancelled) data += '*(This is a cancelled message)*\n';
|
||||
data += '\n\n';
|
||||
}
|
||||
|
||||
|
|
@ -214,21 +214,21 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
data: data,
|
||||
fileName: filename,
|
||||
extension: 'md',
|
||||
exportType: exportFromJSON.types.text
|
||||
exportType: exportFromJSON.types.text,
|
||||
});
|
||||
};
|
||||
|
||||
const exportText = async () => {
|
||||
let data =
|
||||
`Conversation\n` +
|
||||
`########################\n` +
|
||||
'Conversation\n' +
|
||||
'########################\n' +
|
||||
`conversationId: ${conversation?.conversationId}\n` +
|
||||
`endpoint: ${conversation?.endpoint}\n` +
|
||||
`title: ${conversation?.title}\n` +
|
||||
`exportAt: ${new Date().toTimeString()}\n`;
|
||||
|
||||
if (includeOptions) {
|
||||
data += `\nOptions\n########################\n`;
|
||||
data += '\nOptions\n########################\n';
|
||||
const options = cleanupPreset({ preset: conversation, endpointsConfig });
|
||||
|
||||
for (const key of Object.keys(options)) {
|
||||
|
|
@ -241,15 +241,15 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: null,
|
||||
messages: messagesTree,
|
||||
branches: false,
|
||||
recursive: false
|
||||
recursive: false,
|
||||
});
|
||||
|
||||
data += `\nHistory\n########################\n`;
|
||||
data += '\nHistory\n########################\n';
|
||||
for (const message of messages) {
|
||||
data += `>> ${message?.sender}:\n${message?.text}\n`;
|
||||
if (message.error) data += `(This is an error message)\n`;
|
||||
if (message.unfinished) data += `(This is an unfinished message)\n`;
|
||||
if (message.cancelled) data += `(This is a cancelled message)\n`;
|
||||
if (message.error) data += '(This is an error message)\n';
|
||||
if (message.unfinished) data += '(This is an unfinished message)\n';
|
||||
if (message.cancelled) data += '(This is a cancelled message)\n';
|
||||
data += '\n\n';
|
||||
}
|
||||
|
||||
|
|
@ -257,7 +257,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
data: data,
|
||||
fileName: filename,
|
||||
extension: 'txt',
|
||||
exportType: exportFromJSON.types.text
|
||||
exportType: exportFromJSON.types.text,
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -268,7 +268,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
title: conversation?.title,
|
||||
exportAt: new Date().toTimeString(),
|
||||
branches: exportBranches,
|
||||
recursive: recursive
|
||||
recursive: recursive,
|
||||
};
|
||||
|
||||
if (includeOptions) data.options = cleanupPreset({ preset: conversation, endpointsConfig });
|
||||
|
|
@ -278,7 +278,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
message: null,
|
||||
messages: messagesTree,
|
||||
branches: exportBranches,
|
||||
recursive: recursive
|
||||
recursive: recursive,
|
||||
});
|
||||
|
||||
if (recursive) data.messagesTree = messages.children;
|
||||
|
|
@ -288,7 +288,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
data: data,
|
||||
fileName: filename,
|
||||
extension: 'json',
|
||||
exportType: exportFromJSON.types.json
|
||||
exportType: exportFromJSON.types.json,
|
||||
});
|
||||
};
|
||||
|
||||
|
|
@ -322,7 +322,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
placeholder="Set the filename"
|
||||
className={cn(
|
||||
defaultTextProps,
|
||||
'flex h-10 max-h-10 w-full resize-none px-3 py-2 focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
|
||||
'flex h-10 max-h-10 w-full resize-none px-3 py-2 focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0',
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -337,7 +337,7 @@ export default function ExportModel({ open, onOpenChange }) {
|
|||
options={typeOptions}
|
||||
className={cn(
|
||||
defaultTextProps,
|
||||
'flex h-10 max-h-10 w-full resize-none focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0'
|
||||
'flex h-10 max-h-10 w-full resize-none focus:outline-none focus:ring-0 focus:ring-opacity-0 focus:ring-offset-0',
|
||||
)}
|
||||
containerClassName="flex w-full resize-none"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ const ExportConversation = forwardRef(() => {
|
|||
<button
|
||||
className={cn(
|
||||
'flex w-full cursor-pointer items-center gap-3 px-3 py-3 text-sm text-white transition-colors duration-200 hover:bg-gray-700',
|
||||
exportable ? 'cursor-pointer text-white' : 'cursor-not-allowed text-gray-400'
|
||||
exportable ? 'cursor-pointer text-white' : 'cursor-not-allowed text-gray-400',
|
||||
)}
|
||||
onClick={clickHandler}
|
||||
>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ const NavLink = forwardRef((props, ref) => {
|
|||
|
||||
defaultProps.className = cn(
|
||||
'flex cursor-pointer items-center gap-3 rounded-md py-3 px-3 text-sm text-white transition-colors duration-200 hover:bg-gray-500/10',
|
||||
className
|
||||
className,
|
||||
);
|
||||
|
||||
if (clickHandler) {
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ export default function NavLinks({ clearSearch, isSearchEnabled }) {
|
|||
<Menu.Button
|
||||
className={cn(
|
||||
'group-ui-open:bg-gray-800 flex w-full items-center gap-2.5 rounded-md px-3 py-3 text-sm transition-colors duration-200 hover:bg-gray-800',
|
||||
open ? 'bg-gray-800' : ''
|
||||
open ? 'bg-gray-800' : '',
|
||||
)}
|
||||
>
|
||||
<div className="-ml-0.5 h-5 w-5 flex-shrink-0">
|
||||
|
|
@ -80,7 +80,7 @@ export default function NavLinks({ clearSearch, isSearchEnabled }) {
|
|||
<NavLink
|
||||
className={cn(
|
||||
'flex w-full cursor-pointer items-center gap-3 px-3 py-3 text-sm text-white transition-colors duration-200 hover:bg-gray-700 rounded-none',
|
||||
exportable ? 'cursor-pointer text-white' : 'cursor-not-allowed text-white/50'
|
||||
exportable ? 'cursor-pointer text-white' : 'cursor-not-allowed text-white/50',
|
||||
)}
|
||||
svg={() => <Download size={16} />}
|
||||
text="Export conversation"
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ const SearchBar = forwardRef((props, ref) => {
|
|||
setShowClearIcon(true);
|
||||
}
|
||||
}, [searchQuery])
|
||||
|
||||
|
||||
return (
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ export default function Settings({ open, onOpenChange }) {
|
|||
aria-orientation="vertical"
|
||||
className={cn(
|
||||
'-ml-[8px] flex min-w-[180px] flex-shrink-0 flex-col',
|
||||
isMobile && 'flex-row rounded-lg bg-gray-100 p-1 dark:bg-gray-800/30'
|
||||
isMobile && 'flex-row rounded-lg bg-gray-100 p-1 dark:bg-gray-800/30',
|
||||
)}
|
||||
style={{ outline: 'none' }}
|
||||
>
|
||||
|
|
@ -79,7 +79,7 @@ export default function Settings({ open, onOpenChange }) {
|
|||
className={cn(
|
||||
'radix-state-active:bg-gray-800 radix-state-active:text-white flex items-center justify-start gap-2 rounded-md px-2 py-1.5 text-sm',
|
||||
isMobile &&
|
||||
'dark:radix-state-active:text-white group flex-1 items-center justify-center text-sm dark:text-gray-500'
|
||||
'dark:radix-state-active:text-white group flex-1 items-center justify-center text-sm dark:text-gray-500',
|
||||
)}
|
||||
value="general"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ describe('ClearChatsButton', () => {
|
|||
|
||||
it('renders correctly', () => {
|
||||
const { getByText } = render(
|
||||
<ClearChatsButton confirmClear={false} showText={true} onClick={mockOnClick} />
|
||||
<ClearChatsButton confirmClear={false} showText={true} onClick={mockOnClick} />,
|
||||
);
|
||||
|
||||
expect(getByText('Clear all chats')).toBeInTheDocument();
|
||||
|
|
@ -21,7 +21,7 @@ describe('ClearChatsButton', () => {
|
|||
|
||||
it('renders confirm clear when confirmClear is true', () => {
|
||||
const { getByText } = render(
|
||||
<ClearChatsButton confirmClear={true} showText={true} onClick={mockOnClick} />
|
||||
<ClearChatsButton confirmClear={true} showText={true} onClick={mockOnClick} />,
|
||||
);
|
||||
|
||||
expect(getByText('Confirm Clear')).toBeInTheDocument();
|
||||
|
|
@ -29,7 +29,7 @@ describe('ClearChatsButton', () => {
|
|||
|
||||
it('calls onClick when the button is clicked', () => {
|
||||
const { getByText } = render(
|
||||
<ClearChatsButton confirmClear={false} showText={true} onClick={mockOnClick} />
|
||||
<ClearChatsButton confirmClear={false} showText={true} onClick={mockOnClick} />,
|
||||
);
|
||||
|
||||
fireEvent.click(getByText('Clear'));
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import { useClearConversationsMutation } from '@librechat/data-provider';
|
|||
|
||||
export const ThemeSelector = ({
|
||||
theme,
|
||||
onChange
|
||||
onChange,
|
||||
}: {
|
||||
theme: string;
|
||||
onChange: (value: string) => void;
|
||||
|
|
@ -28,7 +28,7 @@ export const ThemeSelector = ({
|
|||
export const ClearChatsButton = ({
|
||||
confirmClear,
|
||||
showText = true,
|
||||
onClick
|
||||
onClick,
|
||||
}: {
|
||||
confirmClear: boolean;
|
||||
showText: boolean;
|
||||
|
|
@ -74,7 +74,7 @@ function General() {
|
|||
(value: string) => {
|
||||
setTheme(value);
|
||||
},
|
||||
[setTheme]
|
||||
[setTheme],
|
||||
);
|
||||
|
||||
return (
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ describe('ThemeSelector', () => {
|
|||
|
||||
it('renders correctly', () => {
|
||||
const { getByText, getByDisplayValue } = render(
|
||||
<ThemeSelector theme="system" onChange={mockOnChange} />
|
||||
<ThemeSelector theme="system" onChange={mockOnChange} />,
|
||||
);
|
||||
|
||||
expect(getByText('Theme')).toBeInTheDocument();
|
||||
|
|
@ -21,7 +21,7 @@ describe('ThemeSelector', () => {
|
|||
|
||||
it('calls onChange when the select value changes', () => {
|
||||
const { getByDisplayValue } = render(
|
||||
<ThemeSelector theme="system" onChange={mockOnChange} />
|
||||
<ThemeSelector theme="system" onChange={mockOnChange} />,
|
||||
);
|
||||
|
||||
fireEvent.change(getByDisplayValue('System'), { target: { value: 'dark' } });
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ export default function Nav({ navVisible, setNavVisible }) {
|
|||
const debouncedSearchTerm = useDebounce(searchQuery, 750);
|
||||
const searchQueryFn = useSearchQuery(debouncedSearchTerm, pageNumber, {
|
||||
enabled:
|
||||
!!debouncedSearchTerm && debouncedSearchTerm.length > 0 && isSearchEnabled && isSearching
|
||||
!!debouncedSearchTerm && debouncedSearchTerm.length > 0 && isSearchEnabled && isSearching,
|
||||
});
|
||||
|
||||
const onSearchSuccess = (data, expectedPage) => {
|
||||
|
|
@ -127,7 +127,7 @@ export default function Nav({ navVisible, setNavVisible }) {
|
|||
} else {
|
||||
if (!isSearching) {
|
||||
conversations = conversations.sort(
|
||||
(a, b) => new Date(b.createdAt) - new Date(a.createdAt)
|
||||
(a, b) => new Date(b.createdAt) - new Date(a.createdAt),
|
||||
);
|
||||
}
|
||||
setConversations(conversations);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue