-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlint-errors.json
More file actions
5 lines (3 loc) · 204 KB
/
lint-errors.json
File metadata and controls
5 lines (3 loc) · 204 KB
1
2
3
4
5
> csv-data-validator@1.0.0 lint
> eslint . --format=json
[{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/app/api/generate-schema-doc/route.ts","messages":[],"suppressedMessages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'formatMarkdown' is defined but never used.","line":116,"column":16,"nodeType":null,"messageId":"unusedVar","endLine":116,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/app/api/schemas/[name]/route.ts","messages":[{"ruleId":"@typescript-eslint/restrict-template-expressions","severity":2,"message":"Invalid type \"unknown\" of template literal expression.","line":56,"column":72,"nodeType":"Identifier","messageId":"invalidType","endLine":56,"endColumn":77},{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":68,"column":13,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":68,"endColumn":46}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { NextRequest, NextResponse } from \"next/server\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { parse } from \"jsonc-parser\";\n\n// Get the schema directory path\nconst getSchemaDirectory = () => {\n return path.join(process.cwd(), \"schemas\", \"v1\");\n};\n\ninterface Context {\n params: {\n name: string;\n };\n}\n\nexport async function GET(\n request: NextRequest,\n { params }: Context\n) {\n console.log(\"[API /api/schemas/[name]] Received params:\", params);\n \n // Validate that params.name is a string and not an object\n if (\n !params.name ||\n typeof params.name !== \"string\" ||\n params.name === \"[object Object]\"\n ) {\n console.log(\n \"[API /api/schemas/[name]] Invalid name received:\",\n params.name,\n );\n return NextResponse.json(\n { error: \"Invalid schema name provided\" },\n { status: 400 },\n );\n }\n\n // Ensure the file has .json extension\n const schemaName = params.name.endsWith(\".json\") \n ? params.name \n : `${params.name}.json`;\n \n console.log(\n `[API /api/schemas/${schemaName}] Reading file: ${path.join(getSchemaDirectory(), schemaName)}`,\n );\n\n try {\n const filePath = path.join(getSchemaDirectory(), schemaName);\n\n // Check if file exists first\n try {\n await fs.access(filePath);\n } catch (error) {\n console.log(\n `[API /api/schemas/${schemaName}] Error reading schema file: ${error}`,\n );\n return NextResponse.json(\n { error: `Schema file not found: ${schemaName}` },\n { status: 404 },\n );\n }\n\n const fileContent = await fs.readFile(filePath, \"utf-8\");\n\n // Parse JSONC (JSON with comments) for validation\n try {\n const parsedSchema = parse(fileContent);\n return NextResponse.json(parsedSchema);\n } catch (error) {\n console.error(\n `[API /api/schemas/${schemaName}] JSON parsing error:`,\n error,\n );\n return NextResponse.json(\n { error: \"Invalid JSON schema format\" },\n { status: 400 },\n );\n }\n } catch (error) {\n console.error(`[API /api/schemas/${schemaName}] Server error:`, error);\n return NextResponse.json(\n { error: \"Failed to read schema file\" },\n { status: 500 },\n );\n }\n}\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/app/api/schemas/route.ts","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'getSchemasDirectory' is assigned a value but never used.","line":6,"column":7,"nodeType":null,"messageId":"unusedVar","endLine":6,"endColumn":26},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'SchemaInfo' is defined but never used.","line":11,"column":11,"nodeType":null,"messageId":"unusedVar","endLine":11,"endColumn":21}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { NextResponse } from \"next/server\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\n\n// Get the schemas directory\nconst getSchemasDirectory = () => {\n return path.join(process.cwd(), \"schemas\", \"v1\");\n};\n\n// Interface for schema objects\ninterface SchemaInfo {\n name: string;\n filename: string;\n}\n\nexport async function GET() {\n const schemasDir = path.join(process.cwd(), \"schemas\", \"v1\");\n console.log(`[API /api/schemas] Reading directory: ${schemasDir}`);\n\n try {\n const files = await fs.readdir(schemasDir);\n console.log(`[API /api/schemas] Found files: ${files.join(\", \")}`);\n\n const jsonFiles = files.filter(\n (file) => file.endsWith(\".json\") && !file.includes(\":Zone.Identifier\"),\n );\n console.log(\n `[API /api/schemas] Filtered JSON files: ${jsonFiles.join(\", \")}`,\n );\n\n const schemas = jsonFiles.map((filename) => ({\n name: filename.replace(\".json\", \"\"),\n filename,\n }));\n\n console.log(\n `[API /api/schemas] Mapped schemas: ${JSON.stringify(schemas, null, 2)}`,\n );\n\n return NextResponse.json(schemas);\n } catch (error) {\n console.error(\"[API /api/schemas] Error reading schema directory:\", error);\n return NextResponse.json(\n { error: \"Failed to read schemas directory\" },\n { status: 500 },\n );\n }\n}\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/app/layout.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/app/page.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/code-editor.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/csv-validator.tsx","messages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'SchemaListResponse' is defined but never used.","line":193,"column":11,"nodeType":null,"messageId":"unusedVar","endLine":193,"endColumn":29}],"suppressedMessages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'csvEditorRef' is assigned a value but never used.","line":301,"column":9,"nodeType":null,"messageId":"unusedVar","endLine":301,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'jsonEditorRef' is assigned a value but never used.","line":303,"column":9,"nodeType":null,"messageId":"unusedVar","endLine":303,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"react-hooks/exhaustive-deps","severity":1,"message":"React Hook useEffect has a missing dependency: 'toast'. Either include it or remove the dependency array.","line":373,"column":6,"nodeType":"ArrayExpression","endLine":373,"endColumn":8,"suggestions":[{"desc":"Update the dependencies array to be: [toast]","fix":{"range":[13017,13019],"text":"[toast]"}}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'_err' is defined but never used.","line":887,"column":8,"nodeType":null,"messageId":"unusedVar","endLine":887,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"\"use client\";\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useCallback,\n useMemo,\n} from \"react\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardFooter,\n} from \"@/components/ui/card\";\nimport { Button } from \"@/components/ui/button\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { useToast } from \"@/components/ui/use-toast\";\nimport CodeEditor from \"@/components/code-editor\";\nimport ThemeToggle from \"@/components/theme-toggle\";\nimport {\n Copy,\n FileText,\n Upload,\n Loader2,\n CheckCircle,\n XCircle,\n AlertTriangle,\n X,\n Save,\n Info,\n Key,\n ClipboardList,\n} from \"lucide-react\";\nimport Papa from \"papaparse\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeRaw from \"rehype-raw\";\nimport { cn } from \"@/lib/utils\";\nimport ValidationResults from \"@/components/validation-results\";\nimport Image from \"next/image\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Label } from \"@/components/ui/label\";\nimport { getSchemasList, getSchemaByName, generateSchemaDocumentation } from '@/lib/api-client';\n\n// --- Web Worker Setup ---\nconst getWorker = (() => {\n let worker: Worker | null = null;\n return () => {\n if (!worker) {\n worker = new Worker(\n new URL(\"../workers/csv-validator.worker.js\", import.meta.url),\n );\n }\n return worker;\n };\n})();\n\n// --- Schema cache ---\nconst schemaListCache: { list?: string[] } = {};\nconst schemaContentCache: Record<string, Record<string, unknown> | string> = {};\n\n// --- Custom Markdown Components for Styling ---\n// const CustomH1 = ({ _node, children, ...props }: any) => (\n// <h1 className=\"text-2xl font-bold mt-6 mb-3 border-b pb-1\" {...props}>\n// {children}\n// </h1>\n// );\n// const CustomH2 = ({ _node, children, ...props }: any) => (\n// <h2 className=\"text-lg font-semibold mt-4 mb-2\" {...props}>\n// {children}\n// </h2>\n// );\n// const CustomTable = ({ _node, ...props }: any) => (\n// <table className=\"w-full my-3 border-collapse text-sm\" {...props} />\n// );\n// const CustomThead = ({ _node, ...props }: any) => (\n// <thead className=\"hidden\" {...props} />\n// );\n// const CustomTbody = ({ _node, ...props }: any) => <tbody {...props} />;\n// const CustomTr = ({ _node, ...props }: any) => (\n// <tr className=\"border-b border-muted/40\" {...props} />\n// );\n// const CustomTh = ({ _node, ...props }: any) => (\n// <th className=\"p-2 text-left font-semibold w-1/4\" {...props} />\n// );\n// const CustomTd = ({ _node, ...props }: any) => (\n// <td className=\"p-2 align-top\" {...props} />\n// );\n// const CustomCode = ({ _node, ...props }: any) => (\n// <code\n// className=\"px-1.5 py-0.5 bg-muted rounded text-sm font-mono\"\n// {...props}\n// />\n// );\n// const CustomP = ({ _node, ...props }: any) => (\n// <p className=\"mb-2 leading-relaxed\" {...props} />\n// );\n// const CustomHr = ({ _node, ...props }: any) => (\n// <hr className=\"my-6 border-border\" {...props} />\n// );\n\n// --- Modern Custom Markdown Components for Schema Doc Styling ---\nconst SchemaH1 = ({ ...props }: React.HTMLAttributes<HTMLHeadingElement>) => (\n <h1 className=\"text-3xl font-extrabold mt-8 mb-4 flex items-center gap-2 text-gradient-to-r from-blue-600 to-purple-600\">\n <ClipboardList className=\"h-6 w-6 text-blue-500\" /> {props.children}\n </h1>\n);\nconst SchemaH2 = ({ ...props }: React.HTMLAttributes<HTMLHeadingElement>) => (\n <h2 className=\"text-xl font-bold mt-6 mb-2 flex items-center gap-2 text-purple-700 dark:text-purple-300\">\n <Key className=\"h-5 w-5 text-purple-500\" /> {props.children}\n </h2>\n);\nconst SchemaTable = ({ ...props }: React.HTMLAttributes<HTMLTableElement>) => (\n <table className=\"w-full my-3 border-separate border-spacing-y-1 text-sm bg-white/80 dark:bg-zinc-900/40 rounded-xl overflow-hidden shadow\">\n {props.children}\n </table>\n);\nconst SchemaTh = ({ ...props }: React.HTMLAttributes<HTMLTableCellElement>) => (\n <th\n className=\"p-2 text-left font-semibold bg-blue-50 dark:bg-zinc-800 text-blue-900 dark:text-blue-200\"\n {...props}\n />\n);\nconst SchemaTd = ({ ...props }: React.HTMLAttributes<HTMLTableCellElement>) => (\n <td className=\"p-2 align-top\" {...props} />\n);\nconst SchemaBlockquote = ({\n ...props\n}: React.HTMLAttributes<HTMLQuoteElement>) => (\n <blockquote className=\"border-l-4 border-blue-400 bg-blue-50/60 dark:bg-zinc-800/40 p-3 my-3 rounded-md text-blue-900 dark:text-blue-200 flex items-start gap-2\">\n <Info className=\"h-5 w-5 text-blue-400 mt-0.5\" />\n <span>{props.children}</span>\n </blockquote>\n);\nconst SchemaCode = ({ ...props }: React.HTMLAttributes<HTMLElement>) => (\n <code\n className=\"px-2 py-1 bg-zinc-100 dark:bg-zinc-800 rounded text-sm font-mono text-blue-700 dark:text-blue-200\"\n {...props}\n />\n);\nconst SchemaP = ({ ...props }: React.HTMLAttributes<HTMLParagraphElement>) => (\n <p\n className=\"mb-2 leading-relaxed text-zinc-700 dark:text-zinc-200\"\n {...props}\n />\n);\n\n// --- Badge Renderer for Markdown (for enums, types, required, etc.) ---\n// const SchemaBadge = ({ children, color = \"blue\", icon }: any) => (\n// <Badge\n// className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-semibold bg-${color}-100 text-${color}-800 dark:bg-${color}-900/40 dark:text-${color}-200 mr-1 mb-1`}\n// >\n// {icon && React.createElement(icon, { className: \"h-3 w-3 mr-0.5\" })}\n// {children}\n// </Badge>\n// );\n\n// Interface for a single validation issue (error or warning)\ninterface ValidationIssue {\n property: string;\n message: string;\n}\n\n// Interface for combined results per row\ninterface RowValidationResults {\n row: number;\n errors: ValidationIssue[];\n warnings: ValidationIssue[];\n}\n\n// Interface for the schema list API response\ninterface SchemaObject {\n // Define the object structure\n name: string;\n filename: string;\n}\ninterface SchemaListResponse {\n schemas: SchemaObject[]; // Expect an array of SchemaObjects\n}\n\n// Interface for single schema content API response\ninterface SchemaContentResponse {\n content: Record<string, unknown> | string;\n}\n\n// Interfaces for Worker messages\ninterface WorkerMessageResultsBatch {\n type: \"resultsBatch\";\n payload: { results: RowValidationResults[] };\n}\n\ninterface WorkerMessageComplete {\n type: \"complete\";\n payload: { totalErrors: number; totalWarnings: number };\n}\n\ninterface WorkerMessageError {\n type: \"error\";\n payload: { message: string };\n}\n\ntype WorkerMessageData =\n | WorkerMessageResultsBatch\n | WorkerMessageComplete\n | WorkerMessageError;\n\n// --- Debounce Utility ---\n// Use generic T that extends a function type\nfunction debounce<T extends (...args: never[]) => void>(\n func: T,\n waitFor: number,\n): (...args: Parameters<T>) => void {\n // Use Parameters<T> for args type\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n // Use Parameters<T> here as well\n return (...args: Parameters<T>): void => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n func(...args);\n }, waitFor);\n };\n}\n\nexport default function CsvValidator() {\n // --- State Variables --- // Uncomment most\n const [availableSchemaNames, setAvailableSchemaNames] = useState<string[]>(\n [],\n ); // List of schema filenames\n const [selectedSchemaName, setSelectedSchemaName] = useState<string>(\"\"); // Currently selected filename\n const [selectedSchemaContent, setSelectedSchemaContent] = useState<\n Record<string, unknown> | string\n >(\"\"); // Allow object or string\n const [uploadedSchemaContent, setUploadedSchemaContent] = useState<Record<\n string,\n unknown\n > | null>(null); // Use Record<string, unknown> instead of any\n const [uploadedSchemaName, setUploadedSchemaName] = useState<string | null>(\n null,\n ); // State for uploaded schema name\n const [useUploadedSchema, setUseUploadedSchema] = useState<boolean>(false); // Flag for using uploaded schema\n const [csvRawText, setCsvRawText] = useState<string>(\"\");\n const [validationResults, setValidationResults] = useState<\n RowValidationResults[]\n >([]); // Updated state type\n const [totalErrorCount, setTotalErrorCount] = useState<number>(0);\n const [totalWarningCount, setTotalWarningCount] = useState<number>(0);\n const [visibleResultCount, setVisibleResultCount] = useState<number>(20); // State for visible results\n const [isLoadingSchemaList, setIsLoadingSchemaList] = useState<boolean>(true);\n const [isLoadingSchemaContent, setIsLoadingSchemaContent] =\n useState<boolean>(false);\n const [isLoadingCsv, setIsLoadingCsv] = useState<boolean>(false);\n const [csvFileName, setCsvFileName] = useState<string>(\"\");\n const [overallCsvStatus, setOverallCsvStatus] = useState<\n \"valid\" | \"invalid\" | \"pending\" | \"error\"\n >(\"pending\");\n const [openAccordionValue, setOpenAccordionValue] = useState<\n string | undefined\n >(undefined); // State to track the open accordion item\n const [isJsonPanelVisible, setIsJsonPanelVisible] = useState<boolean>(false); // Keep one state for testing\n const [schemaMarkdown, setSchemaMarkdown] = useState<string>(\"\"); // State for generated Markdown\n const [isFetchingMarkdown, setIsFetchingMarkdown] = useState<boolean>(false); // State for markdown fetch loading\n const [highlightedCsvLine, setHighlightedCsvLine] = useState<\n number | undefined\n >(undefined);\n const [scrollToLine, setScrollToLine] = useState<number | undefined>(\n undefined,\n );\n const [workerBusy, setWorkerBusy] = useState(false);\n const [lastRenderedSchemaName, setLastRenderedSchemaName] = useState<\n string | null\n >(null);\n const [isEditorDirty, setIsEditorDirty] = useState<boolean>(false); // Track if editor content changed\n const [isAutoDownloadOn, setIsAutoDownloadOn] = useState<boolean>(false); // ADDED State for auto-download toggle\n\n // Local Storage Key\n const LOCAL_STORAGE_KEY = \"csvValidatorUnsavedData\";\n\n // --- Refs ---\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const csvEditorRef = useRef<{ editor: unknown } | null>(null);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const jsonEditorRef = useRef<{ editor: unknown } | null>(null);\n const workerRef = useRef<Worker | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const schemaFileInputRef = useRef<HTMLInputElement>(null);\n const parentRef = useRef<HTMLDivElement>(null); // Ref for virtualizer\n const validationBatchRef = useRef<RowValidationResults[]>([]); // KEEPING THIS\n\n // --- Toast Notifications ---\n const { toast } = useToast();\n\n // Derived state for displayed results\n const displayedResults = useMemo(() => {\n // Sort: errors first, then warnings, then none (if any)\n return [...validationResults]\n .sort((a, b) => {\n // Errors first\n if (a.errors.length > 0 && b.errors.length === 0) return -1;\n if (a.errors.length === 0 && b.errors.length > 0) return 1;\n // If both have errors or both have none, preserve order\n return a.row - b.row;\n })\n .slice(0, visibleResultCount);\n }, [validationResults, visibleResultCount]);\n\n // Update Virtualizer configuration - Uncomment\n const rowVirtualizer = useVirtualizer({\n count: displayedResults.length,\n getScrollElement: () => parentRef.current,\n estimateSize: () => 50,\n overscan: 5,\n // measureElement: (element) => {\n // const trigger = element.querySelector('[data-state=\"closed\"], [data-state=\"open\"]');\n // return trigger?.getBoundingClientRect().height || element.getBoundingClientRect().height;\n // }\n });\n\n useEffect(() => {\n if (validationResults.length > 0 && visibleResultCount < 20) {\n setVisibleResultCount(Math.min(20, validationResults.length));\n }\n }, [validationResults, visibleResultCount]);\n\n // --- Effect to Load from Local Storage on Mount ---\n useEffect(() => {\n const savedCsv = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (savedCsv) {\n console.log(\"Found unsaved CSV data in local storage.\");\n toast({\n title: \"Restore Session?\",\n description: \"You have unsaved CSV data from a previous session.\",\n action: (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setCsvRawText(savedCsv);\n setIsEditorDirty(true); // Mark as dirty if restored\n toast({\n title: \"Session Restored\",\n description: \"Loaded previous CSV data.\",\n });\n }}\n >\n Restore\n </Button>\n ),\n duration: 15000, // Give user time to decide\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Runs only once on mount\n\n // --- Function to Save to Local Storage ---\n const saveCsvToLocalStorage = useCallback((text: string) => {\n try {\n localStorage.setItem(LOCAL_STORAGE_KEY, text);\n // console.log(\"CSV data saved to local storage.\"); // Optional log\n } catch (error) {\n console.error(\"Error saving CSV to local storage:\", error);\n // Maybe show a subtle toast error if localStorage is full/unavailable\n }\n }, []);\n\n // --- Function to Fetch and Render Schema Docs ---\n const fetchAndRenderSchemaDoc = useCallback(async () => {\n let schemaObject: Record<string, unknown> | null = null;\n const schemaSource = useUploadedSchema\n ? uploadedSchemaContent\n : selectedSchemaContent;\n const currentSourceName = useUploadedSchema\n ? uploadedSchemaName\n : selectedSchemaName;\n\n // Avoid re-rendering if the same schema (by name) is already displayed\n if (currentSourceName && currentSourceName === lastRenderedSchemaName) {\n console.log(\n `Skipping doc render for already displayed schema: ${currentSourceName}`,\n );\n return;\n }\n\n if (typeof schemaSource === \"string\") {\n if (!schemaSource.trim()) {\n setSchemaMarkdown(\"_Select or upload a schema to view documentation._\");\n setLastRenderedSchemaName(currentSourceName);\n return;\n }\n try {\n schemaObject = JSON.parse(schemaSource) as Record<string, unknown>;\n } catch (parseError: unknown) {\n console.error(\n \"Error parsing schema string for documentation:\",\n parseError,\n );\n const message =\n parseError instanceof Error\n ? parseError.message\n : \"Invalid JSON format\";\n setSchemaMarkdown(\n `# Error parsing schema\\n\\n\\`\\`\\`\\n${message}\\n\\`\\`\\``,\n );\n setLastRenderedSchemaName(null); // Allow retry\n toast({\n title: \"Schema Parse Error\",\n description: message,\n variant: \"destructive\",\n });\n setIsFetchingMarkdown(false); // Ensure loading stops\n return;\n }\n } else if (schemaSource && typeof schemaSource === \"object\") {\n schemaObject = schemaSource;\n } else {\n setSchemaMarkdown(\n schemaSource === \"\"\n ? \"_Select or upload a schema to view documentation._\"\n : \"_Invalid schema format for documentation._\",\n );\n setLastRenderedSchemaName(currentSourceName);\n return;\n }\n\n if (!schemaObject) {\n // This case should technically not be reached if logic above is sound\n setSchemaMarkdown(\"_Could not prepare schema for documentation._\");\n setLastRenderedSchemaName(null);\n return;\n }\n\n setIsFetchingMarkdown(true);\n setSchemaMarkdown(\"Loading documentation...\"); // Placeholder\n\n try {\n // Use our new API client instead of direct fetch\n const data = await generateSchemaDocumentation(schemaObject);\n setSchemaMarkdown(data.markdown);\n setLastRenderedSchemaName(currentSourceName); // Update last rendered name\n\n // Update/dismiss the loading toast on success\n toast({\n title: \"Documentation Ready\",\n description: \"Schema documentation loaded successfully.\",\n duration: 3000,\n });\n } catch (error: unknown) {\n // Use unknown for caught error\n console.error(\"Error fetching/rendering schema doc:\", error);\n // Use type guard to get message\n const message =\n error instanceof Error ? error.message : \"Could not load documentation\";\n setSchemaMarkdown(\n `# Error loading documentation\\n\\n\\`\\`\\`\\n${message}\\n\\`\\`\\``,\n ); // Display error in markdown panel\n setLastRenderedSchemaName(null); // Clear last rendered on error so it can be retried\n\n // Update/dismiss the loading toast on error\n toast({\n title: \"Documentation Error\",\n description: message,\n variant: \"destructive\",\n duration: 10000,\n });\n } finally {\n setIsFetchingMarkdown(false);\n }\n }, [\n selectedSchemaContent,\n uploadedSchemaContent,\n useUploadedSchema,\n toast,\n uploadedSchemaName,\n selectedSchemaName,\n lastRenderedSchemaName,\n setLastRenderedSchemaName,\n ]);\n\n // --- Effect to fetch schema list on mount --- // Keep uncommented for now\n useEffect(() => {\n const fetchSchemaList = async () => {\n setIsLoadingSchemaList(true);\n try {\n if (schemaListCache.list) {\n setAvailableSchemaNames(schemaListCache.list);\n setIsLoadingSchemaList(false);\n return;\n }\n \n // Use our new API client instead of direct fetch\n const data = await getSchemasList();\n \n // Ensure data is an array before sorting/mapping\n if (!Array.isArray(data)) {\n throw new Error(\"API response for schemas is not an array.\");\n }\n // Sort based on the 'name' property for user-friendly display\n const sortedSchemaObjects = data.sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n // Extract filenames for internal use (state, selection values)\n const schemaFilenames = sortedSchemaObjects.map((s) => s.filename);\n\n schemaListCache.list = schemaFilenames; // Cache the filenames\n setAvailableSchemaNames(schemaFilenames); // Set state with filenames\n\n // Automatically select the first schema *filename* if available\n if (schemaFilenames.length > 0 && !selectedSchemaName) {\n setSelectedSchemaName(schemaFilenames[0]); // Auto-select the filename string\n }\n } catch (error: unknown) {\n console.error(\"Error fetching schema list:\", error);\n void toast({\n title: \"Error\",\n description:\n \"Could not fetch the list of available schemas. Please check the API or try again later.\",\n variant: \"destructive\",\n });\n } finally {\n setIsLoadingSchemaList(false);\n }\n };\n\n void fetchSchemaList();\n // Add dependencies here if needed, e.g., if fetchSchemaList depends on props or other state\n }, [toast, selectedSchemaName]); // Added toast and selectedSchemaName as dependencies\n\n // --- Effect to fetch schema content when selection changes --- // Uncomment\n useEffect(() => {\n if (!selectedSchemaName && !useUploadedSchema) {\n // Adjusted condition\n setSelectedSchemaContent(\"\");\n setSchemaMarkdown(\"\"); // Clear markdown when schema is unselected/cleared\n return;\n }\n\n const fetchSchemaContent = async () => {\n setIsLoadingSchemaContent(true);\n try {\n if (\n !useUploadedSchema &&\n selectedSchemaName &&\n schemaContentCache[selectedSchemaName]\n ) {\n setSelectedSchemaContent(schemaContentCache[selectedSchemaName]);\n setIsLoadingSchemaContent(false);\n if (isJsonPanelVisible) {\n await fetchAndRenderSchemaDoc();\n }\n return;\n }\n if (!useUploadedSchema && selectedSchemaName) {\n // Ensure we're passing a string, not an object\n const schemaNameToFetch = typeof selectedSchemaName === 'string' \n ? selectedSchemaName.replace(/\\.json$/, \"\") // Remove .json extension if present\n : String(selectedSchemaName).replace(/\\.json$/, \"\");\n \n console.log(`Fetching schema: ${schemaNameToFetch}`);\n try {\n // Use our new API client instead of direct fetch\n const data = await getSchemaByName(schemaNameToFetch);\n \n // Handle the response data structure\n const newSchemaContent = typeof data === 'object' ? data : { content: data };\n schemaContentCache[selectedSchemaName] = newSchemaContent;\n setSelectedSchemaContent(newSchemaContent);\n setIsLoadingSchemaContent(false);\n if (isJsonPanelVisible) {\n await fetchAndRenderSchemaDoc();\n }\n } catch (error) {\n console.error(`Error fetching schema ${schemaNameToFetch}:`, error);\n throw error;\n }\n return;\n }\n if (useUploadedSchema && uploadedSchemaContent) {\n const newSchemaContent = JSON.stringify(\n uploadedSchemaContent,\n null,\n 2,\n );\n setSelectedSchemaContent(newSchemaContent);\n setIsLoadingSchemaContent(false);\n if (isJsonPanelVisible) {\n await fetchAndRenderSchemaDoc();\n }\n return;\n }\n setSelectedSchemaContent(\"\");\n setIsLoadingSchemaContent(false);\n setSchemaMarkdown(\"\");\n } catch (error) {\n console.error(\"Error fetching schema content:\", error);\n void toast({\n variant: \"destructive\",\n title: \"Error\",\n description: `Failed to load schema '${selectedSchemaName}'.`,\n });\n setSelectedSchemaContent(\"\");\n setIsLoadingSchemaContent(false);\n setSchemaMarkdown(\"\");\n }\n };\n\n void fetchSchemaContent();\n }, [\n selectedSchemaName,\n useUploadedSchema,\n uploadedSchemaContent,\n toast,\n isJsonPanelVisible,\n fetchAndRenderSchemaDoc,\n ]); // Added isJsonPanelVisible & fetchAndRenderSchemaDoc\n\n // --- Handlers ---\n const handleSchemaSelectionChange = (schemaName: string) => {\n if (schemaName === \"uploaded-schema\" && uploadedSchemaContent) {\n setUseUploadedSchema(true);\n setSelectedSchemaName(uploadedSchemaName || \"uploaded-schema\"); // Keep track\n // Directly use uploaded content (handled in useEffect now)\n } else if (schemaName && schemaName !== \"uploaded-schema\") {\n setUseUploadedSchema(false);\n setSelectedSchemaName(schemaName);\n // Fetching handled by useEffect\n }\n };\n\n const handleCsvUpload = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n\n setIsLoadingCsv(true);\n setCsvFileName(file.name);\n setOverallCsvStatus(\"pending\"); // Reset status\n void toast({\n title: \"Parsing CSV\",\n description: `Processing ${file.name}...`,\n });\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const text = e.target?.result as string;\n setCsvRawText(text);\n\n Papa.parse<Record<string, unknown>>(text, {\n header: true,\n skipEmptyLines: true,\n dynamicTyping: true, // changed from false\n complete: (results) => {\n // Check for Papa Parse errors specifically\n if (results.errors.length > 0) {\n console.error(\"CSV Parsing Errors:\", results.errors);\n // Add null checks for the first error object\n const firstError = results.errors[0];\n // Use nullish coalescing for defaults. Add 1 to row index.\n const errorRow = (firstError?.row ?? -1) + 1;\n const errorMessage =\n firstError?.message ?? \"Unknown parsing error\";\n setValidationResults([\n {\n row: errorRow, // Use checked/defaulted row\n // Use errorRow in the path string as well\n errors: [\n {\n property: `CSV Header/Parse Error (Row ${errorRow})`,\n message: errorMessage, // Use checked/defaulted message\n },\n ],\n warnings: [],\n },\n ]);\n setOverallCsvStatus(\"invalid\");\n } else {\n setOverallCsvStatus(\"pending\"); // Set to pending as validation hasn't run\n }\n setIsLoadingCsv(false);\n },\n error: (error: Error) => {\n console.error(\"CSV Parsing Failed:\", error);\n setValidationResults([\n {\n row: -1,\n errors: [\n {\n property: \"CSV File\",\n message: error.message,\n },\n ],\n warnings: [],\n },\n ]);\n setOverallCsvStatus(\"error\");\n setIsLoadingCsv(false);\n },\n });\n };\n reader.readAsText(file);\n },\n [toast],\n ); // Add toast dependency if used inside\n\n // --- Updated handleSaveCsv to add logging, filename override, and BOM ---\n const handleSaveCsv = useCallback(\n (textToSave: string, filenameOverride?: string) => {\n if (!textToSave.trim()) {\n toast({\n variant: \"destructive\",\n title: \"Error\",\n description: \"No CSV data to save.\",\n });\n return;\n }\n\n try {\n // Prepend UTF-8 BOM for better Excel compatibility\n const blob = new Blob([\"\\ufeff\" + textToSave], {\n type: \"text/csv;charset=utf-8;\",\n });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n link.setAttribute(\"href\", url);\n // Prioritize override, then state, then default\n const filename = filenameOverride || csvFileName || \"edited_data.csv\";\n console.log(`Attempting to save file as: ${filename}`);\n link.setAttribute(\"download\", filename);\n link.style.visibility = \"hidden\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n toast({ title: \"CSV Saved\", description: `Saved data as ${filename}` });\n localStorage.removeItem(LOCAL_STORAGE_KEY); // Clear local storage on explicit save\n setIsEditorDirty(false); // Mark as clean after explicit save\n } catch (error) {\n console.error(\"Error saving CSV:\", error);\n toast({\n variant: \"destructive\",\n title: \"Save Error\",\n description: \"Could not save CSV data.\",\n });\n }\n },\n [toast, csvFileName],\n );\n\n const handleUploadClick = () => {\n fileInputRef.current?.click(); // Trigger click on hidden input\n };\n\n const handleUploadSchemaClick = () => {\n schemaFileInputRef.current?.click(); // Trigger click on hidden JSON input\n };\n\n const handleSchemaUpload = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const text = e.target?.result as string;\n try {\n const parsedJson = JSON.parse(text) as Record<string, unknown>;\n // Basic check if it looks like a schema\n if (\n typeof parsedJson !== \"object\" ||\n parsedJson === null ||\n !(\"$schema\" in parsedJson) ||\n typeof parsedJson.$schema !== \"string\"\n ) {\n throw new Error(\n \"Invalid JSON content or missing/invalid $schema keyword.\",\n );\n }\n\n setUploadedSchemaContent(parsedJson);\n setUploadedSchemaName(file.name);\n setSelectedSchemaContent(text); // Update editor view\n setUseUploadedSchema(true);\n setOverallCsvStatus(\"pending\");\n void toast({\n title: \"Schema Uploaded\",\n description: `Using uploaded schema: ${file.name}`,\n });\n } catch (error: unknown) {\n console.error(\"Failed to parse uploaded JSON schema:\", error);\n const message =\n error instanceof Error ? error.message : \"Unknown error parsing JSON\";\n void toast({\n variant: \"destructive\",\n title: \"Schema Upload Error\",\n description: `Failed to parse JSON file: ${message}`,\n });\n // Reset state if upload fails\n setUploadedSchemaContent(null);\n setUploadedSchemaName(null);\n setUseUploadedSchema(false);\n }\n };\n reader.onerror = (error) => {\n console.error(\"Failed to read uploaded file:\", error);\n void toast({\n variant: \"destructive\",\n title: \"File Read Error\",\n description: \"Could not read the selected file.\",\n });\n };\n reader.readAsText(file);\n\n // Reset the file input\n if (event.target) {\n event.target.value = \"\";\n }\n };\n\n const handleClearUploadedSchema = useCallback(async () => {\n setUploadedSchemaContent(null);\n setUploadedSchemaName(null);\n setUseUploadedSchema(false);\n\n // Reset editor to the content of the currently selected dropdown schema\n if (selectedSchemaName) {\n setIsLoadingSchemaContent(true); // Show loading indicator briefly\n try {\n const response = await fetch(`/api/schemas/${selectedSchemaName}`);\n if (!response.ok)\n throw new Error(`HTTP error! status: ${response.status}`);\n const data = (await response.json()) as SchemaContentResponse;\n setSelectedSchemaContent(data.content);\n void toast({\n title: \"Schema Cleared\",\n description: `Restored schema: ${selectedSchemaName}`,\n });\n } catch (error) {\n console.error(\"Error re-fetching schema content:\", error);\n void toast({\n variant: \"destructive\",\n title: \"Error\",\n description: `Failed to restore schema '${selectedSchemaName}'.`,\n });\n setSelectedSchemaContent(\"// Error loading schema.\");\n }\n setIsLoadingSchemaContent(false);\n } else {\n setSelectedSchemaContent(\"// Select a schema or upload one.\"); // Handle case where no dropdown schema was selected\n void toast({ title: \"Schema Cleared\" });\n }\n }, [selectedSchemaName, toast]); // Add dependencies\n\n const handleCopyResults = () => {\n // Include warnings in copied results\n const resultsText = JSON.stringify(validationResults, null, 2);\n navigator.clipboard.writeText(resultsText).then(\n () => {\n void toast({\n title: \"Results Copied!\",\n description:\n \"Validation results (errors and warnings) copied to clipboard.\",\n });\n },\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n (_err) => {\n void toast({\n title: \"Copy Failed\",\n description: \"Could not copy results.\",\n variant: \"destructive\",\n });\n },\n );\n };\n\n const handleShowMoreResults = () => {\n setVisibleResultCount((prev) =>\n Math.min(prev + 20, validationResults.length),\n );\n };\n\n // --- Handler to Toggle JSON Panel --- // Updated to use fetchAndRenderSchemaDoc\n const toggleJsonPanel = async () => {\n if (isJsonPanelVisible) {\n setIsJsonPanelVisible(false);\n } else {\n await fetchAndRenderSchemaDoc(); // Fetch/render\n setIsJsonPanelVisible(true); // Then show\n }\n };\n\n // --- Updated handleClearCsv to clear local storage ---\n const handleClearCsv = useCallback(() => {\n setCsvRawText(\"\");\n setCsvFileName(\"\");\n setValidationResults([]);\n setTotalErrorCount(0);\n setTotalWarningCount(0);\n setOverallCsvStatus(\"pending\");\n setHighlightedCsvLine(undefined);\n localStorage.removeItem(LOCAL_STORAGE_KEY); // <-- CLEAR LOCAL STORAGE\n setIsEditorDirty(false); // Mark as clean\n toast({\n title: \"CSV Cleared\",\n description: \"Input data has been removed.\",\n });\n }, [toast]); // Simplified dependencies\n\n // --- Memoized expensive handlers ---\n const memoizedSetValidationResults = useCallback(\n (results: RowValidationResults[]) => setValidationResults(results),\n [],\n );\n\n // --- Worker validation logic ---\n const runWorkerValidation = useCallback(\n (csv: string, schema: Record<string, unknown> | string) => {\n setWorkerBusy(true);\n validationBatchRef.current = [];\n const worker = getWorker();\n workerRef.current = worker;\n worker.onmessage = (event: MessageEvent<WorkerMessageData>) => {\n const { type, payload } = event.data;\n if (type === \"resultsBatch\") {\n validationBatchRef.current = [\n ...validationBatchRef.current,\n ...payload.results,\n ];\n memoizedSetValidationResults([...validationBatchRef.current]);\n } else if (type === \"complete\") {\n setWorkerBusy(false);\n setTotalErrorCount(payload.totalErrors || 0);\n setTotalWarningCount(payload.totalWarnings || 0);\n setOverallCsvStatus(payload.totalErrors === 0 ? \"valid\" : \"invalid\");\n } else if (type === \"error\") {\n setWorkerBusy(false);\n setOverallCsvStatus(\"error\");\n }\n };\n // Parse CSV and schema before sending to worker\n let parsedCsv: Record<string, unknown>[] = [];\n let parsedSchema: Record<string, unknown> | undefined = undefined;\n let firstDataRowLine = 2; // Default: header is line 1, first data row is line 2\n try {\n // Count lines before header (to support CSVs that start at arbitrary lines)\n const lines = csv.split(/\\r?\\n/);\n let headerLineIdx = lines.findIndex(\n (line) => line.trim() && !line.startsWith(\"#\"),\n );\n if (headerLineIdx === -1) headerLineIdx = 0;\n firstDataRowLine = headerLineIdx + 2; // header line + 1 for first data row (1-based)\n const parseResult = Papa.parse<Record<string, unknown>>(csv, {\n header: true,\n skipEmptyLines: true,\n dynamicTyping: false, // Always keep as string for schema validation\n });\n parsedCsv = parseResult.data;\n } catch /* _e */ {\n setWorkerBusy(false);\n setOverallCsvStatus(\"error\");\n return;\n }\n try {\n parsedSchema =\n typeof schema === \"string\"\n ? (JSON.parse(schema) as Record<string, unknown>)\n : schema;\n } catch (e: unknown) {\n console.error(\"Schema parsing error before sending to worker:\", e);\n const message =\n e instanceof Error ? e.message : \"Invalid schema format\";\n toast({\n title: \"Schema Error\",\n description: message,\n variant: \"destructive\",\n });\n setWorkerBusy(false);\n setOverallCsvStatus(\"error\");\n return;\n }\n worker.postMessage({\n type: \"validate\",\n payload: { csvData: parsedCsv, schema: parsedSchema, firstDataRowLine },\n });\n },\n [memoizedSetValidationResults, toast],\n );\n\n // --- Updated Validation Trigger Function ---\n const triggerValidation = useCallback(\n (\n csvText: string,\n schema: Record<string, unknown> | string,\n isAutoDownload: boolean,\n ) => {\n if (!schema) {\n console.warn(\"No schema available for validation trigger.\");\n return;\n }\n console.log(\"Triggering validation and auto-save...\");\n setIsEditorDirty(false);\n\n saveCsvToLocalStorage(csvText);\n runWorkerValidation(csvText, schema);\n\n if (isAutoDownload) {\n console.log(\"Auto-download is ON, triggering file save...\");\n const filenameToUse = csvFileName || \"edited_data.csv\";\n setTimeout(() => handleSaveCsv(csvText, filenameToUse), 100);\n }\n },\n [saveCsvToLocalStorage, runWorkerValidation, csvFileName, handleSaveCsv], // ADDED DEPENDENCIES\n );\n\n // --- Debounced Trigger Ref ---\n // Update the function signature type to match the new triggerValidation\n const debouncedTriggerRef = useRef(debounce(triggerValidation, 750));\n\n // --- CSV Content Change Handler ---\n const handleCsvContentChange = useCallback(\n (value: string | undefined) => {\n const newCsvText = value || \"\";\n setCsvRawText(newCsvText);\n setIsEditorDirty(true);\n setOverallCsvStatus(\"pending\");\n setValidationResults([]);\n setTotalErrorCount(0);\n setTotalWarningCount(0);\n\n const schemaToUse = useUploadedSchema\n ? uploadedSchemaContent\n : selectedSchemaContent;\n\n if (newCsvText.trim() && schemaToUse) {\n console.log(\"CSV Change: Debouncing validation call...\");\n // Pass current text, schema, AND the current auto-download state\n debouncedTriggerRef.current(newCsvText, schemaToUse, isAutoDownloadOn);\n }\n },\n [\n selectedSchemaContent,\n uploadedSchemaContent,\n useUploadedSchema,\n isAutoDownloadOn,\n ],\n );\n\n // --- Updated Manual Validation Click Handler ---\n const handleManualValidateClick = useCallback(() => {\n const schemaToUse = useUploadedSchema\n ? uploadedSchemaContent\n : selectedSchemaContent;\n if (csvRawText.trim() && schemaToUse) {\n console.log(\"Manual validation clicked, triggering...\");\n // Pass the current auto-download state when calling directly\n triggerValidation(csvRawText, schemaToUse, isAutoDownloadOn);\n }\n }, [\n csvRawText,\n selectedSchemaContent,\n uploadedSchemaContent,\n useUploadedSchema,\n isAutoDownloadOn,\n triggerValidation,\n ]);\n\n // --- Manual Save Button Click Handler ---\n const handleManualSaveClick = useCallback(() => {\n const filenameToUse = csvFileName || \"edited_data.csv\";\n handleSaveCsv(csvRawText, filenameToUse);\n }, [csvRawText, handleSaveCsv, csvFileName]);\n\n return (\n <div className=\"flex flex-col h-screen w-full\">\n <header className=\"flex items-center justify-between px-6 py-4 border-b border-[#1e007d]/10 dark:border-zinc-700 flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Image\n src=\"/lavitrine_logo.svg\"\n alt=\"Company Logo\"\n width={64}\n height={64}\n className=\"h-16 w-auto transition-all duration-300 dark:filter dark:invert dark:brightness-0 dark:contrast-100\"\n />\n <span className=\"text-sm font-medium text-muted-foreground\">|</span>\n <h1 className=\"text-2xl md:text-3xl font-bold tracking-tight text-transparent bg-clip-text bg-gradient-to-r from-blue-600 to-purple-600 dark:from-blue-400 dark:to-purple-400\">\n CSV Data Validator\n </h1>\n </div>\n <div className=\"flex items-center gap-2\">\n <ThemeToggle />\n </div>\n </header>\n\n <section className=\"px-6 py-4 flex flex-wrap gap-4 items-center border-b border-[#1e007d]/10 dark:border-zinc-700 flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-muted-foreground\">\n Schema:\n </span>\n <Select\n value={useUploadedSchema ? \"uploaded-schema\" : selectedSchemaName} // Ensure value reflects uploaded state\n onValueChange={handleSchemaSelectionChange}\n disabled={isLoadingSchemaList || availableSchemaNames.length === 0}\n >\n <SelectTrigger className=\"w-[220px] bg-background border-[#1e007d]/20 dark:border-zinc-700\">\n <SelectValue\n placeholder={\n isLoadingSchemaList ? \"Loading...\" : \"Select Schema\"\n }\n />\n </SelectTrigger>\n <SelectContent className=\"dark:bg-zinc-800\">\n {isLoadingSchemaList ? (\n <SelectItem value=\"loading\" disabled>\n Loading...\n </SelectItem>\n ) : availableSchemaNames.length === 0 && !uploadedSchemaName ? (\n <SelectItem value=\"no-schemas\" disabled>\n No schemas found\n </SelectItem>\n ) : null}\n {availableSchemaNames.map((schema) => {\n // Ensure we have a string for value and display\n const schemaValue = typeof schema === \"string\" \n ? schema \n : String(schema);\n \n // Remove .json extension for display\n const schemaLabel = schemaValue.replace(/\\.json$/, \"\");\n \n return (\n <SelectItem\n key={schemaValue}\n value={schemaValue}\n className=\"dark:focus:bg-zinc-700\"\n >\n {schemaLabel}\n </SelectItem>\n );\n })}\n {uploadedSchemaContent && (\n <SelectItem\n value=\"uploaded-schema\"\n className=\"dark:focus:bg-zinc-700\"\n >\n {uploadedSchemaName || \"Uploaded Schema\"}\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n </div>\n\n <TooltipProvider delayDuration={100}>\n {\" \"}\n <Tooltip>\n {\" \"}\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleUploadSchemaClick}\n className=\"border-[#1e007d]/20 dark:border-zinc-700\"\n >\n <Upload className=\"h-4 w-4 mr-2\" /> Upload Schema\n </Button>\n </TooltipTrigger>{\" \"}\n <TooltipContent side=\"bottom\">\n <p>Upload Custom Schema (.json)</p>\n </TooltipContent>{\" \"}\n </Tooltip>{\" \"}\n </TooltipProvider>\n\n {useUploadedSchema && (\n <TooltipProvider delayDuration={100}>\n {\" \"}\n <Tooltip>\n {\" \"}\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleClearUploadedSchema()}\n className=\"text-destructive hover:bg-destructive/10 border-destructive/50\"\n >\n <X className=\"h-4 w-4 mr-2\" /> Clear Uploaded\n </Button>\n </TooltipTrigger>{\" \"}\n <TooltipContent side=\"bottom\">\n <p>Clear Uploaded Schema</p>\n </TooltipContent>{\" \"}\n </Tooltip>{\" \"}\n </TooltipProvider>\n )}\n\n <TooltipProvider delayDuration={100}>\n {\" \"}\n <Tooltip>\n {\" \"}\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void toggleJsonPanel()}\n disabled={\n isLoadingSchemaContent ||\n isFetchingMarkdown ||\n (!selectedSchemaName && !useUploadedSchema)\n }\n className=\"border-[#1e007d]/20 dark:border-zinc-700\"\n >\n {isFetchingMarkdown ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : null}\n {isJsonPanelVisible ? \"Hide Schema View\" : \"Show Schema View\"}\n </Button>\n </TooltipTrigger>{\" \"}\n <TooltipContent side=\"bottom\">\n <p>\n {isJsonPanelVisible\n ? \"Hide human-readable schema\"\n : \"Show human-readable schema\"}\n </p>\n </TooltipContent>{\" \"}\n </Tooltip>{\" \"}\n </TooltipProvider>\n\n <div className=\"flex-grow\"></div>\n\n <Button\n onClick={handleManualValidateClick}\n disabled={\n workerBusy ||\n !csvRawText.trim() ||\n (!selectedSchemaName && !useUploadedSchema) ||\n !(useUploadedSchema ? uploadedSchemaContent : selectedSchemaContent)\n }\n size=\"sm\"\n className=\"bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white\"\n >\n {workerBusy ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> Validating...\n </>\n ) : (\n \"Validate Data\"\n )}\n </Button>\n </section>\n\n {/* --- Main Content Area --- */}\n <div\n className=\"flex-1 min-h-0 flex flex-col overflow-hidden px-6 pt-6 pb-4\"\n style={{ height: \"calc(100vh - 112px - 72px)\" }}\n >\n {/* --- Row 1: Schema/CSV (66% height) --- */}\n <div\n className=\"flex flex-row gap-6 min-h-0\"\n style={{ flexBasis: \"66.66%\" }}\n >\n {isJsonPanelVisible ? (\n <>\n {/* Schema panel (50% width) */}\n <div className=\"w-1/2 min-w-0 flex flex-col h-full overflow-hidden\">\n <Card className=\"flex-1 min-h-0 flex flex-col h-full border-[#1e007d]/20 dark:border-zinc-700 shadow-md dark:shadow-zinc-900/50 rounded-lg\">\n <CardHeader className=\"flex-shrink-0 p-3 border-b border-[#1e007d]/10 dark:border-zinc-600\">\n <CardTitle className=\"text-base font-semibold text-[#1e007d] dark:text-zinc-100\">\n Schema Documentation\n </CardTitle>\n </CardHeader>\n <CardContent className=\"flex-1 overflow-y-auto p-4\">\n {isFetchingMarkdown ? (\n <div className=\"flex justify-center items-center h-full text-muted-foreground\">\n <Loader2 className=\"h-6 w-6 animate-spin\" />\n </div>\n ) : schemaMarkdown ? (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeRaw]}\n components={{\n h1: SchemaH1,\n h2: SchemaH2,\n p: SchemaP,\n table: SchemaTable,\n th: SchemaTh,\n td: SchemaTd,\n blockquote: SchemaBlockquote,\n code: SchemaCode,\n // Optionally: render badges for enums/types/required\n // You can further enhance by parsing inline code or custom syntax for badges\n }}\n >\n {schemaMarkdown}\n </ReactMarkdown>\n </div>\n ) : (\n <div className=\"flex items-center justify-center h-full text-center text-muted-foreground p-4\">\n {!selectedSchemaName && !useUploadedSchema\n ? \"Select or upload a schema.\"\n : 'Click \"Show Schema Doc\" to generate documentation.'}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n {/* CSV panel (50% width) */}\n <div className=\"w-1/2 min-w-0 flex flex-col h-full overflow-hidden\">\n <Card className=\"flex-1 min-h-0 flex flex-col h-full border-[#1e007d]/20 dark:border-zinc-700 shadow-md dark:shadow-zinc-900/50 rounded-lg\">\n <CardHeader className=\"flex-row justify-between items-center p-3 border-b border-[#1e007d]/10 dark:border-zinc-600 flex-shrink-0\">\n <div className=\"flex items-center space-x-2\">\n <FileText className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n <CardTitle className=\"text-base font-semibold text-[#1e007d] dark:text-zinc-100\">\n CSV Data\n </CardTitle>\n {csvFileName && (\n <span className=\"text-xs text-muted-foreground truncate\">\n ({csvFileName})\n </span>\n )}\n </div>\n <div className=\"flex items-center space-x-1\">\n {/* Auto-save Toggle */}\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* Need a div for TooltipTrigger with Label + Switch */}\n <div className=\"flex items-center space-x-2 px-2\">\n <Switch\n id=\"auto-download-switch\"\n checked={isAutoDownloadOn}\n onCheckedChange={setIsAutoDownloadOn}\n aria-label=\"Toggle automatic file download\"\n className=\"data-[state=checked]:bg-blue-600 data-[state=unchecked]:bg-gray-300 dark:data-[state=unchecked]:bg-gray-600\"\n style={{ transform: \"scale(0.8)\" }} // Make switch slightly smaller\n />\n <Label\n htmlFor=\"auto-download-switch\"\n className=\"text-xs text-muted-foreground cursor-pointer\"\n >\n Auto-save\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>\n {isAutoDownloadOn\n ? \"ON: Auto-download a copy using the original filename after edits.\"\n : \"OFF: Changes saved to browser session only. Click Save icon to download.\"}\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {/* Manual Save Button */}\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={(e) => {\n // <-- Use handleManualSaveClick\n e.stopPropagation();\n handleManualSaveClick();\n }}\n className=\"hover:bg-white/10 dark:hover:bg-zinc-700 text-[#1e007d] dark:text-zinc-300 h-8 w-8\"\n disabled={!csvRawText.trim() || !isEditorDirty} // Disable if clean or empty\n >\n <Save className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>Save CSV to File (Download)</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {/* Clear Button */}\n {csvRawText.trim() && (\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={(e) => {\n e.stopPropagation();\n handleClearCsv();\n }}\n className=\"hover:bg-destructive/10 text-destructive h-8 w-8\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>Clear CSV Data</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </CardHeader>\n\n <div className=\"flex flex-col items-center justify-center px-1 pt-1 pb-1\">\n {csvFileName ? (\n <button\n type=\"button\"\n onClick={handleUploadClick}\n disabled={\n isLoadingSchemaContent || workerBusy || isLoadingCsv\n }\n className={`w-8 h-8 flex items-center justify-center rounded border-2 border-dashed border-[#1e007d]/30 dark:border-zinc-600 bg-white/60 dark:bg-zinc-900/40 shadow-sm hover:shadow-lg transition-all cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-400 disabled:opacity-60 disabled:cursor-not-allowed ${csvFileName ? \"border-green-400 bg-green-50/60 dark:bg-green-900/20\" : \"\"}`}\n tabIndex={0}\n aria-label=\"Upload another CSV file\"\n >\n <Upload className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleUploadClick}\n disabled={\n isLoadingSchemaContent || workerBusy || isLoadingCsv\n }\n className={`w-28 h-10 flex flex-col items-center justify-center rounded border-2 border-dashed border-[#1e007d]/30 dark:border-zinc-600 bg-white/60 dark:bg-zinc-900/40 shadow-sm hover:shadow-lg transition-all cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-400 disabled:opacity-60 disabled:cursor-not-allowed`}\n tabIndex={0}\n >\n <Upload className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n <span className=\"text-xs font-medium text-[#1e007d] dark:text-blue-200 mt-0.5\">\n Upload CSV\n </span>\n </button>\n )}\n </div>\n\n <CardContent className=\"flex-grow p-0 relative min-h-0 overflow-auto\">\n <CodeEditor\n value={csvRawText}\n language=\"csv\"\n readOnly={false}\n height=\"100%\"\n onChange={handleCsvContentChange}\n highlightedLine={highlightedCsvLine}\n scrollToLine={scrollToLine}\n />\n </CardContent>\n </Card>\n </div>\n </>\n ) : (\n /* CSV panel (100% width) */\n <div className=\"w-full min-w-0 flex flex-col h-full overflow-hidden\">\n <Card className=\"flex-1 min-h-0 flex flex-col h-full border-[#1e007d]/20 dark:border-zinc-700 shadow-md dark:shadow-zinc-900/50 rounded-lg\">\n <CardHeader className=\"flex-row justify-between items-center p-3 border-b border-[#1e007d]/10 dark:border-zinc-600 flex-shrink-0\">\n <div className=\"flex items-center space-x-2\">\n <FileText className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n <CardTitle className=\"text-base font-semibold text-[#1e007d] dark:text-zinc-100\">\n CSV Data\n </CardTitle>\n {csvFileName && (\n <span className=\"text-xs text-muted-foreground truncate\">\n ({csvFileName})\n </span>\n )}\n </div>\n <div className=\"flex items-center space-x-1\">\n {/* Auto-save Toggle */}\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n {/* Need a div for TooltipTrigger with Label + Switch */}\n <div className=\"flex items-center space-x-2 px-2\">\n <Switch\n id=\"auto-download-switch\"\n checked={isAutoDownloadOn}\n onCheckedChange={setIsAutoDownloadOn}\n aria-label=\"Toggle automatic file download\"\n className=\"data-[state=checked]:bg-blue-600 data-[state=unchecked]:bg-gray-300 dark:data-[state=unchecked]:bg-gray-600\"\n style={{ transform: \"scale(0.8)\" }} // Make switch slightly smaller\n />\n <Label\n htmlFor=\"auto-download-switch\"\n className=\"text-xs text-muted-foreground cursor-pointer\"\n >\n Auto-save\n </Label>\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>\n {isAutoDownloadOn\n ? \"ON: Auto-download a copy using the original filename after edits.\"\n : \"OFF: Changes saved to browser session only. Click Save icon to download.\"}\n </p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {/* Manual Save Button */}\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={(e) => {\n // <-- Use handleManualSaveClick\n e.stopPropagation();\n handleManualSaveClick();\n }}\n className=\"hover:bg-white/10 dark:hover:bg-zinc-700 text-[#1e007d] dark:text-zinc-300 h-8 w-8\"\n disabled={!csvRawText.trim() || !isEditorDirty} // Disable if clean or empty\n >\n <Save className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>Save CSV to File (Download)</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {/* Clear Button */}\n {csvRawText.trim() && (\n <TooltipProvider delayDuration={100}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={(e) => {\n e.stopPropagation();\n handleClearCsv();\n }}\n className=\"hover:bg-destructive/10 text-destructive h-8 w-8\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <p>Clear CSV Data</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </CardHeader>\n\n <div className=\"flex flex-col items-center justify-center px-1 pt-1 pb-1\">\n {csvFileName ? (\n <button\n type=\"button\"\n onClick={handleUploadClick}\n disabled={\n isLoadingSchemaContent || workerBusy || isLoadingCsv\n }\n className={`w-8 h-8 flex items-center justify-center rounded border-2 border-dashed border-[#1e007d]/30 dark:border-zinc-600 bg-white/60 dark:bg-zinc-900/40 shadow-sm hover:shadow-lg transition-all cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-400 disabled:opacity-60 disabled:cursor-not-allowed ${csvFileName ? \"border-green-400 bg-green-50/60 dark:bg-green-900/20\" : \"\"}`}\n tabIndex={0}\n aria-label=\"Upload another CSV file\"\n >\n <Upload className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleUploadClick}\n disabled={\n isLoadingSchemaContent || workerBusy || isLoadingCsv\n }\n className={`w-28 h-10 flex flex-col items-center justify-center rounded border-2 border-dashed border-[#1e007d]/30 dark:border-zinc-600 bg-white/60 dark:bg-zinc-900/40 shadow-sm hover:shadow-lg transition-all cursor-pointer focus:outline-none focus:ring-2 focus:ring-blue-400 disabled:opacity-60 disabled:cursor-not-allowed`}\n tabIndex={0}\n >\n <Upload className=\"h-5 w-5 text-[#1e007d] dark:text-blue-300\" />\n <span className=\"text-xs font-medium text-[#1e007d] dark:text-blue-200 mt-0.5\">\n Upload CSV\n </span>\n </button>\n )}\n </div>\n\n <CardContent className=\"flex-grow p-0 relative min-h-0 overflow-auto\">\n <CodeEditor\n value={csvRawText}\n language=\"csv\"\n readOnly={false}\n height=\"100%\"\n onChange={handleCsvContentChange}\n highlightedLine={highlightedCsvLine}\n scrollToLine={scrollToLine}\n />\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n\n {/* Separator */}\n <div className=\"h-4 flex-shrink-0\" />\n\n {/* --- Row 2: Results Panel (33% height) --- */}\n <div\n className=\"w-full min-h-0 flex flex-col\"\n style={{ flexBasis: \"33.33%\" }}\n >\n <Card className=\"h-full flex flex-col border-[#1e007d]/20 dark:border-zinc-700 shadow-lg dark:shadow-zinc-900/50 rounded-lg overflow-hidden\">\n <CardHeader\n className={cn(\n \"flex flex-row items-center justify-between p-3 border-b flex-shrink-0\",\n overallCsvStatus === \"valid\"\n ? \"bg-green-100 dark:bg-green-900/30 border-green-300 dark:border-green-700\"\n : overallCsvStatus === \"invalid\"\n ? \"bg-red-100 dark:bg-red-900/30 border-red-300 dark:border-red-700\"\n : \"bg-[#1e007d]/5 dark:bg-zinc-800/50 border-[#1e007d]/10 dark:border-zinc-600\",\n )}\n >\n <div className=\"flex items-center space-x-4\">\n {overallCsvStatus === \"valid\" ? (\n <CheckCircle className=\"h-5 w-5 text-green-500\" />\n ) : overallCsvStatus === \"invalid\" ? (\n <XCircle className=\"h-5 w-5 text-red-500\" />\n ) : overallCsvStatus === \"pending\" ? (\n <FileText className=\"h-5 w-5 text-gray-400\" />\n ) : (\n <AlertTriangle className=\"h-5 w-5 text-yellow-500\" />\n )}\n <CardTitle className=\"text-base font-semibold text-[#1e007d] dark:text-zinc-100\">\n Validation Results\n </CardTitle>\n {(totalErrorCount > 0 || totalWarningCount > 0) && (\n <span className=\"text-lg text-muted-foreground font-bold\">\n ({totalErrorCount > 0 ? `${totalErrorCount} Errors` : \"\"}\n {totalErrorCount > 0 && totalWarningCount > 0 ? \", \" : \"\"}\n {totalWarningCount > 0\n ? `${totalWarningCount} Warnings`\n : \"\"}\n )\n </span>\n )}\n </div>\n <div className=\"flex items-center space-x-2\">\n {overallCsvStatus === \"valid\" && (\n <span className=\"flex items-center text-green-700 dark:text-green-300 font-bold text-base bg-green-50 dark:bg-green-900/40 px-3 py-1 rounded-full\">\n <CheckCircle className=\"h-5 w-5 mr-1 text-green-500\" />\n Success: Data is valid!\n </span>\n )}\n {overallCsvStatus === \"invalid\" && (\n <span className=\"flex items-center text-red-700 dark:text-red-300 font-bold text-base bg-red-50 dark:bg-red-900/40 px-3 py-1 rounded-full\">\n <XCircle className=\"h-5 w-5 mr-1 text-red-500\" />\n Invalid data\n </span>\n )}\n <TooltipProvider delayDuration={100}>\n {\" \"}\n <Tooltip>\n {\" \"}\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopyResults}\n disabled={validationResults.length === 0}\n className=\"hover:bg-white/10 dark:hover:bg-zinc-700 text-[#1e007d] dark:text-zinc-300 h-8 w-8\"\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>{\" \"}\n <TooltipContent side=\"bottom\">\n <p>Copy Results</p>\n </TooltipContent>{\" \"}\n </Tooltip>{\" \"}\n </TooltipProvider>\n </div>\n </CardHeader>\n <ScrollArea type=\"auto\">\n <CardContent className=\"p-0 overflow-auto\">\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {displayedResults.length === 0 && !workerBusy && (\n <div className=\"flex items-center justify-center p-10 text-muted-foreground\">\n {overallCsvStatus === \"pending\"\n ? \"Upload CSV and click Validate.\"\n : \"No issues found.\"}\n </div>\n )}\n {workerBusy && (\n <div className=\"flex items-center justify-center p-10 text-muted-foreground\">\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />{\" \"}\n Validating...\n </div>\n )}\n <ValidationResults\n results={displayedResults}\n openAccordionValue={openAccordionValue}\n setOpenAccordionValue={setOpenAccordionValue}\n setHighlightedCsvLine={setHighlightedCsvLine}\n setScrollToLine={setScrollToLine}\n />\n </div>\n </CardContent>\n {validationResults.length > visibleResultCount && (\n <CardFooter className=\"p-3 border-t border-[#1e007d]/10 dark:border-zinc-600 flex-shrink-0 justify-center\">\n <Button\n variant=\"secondary\"\n onClick={handleShowMoreResults}\n disabled={workerBusy}\n >\n Show More Results ({displayedResults.length} /{\" \"}\n {validationResults.length})\n </Button>\n </CardFooter>\n )}\n </ScrollArea>\n </Card>\n </div>\n </div>\n\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleCsvUpload}\n accept=\".csv, text/csv\"\n style={{ display: \"none\" }}\n />\n <input\n type=\"file\"\n ref={schemaFileInputRef}\n onChange={handleSchemaUpload}\n accept=\".json, application/json\"\n style={{ display: \"none\" }}\n />\n </div>\n );\n}\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/theme-provider.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/theme-toggle.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/accordion.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/alert-dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/alert.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/aspect-ratio.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/avatar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/badge.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/breadcrumb.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/button.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/carousel.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/chart.tsx","messages":[{"ruleId":"@typescript-eslint/no-unsafe-assignment","severity":2,"message":"Unsafe assignment of an `any` value.","line":127,"column":11,"nodeType":"VariableDeclarator","messageId":"anyAssignment","endLine":127,"endColumn":100},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":279,"column":38,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":279,"endColumn":41,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[9531,9534],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[9531,9534],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":279,"column":46,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":279,"endColumn":49,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[9539,9542],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[9539,9542],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]},{"ruleId":"@typescript-eslint/no-explicit-any","severity":2,"message":"Unexpected any. Specify a different type.","line":282,"column":11,"nodeType":"TSAnyKeyword","messageId":"unexpectedAny","endLine":282,"endColumn":14,"suggestions":[{"messageId":"suggestUnknown","fix":{"range":[9590,9593],"text":"unknown"},"desc":"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct."},{"messageId":"suggestNever","fix":{"range":[9590,9593],"text":"never"},"desc":"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of."}]}],"suppressedMessages":[],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"\"use client\";\n\nimport * as React from \"react\";\nimport * as RechartsPrimitive from \"recharts\";\nimport { type Payload } from \"recharts/types/component/DefaultTooltipContent\";\nimport { type Props as DefaultLegendContentProps } from \"recharts/types/component/DefaultLegendContent\";\n\nimport { cn } from \"@/lib/utils\";\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const;\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n hide?: boolean;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n );\n};\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\");\n }\n\n return context;\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n config: ChartConfig;\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"];\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className,\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n});\nChartContainer.displayName = \"Chart\";\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, itemConfig]) => itemConfig.theme || itemConfig.color,\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, _prefix]) => `\n${_prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .join(\"\\n\")}\n}\n`,\n )\n .join(\"\\n\"),\n }}\n />\n );\n};\n\n// Define props for the ChartTooltip, extending Recharts types\ninterface ChartTooltipProps extends RechartsPrimitive.TooltipProps<number | string, string> {\n indicator?: 'dot' | 'line' | 'dashed';\n hideLabel?: boolean;\n hideIndicator?: boolean;\n labelKey?: string;\n labelFormatter?: (label: string, payload: Payload<number | string, string>[]) => React.ReactNode;\n formatter?: (value: number | string | Array<number | string>, name: string, item: Payload<number | string, string>, index: number, payload: Payload<number | string, string>[]) => React.ReactNode;\n color?: string;\n className?: string;\n}\n\nconst ChartTooltip = ({ active, payload, label, className, indicator = \"dot\", hideLabel, hideIndicator, formatter, color }: ChartTooltipProps) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload || payload.length === 0) {\n return null;\n }\n const [item] = payload;\n const itemConfig = getPayloadConfigFromPayload(config, item);\n const value: React.ReactNode | undefined = label || (itemConfig ? itemConfig.label : undefined);\n\n if (!value) {\n return null;\n }\n\n return <div className=\"font-medium\">{value}</div>;\n \n }, [label, payload, hideLabel, config]);\n\n if (!active || !payload || payload.length === 0) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\";\n\n return (\n <div\n className={cn(\n \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item, index) => {\n const itemConfig = getPayloadConfigFromPayload(config, item);\n const indicatorColor = color || (item.payload as { fill?: string })?.fill || item.color as string || \"hsl(var(--foreground))\";\n\n return (\n <div\n key={item.dataKey as string}\n className={cn(\n \"flex w-full items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name !== undefined ? (\n formatter(item.value as number | string | Array<number | string>, item.name, item, index, payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\": indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={{\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties}\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name as string}\n </span>\n </div>\n {item.value !== undefined && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {(item.value as number | { toString: () => string}).toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\nChartTooltip.displayName = \"ChartTooltip\";\n\n// Define props for ChartLegend, extending Recharts types\ninterface ChartLegendProps extends RechartsPrimitive.LegendProps {\n hideIcon?: boolean;\n className?: string;\n verticalAlign?: 'top' | 'middle' | 'bottom';\n}\n\nconst ChartLegend = ({ className, hideIcon, verticalAlign = \"bottom\" }: ChartLegendProps) => {\n const { config } = useChart();\n\n const renderLegendItem = (props: DefaultLegendContentProps) => {\n const { payload } = props;\n if (!payload) return null;\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload.map((item) => {\n const itemConfig = getPayloadConfigFromPayload(config, item);\n const color = itemConfig?.color || item.color as string || \"hsl(var(--foreground))\";\n\n if (itemConfig?.hide) {\n return null;\n }\n\n return (\n <div\n key={String(item.value)} \n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n !hideIcon && (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{ backgroundColor: color }}\n />\n )\n )}\n {itemConfig?.label || String(item.value)}\n </div>\n );\n })}\n </div>\n );\n };\n\n return <RechartsPrimitive.Legend content={renderLegendItem} />;\n};\nChartLegend.displayName = \"ChartLegend\";\n\n// Define a minimal interface for payload items used by the helper\ninterface MinimalPayloadItem {\n dataKey?: string | number | ((obj: any) => any);\n name?: string;\n color?: string;\n value?: any;\n payload?: Record<string, unknown>;\n}\n\n// Helper to find the chart config matching the payload item\nconst getPayloadConfigFromPayload = (\n config: ChartConfig,\n item: MinimalPayloadItem,\n): ChartConfig[string] | undefined => {\n if (typeof item.dataKey === \"string\") {\n return config[item.dataKey];\n }\n\n return undefined;\n}\n\n// Export all components\nexport {\n ChartContainer,\n ChartTooltip,\n ChartLegend,\n useChart,\n};\n","usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/checkbox.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/collapsible.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/command.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/context-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/dialog.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/drawer.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/dropdown-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/form.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/hover-card.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/input-otp.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/input.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/label.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/menubar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/navigation-menu.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/pagination.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/popover.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/progress.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/radio-group.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/resizable.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/scroll-area.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/select.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/separator.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/sheet.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/sidebar.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/skeleton.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/slider.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/sonner.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/switch.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/table.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/tabs.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/textarea.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/toast.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/toaster.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/toggle-group.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/toggle.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/tooltip.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/use-mobile.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/ui/use-toast.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/components/validation-results.tsx","messages":[],"suppressedMessages":[{"ruleId":"@typescript-eslint/no-unused-vars","severity":1,"message":"'_idx' is defined but never used.","line":51,"column":7,"nodeType":null,"messageId":"unusedVar","endLine":51,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/hooks/use-mobile.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/lib/api-client.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/lib/utils.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/lib/validation-api.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/playwright.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tailwind.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/e2e/e2e.spec.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/Badge.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/Button.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/Card.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/ErrorDisplay.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/ScrollArea.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/Select.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/Tooltip.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/ValidationUI.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/accordion.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/alert-dialog.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/components/dropdown-menu.test.tsx","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/lib/utils.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/tests/unit/lib/validation-api.test.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/types/json-schema-static-docs.d.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]},{"filePath":"/home/lefab/Documents/JSON_Schema_Validator/types/validation.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-extra-semi","replacedBy":["@stylistic/js/no-extra-semi"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-extra-semi","url":"https://eslint.style/rules/js/no-extra-semi"}}]}},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":["@stylistic/js/no-mixed-spaces-and-tabs"],"info":{"message":"Formatting rules are being moved out of ESLint core.","url":"https://eslint.org/blog/2023/10/deprecating-formatting-rules/","deprecatedSince":"8.53.0","availableUntil":"10.0.0","replacedBy":[{"message":"ESLint Stylistic now maintains deprecated stylistic core rules.","url":"https://eslint.style/guide/migration","plugin":{"name":"@stylistic/eslint-plugin-js","url":"https://eslint.style/packages/js"},"rule":{"name":"no-mixed-spaces-and-tabs","url":"https://eslint.style/rules/js/no-mixed-spaces-and-tabs"}}]}}]}]