From 57a05d54863bbdb0e19e9303f24135288f2115a1 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Tue, 22 Oct 2024 08:07:56 -0700 Subject: [PATCH] Fix up some of the new formatting stuff --- .../plugins/exporter-curl/build/index.js | 13 +++++- src-tauri/yaak_templates/src/format.rs | 41 +++++++++++++++---- src-web/components/GraphQLEditor.tsx | 8 ++-- src-web/components/core/Editor/extensions.ts | 2 +- .../components/responseViewers/TextViewer.tsx | 2 +- src-web/hooks/useFormatText.ts | 2 +- src-web/lib/formatters.ts | 19 ++++++++- 7 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src-tauri/vendored/plugins/exporter-curl/build/index.js b/src-tauri/vendored/plugins/exporter-curl/build/index.js index ca859501..d517e296 100644 --- a/src-tauri/vendored/plugins/exporter-curl/build/index.js +++ b/src-tauri/vendored/plugins/exporter-curl/build/index.js @@ -63,8 +63,12 @@ async function pluginHookExport(_ctx, request) { } xs.push(NEWLINE); } + } else if (typeof request.body?.query === "string") { + const body = { query: request.body.query || "", variables: maybeParseJSON(request.body.variables, void 0) }; + xs.push("--data-raw", `${quote(JSON.stringify(body))}`); + xs.push(NEWLINE); } else if (typeof request.body?.text === "string") { - xs.push("--data-raw", `$${quote(request.body.text)}`); + xs.push("--data-raw", `${quote(request.body.text)}`); xs.push(NEWLINE); } if (request.authenticationType === "basic" || request.authenticationType === "digest") { @@ -91,6 +95,13 @@ function quote(arg) { function onlyEnabled(v) { return v.enabled !== false && !!v.name; } +function maybeParseJSON(v, fallback) { + try { + return JSON.parse(v); + } catch (err) { + return fallback; + } +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { plugin, diff --git a/src-tauri/yaak_templates/src/format.rs b/src-tauri/yaak_templates/src/format.rs index 7e027446..6e665164 100644 --- a/src-tauri/yaak_templates/src/format.rs +++ b/src-tauri/yaak_templates/src/format.rs @@ -96,20 +96,12 @@ pub fn format_json(text: &str, tab: &str) -> String { new_json.push('\n'); new_json.push_str(tab.to_string().repeat(depth).as_str()); new_json.push(current_char); - // Pad with space if the next char is not a comma - if let Some(',') = chars.peek() { - new_json.push(' '); - } } ']' => { depth -= 1; new_json.push('\n'); new_json.push_str(tab.to_string().repeat(depth).as_str()); new_json.push(current_char); - // Pad with space if the next char is not a comma - if let Some(',') = chars.peek() { - new_json.push(' '); - } } ':' => { new_json.push(current_char); @@ -227,4 +219,37 @@ mod test { .trim() ); } + + #[test] + fn test_graphql_response() { + assert_eq!( + format_json(r#"{"data":{"capsules":[{"landings":null,"original_launch":null,"reuse_count":0,"status":"retired","type":"Dragon 1.0","missions":null},{"id":"5e9e2c5bf3591882af3b2665","landings":null,"original_launch":null,"reuse_count":0,"status":"retired","type":"Dragon 1.0","missions":null}]}}"#, " "), + r#" +{ + "data": { + "capsules": [ + { + "landings": null, + "original_launch": null, + "reuse_count": 0, + "status": "retired", + "type": "Dragon 1.0", + "missions": null + }, + { + "id": "5e9e2c5bf3591882af3b2665", + "landings": null, + "original_launch": null, + "reuse_count": 0, + "status": "retired", + "type": "Dragon 1.0", + "missions": null + } + ] + } +} +"# + .trim() + ); + } } diff --git a/src-web/components/GraphQLEditor.tsx b/src-web/components/GraphQLEditor.tsx index 19c4bc3b..45fa56ef 100644 --- a/src-web/components/GraphQLEditor.tsx +++ b/src-web/components/GraphQLEditor.tsx @@ -20,12 +20,12 @@ type Props = Pick & export function GraphQLEditor({ body, onChange, baseRequest, ...extraEditorProps }: Props) { const editorViewRef = useRef(null); const { schema, isLoading, error, refetch } = useIntrospectGraphQL(baseRequest); - const [currentBody, setCurrentBody] = useState<{ query: string; variables: string }>(() => { + const [currentBody, setCurrentBody] = useState<{ query: string; variables: string | undefined }>(() => { // Migrate text bodies to GraphQL format // NOTE: This is how GraphQL used to be stored if ('text' in body) { const b = tryParseJson(body.text, {}); - const variables = JSON.stringify(b.variables ?? '', null, 2); + const variables = JSON.stringify(b.variables || undefined, null, 2); return { query: b.query ?? '', variables }; } @@ -33,13 +33,13 @@ export function GraphQLEditor({ body, onChange, baseRequest, ...extraEditorProps }); const handleChangeQuery = (query: string) => { - const newBody = { query, variables: currentBody.variables }; + const newBody = { query, variables: currentBody.variables || undefined }; setCurrentBody(newBody); onChange(newBody); }; const handleChangeVariables = (variables: string) => { - const newBody = { query: currentBody.query, variables }; + const newBody = { query: currentBody.query, variables: variables || undefined }; setCurrentBody(newBody); onChange(newBody); }; diff --git a/src-web/components/core/Editor/extensions.ts b/src-web/components/core/Editor/extensions.ts index dadcc455..6fa30731 100644 --- a/src-web/components/core/Editor/extensions.ts +++ b/src-web/components/core/Editor/extensions.ts @@ -52,7 +52,7 @@ export const syntaxHighlightStyle = HighlightStyle.define([ textDecoration: 'underline', }, { - tag: [t.paren, t.bracket, t.brace], + tag: [t.paren, t.bracket, t.squareBracket, t.brace, t.separator], color: 'var(--textSubtle)', }, { diff --git a/src-web/components/responseViewers/TextViewer.tsx b/src-web/components/responseViewers/TextViewer.tsx index 55a9d0f8..b6b8a856 100644 --- a/src-web/components/responseViewers/TextViewer.tsx +++ b/src-web/components/responseViewers/TextViewer.tsx @@ -142,7 +142,7 @@ export function TextViewer({ ); } - if (formattedBody.isFetching) { + if (formattedBody.data == null) { return null; } diff --git a/src-web/hooks/useFormatText.ts b/src-web/hooks/useFormatText.ts index 5d7ce40e..839da2ba 100644 --- a/src-web/hooks/useFormatText.ts +++ b/src-web/hooks/useFormatText.ts @@ -12,7 +12,7 @@ export function useFormatText({ pretty: boolean; }) { return useQuery({ - queryKey: [text], + queryKey: [text, language, pretty], queryFn: async () => { if (text === '' || !pretty) { return text; diff --git a/src-web/lib/formatters.ts b/src-web/lib/formatters.ts index 26ac00e3..d6f74cfa 100644 --- a/src-web/lib/formatters.ts +++ b/src-web/lib/formatters.ts @@ -5,7 +5,24 @@ const INDENT = ' '; export async function tryFormatJson(text: string): Promise { if (text === '') return text; - return invokeCmd('cmd_format_json', { text }); + + try { + const result = await invokeCmd('cmd_format_json', { text }); + return result; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (err) { + console.warn("Failed to format JSON", err); + // Nothing + } + + try { + return JSON.stringify(JSON.parse(text), null, 2); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } catch (err) { + // Nothing + } + + return text; } export async function tryFormatXml(text: string): Promise {