Fix up some of the new formatting stuff

This commit is contained in:
Gregory Schier
2024-10-22 08:07:56 -07:00
parent e216214085
commit 57a05d5486
7 changed files with 70 additions and 17 deletions

View File

@@ -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,

View File

@@ -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()
);
}
}

View File

@@ -20,12 +20,12 @@ type Props = Pick<EditorProps, 'heightMode' | 'className' | 'forceUpdateKey'> &
export function GraphQLEditor({ body, onChange, baseRequest, ...extraEditorProps }: Props) {
const editorViewRef = useRef<EditorView>(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);
};

View File

@@ -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)',
},
{

View File

@@ -142,7 +142,7 @@ export function TextViewer({
);
}
if (formattedBody.isFetching) {
if (formattedBody.data == null) {
return null;
}

View File

@@ -12,7 +12,7 @@ export function useFormatText({
pretty: boolean;
}) {
return useQuery({
queryKey: [text],
queryKey: [text, language, pretty],
queryFn: async () => {
if (text === '' || !pretty) {
return text;

View File

@@ -5,7 +5,24 @@ const INDENT = ' ';
export async function tryFormatJson(text: string): Promise<string> {
if (text === '') return text;
return invokeCmd('cmd_format_json', { text });
try {
const result = await invokeCmd<string>('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<string> {