import * as monaco from 'monaco-editor'; const SQL_LANG_ID = 'sql'; export const validateSql = (sql: string): Omit[] => { const markers: Omit[] = []; if (!sql || sql.trim().length === 0) { return markers; } // Basic SQL validation - check for common syntax issues const lines = sql.split('\n'); lines.forEach((line, index) => { const lineNumber = index + 1; // Check for incomplete quotes const singleQuotes = (line.match(/'/g) || []).length; const doubleQuotes = (line.match(/"/g) || []).length; const backticks = (line.match(/`/g) || []).length; if (singleQuotes % 2 !== 0) { markers.push({ severity: monaco.MarkerSeverity.Warning, startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: line.length + 1, message: "Unclosed single quote '", code: 'SQL001', source: SQL_LANG_ID, }); } if (doubleQuotes % 2 !== 0) { markers.push({ severity: monaco.MarkerSeverity.Warning, startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: line.length + 1, message: 'Unclosed double quote "', code: 'SQL002', source: SQL_LANG_ID, }); } if (backticks % 2 !== 0) { markers.push({ severity: monaco.MarkerSeverity.Warning, startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: line.length + 1, message: 'Unclosed backtick `', code: 'SQL003', source: SQL_LANG_ID, }); } // Check for unmatched parentheses (basic check) const openParens = (line.match(/\(/g) || []).length; const closeParens = (line.match(/\)/g) || []).length; if (openParens > closeParens) { markers.push({ severity: monaco.MarkerSeverity.Warning, startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: line.length + 1, message: 'Unmatched opening parenthesis', code: 'SQL004', source: SQL_LANG_ID, }); } else if (closeParens > openParens) { markers.push({ severity: monaco.MarkerSeverity.Warning, startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: line.length + 1, message: 'Unmatched closing parenthesis', code: 'SQL005', source: SQL_LANG_ID, }); } }); return markers; };