Files
yaak-mountain-loop/src-web/components/core/Editor/json-lint.ts
Gregory Schier c340a7d5ae Auto-fix JSON comments and trailing commas for HTTP request bodies
Add a per-request "Automatically Fix JSON" toggle (default: on) that strips
comments and trailing commas before sending HTTP requests. When disabled,
comments are sent as-is and the editor linter flags them as errors.

- New JsonBodyEditor component with settings dropdown and dismissible banner
- Configurable JSON linter (allowComments/allowTrailingCommas) via lintExtension prop
- strip_trailing_commas pass in Rust strip_json_comments pipeline
- Fix JSON formatter pulling standalone comments onto previous comma line
- Add get_bool_map helper, maybe_strip_json_comments, and related tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:23:41 -08:00

45 lines
1.4 KiB
TypeScript

import type { Diagnostic } from '@codemirror/lint';
import type { EditorView } from '@codemirror/view';
import { parse as jsonLintParse } from '@prantlf/jsonlint';
const TEMPLATE_SYNTAX_REGEX = /\$\{\[[\s\S]*?]}/g;
interface JsonLintOptions {
allowComments?: boolean;
allowTrailingCommas?: boolean;
}
export function jsonParseLinter(options?: JsonLintOptions) {
return (view: EditorView): Diagnostic[] => {
try {
const doc = view.state.doc.toString();
// We need lint to not break on stuff like {"foo:" ${[ ... ]}} so we'll replace all template
// syntax with repeating `1` characters, so it's valid JSON and the position is still correct.
const escapedDoc = doc.replace(TEMPLATE_SYNTAX_REGEX, (m) => '1'.repeat(m.length));
jsonLintParse(escapedDoc, {
mode: (options?.allowComments ?? true) ? 'cjson' : 'json',
ignoreTrailingCommas: options?.allowTrailingCommas ?? false,
});
// biome-ignore lint/suspicious/noExplicitAny: none
} catch (err: any) {
if (!('location' in err)) {
return [];
}
// const line = location?.start?.line;
// const column = location?.start?.column;
if (err.location.start.offset) {
return [
{
from: err.location.start.offset,
to: err.location.start.offset,
severity: 'error',
message: err.message,
},
];
}
}
return [];
};
}