Ver Fonte

Merge pull request #19757 from overleaf/ae-eslint-upgrade

Upgrade `@typescript-eslint` dependencies

GitOrigin-RevId: b953e795d705b817ec3669b04cd6a289be12b20d
Alf Eaton há 2 anos atrás
pai
commit
901d79dd55

Diff do ficheiro suprimidas por serem muito extensas
+ 373 - 415
package-lock.json


+ 2 - 1
package.json

@@ -6,7 +6,8 @@
   },
   "devDependencies": {
     "@types/mocha": "^10.0.6",
-    "@typescript-eslint/eslint-plugin": "^6.7.4",
+    "@typescript-eslint/eslint-plugin": "^8.0.0",
+    "@typescript-eslint/parser": "^8.0.0",
     "eslint": "^8.15.0",
     "eslint-config-prettier": "^8.5.0",
     "eslint-config-standard": "^17.0.0",

+ 18 - 34
services/web/.eslintrc.js

@@ -85,6 +85,8 @@ module.exports = {
         // we don't enforce this at the top-level - just in tests to manage `this` scope
         // based on mocha's context mechanism
         'mocha/prefer-arrow-callback': 'error',
+
+        '@typescript-eslint/no-unused-expressions': 'off',
       },
     },
     {
@@ -133,13 +135,20 @@ module.exports = {
             message:
               "Don't map ObjectId directly. Use `id => new ObjectId(id)` instead",
           },
+          // Catch incorrect usage of `await db.collection.find()`
+          {
+            selector:
+              "AwaitExpression > CallExpression > MemberExpression[property.name='find'][object.object.name='db']",
+            message:
+              'Mongo find returns a cursor not a promise, use `for await (const result of cursor)` or `.toArray()` instead.',
+          },
         ],
         '@typescript-eslint/no-floating-promises': 'error',
       },
     },
     {
-      // Backend tests and scripts specific rules
-      files: ['**/test/**/*.*', '**/scripts/*.*'],
+      // Backend scripts specific rules
+      files: ['**/scripts/**/*.js'],
       rules: {
         'no-restricted-syntax': [
           'error',
@@ -274,38 +283,6 @@ module.exports = {
         ],
         'no-restricted-syntax': [
           'error',
-          // Begin: Make sure angular can withstand minification
-          {
-            selector:
-              "CallExpression[callee.object.name='App'][callee.property.name=/run|directive|config|controller/] > :function[params.length > 0]",
-            message:
-              "Wrap the function in an array with the parameter names, to withstand minifcation. E.g. App.controller('MyController', ['param1', function(param1) {}]",
-          },
-          {
-            selector:
-              "CallExpression[callee.object.name='App'][callee.property.name=/run|directive|config|controller/] > ArrayExpression > ArrowFunctionExpression",
-            message:
-              'Use standard function syntax instead of arrow function syntax in angular components. E.g. function(param1) {}',
-          },
-          {
-            selector:
-              "CallExpression[callee.object.name='App'][callee.property.name=/run|directive|config|controller/] > ArrowFunctionExpression",
-            message:
-              'Use standard function syntax instead of arrow function syntax in angular components. E.g. function(param1) {}',
-          },
-          {
-            selector:
-              "CallExpression[callee.object.name='App'][callee.property.name=/run|directive|config|controller/] > ArrayExpression > :not(:function, Identifier):last-child",
-            message:
-              "Last element of the array must be a function. E.g ['param1', function(param1) {}]",
-          },
-          {
-            selector:
-              "CallExpression[callee.object.name='App'][callee.property.name=/run|directive|config|controller/] > ArrayExpression[elements.length=0]",
-            message:
-              "Array must not be empty. Add parameters and a function. E.g ['param1', function(param1) {}]",
-          },
-          // End: Make sure angular can withstand minification
           // prohibit direct calls to methods of window.localStorage
           {
             selector:
@@ -392,6 +369,13 @@ module.exports = {
         'no-undef': 'off',
       },
     },
+    // JavaScript-specific rules
+    {
+      files: ['**/*.js'],
+      rules: {
+        '@typescript-eslint/no-require-imports': 'off',
+      },
+    },
     {
       files: ['scripts/ukamf/*.js'],
       rules: {

+ 5 - 1
services/web/frontend/js/features/project-list/components/color-picker/color-picker.tsx

@@ -75,7 +75,11 @@ function MoreButton() {
 
   function handleKeyDown(event: React.KeyboardEvent<HTMLDivElement>) {
     if (event.key === 'Enter' || event.key === ' ') {
-      showCustomPicker ? closeCustomPicker() : openCustomPicker()
+      if (showCustomPicker) {
+        closeCustomPicker()
+      } else {
+        openCustomPicker()
+      }
     }
   }
 

+ 3 - 1
services/web/frontend/js/features/share-project-modal/components/restricted-link-sharing/edit-member.tsx

@@ -150,7 +150,9 @@ export default function EditMember({
           <SelectPrivilege
             value={privileges}
             handleChange={value => {
-              value && handlePrivilegeChange(value.key)
+              if (value) {
+                handlePrivilegeChange(value.key)
+              }
             }}
             canAddCollaborators={canAddCollaborators}
           />

+ 1 - 2
services/web/package.json

@@ -85,6 +85,7 @@
     "@overleaf/redis-wrapper": "*",
     "@overleaf/settings": "*",
     "@slack/webhook": "^7.0.2",
+    "@types/dateformat": "^5.0.2",
     "@xmldom/xmldom": "^0.7.13",
     "accepts": "^1.3.7",
     "ajv": "^8.12.0",
@@ -251,8 +252,6 @@
     "@types/recurly__recurly-js": "^4.22.0",
     "@types/sinon-chai": "^3.2.8",
     "@types/uuid": "^9.0.8",
-    "@typescript-eslint/eslint-plugin": "^7.8.0",
-    "@typescript-eslint/parser": "^7.8.0",
     "@uppy/core": "^3.8.0",
     "@uppy/dashboard": "^3.7.1",
     "@uppy/drag-drop": "^3.0.3",

+ 3 - 1
services/web/scripts/add_salesforce_data_to_subscriptions.js

@@ -134,7 +134,9 @@ async function processRows(rows) {
           update,
           { upsert: false }
         )
-        result.matchedCount && stats.db.matched++
+        if (result.matchedCount) {
+          stats.db.matched++
+        }
         if (result.modifiedCount) {
           stats.db.updated++
           if (verbose) {

+ 9 - 10
services/web/test/frontend/features/project-list/fixtures/projects-data.ts

@@ -3,8 +3,7 @@ import {
   isDeletableProject,
   isLeavableProject,
 } from '../../../../../frontend/js/features/project-list/util/project'
-
-const moment = require('moment')
+import moment from 'moment'
 
 export const owner = {
   id: '624333f147cfd8002622a1d3',
@@ -38,7 +37,7 @@ const users = {
 export const copyableProject = <Project>{
   id: '62f17f594641b405ca2b3264',
   name: 'Starfleet Report (owner)',
-  lastUpdated: moment().subtract(1, 'day').toDate(),
+  lastUpdated: moment().subtract(1, 'day').toISOString(),
   lastUpdatedBy: users.picard,
   accessLevel: 'owner',
   source: 'owner',
@@ -50,7 +49,7 @@ export const copyableProject = <Project>{
 export const archiveableProject = <Project>{
   id: '62d6d3721357e20a682110d5',
   name: "Captain's logs (Invite & Read Only)",
-  lastUpdated: moment().subtract(1, 'week').toDate(),
+  lastUpdated: moment().subtract(1, 'week').toISOString(),
   lastUpdatedBy: users.picard,
   accessLevel: 'readOnly',
   source: 'invite',
@@ -62,7 +61,7 @@ export const archiveableProject = <Project>{
 export const trashedProject = <Project>{
   id: '42f17f594641b405ca2b3265',
   name: 'Starfleet Report draft (owner & trashed)',
-  lastUpdated: moment().subtract(2, 'year').toDate(),
+  lastUpdated: moment().subtract(2, 'year').toISOString(),
   lastUpdatedBy: users.picard,
   accessLevel: 'owner',
   source: 'owner',
@@ -74,7 +73,7 @@ export const trashedProject = <Project>{
 export const archivedProject = <Project>{
   id: '52f17f594641b405ca2b3266',
   name: 'Starfleet Report old (owner & archive)',
-  lastUpdated: moment().subtract(1, 'year').toDate(),
+  lastUpdated: moment().subtract(1, 'year').toISOString(),
   lastUpdatedBy: users.picard,
   accessLevel: 'owner',
   source: 'owner',
@@ -86,7 +85,7 @@ export const archivedProject = <Project>{
 export const trashedAndNotOwnedProject = <Project>{
   id: '63d6d3721357e20a682110d5',
   name: "Captain's logs very old (Trashed & Read Only & Not Owned)",
-  lastUpdated: moment().subtract(11, 'year').toDate(),
+  lastUpdated: moment().subtract(11, 'year').toISOString(),
   lastUpdatedBy: users.picard,
   accessLevel: 'readOnly',
   source: 'invite',
@@ -105,7 +104,7 @@ export const projectsData: Array<Project> = [
   {
     id: '62b5cdf85212090c2244161c',
     name: 'Enterprise Security Analysis | Deflector Shields, Sensors, Tractor Beams, and Cloaking Devices (Invite & Edit)',
-    lastUpdated: moment().subtract(1, 'month').toDate(),
+    lastUpdated: moment().subtract(1, 'month').toISOString(),
     lastUpdatedBy: users.worf,
     accessLevel: 'readWrite',
     source: 'invite',
@@ -116,7 +115,7 @@ export const projectsData: Array<Project> = [
   {
     id: '624380431c2e40006c59b922',
     name: 'VISOR Sensors (Link Sharing & Edit)',
-    lastUpdated: moment().subtract(2, 'months').toDate(),
+    lastUpdated: moment().subtract(2, 'months').toISOString(),
     lastUpdatedBy: users.laforge,
     accessLevel: 'readAndWrite',
     source: 'token',
@@ -127,7 +126,7 @@ export const projectsData: Array<Project> = [
   {
     id: '62f51b31f6f4c60027e8935f',
     name: 'United Federation of Planets (Link Sharing & View Only)',
-    lastUpdated: moment().subtract(2, 'year').toDate(),
+    lastUpdated: moment().subtract(2, 'year').toISOString(),
     lastUpdatedBy: null,
     accessLevel: 'readOnly',
     source: 'token',

+ 1 - 1
services/web/test/frontend/features/subscription/fixtures/subscriptions.ts

@@ -3,8 +3,8 @@ import {
   GroupSubscription,
   RecurlySubscription,
 } from '../../../../../types/subscription/dashboard/subscription'
+import dateformat from 'dateformat'
 
-const dateformat = require('dateformat')
 const today = new Date()
 const oneYearFromToday = new Date().setFullYear(today.getFullYear() + 1)
 const nextPaymentDueAt = dateformat(oneYearFromToday, 'dS mmmm yyyy')

+ 1 - 1
services/web/test/frontend/features/subscription/util/is-in-free-trial.test.ts

@@ -1,6 +1,6 @@
 import { expect } from 'chai'
 import isInFreeTrial from '../../../../../frontend/js/features/subscription/util/is-in-free-trial'
-const dateformat = require('dateformat')
+import dateformat from 'dateformat'
 
 describe('isInFreeTrial', function () {
   it('returns false when no date sent', function () {

+ 1 - 1
services/web/test/frontend/features/subscription/util/show-downgrade-option.test.ts

@@ -1,6 +1,6 @@
 import { expect } from 'chai'
 import showDowngradeOption from '../../../../../frontend/js/features/subscription/util/show-downgrade-option'
-const dateformat = require('dateformat')
+import dateformat from 'dateformat'
 
 describe('showDowngradeOption', function () {
   const today = new Date()

+ 1 - 1
services/web/types/utils.ts

@@ -1,6 +1,6 @@
 export type Nullable<T> = T | null
 
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
+// eslint-disable-next-line @typescript-eslint/no-empty-interface, @typescript-eslint/no-empty-object-type
 interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {}
 
 type DeepReadonlyObject<T> = {

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff