diff --git a/frontend/src/app-components/inputs/AutoCompleteEntitySelect.tsx b/frontend/src/app-components/inputs/AutoCompleteEntitySelect.tsx index f0098fe8..c4559306 100644 --- a/frontend/src/app-components/inputs/AutoCompleteEntitySelect.tsx +++ b/frontend/src/app-components/inputs/AutoCompleteEntitySelect.tsx @@ -8,6 +8,7 @@ import { ChipTypeMap } from "@mui/material"; import { AutocompleteProps } from "@mui/material/Autocomplete"; +import stringify from "fast-json-stable-stringify"; import { forwardRef, useEffect, useRef } from "react"; import { useInfiniteFind } from "@/hooks/crud/useInfiniteFind"; @@ -96,7 +97,7 @@ const AutoCompleteEntitySelect = < useEffect(() => { fetchNextPage({ pageParam: params }); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(searchPayload)]); + }, [stringify(searchPayload)]); return ( diff --git a/frontend/src/components/nlp/components/NlpTrainForm.tsx b/frontend/src/components/nlp/components/NlpTrainForm.tsx index fb9873de..139a7c4c 100644 --- a/frontend/src/components/nlp/components/NlpTrainForm.tsx +++ b/frontend/src/components/nlp/components/NlpTrainForm.tsx @@ -22,6 +22,7 @@ import { RadioGroup, Typography, } from "@mui/material"; +import stringify from "fast-json-stable-stringify"; import { FC, useCallback, useEffect, useMemo, useState } from "react"; import { Controller, useFieldArray, useForm } from "react-hook-form"; import { useQuery } from "react-query"; @@ -82,7 +83,7 @@ const NlpDatasetSample: FC = ({ ) as INlpDatasetKeywordEntity[], }), // eslint-disable-next-line react-hooks/exhaustive-deps - [allKeywordEntities, allTraitEntities, JSON.stringify(sample)], + [allKeywordEntities, allTraitEntities, stringify(sample)], ); const { handleSubmit, control, register, reset, setValue, watch } = useForm({ @@ -167,7 +168,7 @@ const NlpDatasetSample: FC = ({ useEffect(() => { reset(defaultValues); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(defaultValues)]); + }, [stringify(defaultValues)]); return ( @@ -322,9 +323,7 @@ const NlpDatasetSample: FC = ({ ))} - { - /* Keyword entities */ - } + {/* Keyword entities */} {keywordEntities.map((keywordEntity, index) => ( { event.dataTransfer.setData( "storm-diagram-node", - JSON.stringify({ + stringify({ ...blockTemplate, name, }), diff --git a/frontend/src/components/visual-editor/v2/Diagrams.tsx b/frontend/src/components/visual-editor/v2/Diagrams.tsx index f6708e09..f8b3eb8a 100644 --- a/frontend/src/components/visual-editor/v2/Diagrams.tsx +++ b/frontend/src/components/visual-editor/v2/Diagrams.tsx @@ -29,6 +29,7 @@ import { DiagramModel, DiagramModelGenerics, } from "@projectstorm/react-diagrams"; +import stringify from "fast-json-stable-stringify"; import { useRouter } from "next/router"; import { SyntheticEvent, useCallback, useEffect, useState } from "react"; import { useQueryClient } from "react-query"; @@ -351,7 +352,7 @@ const Diagrams = () => { }); }, [ selectedCategoryId, - JSON.stringify( + stringify( blocks.map((b) => { return { ...b, position: undefined, updatedAt: undefined }; }), diff --git a/frontend/src/hooks/crud/useCount.tsx b/frontend/src/hooks/crud/useCount.tsx index b3d59bb1..07f76530 100644 --- a/frontend/src/hooks/crud/useCount.tsx +++ b/frontend/src/hooks/crud/useCount.tsx @@ -1,11 +1,12 @@ /* - * Copyright © 2024 Hexastack. All rights reserved. + * Copyright © 2025 Hexastack. All rights reserved. * * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ +import stringify from "fast-json-stable-stringify"; import { useQuery, UseQueryOptions } from "react-query"; import { EntityType, QueryType } from "@/services/types"; @@ -31,6 +32,6 @@ export const useCount = ( return useQuery({ ...options, queryFn: () => api.count({ where: params }), - queryKey: [QueryType.count, entity, JSON.stringify(params)], + queryKey: [QueryType.count, entity, stringify(params)], }); }; diff --git a/frontend/src/websocket/SocketIoClient.ts b/frontend/src/websocket/SocketIoClient.ts index bb8ff2aa..d0422d69 100644 --- a/frontend/src/websocket/SocketIoClient.ts +++ b/frontend/src/websocket/SocketIoClient.ts @@ -6,6 +6,7 @@ * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ +import stringify from "fast-json-stable-stringify"; import { io, ManagerOptions, Socket, SocketOptions } from "socket.io-client"; import { IOIncomingMessage, IOOutgoingMessage } from "./types/io-message"; @@ -133,7 +134,7 @@ export class SocketIoClient { return response; } throw new Error( - `Request failed with status code ${response.statusCode}: ${JSON.stringify( + `Request failed with status code ${response.statusCode}: ${stringify( response.body, )}`, );