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

Upgrade `@typescript-eslint` dependencies

GitOrigin-RevId: b953e795d705b817ec3669b04cd6a289be12b20d
This commit is contained in:
Alf Eaton 2024-08-07 09:16:51 +01:00 committed by Copybot
parent 6ec26060e4
commit 901d79dd55
12 changed files with 789 additions and 920 deletions

1572
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -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",

View file

@ -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: {

View file

@ -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()
}
}
}

View file

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

View file

@ -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",

View file

@ -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) {

View file

@ -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',

View file

@ -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')

View file

@ -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 () {

View file

@ -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()

View file

@ -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> = {