diff --git a/web/.eslintignore b/web/.eslintignore deleted file mode 100644 index eab18762b14..00000000000 --- a/web/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -generated -node_modules -vendor -templates/ -templates\ -ycache -regression/htmlcov diff --git a/web/.eslintrc.js b/web/.eslintrc.js index f0aee055e7a..8fbbd4c717e 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -6,98 +6,122 @@ // This software is released under the PostgreSQL Licence // ////////////////////////////////////////////////////////////// +const globals = require('globals'); +const js = require('@eslint/js'); +const reactjs = require('eslint-plugin-react'); +const jest = require('eslint-plugin-jest'); +const babel = require('@babel/eslint-plugin'); +const babelParser = require('@babel/eslint-parser'); +const ts = require('typescript-eslint'); -module.exports = { - 'env': { - 'browser': true, - 'es6': true, - 'amd': true, + +module.exports = [ + { + ignores: [ + '**/generated', + '**/node_modules', + '**/vendor', + '**/templates/', + '**/templates\\', + '**/ycache', + '**/regression/htmlcov', + ], }, - 'extends': [ - 'eslint:recommended', - 'plugin:react/recommended', - /* Uncomment the below line to use linter error for React Hooks. - By Default commented so that builds are generated successfully. - Once all the errors will be resolved will uncomment it and commit it. - */ - // "plugin:react-hooks/recommended", - ], - 'parser': '@babel/eslint-parser', - 'parserOptions': { - 'requireConfigFile': false, - 'ecmaVersion': 2018, - 'ecmaFeatures': { - 'jsx': true, + js.configs.recommended, + { + files: ['**/*.{js,jsx,mjs,cjs,ts,tsx}'], + languageOptions: { + 'parser': babelParser, + ecmaVersion: 2018, + parserOptions: { + 'ecmaFeatures': { + 'jsx': true, + }, + 'requireConfigFile': false, + 'babelOptions': { + 'plugins': [ + '@babel/plugin-syntax-jsx', + '@babel/plugin-proposal-class-properties', + ], + }, + }, + 'sourceType': 'module', + globals: { + ...globals.browser, + ...globals.es2017, + ...globals.amd, + '_': 'readonly', + 'module': 'readonly', + '__dirname': 'readonly', + 'global': 'readonly', + 'jest': 'readonly', + 'process': 'readonly', + }, }, - 'sourceType': 'module', - 'babelOptions': { - 'plugins': [ - '@babel/plugin-syntax-jsx', - '@babel/plugin-proposal-class-properties', - ], + 'plugins': { + 'react': reactjs, + '@babel': babel, }, - }, - 'plugins': [ - 'react', - '@babel', - 'jest' - ], - 'overrides': [ - { - 'files': ['**/*.{ts,tsx}'], - 'plugins': [ - '@typescript-eslint', + 'rules': { + 'indent': [ + 'error', + 2, + ], + 'linebreak-style': 0, + 'quotes': [ + 'error', + 'single', + ], + 'semi': [ + 'error', + 'always', + ], + 'comma-dangle': [ + 'error', + 'only-multiline', ], - 'extends': ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:@typescript-eslint/eslint-recommended'], - 'parser': '@typescript-eslint/parser', - 'rules': { - '@typescript-eslint/no-explicit-any': ['off'], - '@typescript-eslint/no-this-alias': ['off'], - } + 'no-console': ['error', { allow: ['warn', 'error'] }], + // We need to exclude below for RegEx case + 'no-useless-escape': 'off', + 'no-prototype-builtins': 'off', + 'no-global-assign': 'off', + 'no-import-assign': 'off', + 'react/jsx-uses-vars': 'error', + 'react/jsx-uses-react': 'error' }, - { - 'files': ['**/*{spec,test}.{js,jsx}', './regression/javascript/**/*.{js}'], - 'extends': ['eslint:recommended'], - 'env': { - 'jest': true - } + 'settings': { + 'react': { + 'version': 'detect', + }, }, - ], - 'globals': { - '_': true, - 'module': true, - '__dirname': true, - 'global': true, - 'jest': true }, - 'rules': { - 'indent': [ - 'error', - 2, - ], - 'linebreak-style': 0, - 'quotes': [ - 'error', - 'single', - ], - 'semi': [ - 'error', - 'always', - ], - 'comma-dangle': [ - 'error', - 'only-multiline', - ], - 'no-console': ['error', { allow: ['warn', 'error'] }], - // We need to exclude below for RegEx case - 'no-useless-escape': 0, - 'no-prototype-builtins': 0, - 'no-global-assign': 0, - 'no-import-assign': 0, - }, - 'settings': { - 'react': { - 'version': 'detect', + { + 'files': ['**/*.{ts,tsx}'], + languageOptions: { + 'parser': ts.parser, + }, + 'plugins': { + '@typescript-eslint': ts.plugin, }, + 'rules': { + 'no-unused-vars': 'off', + 'no-undef': 'off', + '@typescript-eslint/no-unused-vars': ['error'], + '@typescript-eslint/no-explicit-any': ['off'], + '@typescript-eslint/no-this-alias': ['off'], + } }, -}; + { + 'files': ['**/*{spec,test}.{js,jsx}', './regression/javascript/**/*.{js}'], + ...jest.configs['flat/recommended'], + rules: { + ...jest.configs['flat/recommended'].rules, + 'jest/prefer-expect-assertions': 'off', + 'jest/expect-expect': 'off', + 'jest/no-identical-title': 'off', + 'jest/no-done-callback': 'off', + 'jest/no-conditional-expect': 'off', + 'jest/valid-title': 'off', + }, + } +]; diff --git a/web/package.json b/web/package.json index 8bcda0eb0ad..7a36114395a 100644 --- a/web/package.json +++ b/web/package.json @@ -8,8 +8,8 @@ "license": "PostgreSQL", "devDependencies": { "@babel/core": "^7.10.2", - "@babel/eslint-parser": "^7.21.3", - "@babel/eslint-plugin": "^7.17.7", + "@babel/eslint-parser": "^7.24.7", + "@babel/eslint-plugin": "^7.24.7", "@babel/plugin-proposal-object-rest-spread": "^7.10.1", "@babel/plugin-syntax-jsx": "^7.16.0", "@babel/plugin-transform-runtime": "^7.22.15", @@ -25,8 +25,6 @@ "@testing-library/react": "16.0.0", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.4", - "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.12.0", "autoprefixer": "^10.2.4", "axios-mock-adapter": "^1.17.0", "babel-loader": "^9.1.3", @@ -36,11 +34,12 @@ "cross-env": "^7.0.3", "css-loader": "^6.7.2", "css-minimizer-webpack-plugin": "^5.0.0", - "eslint": "^8.37.0", + "eslint": "^9.5.0", "eslint-plugin-jest": "^27.4.0", - "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react": "^7.34.3", "eslint-plugin-react-hooks": "^4.3.0", "exports-loader": "^4.0.0", + "globals": "^15.8.0", "html-react-parser": "^5.0.6", "image-minimizer-webpack-plugin": "^4.0.2", "imagemin": "^8.0.1", @@ -62,6 +61,7 @@ "svgo-loader": "^2.2.0", "terser-webpack-plugin": "^5.1.1", "typescript": "^5.4.5", + "typescript-eslint": "^7.15.0", "url-loader": "^4.1.1", "webfonts-loader": "^8.0.1", "webpack": "^5.88.2", @@ -156,7 +156,7 @@ "zustand": "^4.4.1" }, "scripts": { - "linter": "yarn eslint --no-eslintrc -c .eslintrc.js --ext .js --ext .jsx --ext .ts --ext .tsx .", + "linter": "yarn run eslint -c .eslintrc.js .", "webpacker": "yarn run webpack --config webpack.config.js --progress", "webpacker:watch": "yarn run webpack --config webpack.config.js --progress --watch", "bundle:watch": "yarn run linter && yarn run webpacker:watch", @@ -175,5 +175,8 @@ "auditpy": "safety check --full-report -i 51668 -i 52495yarn npm audit", "audit-all": "yarn run auditjs && yarn run auditpy" }, - "packageManager": "yarn@3.8.3" + "packageManager": "yarn@3.8.3", + "browserslist": [ + "defaults and fully supports es6-module" + ] } diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.ui.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.ui.js index 9ba7c6e6bee..8ab594d20d4 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.ui.js +++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.ui.js @@ -32,8 +32,8 @@ export default class RoleSchema extends BaseUISchema { variables: [], rolbypassrls: false, }); - this.getVariableSchema = getVariableSchema; - this.getMembershipSchema = getMembershipSchema; + this.variableSchema = getVariableSchema(); + this.membershipSchema = getMembershipSchema(); this.fieldOptions = { role: [], ...fieldOptions, @@ -165,7 +165,7 @@ export default class RoleSchema extends BaseUISchema { disabled: obj.readOnly, mode: ['edit', 'create'], cell: 'text', type: 'collection', - schema: new obj.getMembershipSchema(), + schema: obj.membershipSchema, helpMessage: obj.isReadOnly ? gettext('Select the checkbox for roles to include WITH ADMIN OPTION.') : gettext('Roles shown with a check mark have the WITH ADMIN OPTION set.'), }, { @@ -183,7 +183,7 @@ export default class RoleSchema extends BaseUISchema { id: 'rolmembers', label: gettext('Members'), group: gettext('Membership'), mode: ['edit', 'create'], cell: 'text', type: 'collection', - schema: new obj.getMembershipSchema(), + schema: obj.membershipSchema, disabled: obj.readOnly, helpMessage: obj.isReadOnly ? gettext('Select the checkbox for roles to include WITH ADMIN OPTION.') : gettext('Roles shown with a check mark have the WITH ADMIN OPTION set.') , }, @@ -201,7 +201,7 @@ export default class RoleSchema extends BaseUISchema { { id: 'variables', label: '', type: 'collection', group: gettext('Parameters'), - schema: this.getVariableSchema(), + schema: this.variableSchema, mode: [ 'edit', 'create'], canAdd: true, canDelete: true, disabled: obj.readOnly, }, diff --git a/web/pgadmin/dashboard/static/js/Dashboard.jsx b/web/pgadmin/dashboard/static/js/Dashboard.jsx index 853fb2d6c88..6cd1915779e 100644 --- a/web/pgadmin/dashboard/static/js/Dashboard.jsx +++ b/web/pgadmin/dashboard/static/js/Dashboard.jsx @@ -468,7 +468,7 @@ function Dashboard({ link.click(); } document.body.removeChild(link); - } catch (error) { + } catch { setSsMsg(gettext('Failed to download the logs.')); } }; diff --git a/web/pgadmin/dashboard/static/js/SystemStats/CpuDetails.jsx b/web/pgadmin/dashboard/static/js/SystemStats/CpuDetails.jsx index 4207ff303c5..47e80dfa37f 100644 --- a/web/pgadmin/dashboard/static/js/SystemStats/CpuDetails.jsx +++ b/web/pgadmin/dashboard/static/js/SystemStats/CpuDetails.jsx @@ -6,7 +6,7 @@ // This software is released under the PostgreSQL Licence // ////////////////////////////////////////////////////////////// -// eslint-disable-next-line react/display-name + import React, { useState, useEffect, useRef, useReducer, useMemo } from 'react'; import PgTable from 'sources/components/PgTable'; import gettext from 'sources/gettext'; diff --git a/web/pgadmin/static/js/clipboard.js b/web/pgadmin/static/js/clipboard.js index 2ced92fd3ca..bb1e385766e 100644 --- a/web/pgadmin/static/js/clipboard.js +++ b/web/pgadmin/static/js/clipboard.js @@ -3,7 +3,7 @@ import pgAdmin from 'sources/pgadmin'; export async function copyToClipboard(text) { try { await navigator.clipboard.writeText(text); - } catch(err) { + } catch { /* Suppress error */ pgAdmin.Browser.notifier.error('Does not have clipboard access'); } diff --git a/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx b/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx index 1ac749ac442..a032e319ccb 100644 --- a/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx +++ b/web/pgadmin/static/js/components/ReactCodeMirror/components/Editor.jsx @@ -66,7 +66,7 @@ function handleDrop(e, editor) { if (e.stopPropagation) { e.stopPropagation(); } - } catch (error) { + } catch { /* if parsing fails, it must be the drag internal of codemirror text */ return false; } diff --git a/web/pgadmin/static/js/helpers/withColorPicker.js b/web/pgadmin/static/js/helpers/withColorPicker.js index c8668f4a118..2ac97de18e8 100644 --- a/web/pgadmin/static/js/helpers/withColorPicker.js +++ b/web/pgadmin/static/js/helpers/withColorPicker.js @@ -15,7 +15,7 @@ import PropTypes from 'prop-types'; import { fullHexColor } from '../utils'; export function withColorPicker(Component) { - // eslint-disable-next-line react/display-name + const HOCComponent = ({value, currObj, onChange, onSave, options, ...props})=>{ const pickrOptions = { showPalette: true, diff --git a/web/pgadmin/static/js/helpers/withStandardTabInfo.jsx b/web/pgadmin/static/js/helpers/withStandardTabInfo.jsx index e713c76bcbd..b22cfbf2f61 100644 --- a/web/pgadmin/static/js/helpers/withStandardTabInfo.jsx +++ b/web/pgadmin/static/js/helpers/withStandardTabInfo.jsx @@ -14,7 +14,7 @@ import { usePgAdmin } from '../../../static/js/BrowserComponent'; import ErrorBoundary from './ErrorBoundary'; export default function withStandardTabInfo(Component, tabId) { - // eslint-disable-next-line react/display-name + const HOCComponent = (props)=>{ const [[isStale, nodeItem, nodeData], setNodeInfo] = useState([true, undefined, undefined]); const pgAdmin = usePgAdmin(); diff --git a/web/pgadmin/static/js/to_px.js b/web/pgadmin/static/js/to_px.js index af1e3df7f87..15f0d679523 100644 --- a/web/pgadmin/static/js/to_px.js +++ b/web/pgadmin/static/js/to_px.js @@ -84,7 +84,7 @@ export default function toPx(value, prop, force, el) { // set the style on the target element try { style[prop] = value; - } catch (e) { + } catch { // IE 8 and below throw an exception when setting unsupported units return 0; } diff --git a/web/pgadmin/static/js/tree/ObjectExplorer.jsx b/web/pgadmin/static/js/tree/ObjectExplorer.jsx index fd6e52f1bd4..ac3c65d0cab 100644 --- a/web/pgadmin/static/js/tree/ObjectExplorer.jsx +++ b/web/pgadmin/static/js/tree/ObjectExplorer.jsx @@ -141,7 +141,7 @@ export default function ObjectExplorer() { try { const _node_path = parentPath + '/' + _data.id; return mtree.addNode(parentPath, _node_path, _data); - } catch (error) { + } catch { return null; // or throw error as you see fit } }; @@ -151,7 +151,7 @@ export default function ObjectExplorer() { try { await mtree.removeNode(path, _removeOnlyChild); return true; - } catch (error) { + } catch { return false; // or throw error as you see fit } }; @@ -161,7 +161,7 @@ export default function ObjectExplorer() { try { await mtree.updateNode(path, data); return true; - } catch (error) { + } catch { return false; // or throw error as you see fit } }; diff --git a/web/pgadmin/static/js/window.js b/web/pgadmin/static/js/window.js index 0b57b2d7051..b19b2be3afd 100644 --- a/web/pgadmin/static/js/window.js +++ b/web/pgadmin/static/js/window.js @@ -24,7 +24,7 @@ const pgWindow = function() { } else { localPgWindow = window; } - } catch (error) { + } catch { localPgWindow = window; } return localPgWindow; diff --git a/web/pgadmin/tools/debugger/static/js/DebuggerModule.js b/web/pgadmin/tools/debugger/static/js/DebuggerModule.js index a769aa827eb..1f8e3297e1e 100644 --- a/web/pgadmin/tools/debugger/static/js/DebuggerModule.js +++ b/web/pgadmin/tools/debugger/static/js/DebuggerModule.js @@ -367,7 +367,7 @@ export default class DebuggerModule { let browser_preferences = usePreferences.getState().getPreferencesForModule('browser'); let open_new_tab = browser_preferences.new_browser_tab_open; - const db_label = self.checkDbNameChange(data, dbNode, newTreeInfo, db_label); + const db_label = self.checkDbNameChange(data, dbNode, newTreeInfo); let label = getAppropriateLabel(newTreeInfo); pgAdmin.Browser.Events.trigger( 'pgadmin:tool:show', diff --git a/web/pgadmin/tools/debugger/static/js/components/DebuggerComponent.jsx b/web/pgadmin/tools/debugger/static/js/components/DebuggerComponent.jsx index 14359c634b5..b9547e40f79 100644 --- a/web/pgadmin/tools/debugger/static/js/components/DebuggerComponent.jsx +++ b/web/pgadmin/tools/debugger/static/js/components/DebuggerComponent.jsx @@ -147,7 +147,7 @@ export default function DebuggerComponent({ pgAdmin, selectedNodeInfo, panelId, } }); } - } catch (e) { + } catch { alert(xhr); pgAdmin.Browser.notifier.alert( gettext('Debugger Error'), diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/GeometryViewer.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/GeometryViewer.jsx index 5746594e254..916229e38c3 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/GeometryViewer.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/GeometryViewer.jsx @@ -87,7 +87,7 @@ function parseEwkbData(rows, column) { } supportedGeometries.push(geometry); geometryItemMap.set(geometry, item); - } catch (e) { + } catch { unsupportedRows.push(item); } return true; diff --git a/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx b/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx index b30c52eecba..413ff0d2a5e 100644 --- a/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx +++ b/web/pgadmin/tools/sqleditor/static/js/components/sections/ResultSet.jsx @@ -1075,7 +1075,7 @@ export function ResultSet() { 'info': gettext('This query was generated by pgAdmin as part of a "Save Data" operation'), }); }); - } catch (_e) {/* History errors should not bother others */} + } catch {/* History errors should not bother others */} if(!respData.data.status) { eventBus.fireEvent(QUERY_TOOL_EVENTS.SAVE_DATA_DONE, false); diff --git a/web/regression/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/regression/feature_tests/xss_checks_pgadmin_debugger_test.py index 8cd8ed99ca0..464cf215926 100644 --- a/web/regression/feature_tests/xss_checks_pgadmin_debugger_test.py +++ b/web/regression/feature_tests/xss_checks_pgadmin_debugger_test.py @@ -65,15 +65,23 @@ def _function_node_expandable(self): function_node.click() def _debug_function(self): + wait = WebDriverWait(self.page.driver, 2) self.page.driver.find_element(By.CSS_SELECTOR, NavMenuLocators.object_menu_css).click() + wait.until(EC.presence_of_element_located( + (By.CSS_SELECTOR, "div[data-label='Debugging']"))) + ActionChains( self.page.driver ).move_to_element( self.page.driver.find_element( By.CSS_SELECTOR, "div[data-label='Debugging']") ).perform() - time.sleep(2) + + # time.sleep(2) + wait.until(EC.presence_of_element_located( + (By.CSS_SELECTOR, "li[data-label='Debug']"))) + self.page.driver.find_element( By.CSS_SELECTOR, "li[data-label='Debug']").click() diff --git a/web/regression/javascript/fake_theme.js b/web/regression/javascript/fake_theme.js index dc0ca791754..b60d7218efc 100644 --- a/web/regression/javascript/fake_theme.js +++ b/web/regression/javascript/fake_theme.js @@ -2,7 +2,6 @@ import React from 'react'; import Theme from 'sources/Theme'; export function withTheme(WrappedComp) { - // eslint-disable-next-line react/display-name return (props)=>{ return ; }; diff --git a/web/regression/javascript/genericFunctions.jsx b/web/regression/javascript/genericFunctions.jsx index 6bedcd8549e..ab58144fb85 100644 --- a/web/regression/javascript/genericFunctions.jsx +++ b/web/regression/javascript/genericFunctions.jsx @@ -18,7 +18,6 @@ import { act, render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; export function withBrowser(WrappedComp) { - // eslint-disable-next-line react/display-name return (props)=>{ return diff --git a/web/yarn.lock b/web/yarn.lock index 189206ad078..316501a27f8 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -62,7 +62,7 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.21.3": +"@babel/eslint-parser@npm:^7.24.7": version: 7.24.7 resolution: "@babel/eslint-parser@npm:7.24.7" dependencies: @@ -76,7 +76,7 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-plugin@npm:^7.17.7": +"@babel/eslint-plugin@npm:^7.24.7": version: 7.24.7 resolution: "@babel/eslint-plugin@npm:7.24.7" dependencies: @@ -1880,27 +1880,45 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/config-array@npm:0.17.0" + dependencies: + "@eslint/object-schema": ^2.1.4 + debug: ^4.3.1 + minimatch: ^3.1.2 + checksum: 4a7eea8e8531045ae6836c7b899776663f120b75a074fd09c5bfa52304ee969053d1daad35c30e3f657ef578078c14fe277a5ff625bceb4166c6196ff44e5d02 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.0" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 + espree: ^10.0.1 + globals: ^14.0.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 + checksum: b0a9bbd98c8b9e0f4d975b042ff9b874dde722b20834ea2ff46551c3de740d4f10f56c449b790ef34d7f82147cbddfc22b004a43cc885dbc2664bb134766b5e4 languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 315dc65b0e9893e2bff139bddace7ea601ad77ed47b4550e73da8c9c2d2766c7a575c3cddf17ef85b8fd6a36ff34f91729d0dcca56e73ca887c10df91a41b0bb +"@eslint/js@npm:9.6.0": + version: 9.6.0 + resolution: "@eslint/js@npm:9.6.0" + checksum: 8d0c1cc81ae9182139a38555a56bd6387b663b45efa5ca642e1e50584926f749a68d497c8a5ca02d55661341a5b689fc7977c65b10191e2a315888ca403b8bcd + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 5a03094115bcdab7991dbbc5d17a9713f394cebb4b44d3eaf990d7487b9b8e1877b817997334ab40be52e299a0384595c6f6ba91b389901e5e1d21efda779271 languageName: node linkType: hard @@ -1956,17 +1974,6 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" - dependencies: - "@humanwhocodes/object-schema": ^2.0.2 - debug: ^4.3.1 - minimatch: ^3.0.5 - checksum: 861ccce9eaea5de19546653bccf75bf09fe878bc39c3aab00aeee2d2a0e654516adad38dd1098aab5e3af0145bbcbf3f309bdf4d964f8dab9dcd5834ae4c02f2 - languageName: node - linkType: hard - "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -1974,10 +1981,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.0 + resolution: "@humanwhocodes/retry@npm:0.3.0" + checksum: 4349cb8b60466a000e945fde8f8551cefb01ebba22ead4a92ac7b145f67f5da6b52e5a1e0c53185d732d0a49958ac29327934a4a5ac1d0bc20efb4429a4f7bf7 languageName: node linkType: hard @@ -3469,7 +3476,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.12.0": +"@typescript-eslint/eslint-plugin@npm:7.15.0": version: 7.15.0 resolution: "@typescript-eslint/eslint-plugin@npm:7.15.0" dependencies: @@ -3492,7 +3499,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.12.0": +"@typescript-eslint/parser@npm:7.15.0": version: 7.15.0 resolution: "@typescript-eslint/parser@npm:7.15.0" dependencies: @@ -3650,13 +3657,6 @@ __metadata: languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 - languageName: node - linkType: hard - "@vusion/webfonts-generator@npm:^0.8.0": version: 0.8.0 resolution: "@vusion/webfonts-generator@npm:0.8.0" @@ -3984,7 +3984,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.12.0, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2": version: 8.12.1 resolution: "acorn@npm:8.12.1" bin: @@ -6573,15 +6573,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" @@ -7144,7 +7135,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.33.2": +"eslint-plugin-react@npm:^7.34.3": version: 7.34.3 resolution: "eslint-plugin-react@npm:7.34.3" dependencies: @@ -7189,13 +7180,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.0.1": + version: 8.0.1 + resolution: "eslint-scope@npm:8.0.1" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e + checksum: 67a5a39312dadb8c9a677df0f2e8add8daf15280b08bfe07f898d5347ee2d7cd2a1f5c2760f34e46e8f5f13f7192f47c2c10abe676bfa4173ae5539365551940 languageName: node linkType: hard @@ -7206,47 +7197,50 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard -"eslint@npm:^8.37.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint-visitor-keys@npm:^4.0.0": + version: 4.0.0 + resolution: "eslint-visitor-keys@npm:4.0.0" + checksum: 5c09f89cf29d87cdbfbac38802a880d3c2e65f8cb61c689888346758f1e24a4c7f6caefeac9474dfa52058a99920623599bdb00516976a30134abeba91275aa2 + languageName: node + linkType: hard + +"eslint@npm:^9.5.0": + version: 9.6.0 + resolution: "eslint@npm:9.6.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.4 - "@eslint/js": 8.57.0 - "@humanwhocodes/config-array": ^0.11.14 + "@eslint/config-array": ^0.17.0 + "@eslint/eslintrc": ^3.1.0 + "@eslint/js": 9.6.0 "@humanwhocodes/module-importer": ^1.0.1 + "@humanwhocodes/retry": ^0.3.0 "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 - doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 + eslint-scope: ^8.0.1 + eslint-visitor-keys: ^4.0.0 + espree: ^10.1.0 + esquery: ^1.5.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 + file-entry-cache: ^8.0.0 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 ignore: ^5.2.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 levn: ^0.4.1 lodash.merge: ^4.6.2 @@ -7257,18 +7251,18 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 3a48d7ff85ab420a8447e9810d8087aea5b1df9ef68c9151732b478de698389ee656fd895635b5f2871c89ee5a2652b3f343d11e9db6f8486880374ebc74a2d9 + checksum: b3f3de28df0ebbccbd0863637523cd443569dd32d18da021a97b53f25b2f5bc7f788fe74da8e585da6bb7b2060d7a688e9dcaa35efaabb7b596c354ff4b07963 languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.1.0": + version: 10.1.0 + resolution: "espree@npm:10.1.0" dependencies: - acorn: ^8.9.0 + acorn: ^8.12.0 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 + eslint-visitor-keys: ^4.0.0 + checksum: a4708ab987f6c03734b8738b1588e9f31b2e305e869ca4677c60d82294eb05f7099b6687eb39eeb0913bb2d49bdf0bd0f31c511599ea7ee171281f871a9c897e languageName: node linkType: hard @@ -7282,7 +7276,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.5.0": version: 1.5.0 resolution: "esquery@npm:1.5.0" dependencies: @@ -7564,12 +7558,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: ^4.0.0 + checksum: f67802d3334809048c69b3d458f672e1b6d26daefda701761c81f203b80149c35dea04d78ea4238969dd617678e530876722a0634c43031a0957f10cc3ed190f languageName: node linkType: hard @@ -7727,14 +7721,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec + keyv: ^4.5.4 + checksum: 899fc86bf6df093547d76e7bfaeb900824b869d7d457d02e9b8aae24836f0a99fbad79328cfd6415ee8908f180699bf259dc7614f793447cb14f707caf5996f6 languageName: node linkType: hard @@ -8087,12 +8080,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: ^0.20.2 - checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 534b8216736a5425737f59f6e6a5c7f386254560c9f41d24a9227d60ee3ad4a9e82c5b85def0e212e9d92162f83a92544be4c7fd4c902cb913736c10e08237ac + languageName: node + linkType: hard + +"globals@npm:^15.8.0": + version: 15.8.0 + resolution: "globals@npm:15.8.0" + checksum: 92d0522c47226ca12f6fd8938df04b37852d812cc5a84e31890d919497f102a818d2081570bc08c2dd6353cd8b2699e7180bc468abbbec8c858a19e0fa53aeb8 languageName: node linkType: hard @@ -10141,7 +10139,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -10861,7 +10859,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -13937,8 +13935,8 @@ __metadata: resolution: "root-workspace-0b6124@workspace:." dependencies: "@babel/core": ^7.10.2 - "@babel/eslint-parser": ^7.21.3 - "@babel/eslint-plugin": ^7.17.7 + "@babel/eslint-parser": ^7.24.7 + "@babel/eslint-plugin": ^7.24.7 "@babel/plugin-proposal-class-properties": ^7.10.4 "@babel/plugin-proposal-object-rest-spread": ^7.10.1 "@babel/plugin-syntax-jsx": ^7.16.0 @@ -13975,8 +13973,6 @@ __metadata: "@types/jest": ^29.5.4 "@types/react": ^18.0.2 "@types/react-dom": ^18.0.0 - "@typescript-eslint/eslint-plugin": ^7.12.0 - "@typescript-eslint/parser": ^7.12.0 ajv: ^8.8.2 anti-trojan-source: ^1.4.0 aspen-decorations: ^1.0.2 @@ -14001,11 +13997,12 @@ __metadata: cssnano: ^5.0.2 date-fns: ^3.6.0 diff-arrays-of-objects: ^1.1.8 - eslint: ^8.37.0 + eslint: ^9.5.0 eslint-plugin-jest: ^27.4.0 - eslint-plugin-react: ^7.33.2 + eslint-plugin-react: ^7.34.3 eslint-plugin-react-hooks: ^4.3.0 exports-loader: ^4.0.0 + globals: ^15.8.0 hotkeys-js: ^3.13.3 html-react-parser: ^5.0.6 html-to-image: ^1.11.11 @@ -14066,6 +14063,7 @@ __metadata: svgo-loader: ^2.2.0 terser-webpack-plugin: ^5.1.1 typescript: ^5.4.5 + typescript-eslint: ^7.15.0 uplot: ^1.6.24 uplot-react: ^1.1.4 url-loader: ^4.1.1 @@ -15570,13 +15568,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -15650,6 +15641,22 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:^7.15.0": + version: 7.15.0 + resolution: "typescript-eslint@npm:7.15.0" + dependencies: + "@typescript-eslint/eslint-plugin": 7.15.0 + "@typescript-eslint/parser": 7.15.0 + "@typescript-eslint/utils": 7.15.0 + peerDependencies: + eslint: ^8.56.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 0a14724dba7a9f402db9d52f8d87b7d86b3472ffc0934627176b572680938ae60c584c5cb18db29335ea47293b6979a5ce6626d34507cd89726ceb15376c7d93 + languageName: node + linkType: hard + "typescript@npm:^5.4.5": version: 5.5.3 resolution: "typescript@npm:5.5.3"