From 003285506f0d06e9ba5e58334f93b4ed0959ab3b Mon Sep 17 00:00:00 2001 From: James Brunton Date: Thu, 4 Sep 2025 16:04:49 +0100 Subject: [PATCH 1/3] Enable ESLint no-useless-escape rule (#4344) # Description of Changes Enable ESLint [no-useless-escape rule](https://eslint.org/docs/latest/rules/no-useless-escape) --- frontend/eslint.config.mjs | 1 - frontend/scripts/generate-licenses.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index a8042355f..d39d66276 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -17,7 +17,6 @@ export default defineConfig( rules: { "no-empty-pattern": "off", // Temporarily disabled until codebase conformant "no-undef": "off", // Temporarily disabled until codebase conformant - "no-useless-escape": "off", // Temporarily disabled until codebase conformant "no-case-declarations": "off", // Temporarily disabled until codebase conformant "prefer-const": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/ban-ts-comment": "off", // Temporarily disabled until codebase conformant diff --git a/frontend/scripts/generate-licenses.js b/frontend/scripts/generate-licenses.js index aaac69800..7ab425e19 100644 --- a/frontend/scripts/generate-licenses.js +++ b/frontend/scripts/generate-licenses.js @@ -224,7 +224,7 @@ function getLicenseUrl(licenseType) { // Handle complex SPDX expressions like "(MIT AND Zlib)" or "(MIT OR CC0-1.0)" if (licenseType.includes('AND') || licenseType.includes('OR')) { // Extract the first license from compound expressions for URL - const match = licenseType.match(/\(?\s*([A-Za-z0-9\-\.]+)/); + const match = licenseType.match(/\(?\s*([A-Za-z0-9\-.]+)/); if (match && licenseUrls[match[1]]) { return licenseUrls[match[1]]; } From 74609e54fe7f6050084bdd713aa8cb8e441c59bb Mon Sep 17 00:00:00 2001 From: James Brunton Date: Thu, 4 Sep 2025 16:09:29 +0100 Subject: [PATCH 2/3] Enable ESLint prefer-const rule (#4349) # Description of Changes Enable ESLint [prefer-const rule](https://eslint.org/docs/latest/rules/prefer-const) --- frontend/eslint.config.mjs | 1 - .../src/services/enhancedPDFProcessingService.ts | 7 ++----- frontend/src/services/indexedDBManager.ts | 12 +++++------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index d39d66276..98acb81c4 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -18,7 +18,6 @@ export default defineConfig( "no-empty-pattern": "off", // Temporarily disabled until codebase conformant "no-undef": "off", // Temporarily disabled until codebase conformant "no-case-declarations": "off", // Temporarily disabled until codebase conformant - "prefer-const": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/ban-ts-comment": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-empty-object-type": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-explicit-any": "off", // Temporarily disabled until codebase conformant diff --git a/frontend/src/services/enhancedPDFProcessingService.ts b/frontend/src/services/enhancedPDFProcessingService.ts index f9f067c30..65d0c6519 100644 --- a/frontend/src/services/enhancedPDFProcessingService.ts +++ b/frontend/src/services/enhancedPDFProcessingService.ts @@ -182,7 +182,7 @@ export class EnhancedPDFProcessingService { ): Promise { const arrayBuffer = await file.arrayBuffer(); const pdf = await pdfWorkerManager.createDocument(arrayBuffer); - + try { const totalPages = pdf.numPages; @@ -519,10 +519,7 @@ export class EnhancedPDFProcessingService { this.notifyListeners(); // Force memory cleanup hint - if (typeof window !== 'undefined' && window.gc) { - let gc = window.gc; - setTimeout(() => gc(), 100); - } + setTimeout(() => window.gc?.(), 100); } /** diff --git a/frontend/src/services/indexedDBManager.ts b/frontend/src/services/indexedDBManager.ts index 2048c021f..9251998a3 100644 --- a/frontend/src/services/indexedDBManager.ts +++ b/frontend/src/services/indexedDBManager.ts @@ -73,7 +73,7 @@ class IndexedDBManager { request.onsuccess = () => { const db = request.result; console.log(`Successfully opened ${config.name}`); - + // Set up close handler to clean up our references db.onclose = () => { console.log(`Database ${config.name} closed`); @@ -87,13 +87,11 @@ class IndexedDBManager { request.onupgradeneeded = (event) => { const db = request.result; const oldVersion = event.oldVersion; - + console.log(`Upgrading ${config.name} from v${oldVersion} to v${config.version}`); // Create or update object stores config.stores.forEach(storeConfig => { - let store: IDBObjectStore; - if (db.objectStoreNames.contains(storeConfig.name)) { // Store exists - for now, just continue (could add migration logic here) console.log(`Object store '${storeConfig.name}' already exists`); @@ -109,7 +107,7 @@ class IndexedDBManager { options.autoIncrement = storeConfig.autoIncrement; } - store = db.createObjectStore(storeConfig.name, options); + const store = db.createObjectStore(storeConfig.name, options); console.log(`Created object store '${storeConfig.name}'`); // Create indexes @@ -168,7 +166,7 @@ class IndexedDBManager { return new Promise((resolve, reject) => { const deleteRequest = indexedDB.deleteDatabase(name); - + deleteRequest.onerror = () => reject(deleteRequest.error); deleteRequest.onsuccess = () => { console.log(`Deleted database: ${name}`); @@ -224,4 +222,4 @@ export const DATABASE_CONFIGS = { } as DatabaseConfig } as const; -export const indexedDBManager = IndexedDBManager.getInstance(); \ No newline at end of file +export const indexedDBManager = IndexedDBManager.getInstance(); From 94e8f603ffe9f1970f1f27fdacf20536b13df90f Mon Sep 17 00:00:00 2001 From: James Brunton Date: Thu, 4 Sep 2025 16:12:38 +0100 Subject: [PATCH 3/3] Enable ESLint no-unused-expressions rule (#4363) # Description of Changes Enable ESLint [no-unused-expressions rule](https://typescript-eslint.io/rules/no-unused-expressions/) --- frontend/eslint.config.mjs | 1 - frontend/src/components/tools/toolPicker/ToolSearch.tsx | 2 +- frontend/src/index.tsx | 7 +++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 98acb81c4..6bce88115 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -22,7 +22,6 @@ export default defineConfig( "@typescript-eslint/no-empty-object-type": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-explicit-any": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-require-imports": "off", // Temporarily disabled until codebase conformant - "@typescript-eslint/no-unused-expressions": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-unused-vars": "off", // Temporarily disabled until codebase conformant }, } diff --git a/frontend/src/components/tools/toolPicker/ToolSearch.tsx b/frontend/src/components/tools/toolPicker/ToolSearch.tsx index 53a01cb77..d4350044e 100644 --- a/frontend/src/components/tools/toolPicker/ToolSearch.tsx +++ b/frontend/src/components/tools/toolPicker/ToolSearch.tsx @@ -126,7 +126,7 @@ const ToolSearch = ({ key={id} variant="subtle" onClick={() => { - onToolSelect && onToolSelect(id); + onToolSelect?.(id); setDropdownOpen(false); }} leftSection={
{tool.icon}
} diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index 55fe7f046..38a0c1923 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -35,8 +35,11 @@ function updatePosthogConsent(){ return; } const optIn = (window.CookieConsent as any).acceptedCategory('analytics'); - optIn? - posthog.opt_in_capturing() : posthog.opt_out_capturing(); + if (optIn) { + posthog.opt_in_capturing(); + } else { + posthog.opt_out_capturing(); + } console.log("Updated analytics consent: ", optIn? "opted in" : "opted out"); }