From 6793ebb09e1bd612cfd4714d3e9193fcf9c15e5d Mon Sep 17 00:00:00 2001 From: versecafe <147033096+versecafe@users.noreply.github.com> Date: Tue, 27 Aug 2024 19:44:29 -0400 Subject: [PATCH] Warnings, Underlines, & Hover Information for Issues (#222) * add warnings * missed fix for warnings with no errors display * polish up the UI for warnings/suggestions * hover info for warnings, errors, suggestions * remove prod compiler issue * change infer target on TsServerSuggestionType --- packages/api/server/ws.mts | 26 ++++++ packages/shared/src/schemas/tsserver.ts | 8 ++ packages/shared/src/schemas/websockets.ts | 5 ++ packages/shared/src/types/tsserver.ts | 7 +- packages/shared/src/types/websockets.ts | 4 + packages/web/package.json | 1 + packages/web/src/clients/websocket/index.ts | 2 + packages/web/src/components/cell-output.tsx | 78 ++++++++++++++++-- packages/web/src/components/cells/code.tsx | 88 ++++++++++++++++++++- packages/web/src/components/use-cell.tsx | 24 ++++++ packages/web/src/routes/session.tsx | 12 +++ pnpm-lock.yaml | 23 +++--- tsconfig.base.json | 1 - 13 files changed, 261 insertions(+), 18 deletions(-) diff --git a/packages/api/server/ws.mts b/packages/api/server/ws.mts index 046bd2ca..26b64015 100644 --- a/packages/api/server/ws.mts +++ b/packages/api/server/ws.mts @@ -56,6 +56,7 @@ import { CellCreatePayloadSchema, TsConfigUpdatePayloadSchema, TsConfigUpdatedPayloadSchema, + TsServerCellSuggestionsPayloadSchema, } from '@srcbook/shared'; import tsservers from '../tsservers.mjs'; import { TsServer } from '../tsserver/tsserver.mjs'; @@ -601,6 +602,30 @@ function createTsServer(session: SessionType) { }); }); + tsserver.onSuggestionDiag(async (event) => { + const eventBody = event.body; + + // Get most recent session state + const session = await findSession(sessionId); + + if (!eventBody || !session) { + return; + } + + const filename = filenameFromPath(eventBody.file); + const cells = session.cells.filter((cell) => cell.type === 'code') as CodeCellType[]; + const cell = cells.find((c) => c.filename === filename); + + if (!cell) { + return; + } + + wss.broadcast(`session:${session.id}`, 'tsserver:cell:suggestions', { + cellId: cell.id, + diagnostics: eventBody.diagnostics.map(normalizeDiagnostic), + }); + }); + // Open all code cells in tsserver for (const cell of session.cells) { if (cell.type === 'code') { @@ -678,6 +703,7 @@ wss .outgoing('ai:generated', AiGeneratedCellPayloadSchema) .outgoing('deps:validate:response', DepsValidateResponsePayloadSchema) .outgoing('tsserver:cell:diagnostics', TsServerCellDiagnosticsPayloadSchema) + .outgoing('tsserver:cell:suggestions', TsServerCellSuggestionsPayloadSchema) .outgoing('tsconfig.json:updated', TsConfigUpdatedPayloadSchema); export default wss; diff --git a/packages/shared/src/schemas/tsserver.ts b/packages/shared/src/schemas/tsserver.ts index 13783163..e845f228 100644 --- a/packages/shared/src/schemas/tsserver.ts +++ b/packages/shared/src/schemas/tsserver.ts @@ -12,3 +12,11 @@ export const TsServerDiagnosticSchema = z.object({ start: TsServerLocationSchema, end: TsServerLocationSchema, }); + +export const TsServerSuggestionSchema = z.object({ + code: z.number(), + category: z.string(), + text: z.string(), + start: TsServerLocationSchema, + end: TsServerLocationSchema, +}); diff --git a/packages/shared/src/schemas/websockets.ts b/packages/shared/src/schemas/websockets.ts index 3bc0eec7..a9728379 100644 --- a/packages/shared/src/schemas/websockets.ts +++ b/packages/shared/src/schemas/websockets.ts @@ -108,6 +108,11 @@ export const TsServerCellDiagnosticsPayloadSchema = z.object({ diagnostics: z.array(TsServerDiagnosticSchema), }); +export const TsServerCellSuggestionsPayloadSchema = z.object({ + cellId: z.string(), + diagnostics: z.array(TsServerDiagnosticSchema), +}); + export const TsConfigUpdatePayloadSchema = z.object({ sessionId: z.string(), source: z.string(), diff --git a/packages/shared/src/types/tsserver.ts b/packages/shared/src/types/tsserver.ts index 0be260f6..6621afa5 100644 --- a/packages/shared/src/types/tsserver.ts +++ b/packages/shared/src/types/tsserver.ts @@ -1,6 +1,11 @@ import z from 'zod'; -import { TsServerLocationSchema, TsServerDiagnosticSchema } from '../schemas/tsserver.js'; +import { + TsServerLocationSchema, + TsServerDiagnosticSchema, + TsServerSuggestionSchema, +} from '../schemas/tsserver.js'; export type TsServerLocationType = z.infer; export type TsServerDiagnosticType = z.infer; +export type TsServerSuggestionType = z.infer; diff --git a/packages/shared/src/types/websockets.ts b/packages/shared/src/types/websockets.ts index 46b4191a..bdb3b7f6 100644 --- a/packages/shared/src/types/websockets.ts +++ b/packages/shared/src/types/websockets.ts @@ -21,6 +21,7 @@ import { TsConfigUpdatePayloadSchema, TsConfigUpdatedPayloadSchema, AiFixDiagnosticsPayloadSchema, + TsServerCellSuggestionsPayloadSchema, } from '../schemas/websockets.js'; export type CellExecPayloadType = z.infer; @@ -46,6 +47,9 @@ export type TsServerStopPayloadType = z.infer; export type TsServerCellDiagnosticsPayloadType = z.infer< typeof TsServerCellDiagnosticsPayloadSchema >; +export type TsServerCellSuggestionsPayloadType = z.infer< + typeof TsServerCellSuggestionsPayloadSchema +>; export type TsConfigUpdatePayloadType = z.infer; export type TsConfigUpdatedPayloadType = z.infer; diff --git a/packages/web/package.json b/packages/web/package.json index 6f47035f..df4e8582 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -16,6 +16,7 @@ "@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-json": "^6.0.1", "@codemirror/lang-markdown": "^6.2.5", + "@codemirror/lint": "^6.8.1", "@codemirror/merge": "^6.6.5", "@codemirror/state": "^6.4.1", "@lezer/highlight": "^1.2.0", diff --git a/packages/web/src/clients/websocket/index.ts b/packages/web/src/clients/websocket/index.ts index 55a96175..657aa1e4 100644 --- a/packages/web/src/clients/websocket/index.ts +++ b/packages/web/src/clients/websocket/index.ts @@ -19,6 +19,7 @@ import { TsConfigUpdatePayloadSchema, TsConfigUpdatedPayloadSchema, AiFixDiagnosticsPayloadSchema, + TsServerCellSuggestionsPayloadSchema, } from '@srcbook/shared'; import Channel from '@/clients/websocket/channel'; import WebSocketClient from '@/clients/websocket/client'; @@ -34,6 +35,7 @@ const IncomingSessionEvents = { 'cell:updated': CellUpdatedPayloadSchema, 'deps:validate:response': DepsValidateResponsePayloadSchema, 'tsserver:cell:diagnostics': TsServerCellDiagnosticsPayloadSchema, + 'tsserver:cell:suggestions': TsServerCellSuggestionsPayloadSchema, 'ai:generated': AiGeneratedCellPayloadSchema, 'tsconfig.json:updated': TsConfigUpdatedPayloadSchema, }; diff --git a/packages/web/src/components/cell-output.tsx b/packages/web/src/components/cell-output.tsx index ffa44bb5..6395a6bc 100644 --- a/packages/web/src/components/cell-output.tsx +++ b/packages/web/src/components/cell-output.tsx @@ -27,19 +27,24 @@ export function CellOutput({ fullscreen, setFullscreen, }: PropsType) { - const { getOutput, clearOutput, getTsServerDiagnostics } = useCells(); + const { getOutput, clearOutput, getTsServerDiagnostics, getTsServerSuggestions } = useCells(); - const [activeTab, setActiveTab] = useState<'stdout' | 'stderr' | 'problems'>('stdout'); + const [activeTab, setActiveTab] = useState<'stdout' | 'stderr' | 'problems' | 'warnings'>( + 'stdout', + ); const stdout = getOutput(cell.id, 'stdout') as StdoutOutputType[]; const stderr = getOutput(cell.id, 'stderr') as StderrOutputType[]; const diagnostics = getTsServerDiagnostics(cell.id); + const suggestions = getTsServerSuggestions(cell.id); return (
setActiveTab(value as 'stdout' | 'stderr' | 'problems')} + onValueChange={(value) => + setActiveTab(value as 'stdout' | 'stderr' | 'problems' | 'warnings') + } defaultValue="stdout" >
)} + {cell.type === 'code' && cell.language === 'typescript' && ( + setShow(true)} + value="warnings" + className={cn( + !show && + 'border-transparent data-[state=active]:border-transparent data-[state=active]:text-tertiary-foreground mb-0', + )} + > + {suggestions.length > 0 ? ( + <> + warnings ({suggestions.length}) + + ) : ( + 'warnings' + )} + + )}
@@ -138,6 +166,15 @@ export function CellOutput({ /> )} + {cell.type === 'code' && cell.language === 'typescript' && ( + + + + )}
)} @@ -203,3 +240,34 @@ function TsServerDiagnostics({
); } + +function TsServerSuggestions({ + suggestions, + fixSuggestions, + cellMode, +}: { + suggestions: TsServerDiagnosticType[]; + fixSuggestions: (suggestions: string) => void; + cellMode: 'off' | 'generating' | 'reviewing' | 'prompting' | 'fixing'; +}) { + const { aiEnabled } = useSettings(); + const formattedSuggestions = suggestions.map(formatDiagnostic).join('\n'); + return suggestions.length === 0 ? ( +
No warnings or suggestions
+ ) : ( +
+

{formattedSuggestions}

+ {aiEnabled && cellMode !== 'fixing' && ( + + )} +
+ ); +} diff --git a/packages/web/src/components/cells/code.tsx b/packages/web/src/components/cells/code.tsx index f911b7e7..6293b7c7 100644 --- a/packages/web/src/components/cells/code.tsx +++ b/packages/web/src/components/cells/code.tsx @@ -26,6 +26,7 @@ import { CodeCellUpdateAttrsType, CellErrorPayloadType, AiGeneratedCellPayloadType, + TsServerDiagnosticType, } from '@srcbook/shared'; import { useSettings } from '@/components/use-settings'; import { cn } from '@/lib/utils'; @@ -41,6 +42,7 @@ import { useDebouncedCallback } from 'use-debounce'; import { EditorView } from 'codemirror'; import { EditorState } from '@codemirror/state'; import { unifiedMergeView } from '@codemirror/merge'; +import { type Diagnostic, linter } from '@codemirror/lint'; const DEBOUNCE_DELAY = 500; type CellModeType = 'off' | 'generating' | 'reviewing' | 'prompting' | 'fixing'; @@ -543,6 +545,84 @@ function Header(props: { ); } +function tsCategoryToSeverity( + diagnostic: Pick, +): Diagnostic['severity'] { + if (diagnostic.code === 7027) { + return 'warning'; + } + // force resolve types with fallback + switch (diagnostic.category) { + case 'error': + return 'error'; + case 'warning': + return 'warning'; + case 'suggestion': + return 'warning'; + case 'info': + return 'info'; + default: + return 'info'; + } +} + +function isDiagnosticWithLocation( + diagnostic: TsServerDiagnosticType, +): diagnostic is TsServerDiagnosticType { + return !!(typeof diagnostic.start.line === 'number' && typeof diagnostic.end.line === 'number'); +} + +function tsDiagnosticMessage(diagnostic: TsServerDiagnosticType): string { + if (typeof diagnostic.text === 'string') { + return diagnostic.text; + } + return JSON.stringify(diagnostic); // Fallback +} + +function convertTSDiagnosticToCM(diagnostic: TsServerDiagnosticType, code: string): Diagnostic { + const message = tsDiagnosticMessage(diagnostic); + + // parse conversion TS server is {line, offset} to CodeMirror {from, to} in absolute chars + return { + from: Math.min( + code.length - 1, + code + .split('\n') + .slice(0, diagnostic.start.line - 1) + .join('\n').length + diagnostic.start.offset, + ), + to: Math.min( + code.length - 1, + code + .split('\n') + .slice(0, diagnostic.end.line - 1) + .join('\n').length + diagnostic.end.offset, + ), + message: message, + severity: tsCategoryToSeverity(diagnostic), + }; +} + +function tsLinter( + cell: CodeCellType, + getTsServerDiagnostics: (id: string) => TsServerDiagnosticType[], + getTsServerSuggestions: (id: string) => TsServerDiagnosticType[], +) { + const semanticDiagnostics = getTsServerDiagnostics(cell.id); + const syntaticDiagnostics = getTsServerSuggestions(cell.id); + const diagnostics = [...syntaticDiagnostics, ...semanticDiagnostics].filter( + isDiagnosticWithLocation, + ); + + const cm_diagnostics = diagnostics.map((diagnostic) => { + return convertTSDiagnosticToCM(diagnostic, cell.source); + }); + + return linter(async (): Promise => { + return cm_diagnostics; + }); +} + function CodeEditor({ cell, runCell, @@ -555,7 +635,11 @@ function CodeEditor({ readOnly: boolean; }) { const { codeTheme } = useTheme(); - const { updateCell: updateCellOnClient } = useCells(); + const { + updateCell: updateCellOnClient, + getTsServerDiagnostics, + getTsServerSuggestions, + } = useCells(); const updateCellOnServerDebounced = useDebouncedCallback(updateCellOnServer, DEBOUNCE_DELAY); @@ -566,6 +650,8 @@ function CodeEditor({ let extensions = [ javascript({ typescript: true }), + // wordHoverExtension, + tsLinter(cell, getTsServerDiagnostics, getTsServerSuggestions), Prec.highest(keymap.of([{ key: 'Mod-Enter', run: evaluateModEnter }])), ]; if (readOnly) { diff --git a/packages/web/src/components/use-cell.tsx b/packages/web/src/components/use-cell.tsx index 80f3b21e..5cdbffac 100644 --- a/packages/web/src/components/use-cell.tsx +++ b/packages/web/src/components/use-cell.tsx @@ -5,6 +5,7 @@ import { CodeLanguageType, MarkdownCellType, TsServerDiagnosticType, + TsServerSuggestionType, getDefaultExtensionForLanguage, } from '@srcbook/shared'; import { GenerateAICellType, OutputType } from '@/types'; @@ -89,6 +90,8 @@ interface CellsContextType { clearOutput: (id: string, type?: 'stdout' | 'stderr') => void; getTsServerDiagnostics: (id: string) => TsServerDiagnosticType[]; setTsServerDiagnostics: (id: string, diagnostics: TsServerDiagnosticType[]) => void; + getTsServerSuggestions: (id: string) => TsServerSuggestionType[]; + setTsServerSuggestions: (id: string, suggestions: TsServerSuggestionType[]) => void; } const CellsContext = createContext(undefined); @@ -106,6 +109,9 @@ export const CellsProvider: React.FC<{ initialCells: ClientCellType[]; children: // Use ref to help avoid stale state bugs in closures. const tsServerDiagnosticsRef = useRef({}); + // Use ref to help avoid stale state bugs in closures. + const tsServerSuggestionsRef = useRef({}); + // Because we use refs for our state, we need a way to trigger // component re-renders when the ref state changes. // @@ -128,6 +134,11 @@ export const CellsProvider: React.FC<{ initialCells: ClientCellType[]; children: forceComponentRerender(); }, []); + const stableSetTsServerSuggestions = useCallback((suggestions: TsServerStateType) => { + tsServerSuggestionsRef.current = suggestions; + forceComponentRerender(); + }, []); + const updateCell = useCallback( (cell: ClientCellType) => { stableSetCells(cellsRef.current.map((c) => (c.id === cell.id ? cell : c))); @@ -213,6 +224,10 @@ export const CellsProvider: React.FC<{ initialCells: ClientCellType[]; children: return tsServerDiagnosticsRef.current[id] || []; }, []); + const getTsServerSuggestions = useCallback((id: string) => { + return tsServerSuggestionsRef.current[id] || []; + }, []); + const setTsServerDiagnostics = useCallback( (id: string, diagnostics: TsServerDiagnosticType[]) => { stableSetTsServerDiagnostics({ ...tsServerDiagnosticsRef.current, [id]: diagnostics }); @@ -220,6 +235,13 @@ export const CellsProvider: React.FC<{ initialCells: ClientCellType[]; children: [stableSetTsServerDiagnostics], ); + const setTsServerSuggestions = useCallback( + (id: string, suggestions: TsServerSuggestionType[]) => { + stableSetTsServerSuggestions({ ...tsServerSuggestionsRef.current, [id]: suggestions }); + }, + [stableSetTsServerSuggestions], + ); + return ( {children} diff --git a/packages/web/src/routes/session.tsx b/packages/web/src/routes/session.tsx index eb30e3a9..04122297 100644 --- a/packages/web/src/routes/session.tsx +++ b/packages/web/src/routes/session.tsx @@ -10,6 +10,7 @@ import { MarkdownCellType, CodeCellType, TitleCellType, + TsServerCellSuggestionsPayloadType, } from '@srcbook/shared'; import { loadSession, getConfig } from '@/lib/server'; import type { SessionType, GenerateAICellType, SettingsType } from '@/types'; @@ -83,6 +84,7 @@ function Session(props: { session: SessionType; channel: SessionChannel; config: createGenerateAiCell, setOutput, setTsServerDiagnostics, + setTsServerSuggestions, } = useCells(); const { installing: installingDependencies } = usePackageJson(); @@ -130,6 +132,16 @@ function Session(props: { session: SessionType; channel: SessionChannel; config: return () => channel.off('tsserver:cell:diagnostics', callback); }, [channel, setTsServerDiagnostics]); + useEffect(() => { + const callback = (payload: TsServerCellSuggestionsPayloadType) => { + setTsServerSuggestions(payload.cellId, payload.diagnostics); + }; + + channel.on('tsserver:cell:suggestions', callback); + + return () => channel.off('tsserver:cell:suggestions', callback); + }, [channel, setTsServerSuggestions]); + useEffect(() => { const callback = (payload: CellUpdatedPayloadType) => { updateCell(payload.cell); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f24a600..1a7f4599 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -142,6 +142,9 @@ importers: '@codemirror/lang-markdown': specifier: ^6.2.5 version: 6.2.5 + '@codemirror/lint': + specifier: ^6.8.1 + version: 6.8.1 '@codemirror/merge': specifier: ^6.6.5 version: 6.6.5 @@ -189,7 +192,7 @@ importers: version: 4.22.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0) '@uiw/react-codemirror': specifier: ^4.22.0 - version: 4.22.1(@babel/runtime@7.24.7)(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.8.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.27.0)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.22.1(@babel/runtime@7.24.7)(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.27.0)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -595,8 +598,8 @@ packages: '@codemirror/language@6.10.2': resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==} - '@codemirror/lint@6.8.0': - resolution: {integrity: sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==} + '@codemirror/lint@6.8.1': + resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==} '@codemirror/merge@6.6.5': resolution: {integrity: sha512-jyM/20pb5BaDkFBmobmCq17Gb1ioUkmCrVoBxXv3fvts7TxThHg+vriz1dBqunIr5+ukVN++wHyWWSU13MYJKA==} @@ -4613,7 +4616,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1) '@codemirror/language': 6.10.2 - '@codemirror/lint': 6.8.0 + '@codemirror/lint': 6.8.1 '@codemirror/state': 6.4.1 '@codemirror/view': 6.27.0 '@lezer/common': 1.2.1 @@ -4643,7 +4646,7 @@ snapshots: '@lezer/lr': 1.4.1 style-mod: 4.1.2 - '@codemirror/lint@6.8.0': + '@codemirror/lint@6.8.1': dependencies: '@codemirror/state': 6.4.1 '@codemirror/view': 6.27.0 @@ -5890,12 +5893,12 @@ snapshots: '@typescript-eslint/types': 7.12.0 eslint-visitor-keys: 3.4.3 - '@uiw/codemirror-extensions-basic-setup@4.22.1(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)': + '@uiw/codemirror-extensions-basic-setup@4.22.1(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)': dependencies: '@codemirror/autocomplete': 6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 '@codemirror/language': 6.10.2 - '@codemirror/lint': 6.8.0 + '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 '@codemirror/view': 6.27.0 @@ -5906,14 +5909,14 @@ snapshots: '@codemirror/state': 6.4.1 '@codemirror/view': 6.27.0 - '@uiw/react-codemirror@4.22.1(@babel/runtime@7.24.7)(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.8.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.27.0)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.22.1(@babel/runtime@7.24.7)(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.27.0)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.24.7 '@codemirror/commands': 6.6.0 '@codemirror/state': 6.4.1 '@codemirror/theme-one-dark': 6.1.2 '@codemirror/view': 6.27.0 - '@uiw/codemirror-extensions-basic-setup': 4.22.1(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.0)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0) + '@uiw/codemirror-extensions-basic-setup': 4.22.1(@codemirror/autocomplete@6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1))(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0) codemirror: 6.0.1(@lezer/common@1.2.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6374,7 +6377,7 @@ snapshots: '@codemirror/autocomplete': 6.16.2(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.27.0)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 '@codemirror/language': 6.10.2 - '@codemirror/lint': 6.8.0 + '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 '@codemirror/view': 6.27.0 diff --git a/tsconfig.base.json b/tsconfig.base.json index 631202a3..1b68c6ee 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -2,7 +2,6 @@ "compilerOptions": { "module": "ESNext", "skipLibCheck": true, - /* Linting */ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true,