Skip to content

Commit 67e2ed6

Browse files
committed
fix: remove monaco dir
1 parent c13818a commit 67e2ed6

File tree

4 files changed

+84
-93
lines changed

4 files changed

+84
-93
lines changed

ui/src/components/editor.tsx

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { fetchAutocomplete } from "@/api";
1414
import { Card } from "@/components/ui/card";
1515
import { useQuery } from "@tanstack/react-query";
1616
import { useTheme } from "@/provider/theme.provider";
17-
import { useSqlFormattingProviders } from "@/lib/monaco";
17+
import { useSqlFormattingProviders } from "@/lib/sql-formatting";
1818

1919
type Props = {
2020
value: string;
@@ -25,7 +25,6 @@ export const Editor: FunctionComponent<Props> = ({ value, onChange }) => {
2525
const currentTheme = useTheme();
2626
const monacoInstance = useMonaco();
2727
const providerRef = useRef<IDisposable | null>(null);
28-
2928

3029
const { data: autoCompleteData } = useQuery({
3130
queryKey: ["autocomplete"],
@@ -39,7 +38,7 @@ export const Editor: FunctionComponent<Props> = ({ value, onChange }) => {
3938
monacoInstance.languages.register({ id: ID_LANGUAGE_SQL });
4039
monacoInstance.languages.setLanguageConfiguration(
4140
ID_LANGUAGE_SQL,
42-
COMMAND_CONFIG
41+
COMMAND_CONFIG,
4342
);
4443

4544
monacoInstance.editor.defineTheme("sql-dark", vsPlusTheme.darkThemeData);
@@ -110,7 +109,7 @@ export const Editor: FunctionComponent<Props> = ({ value, onChange }) => {
110109
...tableColumn,
111110
...tableColumnAlias,
112111
];
113-
}
112+
},
114113
);
115114

116115
return { suggestions: [...suggestions, ...tableColumnSuggestions] };
@@ -123,11 +122,7 @@ export const Editor: FunctionComponent<Props> = ({ value, onChange }) => {
123122
};
124123
}, [monacoInstance, autoCompleteData]);
125124

126-
// Register formatting providers (document and range)
127-
// Use centralized formatting providers
128-
// Moved into lib to keep this component lean
129125
useSqlFormattingProviders(monacoInstance, { languageId: ID_LANGUAGE_SQL });
130-
131126

132127
// Avoid rendering until theme is known
133128
if (!currentTheme) return null;

ui/src/lib/monaco/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

ui/src/lib/monaco/sql-formatting.ts

Lines changed: 0 additions & 84 deletions
This file was deleted.

ui/src/lib/sql-formatting.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { useEffect, useRef } from "react";
2+
import type { IDisposable } from "monaco-editor";
3+
import type * as Monaco from "monaco-editor";
4+
import { format as formatSql } from "sql-formatter";
5+
import type { FormatOptionsWithLanguage } from "sql-formatter";
6+
7+
type UseSqlFormattingProvidersOptions = {
8+
languageId: string;
9+
getOptions?: () => FormatOptionsWithLanguage;
10+
};
11+
12+
const getDefaultSqlFormatOptions = (): FormatOptionsWithLanguage => ({
13+
language: "sqlite",
14+
keywordCase: "upper",
15+
});
16+
17+
export function useSqlFormattingProviders(
18+
monaco: typeof Monaco | null,
19+
{ languageId, getOptions }: UseSqlFormattingProvidersOptions,
20+
) {
21+
const disposablesRef = useRef<IDisposable[]>([]);
22+
23+
useEffect(() => {
24+
if (!monaco) return;
25+
26+
// Dispose any previous providers
27+
disposablesRef.current.forEach((d) => d.dispose());
28+
disposablesRef.current = [];
29+
30+
const getOpts = getOptions ?? getDefaultSqlFormatOptions;
31+
32+
const documentProvider =
33+
monaco.languages.registerDocumentFormattingEditProvider(languageId, {
34+
provideDocumentFormattingEdits: (model) => {
35+
const fullRange = model.getFullModelRange();
36+
const text = model.getValue();
37+
try {
38+
const formatted = formatSql(text, getOpts());
39+
return [
40+
{
41+
range: fullRange,
42+
text: formatted,
43+
},
44+
];
45+
} catch (err) {
46+
// Keep UX stable if formatting fails
47+
// eslint-disable-next-line no-console
48+
console.error("SQL formatting error (document)", err);
49+
return [];
50+
}
51+
},
52+
});
53+
54+
const rangeProvider =
55+
monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, {
56+
provideDocumentRangeFormattingEdits: (model, range) => {
57+
const text = model.getValueInRange(range);
58+
try {
59+
const formatted = formatSql(text, getOpts());
60+
return [
61+
{
62+
range,
63+
text: formatted,
64+
},
65+
];
66+
} catch (err) {
67+
// eslint-disable-next-line no-console
68+
console.error("SQL formatting error (range)", err);
69+
return [];
70+
}
71+
},
72+
});
73+
74+
disposablesRef.current = [documentProvider, rangeProvider];
75+
76+
return () => {
77+
disposablesRef.current.forEach((d) => d.dispose());
78+
disposablesRef.current = [];
79+
};
80+
}, [monaco, languageId, getOptions]);
81+
}

0 commit comments

Comments
 (0)