Sfoglia il codice sorgente

Merge pull request #3830 from overleaf/em-upgrade-node-12

Upgrade to Node 12

GitOrigin-RevId: 19870922884b7c98e7e5f2c94df21829672d2db5
Eric Mc Sween 5 anni fa
parent
commit
9ddaa8c9f6
100 ha cambiato i file con 599 aggiunte e 907 eliminazioni
  1. 1 1
      services/web/Dockerfile
  2. 1 1
      services/web/Dockerfile.frontend
  3. 1 1
      services/web/docker-compose.yml
  4. 1 1
      services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/CommandManager.js
  5. 3 1
      services/web/frontend/js/ide/file-tree/FileTreeManager.js
  6. 6 2
      services/web/frontend/js/ide/review-panel/RangesTracker.js
  7. 0 10
      services/web/modules/launchpad/test/unit/src/LaunchpadControllerTests.js
  8. 0 3
      services/web/modules/user-activate/test/unit/src/UserActivateControllerTests.js
  9. 375 124
      services/web/package-lock.json
  10. 3 3
      services/web/package.json
  11. 2 0
      services/web/test/acceptance/bootstrap.js
  12. 0 1
      services/web/test/acceptance/src/CloseSiteTests.js
  13. 1 4
      services/web/test/acceptance/src/ModelTests.js
  14. 2 3
      services/web/test/acceptance/src/ProxyUrls.js
  15. 3 4
      services/web/test/acceptance/src/RedirectUrlsTests.js
  16. 1 2
      services/web/test/acceptance/src/RegistrationTests.js
  17. 3 3
      services/web/test/acceptance/src/SettingsTests.js
  18. 1 6
      services/web/test/acceptance/src/UserHelperTests.js
  19. 0 1
      services/web/test/acceptance/src/UserReconfirmTests.js
  20. 1 3
      services/web/test/acceptance/src/UserThirdPartyIdentityTests.js
  21. 99 38
      services/web/test/unit/bootstrap.js
  22. 0 6
      services/web/test/unit/src/Analytics/AnalyticsControllerTests.js
  23. 0 6
      services/web/test/unit/src/Analytics/AnalyticsManagerTests.js
  24. 1 11
      services/web/test/unit/src/Authentication/AuthenticationControllerTests.js
  25. 1 6
      services/web/test/unit/src/Authentication/AuthenticationManagerTests.js
  26. 1 6
      services/web/test/unit/src/Authorization/AuthorizationManagerTests.js
  27. 0 4
      services/web/test/unit/src/Authorization/AuthorizationMiddlewareTests.js
  28. 0 10
      services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.js
  29. 2 5
      services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.js
  30. 1 11
      services/web/test/unit/src/BrandVariations/BrandVariationsHandlerTests.js
  31. 0 9
      services/web/test/unit/src/Chat/ChatApiHandlerTests.js
  32. 1 9
      services/web/test/unit/src/Chat/ChatControllerTests.js
  33. 1 10
      services/web/test/unit/src/Collaborators/CollaboratorsControllerTests.js
  34. 0 3
      services/web/test/unit/src/Collaborators/CollaboratorsGetterTests.js
  35. 0 9
      services/web/test/unit/src/Collaborators/CollaboratorsHandlerTests.js
  36. 1 12
      services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.js
  37. 1 12
      services/web/test/unit/src/Collaborators/CollaboratorsInviteHandlerTests.js
  38. 1 9
      services/web/test/unit/src/Collaborators/OwnershipTransferHandlerTests.js
  39. 2 14
      services/web/test/unit/src/Compile/ClsiCookieManagerTests.js
  40. 2 12
      services/web/test/unit/src/Compile/ClsiFormatCheckerTests.js
  41. 1 12
      services/web/test/unit/src/Compile/ClsiManagerTests.js
  42. 2 12
      services/web/test/unit/src/Compile/ClsiStateManagerTests.js
  43. 1 11
      services/web/test/unit/src/Compile/CompileControllerTests.js
  44. 1 11
      services/web/test/unit/src/Compile/CompileManagerTests.js
  45. 1 11
      services/web/test/unit/src/Contact/ContactControllerTests.js
  46. 0 5
      services/web/test/unit/src/Contact/ContactManagerTests.js
  47. 1 6
      services/web/test/unit/src/Cooldown/CooldownManagerTests.js
  48. 1 6
      services/web/test/unit/src/Cooldown/CooldownMiddlewareTests.js
  49. 0 11
      services/web/test/unit/src/Docstore/DocstoreManagerTests.js
  50. 0 4
      services/web/test/unit/src/DocumentUpdater/DocumentUpdaterHandlerTests.js
  51. 1 11
      services/web/test/unit/src/Documents/DocumentControllerTests.js
  52. 1 3
      services/web/test/unit/src/Documents/DocumentHelperTests.js
  53. 1 7
      services/web/test/unit/src/Downloads/ProjectDownloadsControllerTests.js
  54. 1 10
      services/web/test/unit/src/Downloads/ProjectZipStreamManagerTests.js
  55. 1 9
      services/web/test/unit/src/Editor/EditorControllerTests.js
  56. 0 8
      services/web/test/unit/src/Editor/EditorHttpControllerTests.js
  57. 0 4
      services/web/test/unit/src/Editor/EditorRealTimeControllerTests.js
  58. 1 7
      services/web/test/unit/src/Email/EmailBuilderTests.js
  59. 1 7
      services/web/test/unit/src/Email/EmailHandlerTests.js
  60. 1 5
      services/web/test/unit/src/Email/EmailMessageHelperTests.js
  61. 0 8
      services/web/test/unit/src/Email/EmailSenderTests.js
  62. 1 10
      services/web/test/unit/src/Errors/HttpErrorHandlerTests.js
  63. 1 9
      services/web/test/unit/src/Exports/ExportsControllerTests.js
  64. 1 11
      services/web/test/unit/src/Exports/ExportsHandlerTests.js
  65. 0 7
      services/web/test/unit/src/FileStore/FileStoreControllerTests.js
  66. 1 11
      services/web/test/unit/src/FileStore/FileStoreHandlerTests.js
  67. 1 5
      services/web/test/unit/src/HelperFiles/AuthorizationHelperTests.js
  68. 1 2
      services/web/test/unit/src/HelperFiles/UrlHelperTests.js
  69. 0 10
      services/web/test/unit/src/History/HistoryControllerTests.js
  70. 0 3
      services/web/test/unit/src/History/HistoryManagerTests.js
  71. 1 9
      services/web/test/unit/src/History/RestoreManagerTests.js
  72. 0 14
      services/web/test/unit/src/InactiveData/InactiveProjectManagerTests.js
  73. 14 24
      services/web/test/unit/src/Institutions/InstitutionsAPITests.js
  74. 1 7
      services/web/test/unit/src/Institutions/InstitutionsControllerTests.js
  75. 0 8
      services/web/test/unit/src/Institutions/InstitutionsFeaturesTests.js
  76. 1 9
      services/web/test/unit/src/Institutions/InstitutionsGetterTests.js
  77. 6 12
      services/web/test/unit/src/Institutions/InstitutionsManagerTests.js
  78. 1 11
      services/web/test/unit/src/Metadata/MetaControllerTests.js
  79. 1 6
      services/web/test/unit/src/Metadata/MetaHandlerTests.js
  80. 1 3
      services/web/test/unit/src/Newsletter/NewsletterManagerTests.js
  81. 1 9
      services/web/test/unit/src/Notifications/NotificationsBuilderTests.js
  82. 0 8
      services/web/test/unit/src/Notifications/NotificationsControllerTests.js
  83. 1 9
      services/web/test/unit/src/Notifications/NotificationsHandlerTests.js
  84. 0 9
      services/web/test/unit/src/PasswordReset/PasswordResetControllerTests.js
  85. 2 11
      services/web/test/unit/src/PasswordReset/PasswordResetHandlerTests.js
  86. 1 10
      services/web/test/unit/src/Project/DocLinesComparitorTests.js
  87. 1 9
      services/web/test/unit/src/Project/ProjectApiControllerTests.js
  88. 1 6
      services/web/test/unit/src/Project/ProjectCollabratecDetailsTest.js
  89. 0 10
      services/web/test/unit/src/Project/ProjectControllerTests.js
  90. 0 4
      services/web/test/unit/src/Project/ProjectCreationHandlerTests.js
  91. 2 13
      services/web/test/unit/src/Project/ProjectDeleterTests.js
  92. 0 8
      services/web/test/unit/src/Project/ProjectDetailsHandlerTests.js
  93. 1 9
      services/web/test/unit/src/Project/ProjectDuplicatorTests.js
  94. 16 20
      services/web/test/unit/src/Project/ProjectEditorHandlerTests.js
  95. 1 12
      services/web/test/unit/src/Project/ProjectEntityHandlerTests.js
  96. 0 10
      services/web/test/unit/src/Project/ProjectEntityMongoUpdateHandlerTests.js
  97. 1 13
      services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js
  98. 2 8
      services/web/test/unit/src/Project/ProjectGetterTests.js
  99. 1 2
      services/web/test/unit/src/Project/ProjectHelperTests.js
  100. 1 12
      services/web/test/unit/src/Project/ProjectHistoryHandlerTests.js

+ 1 - 1
services/web/Dockerfile

@@ -1,5 +1,5 @@
 # the base image is suitable for running web with /app bind mounted
-FROM node:10.23.1 as base
+FROM node:12.21.0 as base
 
 WORKDIR /app
 

+ 1 - 1
services/web/Dockerfile.frontend

@@ -1,4 +1,4 @@
-FROM node:10.23.1
+FROM node:12.21.0
 
 # Install Google Chrome
 RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -

+ 1 - 1
services/web/docker-compose.yml

@@ -19,7 +19,7 @@ services:
     user: node
 
   test_acceptance:
-    image: node:10.23.1
+    image: node:12.21.0
     volumes:
       - .:/app
     working_dir: /app

+ 1 - 1
services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/CommandManager.js

@@ -87,7 +87,7 @@ class Parser {
     // check incidentals, see if we should pluck out a match
     if (incidentalCommands.length > 1) {
       const bestMatch = incidentalCommands.sort(
-        (a, b) => a[1] + a[2] < b[1] + b[2]
+        (a, b) => b[1] + b[2] - (a[1] + a[2])
       )[0]
       realCommands.push(bestMatch)
     }

+ 3 - 1
services/web/frontend/js/ide/file-tree/FileTreeManager.js

@@ -477,8 +477,10 @@ export default FileTreeManager = class FileTreeManager {
         return -(aDepth - bDepth) // Deeper path == folder first
       } else if (a.path < b.path) {
         return -1
-      } else {
+      } else if (a.path > b.path) {
         return 1
+      } else {
+        return 0
       }
     })
   }

+ 6 - 2
services/web/frontend/js/ide/review-panel/RangesTracker.js

@@ -705,8 +705,10 @@ export default RangesTracker = class RangesTracker {
         return result
       } else if (c1.op.i != null && c2.op.d != null) {
         return 1
-      } else {
+      } else if (c1.op.d != null && c2.op.i != null) {
         return -1
+      } else {
+        return 0
       }
     })
 
@@ -727,8 +729,10 @@ export default RangesTracker = class RangesTracker {
         return result
       } else if (a.i != null && b.d != null) {
         return 1
-      } else {
+      } else if (a.d != null && b.i != null) {
         return -1
+      } else {
+        return 0
       }
     })
 

+ 0 - 10
services/web/modules/launchpad/test/unit/src/LaunchpadControllerTests.js

@@ -12,7 +12,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-require('chai').should()
 const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = require('path').join(
@@ -31,17 +30,8 @@ describe('LaunchpadController', function() {
 
     this.User = {}
     this.LaunchpadController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': (this.Settings = {}),
-        'logger-sharelatex': (this.Logger = {
-          log() {},
-          warn() {},
-          err() {},
-          error() {}
-        }),
         '@overleaf/metrics': (this.Metrics = {}),
         '../../../../app/src/Features/User/UserRegistrationHandler': (this.UserRegistrationHandler = {}),
         '../../../../app/src/Features/Email/EmailHandler': (this.EmailHandler = {}),

+ 0 - 3
services/web/modules/user-activate/test/unit/src/UserActivateControllerTests.js

@@ -19,9 +19,6 @@ describe('UserActivateController', function() {
     this.UserGetter = { getUser: sinon.stub() }
     this.ErrorController = { notFound: sinon.stub() }
     this.UserActivateController = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         '../../../../app/src/Features/User/UserGetter': this.UserGetter,
         '../../../../app/src/Features/Errors/ErrorController': this

+ 375 - 124
services/web/package-lock.json

@@ -3401,9 +3401,9 @@
       },
       "dependencies": {
         "core-js": {
-          "version": "3.8.3",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz",
-          "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q=="
+          "version": "3.9.1",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz",
+          "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg=="
         }
       }
     },
@@ -6000,6 +6000,12 @@
         "cuid": "^2.1.1"
       }
     },
+    "@ungap/promise-all-settled": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+      "dev": true
+    },
     "@webassemblyjs/ast": {
       "version": "1.9.0",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@@ -14928,21 +14934,10 @@
       }
     },
     "flat": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
-      "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
-      "dev": true,
-      "requires": {
-        "is-buffer": "~2.0.3"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
-          "dev": true
-        }
-      }
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "dev": true
     },
     "flat-cache": {
       "version": "3.0.4",
@@ -15440,7 +15435,7 @@
     "functional-red-black-tree": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
       "dev": true
     },
     "functions-have-names": {
@@ -20718,128 +20713,369 @@
       }
     },
     "mocha": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz",
-      "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz",
+      "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==",
       "dev": true,
       "requires": {
-        "ansi-colors": "3.2.3",
+        "@ungap/promise-all-settled": "1.1.2",
+        "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
-        "debug": "3.2.6",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "find-up": "3.0.0",
-        "glob": "7.1.3",
+        "chokidar": "3.5.1",
+        "debug": "4.3.1",
+        "diff": "5.0.0",
+        "escape-string-regexp": "4.0.0",
+        "find-up": "5.0.0",
+        "glob": "7.1.6",
         "growl": "1.10.5",
         "he": "1.2.0",
-        "js-yaml": "3.13.1",
-        "log-symbols": "2.2.0",
+        "js-yaml": "4.0.0",
+        "log-symbols": "4.0.0",
         "minimatch": "3.0.4",
-        "mkdirp": "0.5.1",
-        "ms": "2.1.1",
-        "node-environment-flags": "1.0.5",
-        "object.assign": "4.1.0",
-        "strip-json-comments": "2.0.1",
-        "supports-color": "6.0.0",
-        "which": "1.3.1",
+        "ms": "2.1.3",
+        "nanoid": "3.1.20",
+        "serialize-javascript": "5.0.1",
+        "strip-json-comments": "3.1.1",
+        "supports-color": "8.1.1",
+        "which": "2.0.2",
         "wide-align": "1.1.3",
-        "yargs": "13.3.0",
-        "yargs-parser": "13.1.1",
-        "yargs-unparser": "1.6.0"
+        "workerpool": "6.1.0",
+        "yargs": "16.2.0",
+        "yargs-parser": "20.2.4",
+        "yargs-unparser": "2.0.0"
       },
       "dependencies": {
         "ansi-colors": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
-          "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+          "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
           "dev": true
         },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "dev": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
           "dev": true
         },
+        "binary-extensions": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+          "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+          "dev": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.5.1",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+          "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+          "dev": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.3.1",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.5.0"
+          }
+        },
+        "cliui": {
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+          "dev": true,
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^7.0.0"
+          }
+        },
         "debug": {
-          "version": "3.2.6",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
-          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
           "dev": true,
           "requires": {
-            "ms": "^2.1.1"
+            "ms": "2.1.2"
+          },
+          "dependencies": {
+            "ms": {
+              "version": "2.1.2",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+              "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+              "dev": true
+            }
+          }
+        },
+        "diff": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+          "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+          "dev": true
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+          "dev": true
+        },
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+          "dev": true
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
           }
         },
         "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
           "dev": true,
           "requires": {
-            "locate-path": "^3.0.0"
+            "locate-path": "^6.0.0",
+            "path-exists": "^4.0.0"
           }
         },
-        "glob": {
-          "version": "7.1.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-          "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+        "glob-parent": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+          "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
           "dev": true,
           "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
+            "is-glob": "^4.0.1"
           }
         },
-        "locate-path": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "dev": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-fullwidth-code-point": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
+          "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
           "dev": true,
           "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
+            "argparse": "^2.0.1"
           }
         },
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q=="
+        "locate-path": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+          "dev": true,
+          "requires": {
+            "p-locate": "^5.0.0"
+          }
+        },
+        "log-symbols": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+          "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         },
         "ms": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
           "dev": true
         },
-        "p-locate": {
+        "normalize-path": {
           "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+          "dev": true
+        },
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
-            "p-limit": "^2.0.0"
+            "yocto-queue": "^0.1.0"
           }
         },
-        "supports-color": {
+        "p-locate": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^3.0.2"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "readdirp": {
+          "version": "3.5.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+          "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+          "dev": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "serialize-javascript": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+          "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+          "dev": true,
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
           "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
-          "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
           "dev": true,
           "requires": {
-            "has-flag": "^3.0.0"
+            "ansi-regex": "^5.0.0"
           }
         },
-        "yargs-parser": {
-          "version": "13.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
-          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+        "strip-json-comments": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+          "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "8.1.1",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
           "dev": true,
           "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "has-flag": "^4.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "dev": true,
+          "requires": {
+            "isexe": "^2.0.0"
           }
+        },
+        "wrap-ansi": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+          "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "y18n": {
+          "version": "5.0.5",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+          "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
+          "dev": true
+        },
+        "yargs": {
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+          "dev": true,
+          "requires": {
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
+            "get-caller-file": "^2.0.5",
+            "require-directory": "^2.1.1",
+            "string-width": "^4.2.0",
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
+          }
+        },
+        "yargs-parser": {
+          "version": "20.2.4",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+          "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+          "dev": true
         }
       }
     },
@@ -21147,6 +21383,12 @@
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
       "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw=="
     },
+    "nanoid": {
+      "version": "3.1.20",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+      "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
+      "dev": true
+    },
     "nanomatch": {
       "version": "1.2.9",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
@@ -21185,7 +21427,7 @@
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
     },
     "ncp": {
@@ -21334,24 +21576,6 @@
       "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz",
       "integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw=="
     },
-    "node-environment-flags": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
-      "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
-      "dev": true,
-      "requires": {
-        "object.getownpropertydescriptors": "^2.0.3",
-        "semver": "^5.7.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-          "dev": true
-        }
-      }
-    },
     "node-fetch": {
       "version": "2.6.1",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
@@ -27008,7 +27232,7 @@
     "require-like": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
-      "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==",
+      "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=",
       "dev": true
     },
     "require-main-filename": {
@@ -27410,19 +27634,19 @@
       }
     },
     "sandboxed-module": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-0.3.0.tgz",
-      "integrity": "sha1-8fvvvYCaT2kHO9B8rm/H2y6vX2o=",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.4.tgz",
+      "integrity": "sha512-AwEPOdO8mg/wJjr876yCHP2DHqVN0MaggEXhp6IIf3bcI5cYoQl9QrrCHSrvToHjvdEiS5x4TVZRgjD2bEmNTA==",
       "dev": true,
       "requires": {
         "require-like": "0.1.2",
-        "stack-trace": "0.0.6"
+        "stack-trace": "0.0.9"
       },
       "dependencies": {
         "stack-trace": {
-          "version": "0.0.6",
-          "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz",
-          "integrity": "sha1-HnGb1qJin/CcGJ4Xqe+QKpT8XbA=",
+          "version": "0.0.9",
+          "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
+          "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=",
           "dev": true
         }
       }
@@ -32922,6 +33146,12 @@
         "microevent.ts": "~0.1.1"
       }
     },
+    "workerpool": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz",
+      "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==",
+      "dev": true
+    },
     "wrap-ansi": {
       "version": "6.2.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -33274,14 +33504,35 @@
       }
     },
     "yargs-unparser": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
-      "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
       "requires": {
-        "flat": "^4.1.0",
-        "lodash": "^4.17.15",
-        "yargs": "^13.3.0"
+        "camelcase": "^6.0.0",
+        "decamelize": "^4.0.0",
+        "flat": "^5.0.2",
+        "is-plain-obj": "^2.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+          "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+          "dev": true
+        },
+        "decamelize": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+          "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+          "dev": true
+        },
+        "is-plain-obj": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+          "dev": true
+        }
       }
     },
     "yauzl": {

+ 3 - 3
services/web/package.json

@@ -14,7 +14,7 @@
   "scripts": {
     "test:acceptance:run_dir": "mocha --recursive --timeout 25000 --exit --grep=$MOCHA_GREP --require test/acceptance/bootstrap.js",
     "test:acceptance:app": "npm run test:acceptance:run_dir -- test/acceptance/src",
-    "test:unit:run_dir": "mocha --recursive --timeout 25000 --exit --grep=$MOCHA_GREP --file test/unit/bootstrap.js",
+    "test:unit:run_dir": "mocha --recursive --timeout 25000 --exit --grep=$MOCHA_GREP --require test/unit/bootstrap.js",
     "test:unit:all": "npm run test:unit:run_dir -- test/unit/src modules/*/test/unit/src",
     "test:unit:all:silent": "npm run test:unit:all -- --reporter dot",
     "test:unit:app": "npm run test:unit:run_dir -- test/unit/src",
@@ -223,7 +223,7 @@
     "mathjax": "^2.7.9",
     "mini-css-extract-plugin": "^0.8.0",
     "mkdirp": "0.5.1",
-    "mocha": "^6.2.2",
+    "mocha": "^8.3.2",
     "mock-fs": "^4.11.0",
     "node-fetch": "^2.6.1",
     "nodemon": "^2.0.6",
@@ -233,7 +233,7 @@
     "prettier": "^1.19.1",
     "requirejs": "^2.3.6",
     "samlp": "^3.4.1",
-    "sandboxed-module": "0.3.0",
+    "sandboxed-module": "^2.0.4",
     "sinon": "^7.5.0",
     "sinon-chai": "^3.5.0",
     "sinon-mongoose": "^2.3.0",

+ 2 - 0
services/web/test/acceptance/bootstrap.js

@@ -1,6 +1,8 @@
 const chai = require('chai')
+chai.should()
 chai.use(require('chai-as-promised'))
 chai.use(require('chaid'))
+chai.use(require('sinon-chai'))
 
 // Do not truncate assertion errors
 chai.config.truncateThreshold = 0

+ 0 - 1
services/web/test/acceptance/src/CloseSiteTests.js

@@ -11,7 +11,6 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const Settings = require('settings-sharelatex')
-const chai = require('chai')
 const request = require('./helpers/request')
 
 describe('siteIsOpen', function() {

+ 1 - 4
services/web/test/acceptance/src/ModelTests.js

@@ -1,7 +1,4 @@
-const chai = require('chai')
-const expect = chai.expect
-const chaiAsPromised = require('chai-as-promised')
-chai.use(chaiAsPromised)
+const { expect } = require('chai')
 
 const { User } = require('../../../app/src/models/User')
 const { Subscription } = require('../../../app/src/models/Subscription')

+ 2 - 3
services/web/test/acceptance/src/ProxyUrls.js

@@ -9,14 +9,13 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
-const { assert } = require('chai')
+const { assert, expect } = require('chai')
 const async = require('async')
 const request = require('./helpers/request')
 
 const assertResponse = (path, expectedStatusCode, expectedBody, cb) =>
   request.get(path, (error, response) => {
-    should.not.exist(error)
+    expect(error).not.to.exist
     response.statusCode.should.equal(expectedStatusCode)
     if (expectedBody) {
       assert.deepEqual(JSON.parse(response.body), expectedBody)

+ 3 - 4
services/web/test/acceptance/src/RedirectUrlsTests.js

@@ -9,14 +9,13 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
-const { assert } = require('chai')
+const { assert, expect } = require('chai')
 const async = require('async')
 const request = require('./helpers/request')
 
 const assertRedirect = (method, path, expectedStatusCode, destination, cb) =>
   request[method](path, (error, response) => {
-    should.not.exist(error)
+    expect(error).not.to.exist
     response.statusCode.should.equal(expectedStatusCode)
     response.headers.location.should.equal(destination)
     return cb()
@@ -85,7 +84,7 @@ describe('RedirectUrls', function() {
     return request.get(
       { url: '/redirect/one', headers: { 'x-skip-redirects': 'true' } },
       (error, response) => {
-        should.not.exist(error)
+        expect(error).not.to.exist
         response.statusCode.should.equal(404)
         return done()
       }

+ 1 - 2
services/web/test/acceptance/src/RegistrationTests.js

@@ -2,8 +2,7 @@
     handle-callback-err
 */
 
-const { expect } = require('chai')
-const { assert } = require('chai')
+const { assert, expect } = require('chai')
 const async = require('async')
 const User = require('./helpers/User')
 const redis = require('./helpers/redis')

+ 3 - 3
services/web/test/acceptance/src/SettingsTests.js

@@ -8,7 +8,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
+const { expect } = require('chai')
 const async = require('async')
 const User = require('./helpers/User')
 const MockV1ApiClass = require('./mocks/MockV1Api')
@@ -56,7 +56,7 @@ describe('SettingsPage', function() {
   it('update main email address', function(done) {
     const newEmail = 'foo@bar.com'
     return this.user.updateSettings({ email: newEmail }, error => {
-      should.not.exist(error)
+      expect(error).not.to.exist
       return this.user.get((error, user) => {
         user.email.should.equal(newEmail)
         user.emails.length.should.equal(1)
@@ -77,7 +77,7 @@ describe('SettingsPage', function() {
     it('should be able to update settings', function(done) {
       const newName = 'third-party-references'
       this.user.updateSettings({ first_name: newName }, error => {
-        should.not.exist(error)
+        expect(error).not.to.exist
         this.user.get((error, user) => {
           user.first_name.should.equal(newName)
           done()

+ 1 - 6
services/web/test/acceptance/src/UserHelperTests.js

@@ -1,12 +1,7 @@
 const AuthenticationManager = require('../../../app/src/Features/Authentication/AuthenticationManager')
 const UserHelper = require('./helpers/UserHelper')
-const chai = require('chai')
-const chaiAsPromised = require('chai-as-promised')
 const Features = require('../../../app/src/infrastructure/Features')
-
-const expect = chai.expect
-chai.should()
-chai.use(chaiAsPromised)
+const { expect } = require('chai')
 
 describe('UserHelper', function() {
   // Disable all tests unless the public-registration feature is enabled

+ 0 - 1
services/web/test/acceptance/src/UserReconfirmTests.js

@@ -12,7 +12,6 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const { expect } = require('chai')
-const should = require('chai').should()
 const async = require('async')
 const User = require('./helpers/User')
 

+ 1 - 3
services/web/test/acceptance/src/UserThirdPartyIdentityTests.js

@@ -14,9 +14,7 @@ const Errors = require('../../../app/src/Features/Errors/Errors')
 const Settings = require('settings-sharelatex')
 const User = require('./helpers/User')
 const ThirdPartyIdentityManager = require('../../../app/src/Features/User/ThirdPartyIdentityManager')
-const chai = require('chai')
-
-const { expect } = chai
+const { expect } = require('chai')
 
 describe('ThirdPartyIdentityManager', function() {
   beforeEach(function(done) {

+ 99 - 38
services/web/test/unit/bootstrap.js

@@ -1,6 +1,11 @@
+const Path = require('path')
 const chai = require('chai')
 const sinon = require('sinon')
 
+/*
+ * Chai configuration
+ */
+
 // add chai.should()
 chai.should()
 
@@ -17,52 +22,108 @@ chai.config.truncateThreshold = 0
 // add support for mongoose in sinon
 require('sinon-mongoose')
 
-afterEach(function() {
-  sinon.restore()
-})
-
-const SandboxedModule = require('sandboxed-module')
-const PromisesUtils = require('../../app/src/util/promises')
-const Errors = require('../../app/src/Features/Errors/Errors')
-const GLOBAL_REQUIRE_CACHE_FOR_SANDBOXED_MODULES = {
-  // cache p-limit for all expressify/promisifyAll users
-  '../../util/promises': PromisesUtils,
-  '../../../../app/src/util/promises': PromisesUtils,
-
-  // Errors are widely used and instance checks need the exact same prototypes
-  '../Errors/Errors': Errors,
-  '../../../../app/src/Features/Errors/Errors': Errors,
-  '../../../../../app/src/Features/Errors/Errors': Errors
+/*
+ * Global stubs
+ */
+const globalStubsSandbox = sinon.createSandbox()
+const globalStubs = {
+  logger: {
+    debug: globalStubsSandbox.stub(),
+    info: globalStubsSandbox.stub(),
+    log: globalStubsSandbox.stub(),
+    warn: globalStubsSandbox.stub(),
+    err: globalStubsSandbox.stub(),
+    error: globalStubsSandbox.stub(),
+    fatal: globalStubsSandbox.stub()
+  }
 }
-const LIBRARIES = [
-  '@overleaf/o-error',
-  'async',
-  'lodash',
-  'moment',
-  'underscore',
-  'xml2js',
-  'json2csv',
-  'sanitize-html',
-  'marked'
-]
-LIBRARIES.forEach(lib => {
-  GLOBAL_REQUIRE_CACHE_FOR_SANDBOXED_MODULES[lib] = require(lib)
-})
 
+/*
+ * Sandboxed module configuration
+ */
+
+const SandboxedModule = require('sandboxed-module')
 SandboxedModule.configure({
-  requires: GLOBAL_REQUIRE_CACHE_FOR_SANDBOXED_MODULES
+  requires: getSandboxedModuleRequires(),
+  globals: { Buffer, Promise, console, process },
+  sourceTransformers: {
+    coffee(source) {
+      if (this.filename.endsWith('.coffee')) {
+        // Coffeescript mucks with Error.prepareStackTrace, which, in turn,
+        // conflicts with OError. This is a hacky way to prevent Coffeescript
+        // from interfering.
+        //
+        // See https://github.com/jashkenas/coffeescript/blob/07f644c39223e016aceedd2cd71b5941579b5659/src/coffeescript.coffee#L368
+        const originalPrepareStackTrace = Error.prepareStackTrace
+        const compiled = require('coffeescript').compile(source)
+        Error.prepareStackTrace = originalPrepareStackTrace
+        return compiled
+      }
+      return source
+    }
+  }
 })
 
+function getSandboxedModuleRequires() {
+  const requires = {
+    'logger-sharelatex': globalStubs.logger
+  }
+
+  const internalModules = [
+    '../../app/src/util/promises',
+    '../../app/src/Features/Errors/Errors',
+    '../../app/src/Features/Helpers/Mongo'
+  ]
+  const externalLibs = [
+    'async',
+    'json2csv',
+    'lodash',
+    'marked',
+    'moment',
+    '@overleaf/o-error',
+    'sanitize-html',
+    'sshpk',
+    'underscore',
+    'xml2js'
+  ]
+  for (const modulePath of internalModules) {
+    requires[Path.resolve(__dirname, modulePath)] = require(modulePath)
+  }
+  for (const lib of externalLibs) {
+    requires[lib] = require(lib)
+  }
+  return requires
+}
+
+/*
+ * Mocha hooks
+ */
+
 // sandboxed-module somehow registers every fake module it creates in this
 // module's children array, which uses quite a big amount of memory. We'll take
 // a copy of the module children array and restore it after each test so that
 // the garbage collector has a chance to reclaim the fake modules.
 let initialModuleChildren
-before('record initial module children', function() {
-  initialModuleChildren = module.children.slice()
-})
 
-afterEach('restore module children', function() {
-  // Delete leaking sandboxed modules
-  module.children = initialModuleChildren.slice()
-})
+exports.mochaHooks = {
+  beforeAll() {
+    // Record initial module children
+    initialModuleChildren = module.children.slice()
+  },
+
+  beforeEach() {
+    // Install logger stub
+    this.logger = globalStubs.logger
+  },
+
+  afterEach() {
+    // Delete leaking sandboxed modules
+    module.children = initialModuleChildren.slice()
+
+    // Reset global stubs
+    globalStubsSandbox.reset()
+
+    // Restore other stubs
+    sinon.restore()
+  }
+}

+ 0 - 6
services/web/test/unit/src/Analytics/AnalyticsControllerTests.js

@@ -24,18 +24,12 @@ describe('AnalyticsController', function() {
     }
 
     this.controller = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         './AnalyticsManager': this.AnalyticsManager,
         '../Authentication/AuthenticationController': this
           .AuthenticationController,
         '../Institutions/InstitutionsAPI': this.InstitutionsAPI,
         '../../infrastructure/Features': this.Features,
-        'logger-sharelatex': {
-          log() {}
-        },
         '../../infrastructure/GeoIpLookup': (this.GeoIpLookup = {
           getDetails: sinon.stub()
         })

+ 0 - 6
services/web/test/unit/src/Analytics/AnalyticsManagerTests.js

@@ -40,14 +40,8 @@ describe('AnalyticsManager', function() {
     this.backgroundRequest = sinon.stub().yields()
     this.request = sinon.stub().yields()
     this.AnalyticsManager = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.Settings,
-        'logger-sharelatex': {
-          warn() {}
-        },
         '../../infrastructure/Queues': this.Queues
       }
     })

+ 1 - 11
services/web/test/unit/src/Authentication/AuthenticationControllerTests.js

@@ -1,6 +1,5 @@
 const sinon = require('sinon')
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Authentication/AuthenticationController.js'
 const SandboxedModule = require('sandboxed-module')
@@ -19,9 +18,6 @@ describe('AuthenticationController', function() {
         .slice(2)
     }
     this.AuthenticationController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../User/UserAuditLogHandler': (this.UserAuditLogHandler = {
           addEntry: sinon.stub().yields(null)
@@ -49,12 +45,6 @@ describe('AuthenticationController', function() {
           identifyUser: sinon.stub()
         }),
         '../../infrastructure/SessionStoreManager': (this.SessionStoreManager = {}),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          error: sinon.stub(),
-          err: sinon.stub()
-        }),
         'settings-sharelatex': (this.Settings = {
           siteUrl: 'http://www.foo.bar',
           httpAuthUsers: this.httpAuthUsers

+ 1 - 6
services/web/test/unit/src/Authentication/AuthenticationManagerTests.js

@@ -1,11 +1,9 @@
 const sinon = require('sinon')
-const chai = require('chai')
+const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const { ObjectId } = require('mongodb')
 const AuthenticationErrors = require('../../../../app/src/Features/Authentication/AuthenticationErrors')
 
-chai.should()
-const { expect } = chai
 const modulePath =
   '../../../../app/src/Features/Authentication/AuthenticationManager.js'
 
@@ -13,9 +11,6 @@ describe('AuthenticationManager', function() {
   beforeEach(function() {
     this.settings = { security: { bcryptRounds: 4 } }
     this.AuthenticationManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../../models/User': {
           User: (this.User = {})

+ 1 - 6
services/web/test/unit/src/Authorization/AuthorizationManagerTests.js

@@ -12,9 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Authorization/AuthorizationManager.js'
 const SandboxedModule = require('sandboxed-module')
@@ -24,9 +22,6 @@ const { ObjectId } = require('mongodb')
 describe('AuthorizationManager', function() {
   beforeEach(function() {
     this.AuthorizationManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         '../Collaborators/CollaboratorsGetter': (this.CollaboratorsGetter = {}),

+ 0 - 4
services/web/test/unit/src/Authorization/AuthorizationMiddlewareTests.js

@@ -30,12 +30,8 @@ describe('AuthorizationMiddleware', function() {
     }
     this.AuthorizationManager = {}
     this.AuthorizationMiddleware = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         './AuthorizationManager': this.AuthorizationManager,
-        'logger-sharelatex': { log() {} },
         mongodb: {
           ObjectId: this.ObjectId
         },

+ 0 - 10
services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.js

@@ -1,4 +1,3 @@
-require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const path = require('path')
 const sinon = require('sinon')
@@ -23,9 +22,6 @@ describe('BetaProgramController', function() {
       }
     }
     this.BetaProgramController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         './BetaProgramHandler': (this.BetaProgramHandler = {
           optIn: sinon.stub(),
@@ -37,12 +33,6 @@ describe('BetaProgramController', function() {
         'settings-sharelatex': (this.settings = {
           languages: {}
         }),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          err: sinon.stub(),
-          error: sinon.stub()
-        }),
         '../Authentication/AuthenticationController': (this.AuthenticationController = {
           getLoggedInUserId: sinon.stub().returns(this.user._id)
         })

+ 2 - 5
services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.js

@@ -18,13 +18,10 @@ describe('BetaProgramHandler', function() {
       save: sinon.stub().callsArgWith(0, null)
     }
     this.handler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        '@overleaf/metrics': (this.logger = {
+        '@overleaf/metrics': {
           inc: sinon.stub()
-        }),
+        },
         '../User/UserUpdater': (this.UserUpdater = {
           promises: {
             updateUser: sinon.stub().resolves()

+ 1 - 11
services/web/test/unit/src/BrandVariations/BrandVariationsHandlerTests.js

@@ -11,12 +11,11 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-let { expect } = require('chai')
+const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
 const sinon = require('sinon')
-;({ expect } = require('chai'))
 const modulePath = path.join(
   __dirname,
   '../../../../app/src/Features/BrandVariations/BrandVariationsHandler'
@@ -31,19 +30,10 @@ describe('BrandVariationsHandler', function() {
         }
       }
     }
-    this.logger = {
-      warn() {},
-      err() {},
-      log() {}
-    }
     this.V1Api = { request: sinon.stub() }
     this.BrandVariationsHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': this.logger,
         '../V1/V1Api': this.V1Api
       }
     })

+ 0 - 9
services/web/test/unit/src/Chat/ChatApiHandlerTests.js

@@ -10,7 +10,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
@@ -32,16 +31,8 @@ describe('ChatApiHandler', function() {
     }
     this.request = sinon.stub()
     this.ChatApiHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          error: sinon.stub()
-        },
         request: this.request
       }
     })

+ 1 - 9
services/web/test/unit/src/Chat/ChatControllerTests.js

@@ -12,7 +12,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
@@ -33,21 +32,14 @@ describe('ChatController', function() {
       getLoggedInUserId: sinon.stub().returns(this.user_id)
     }
     this.ChatController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log() {}
-        },
         './ChatApiHandler': this.ChatApiHandler,
         '../Editor/EditorRealTimeController': this.EditorRealTimeController,
         '../Authentication/AuthenticationController': this
           .AuthenticationController,
         '../User/UserInfoManager': (this.UserInfoManager = {}),
-        '../User/UserInfoController': (this.UserInfoController = {}),
-        '../Comments/CommentsController': (this.CommentsController = {})
+        '../User/UserInfoController': (this.UserInfoController = {})
       }
     })
     this.req = {

+ 1 - 10
services/web/test/unit/src/Collaborators/CollaboratorsControllerTests.js

@@ -50,16 +50,8 @@ describe('CollaboratorsController', function() {
         transferOwnership: sinon.stub().resolves()
       }
     }
-    this.logger = {
-      err: sinon.stub(),
-      warn: sinon.stub(),
-      log: sinon.stub()
-    }
 
     this.CollaboratorsController = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         './CollaboratorsHandler': this.CollaboratorsHandler,
@@ -69,8 +61,7 @@ describe('CollaboratorsController', function() {
         '../../Features/Errors/HttpErrorHandler': this.HttpErrorHandler,
         '../Tags/TagsHandler': this.TagsHandler,
         '../Authentication/AuthenticationController': this
-          .AuthenticationController,
-        'logger-sharelatex': this.logger
+          .AuthenticationController
       }
     })
   })

+ 0 - 3
services/web/test/unit/src/Collaborators/CollaboratorsGetterTests.js

@@ -47,9 +47,6 @@ describe('CollaboratorsGetter', function() {
       buildOwnerAndMembersViews: sinon.stub()
     }
     this.CollaboratorsGetter = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         '../User/UserGetter': this.UserGetter,

+ 0 - 9
services/web/test/unit/src/Collaborators/CollaboratorsHandlerTests.js

@@ -16,11 +16,6 @@ const sleep = promisify(setTimeout)
 
 describe('CollaboratorsHandler', function() {
   beforeEach(function() {
-    this.logger = {
-      log: sinon.stub(),
-      warn: sinon.stub(),
-      err: sinon.stub()
-    }
     this.userId = ObjectId()
     this.addingUserId = ObjectId()
     this.project = {
@@ -66,11 +61,7 @@ describe('CollaboratorsHandler', function() {
       }
     }
     this.CollaboratorsHandler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': this.logger,
         '../User/UserGetter': this.UserGetter,
         '../Contacts/ContactManager': this.ContactManager,
         '../../models/Project': { Project },

+ 1 - 12
services/web/test/unit/src/Collaborators/CollaboratorsInviteControllerTests.js

@@ -12,9 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Collaborators/CollaboratorsInviteController.js'
 const SandboxedModule = require('sandboxed-module')
@@ -44,21 +42,12 @@ describe('CollaboratorsInviteController', function() {
     }
 
     this.CollaboratorsInviteController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../Project/ProjectGetter': (this.ProjectGetter = {}),
         '../Subscription/LimitationsManager': this.LimitationsManager,
         '../User/UserGetter': this.UserGetter,
         './CollaboratorsGetter': (this.CollaboratorsGetter = {}),
         './CollaboratorsInviteHandler': (this.CollaboratorsInviteHandler = {}),
-        'logger-sharelatex': (this.logger = {
-          err: sinon.stub(),
-          error: sinon.stub(),
-          warn: sinon.stub(),
-          log: sinon.stub()
-        }),
         '../Editor/EditorRealTimeController': (this.EditorRealTimeController = {
           emitToRoom: sinon.stub()
         }),

+ 1 - 12
services/web/test/unit/src/Collaborators/CollaboratorsInviteHandlerTests.js

@@ -15,9 +15,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Collaborators/CollaboratorsInviteHandler.js'
 const SandboxedModule = require('sandboxed-module')
@@ -55,18 +53,9 @@ describe('CollaboratorsInviteHandler', function() {
     })()
     this.Crypto = Crypto
     this.CollaboratorsInviteHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': (this.settings = {}),
         '../../models/ProjectInvite': { ProjectInvite: this.ProjectInvite },
-        'logger-sharelatex': (this.logger = {
-          err: sinon.stub(),
-          error: sinon.stub(),
-          warn: sinon.stub(),
-          log: sinon.stub()
-        }),
         './CollaboratorsEmailHandler': (this.CollaboratorsEmailHandler = {}),
         './CollaboratorsHandler': (this.CollaboratorsHandler = {
           addUserIdToProject: sinon.stub()

+ 1 - 9
services/web/test/unit/src/Collaborators/OwnershipTransferHandlerTests.js

@@ -60,9 +60,6 @@ describe('OwnershipTransferHandler', function() {
       }
     }
     this.handler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         '../Project/ProjectGetter': this.ProjectGetter,
         '../../models/Project': {
@@ -72,12 +69,7 @@ describe('OwnershipTransferHandler', function() {
         '../ThirdPartyDataStore/TpdsProjectFlusher': this.TpdsProjectFlusher,
         '../Project/ProjectAuditLogHandler': this.ProjectAuditLogHandler,
         '../Email/EmailHandler': this.EmailHandler,
-        './CollaboratorsHandler': this.CollaboratorsHandler,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        }
+        './CollaboratorsHandler': this.CollaboratorsHandler
       }
     })
   })

+ 2 - 14
services/web/test/unit/src/Compile/ClsiCookieManagerTests.js

@@ -12,10 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const { assert } = chai
-const should = chai.should()
-const { expect } = chai
+const { assert, expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/ClsiCookieManager.js'
 const SandboxedModule = require('sandboxed-module')
 const realRequst = require('request')
@@ -56,18 +53,9 @@ describe('ClsiCookieManager', function() {
         client: () => this.redis
       }),
       'settings-sharelatex': this.settings,
-      request: this.request,
-
-      'logger-sharelatex': (this.logger = {
-        log: sinon.stub(),
-        error: sinon.stub(),
-        warn: sinon.stub()
-      })
+      request: this.request
     }
     return (this.ClsiCookieManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: this.requires
     })())
   })

+ 2 - 12
services/web/test/unit/src/Compile/ClsiFormatCheckerTests.js

@@ -12,25 +12,15 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/ClsiFormatChecker.js'
 const SandboxedModule = require('sandboxed-module')
 
 describe('ClsiFormatChecker', function() {
   beforeEach(function() {
     this.ClsiFormatChecker = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'settings-sharelatex': (this.settings = { compileBodySizeLimitMb: 5 }),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub(),
-          warn: sinon.stub()
-        })
+        'settings-sharelatex': (this.settings = { compileBodySizeLimitMb: 5 })
       }
     })
     return (this.project_id = 'project-id')

+ 1 - 12
services/web/test/unit/src/Compile/ClsiManagerTests.js

@@ -1,6 +1,5 @@
 const sinon = require('sinon')
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/ClsiManager.js'
 const SandboxedModule = require('sandboxed-module')
 
@@ -25,12 +24,6 @@ describe('ClsiManager', function() {
     this.DocumentUpdaterHandler = {
       getProjectDocsIfMatch: sinon.stub().callsArgWith(2, null, null)
     }
-    this.logger = {
-      log: sinon.stub(),
-      error: sinon.stub(),
-      err: sinon.stub(),
-      warn: sinon.stub()
-    }
     this.request = sinon.stub()
     this.Metrics = {
       Timer: class Metrics {
@@ -41,9 +34,6 @@ describe('ClsiManager', function() {
       inc: sinon.stub()
     }
     this.ClsiManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': (this.settings = {
           apis: {
@@ -68,7 +58,6 @@ describe('ClsiManager', function() {
           .DocumentUpdaterHandler,
         './ClsiCookieManager': () => this.ClsiCookieManager,
         './ClsiStateManager': this.ClsiStateManager,
-        'logger-sharelatex': this.logger,
         request: this.request,
         './ClsiFormatChecker': this.ClsiFormatChecker,
         '@overleaf/metrics': this.Metrics

+ 2 - 12
services/web/test/unit/src/Compile/ClsiStateManagerTests.js

@@ -13,26 +13,16 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/ClsiStateManager.js'
 const SandboxedModule = require('sandboxed-module')
 
 describe('ClsiStateManager', function() {
   beforeEach(function() {
     this.ClsiStateManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': (this.settings = {}),
-        '../Project/ProjectEntityHandler': (this.ProjectEntityHandler = {}),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub(),
-          warn: sinon.stub()
-        })
+        '../Project/ProjectEntityHandler': (this.ProjectEntityHandler = {})
       }
     })
     this.project = 'project'

+ 1 - 11
services/web/test/unit/src/Compile/CompileControllerTests.js

@@ -12,10 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { assert } = require('chai')
-const { expect } = chai
+const { assert, expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/CompileController.js'
 const SandboxedModule = require('sandboxed-module')
 const MockRequest = require('../helpers/MockRequest')
@@ -61,17 +58,10 @@ describe('CompileController', function() {
       isUserLoggedIn: sinon.stub().returns(true)
     }
     this.CompileController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
         request: (this.request = sinon.stub()),
         '../Project/ProjectGetter': (this.ProjectGetter = {}),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub()
-        }),
         '@overleaf/metrics': (this.Metrics = { inc: sinon.stub() }),
         './CompileManager': this.CompileManager,
         '../User/UserGetter': this.UserGetter,

+ 1 - 11
services/web/test/unit/src/Compile/CompileManagerTests.js

@@ -13,11 +13,8 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { assert, expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Compile/CompileManager.js'
-const { assert } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 
 describe('CompileManager', function() {
@@ -27,9 +24,6 @@ describe('CompileManager', function() {
     const { rateLimitGetStub } = this
     this.ratelimiter = { addCount: sinon.stub() }
     this.CompileManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': (this.settings = {
           redis: { web: { host: 'localhost', port: 42 } },
@@ -56,10 +50,6 @@ describe('CompileManager', function() {
             return Timer
           })()),
           inc: sinon.stub()
-        }),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          warn: sinon.stub()
         })
       }
     })

+ 1 - 11
services/web/test/unit/src/Contact/ContactControllerTests.js

@@ -12,10 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { assert } = chai
-const { expect } = chai
+const { assert, expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Contacts/ContactController.js'
 const SandboxedModule = require('sandboxed-module')
 
@@ -23,14 +20,7 @@ describe('ContactController', function() {
   beforeEach(function() {
     this.AuthenticationController = { getLoggedInUserId: sinon.stub() }
     this.ContactController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub()
-        }),
         '../User/UserGetter': (this.UserGetter = {}),
         './ContactManager': (this.ContactManager = {}),
         '../Authentication/AuthenticationController': (this.AuthenticationController = {}),

+ 0 - 5
services/web/test/unit/src/Contact/ContactManagerTests.js

@@ -9,8 +9,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-chai.should()
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Contacts/ContactManager'
 const SandboxedModule = require('sandboxed-module')
@@ -18,9 +16,6 @@ const SandboxedModule = require('sandboxed-module')
 describe('ContactManager', function() {
   beforeEach(function() {
     this.ContactManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         request: (this.request = sinon.stub()),
         'settings-sharelatex': (this.settings = {

+ 1 - 6
services/web/test/unit/src/Cooldown/CooldownManagerTests.js

@@ -12,7 +12,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-require('chai').should()
 const { expect } = require('chai')
 const modulePath = require('path').join(
   __dirname,
@@ -25,12 +24,8 @@ describe('CooldownManager', function() {
     this.rclient = { set: sinon.stub(), get: sinon.stub() }
     this.RedisWrapper = { client: () => this.rclient }
     return (this.CooldownManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        '../../infrastructure/RedisWrapper': this.RedisWrapper,
-        'logger-sharelatex': { log: sinon.stub() }
+        '../../infrastructure/RedisWrapper': this.RedisWrapper
       }
     }))
   })

+ 1 - 6
services/web/test/unit/src/Cooldown/CooldownMiddlewareTests.js

@@ -11,7 +11,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-require('chai').should()
 const { expect } = require('chai')
 const modulePath = require('path').join(
   __dirname,
@@ -22,12 +21,8 @@ describe('CooldownMiddleware', function() {
   beforeEach(function() {
     this.CooldownManager = { isProjectOnCooldown: sinon.stub() }
     return (this.CooldownMiddleware = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        './CooldownManager': this.CooldownManager,
-        'logger-sharelatex': { log: sinon.stub() }
+        './CooldownManager': this.CooldownManager
       }
     }))
   })

+ 0 - 11
services/web/test/unit/src/Docstore/DocstoreManagerTests.js

@@ -9,8 +9,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-chai.should()
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Docstore/DocstoreManager'
 const SandboxedModule = require('sandboxed-module')
@@ -20,9 +18,6 @@ describe('DocstoreManager', function() {
   beforeEach(function() {
     this.requestDefaults = sinon.stub().returns((this.request = sinon.stub()))
     this.DocstoreManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         request: {
           defaults: this.requestDefaults
@@ -33,12 +28,6 @@ describe('DocstoreManager', function() {
               url: 'docstore.sharelatex.com'
             }
           }
-        }),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          error: sinon.stub(),
-          err() {}
         })
       }
     })

+ 0 - 4
services/web/test/unit/src/DocumentUpdater/DocumentUpdaterHandlerTests.js

@@ -32,9 +32,6 @@ describe('DocumentUpdaterHandler', function() {
 
     this.callback = sinon.stub()
     this.handler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         request: {
           defaults: () => {
@@ -42,7 +39,6 @@ describe('DocumentUpdaterHandler', function() {
           }
         },
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': { log() {}, error() {}, warn() {} },
         '../Project/ProjectEntityHandler': this.projectEntityHandler,
         '../../models/Project': {
           Project: (this.Project = {})

+ 1 - 11
services/web/test/unit/src/Documents/DocumentControllerTests.js

@@ -11,9 +11,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Documents/DocumentController.js'
 const SandboxedModule = require('sandboxed-module')
@@ -25,15 +23,7 @@ const Errors = require('../../../../app/src/Features/Errors/Errors')
 describe('DocumentController', function() {
   beforeEach(function() {
     this.DocumentController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        },
         '../Project/ProjectGetter': (this.ProjectGetter = {}),
         '../Project/ProjectLocator': (this.ProjectLocator = {}),
         '../Project/ProjectEntityHandler': (this.ProjectEntityHandler = {}),

+ 1 - 3
services/web/test/unit/src/Documents/DocumentHelperTests.js

@@ -11,9 +11,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Documents/DocumentHelper.js'
 const SandboxedModule = require('sandboxed-module')
 

+ 1 - 7
services/web/test/unit/src/Downloads/ProjectDownloadsControllerTests.js

@@ -11,9 +11,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Downloads/ProjectDownloadsController.js'
 const SandboxedModule = require('sandboxed-module')
@@ -30,14 +28,10 @@ describe('ProjectDownloadsController', function() {
     return (this.ProjectDownloadsController = SandboxedModule.require(
       modulePath,
       {
-        globals: {
-          console: console
-        },
         requires: {
           './ProjectZipStreamManager': (this.ProjectZipStreamManager = {}),
           '../Project/ProjectGetter': (this.ProjectGetter = {}),
           '@overleaf/metrics': (this.metrics = {}),
-          'logger-sharelatex': (this.logger = { log: sinon.stub() }),
           '../DocumentUpdater/DocumentUpdaterHandler': this
             .DocumentUpdaterHandler
         }

+ 1 - 10
services/web/test/unit/src/Downloads/ProjectZipStreamManagerTests.js

@@ -16,9 +16,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath =
   '../../../../app/src/Features/Downloads/ProjectZipStreamManager.js'
 const SandboxedModule = require('sandboxed-module')
@@ -33,15 +31,8 @@ describe('ProjectZipStreamManager', function() {
       append: sinon.stub()
     }
     return (this.ProjectZipStreamManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         archiver: (this.archiver = sinon.stub().returns(this.archive)),
-        'logger-sharelatex': (this.logger = {
-          error: sinon.stub(),
-          log: sinon.stub()
-        }),
         '../Project/ProjectEntityHandler': (this.ProjectEntityHandler = {}),
         '../FileStore/FileStoreHandler': (this.FileStoreHandler = {}),
         '../Project/ProjectGetter': (this.ProjectGetter = {})

+ 1 - 9
services/web/test/unit/src/Editor/EditorControllerTests.js

@@ -13,7 +13,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-require('chai').should()
 const { expect } = require('chai')
 
 const modulePath = require('path').join(
@@ -47,9 +46,6 @@ describe('EditorController', function() {
     this.callback = sinon.stub()
 
     return (this.EditorController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../Project/ProjectEntityUpdateHandler': (this.ProjectEntityUpdateHandler = {}),
         '../Project/ProjectOptionsHandler': (this.ProjectOptionsHandler = {
@@ -70,11 +66,7 @@ describe('EditorController', function() {
         './EditorRealTimeController': (this.EditorRealTimeController = {
           emitToRoom: sinon.stub()
         }),
-        '@overleaf/metrics': (this.Metrics = { inc: sinon.stub() }),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          err: sinon.stub()
-        })
+        '@overleaf/metrics': (this.Metrics = { inc: sinon.stub() })
       }
     }))
   })

+ 0 - 8
services/web/test/unit/src/Editor/EditorHttpControllerTests.js

@@ -106,10 +106,6 @@ describe('EditorHttpController', function() {
     this.ProjectEditorHandler = {
       buildProjectModelView: sinon.stub().returns(this.projectView)
     }
-    this.logger = {
-      log: sinon.stub(),
-      error: sinon.stub()
-    }
     this.Metrics = { inc: sinon.stub() }
     this.TokenAccessHandler = {
       getRequestToken: sinon.stub().returns(this.token),
@@ -128,15 +124,11 @@ describe('EditorHttpController', function() {
       unprocessableEntity: sinon.stub()
     }
     this.EditorHttpController = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         '../Project/ProjectDeleter': this.ProjectDeleter,
         '../Project/ProjectGetter': this.ProjectGetter,
         '../Authorization/AuthorizationManager': this.AuthorizationManager,
         '../Project/ProjectEditorHandler': this.ProjectEditorHandler,
-        'logger-sharelatex': this.logger,
         './EditorController': this.EditorController,
         '@overleaf/metrics': this.Metrics,
         '../Collaborators/CollaboratorsGetter': this.CollaboratorsGetter,

+ 0 - 4
services/web/test/unit/src/Editor/EditorRealTimeControllerTests.js

@@ -12,7 +12,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-require('chai').should()
 const modulePath = require('path').join(
   __dirname,
   '../../../../app/src/Features/Editor/EditorRealTimeController'
@@ -23,9 +22,6 @@ describe('EditorRealTimeController', function() {
     this.rclient = { publish: sinon.stub() }
     this.Metrics = { summary: sinon.stub() }
     this.EditorRealTimeController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../../infrastructure/RedisWrapper': {
           client: () => this.rclient

+ 1 - 7
services/web/test/unit/src/Email/EmailBuilderTests.js

@@ -20,18 +20,12 @@ describe('EmailBuilder', function() {
       siteUrl: 'https://www.overleaf.com'
     }
     this.EmailBuilder = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         './EmailMessageHelper': EmailMessageHelper,
         './Bodies/cta-email': ctaEmailBody,
         './Bodies/NoCTAEmailBody': NoCTAEmailBody,
         './Layouts/BaseWithHeaderEmailLayout': BaseWithHeaderEmailLayout,
-        'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log() {}
-        }
+        'settings-sharelatex': this.settings
       }
     })
   })

+ 1 - 7
services/web/test/unit/src/Email/EmailHandlerTests.js

@@ -21,16 +21,10 @@ describe('EmailHandler', function() {
       }
     }
     this.EmailHandler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         './EmailBuilder': this.EmailBuilder,
         './EmailSender': this.EmailSender,
-        'settings-sharelatex': this.Settings,
-        'logger-sharelatex': {
-          log() {}
-        }
+        'settings-sharelatex': this.Settings
       }
     })
   })

+ 1 - 5
services/web/test/unit/src/Email/EmailMessageHelperTests.js

@@ -9,11 +9,7 @@ const MODULE_PATH = path.join(
 
 describe('EmailMessageHelper', function() {
   beforeEach(function() {
-    this.EmailMessageHelper = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      }
-    })
+    this.EmailMessageHelper = SandboxedModule.require(MODULE_PATH, {})
   })
   describe('cleanHTML', function() {
     beforeEach(function() {

+ 0 - 8
services/web/test/unit/src/Email/EmailSenderTests.js

@@ -33,20 +33,12 @@ describe('EmailSender', function() {
     this.ses = { createTransport: () => this.sesClient }
 
     this.EmailSender = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         nodemailer: this.ses,
         'nodemailer-ses-transport': sinon.stub(),
         'nodemailer-mandrill-transport': {},
         'settings-sharelatex': this.Settings,
         '../../infrastructure/RateLimiter': this.RateLimiter,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        },
         '@overleaf/metrics': {
           inc() {}
         }

+ 1 - 10
services/web/test/unit/src/Errors/HttpErrorHandlerTests.js

@@ -1,5 +1,4 @@
 const { expect } = require('chai')
-const sinon = require('sinon')
 const MockResponse = require('../helpers/MockResponse')
 const MockRequest = require('../helpers/MockRequest')
 const SandboxedModule = require('sandboxed-module')
@@ -10,19 +9,12 @@ describe('HttpErrorHandler', function() {
     this.req = new MockRequest()
     this.res = new MockResponse()
 
-    this.logger = {
-      warn() {},
-      error() {}
-    }
-
     this.HttpErrorHandler = SandboxedModule.require(modulePath, {
-      globals: { console },
       requires: {
         'settings-sharelatex': {
           appName: 'Overleaf',
           statusPageUrl: 'https://status.overlaf.com'
-        },
-        'logger-sharelatex': this.logger
+        }
       }
     })
   })
@@ -342,7 +334,6 @@ describe('HttpErrorHandler', function() {
 
       it('should send the error to the logger', function() {
         const error = new Error('message')
-        this.logger.error = sinon.stub()
         this.HttpErrorHandler.legacyInternal(
           this.req,
           this.res,

+ 1 - 9
services/web/test/unit/src/Exports/ExportsControllerTests.js

@@ -14,8 +14,7 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = require('path').join(
   __dirname,
@@ -64,15 +63,8 @@ describe('ExportsController', function() {
       getLoggedInUserId: sinon.stub().returns(this.req.session.user._id)
     }
     return (this.controller = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         './ExportsHandler': this.handler,
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        },
         '../Authentication/AuthenticationController': this
           .AuthenticationController
       }

+ 1 - 11
services/web/test/unit/src/Exports/ExportsHandlerTests.js

@@ -12,9 +12,7 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Exports/ExportsHandler.js'
 const SandboxedModule = require('sandboxed-module')
 
@@ -27,15 +25,7 @@ describe('ExportsHandler', function() {
       }
     }
     this.ExportsHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        },
         '../Project/ProjectGetter': (this.ProjectGetter = {}),
         '../Project/ProjectHistoryHandler': (this.ProjectHistoryHandler = {}),
         '../Project/ProjectLocator': (this.ProjectLocator = {}),

+ 0 - 7
services/web/test/unit/src/FileStore/FileStoreControllerTests.js

@@ -14,15 +14,8 @@ describe('FileStoreController', function() {
     }
     this.ProjectLocator = { findElement: sinon.stub() }
     this.controller = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          err: sinon.stub()
-        }),
         '../Project/ProjectLocator': this.ProjectLocator,
         './FileStoreHandler': this.FileStoreHandler
       }

+ 1 - 11
services/web/test/unit/src/FileStore/FileStoreHandlerTests.js

@@ -1,6 +1,5 @@
-const { assert } = require('chai')
+const { assert, expect } = require('chai')
 const sinon = require('sinon')
-const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const Errors = require('../../../../app/src/Features/Errors/Errors')
 const OError = require('@overleaf/o-error')
@@ -54,22 +53,13 @@ describe('FileStoreHandler', function() {
         }
       }
     }
-    this.logger = {
-      log: sinon.stub(),
-      warn: sinon.stub(),
-      err: sinon.stub()
-    }
     this.FileHashManager = {
       computeHash: sinon.stub().callsArgWith(1, null, this.hashValue)
     }
     this.handler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
         request: this.request,
-        'logger-sharelatex': this.logger,
         './FileHashManager': this.FileHashManager,
         // FIXME: need to stub File object here
         '../../models/File': {

+ 1 - 5
services/web/test/unit/src/HelperFiles/AuthorizationHelperTests.js

@@ -1,14 +1,10 @@
-const chai = require('chai')
 const SandboxedModule = require('sandboxed-module')
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Helpers/AuthorizationHelper'
 
 describe('AuthorizationHelper', function() {
   beforeEach(function() {
     this.AuthorizationHelper = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../../models/User': {
           UserSchema: {

+ 1 - 2
services/web/test/unit/src/HelperFiles/UrlHelperTests.js

@@ -1,5 +1,4 @@
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const modulePath = require('path').join(
   __dirname,

+ 0 - 10
services/web/test/unit/src/History/HistoryControllerTests.js

@@ -9,8 +9,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-chai.should()
 const sinon = require('sinon')
 
 const Errors = require('../../../../app/src/Features/Errors/Errors')
@@ -26,17 +24,9 @@ describe('HistoryController', function() {
       getLoggedInUserId: sinon.stub().returns(this.user_id)
     }
     this.HistoryController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         request: (this.request = sinon.stub()),
         'settings-sharelatex': (this.settings = {}),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          error: sinon.stub()
-        }),
         '../Authentication/AuthenticationController': this
           .AuthenticationController,
         './HistoryManager': (this.HistoryManager = {}),

+ 0 - 3
services/web/test/unit/src/History/HistoryManagerTests.js

@@ -44,9 +44,6 @@ describe('HistoryManager', function() {
     }
 
     this.HistoryManager = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'request-promise-native': this.request,
         'settings-sharelatex': this.settings,

+ 1 - 9
services/web/test/unit/src/History/RestoreManagerTests.js

@@ -12,7 +12,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-require('chai').should()
 const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = require('path').join(
@@ -27,19 +26,12 @@ describe('RestoreManager', function() {
   beforeEach(function() {
     tk.freeze(Date.now()) // freeze the time for these tests
     this.RestoreManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': {},
         '../../infrastructure/FileWriter': (this.FileWriter = {}),
         '../Uploads/FileSystemImportManager': (this.FileSystemImportManager = {}),
         '../Project/ProjectEntityHandler': (this.ProjectEntityHandler = {}),
-        '../Editor/EditorController': (this.EditorController = {}),
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          err: sinon.stub()
-        })
+        '../Editor/EditorController': (this.EditorController = {})
       }
     })
     this.user_id = 'mock-user-id'

+ 0 - 14
services/web/test/unit/src/InactiveData/InactiveProjectManagerTests.js

@@ -11,7 +11,6 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
@@ -35,23 +34,13 @@ describe('InactiveProjectManager', function() {
       markAsInactive: sinon.stub()
     }
     this.ProjectGetter = { getProject: sinon.stub() }
-    this.TrackChangesManager = { archiveProject: sinon.stub() }
     this.InactiveProjectManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        },
         '../Docstore/DocstoreManager': this.DocstoreManager,
         '../Project/ProjectUpdateHandler': this.ProjectUpdateHandler,
         '../Project/ProjectGetter': this.ProjectGetter,
-        '../TrackChanges/TrackChangesManager': this.TrackChangesManager,
         '../../models/Project': {}
       }
     })
@@ -120,7 +109,6 @@ describe('InactiveProjectManager', function() {
   describe('deactivateProject', function() {
     it('should call unarchiveProject and markAsInactive', function(done) {
       this.DocstoreManager.archiveProject.callsArgWith(1)
-      this.TrackChangesManager.archiveProject.callsArgWith(1)
 
       this.ProjectUpdateHandler.markAsInactive.callsArgWith(1)
 
@@ -130,7 +118,6 @@ describe('InactiveProjectManager', function() {
           this.DocstoreManager.archiveProject
             .calledWith(this.project_id)
             .should.equal(true)
-          // @TrackChangesManager.archiveProject.calledWith(@project_id).should.equal true
           this.ProjectUpdateHandler.markAsInactive
             .calledWith(this.project_id)
             .should.equal(true)
@@ -141,7 +128,6 @@ describe('InactiveProjectManager', function() {
 
     it('should not call markAsInactive if there was a problem archiving in docstore', function(done) {
       this.DocstoreManager.archiveProject.callsArgWith(1, 'errorrr')
-      this.TrackChangesManager.archiveProject.callsArgWith(1)
 
       this.ProjectUpdateHandler.markAsInactive.callsArgWith(1)
 

+ 14 - 24
services/web/test/unit/src/Institutions/InstitutionsAPITests.js

@@ -10,8 +10,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
-let { expect } = require('chai')
+const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
@@ -20,23 +19,17 @@ const modulePath = path.join(
   __dirname,
   '../../../../app/src/Features/Institutions/InstitutionsAPI'
 )
-;({ expect } = require('chai'))
 const Errors = require('../../../../app/src/Features/Errors/Errors')
 
 describe('InstitutionsAPI', function() {
   beforeEach(function() {
-    this.logger = { warn: sinon.stub(), err: sinon.stub(), log() {} }
     this.settings = { apis: { v1: { url: 'v1.url', user: '', pass: '' } } }
     this.request = sinon.stub()
     this.ipMatcherNotification = {
       read: (this.markAsReadIpMatcher = sinon.stub().callsArgWith(1, null))
     }
     this.InstitutionsAPI = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': this.logger,
         '@overleaf/metrics': {
           timeAsyncMethod: sinon.stub()
         },
@@ -44,9 +37,6 @@ describe('InstitutionsAPI', function() {
         request: this.request,
         '../Notifications/NotificationsBuilder': {
           ipMatcherAffiliation: sinon.stub().returns(this.ipMatcherNotification)
-        },
-        '../../../../../app/src/Features/V1/V1Api': {
-          request: sinon.stub()
         }
       }
     })
@@ -67,13 +57,13 @@ describe('InstitutionsAPI', function() {
       return this.InstitutionsAPI.getInstitutionAffiliations(
         this.institutionId,
         (err, body) => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/institutions/${this.institutionId}/affiliations`
           requestOptions.url.should.equal(expectedUrl)
           requestOptions.method.should.equal('GET')
-          should.not.exist(requestOptions.body)
+          expect(requestOptions.body).not.to.exist
           body.should.equal(responseBody)
           return done()
         }
@@ -86,7 +76,7 @@ describe('InstitutionsAPI', function() {
       return this.InstitutionsAPI.getInstitutionAffiliations(
         this.institutionId,
         (err, body) => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           expect(body).to.be.a('Array')
           body.length.should.equal(0)
           return done()
@@ -111,7 +101,7 @@ describe('InstitutionsAPI', function() {
         endDate,
         'monthly',
         (err, body) => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/institutions/${this.institutionId}/institution_licences`
@@ -134,13 +124,13 @@ describe('InstitutionsAPI', function() {
       return this.InstitutionsAPI.getUserAffiliations(
         this.stubbedUser._id,
         (err, body) => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/users/${this.stubbedUser._id}/affiliations`
           requestOptions.url.should.equal(expectedUrl)
           requestOptions.method.should.equal('GET')
-          should.not.exist(requestOptions.body)
+          expect(requestOptions.body).not.to.exist
           body.should.equal(responseBody)
           return done()
         }
@@ -164,7 +154,7 @@ describe('InstitutionsAPI', function() {
       return this.InstitutionsAPI.getUserAffiliations(
         this.stubbedUser._id,
         (err, body) => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           expect(body).to.be.a('Array')
           body.length.should.equal(0)
           return done()
@@ -191,7 +181,7 @@ describe('InstitutionsAPI', function() {
         this.newEmail,
         affiliationOptions,
         err => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/users/${this.stubbedUser._id}/affiliations`
@@ -220,7 +210,7 @@ describe('InstitutionsAPI', function() {
         this.newEmail,
         {},
         err => {
-          should.exist(err)
+          expect(err).to.exist
           err.message.should.have.string(422)
           err.message.should.have.string(body.errors)
           return done()
@@ -239,7 +229,7 @@ describe('InstitutionsAPI', function() {
         this.stubbedUser._id,
         this.newEmail,
         err => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/users/${this.stubbedUser._id}/affiliations/remove`
@@ -257,7 +247,7 @@ describe('InstitutionsAPI', function() {
         this.stubbedUser._id,
         this.newEmail,
         err => {
-          should.exist(err)
+          expect(err).to.exist
           err.message.should.exist
           return done()
         }
@@ -271,7 +261,7 @@ describe('InstitutionsAPI', function() {
       return this.InstitutionsAPI.deleteAffiliations(
         this.stubbedUser._id,
         err => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/users/${this.stubbedUser._id}/affiliations`
@@ -307,7 +297,7 @@ describe('InstitutionsAPI', function() {
         'Student',
         'Physics',
         err => {
-          should.not.exist(err)
+          expect(err).not.to.exist
           this.request.calledOnce.should.equal(true)
           const requestOptions = this.request.lastCall.args[0]
           const expectedUrl = `v1.url/api/v2/users/${this.stubbedUser._id}/affiliations/endorse`

+ 1 - 7
services/web/test/unit/src/Institutions/InstitutionsControllerTests.js

@@ -10,20 +10,18 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
+const { expect } = require('chai')
 const path = require('path')
 const sinon = require('sinon')
 const modulePath = path.join(
   __dirname,
   '../../../../app/src/Features/Institutions/InstitutionsController'
 )
-const { expect } = require('chai')
 
 describe('InstitutionsController', function() {
   beforeEach(function() {
-    this.logger = { err: sinon.stub(), warn: sinon.stub(), log() {} }
     this.host = 'mit.edu'
       .split('')
       .reverse()
@@ -81,11 +79,7 @@ describe('InstitutionsController', function() {
       .withArgs(this.stubbedUser2._id)
       .yields(null, this.stubbedUser2DecoratedEmails)
     this.InstitutionsController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': this.logger,
         '../User/UserGetter': {
           getUsersByHostname: this.getUsersByHostname,
           getUserFullEmails: this.getUserFullEmails

+ 0 - 8
services/web/test/unit/src/Institutions/InstitutionsFeaturesTests.js

@@ -12,7 +12,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-require('chai').should()
 const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = require('path').join(
@@ -26,18 +25,11 @@ describe('InstitutionsFeatures', function() {
     this.PlansLocator = { findLocalPlanInSettings: sinon.stub() }
     this.institutionPlanCode = 'institution_plan_code'
     this.InstitutionsFeatures = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../User/UserGetter': this.UserGetter,
         '../Subscription/PlansLocator': this.PlansLocator,
         'settings-sharelatex': {
           institutionPlanCode: this.institutionPlanCode
-        },
-        'logger-sharelatex': {
-          log() {},
-          err() {}
         }
       }
     })

+ 1 - 9
services/web/test/unit/src/Institutions/InstitutionsGetterTests.js

@@ -10,7 +10,6 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const SandboxedModule = require('sandboxed-module')
-require('chai').should()
 const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = require('path').join(
@@ -22,17 +21,10 @@ describe('InstitutionsGetter', function() {
   beforeEach(function() {
     this.UserGetter = { getUserFullEmails: sinon.stub() }
     this.InstitutionsGetter = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../User/UserGetter': this.UserGetter,
         '../UserMembership/UserMembershipsHandler': (this.UserMembershipsHandler = {}),
-        '../UserMembership/UserMembershipEntityConfigs': (this.UserMembershipEntityConfigs = {}),
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        }
+        '../UserMembership/UserMembershipEntityConfigs': (this.UserMembershipEntityConfigs = {})
       }
     })
 

+ 6 - 12
services/web/test/unit/src/Institutions/InstitutionsManagerTests.js

@@ -1,17 +1,15 @@
-const should = require('chai').should()
 const SandboxedModule = require('sandboxed-module')
 const path = require('path')
 const sinon = require('sinon')
+const { expect } = require('chai')
 const modulePath = path.join(
   __dirname,
   '../../../../app/src/Features/Institutions/InstitutionsManager'
 )
-const { expect } = require('chai')
 
 describe('InstitutionsManager', function() {
   beforeEach(function() {
     this.institutionId = 123
-    this.logger = { log() {} }
     this.user = {}
     this.getInstitutionAffiliations = sinon.stub()
     this.refreshFeatures = sinon.stub().yields()
@@ -54,11 +52,7 @@ describe('InstitutionsManager', function() {
     this.Mongo = { ObjectId: sinon.stub().returnsArg(0) }
 
     this.InstitutionsManager = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': this.logger,
         './InstitutionsAPI': {
           getInstitutionAffiliations: this.getInstitutionAffiliations
         },
@@ -105,7 +99,7 @@ describe('InstitutionsManager', function() {
         this.institutionId,
         false,
         error => {
-          should.not.exist(error)
+          expect(error).not.to.exist
           sinon.assert.calledTwice(this.refreshFeatures)
 
           // expect no notifications
@@ -125,7 +119,7 @@ describe('InstitutionsManager', function() {
         this.institutionId,
         true,
         error => {
-          should.not.exist(error)
+          expect(error).not.to.exist
           sinon.assert.calledOnce(
             this.NotificationsBuilder.featuresUpgradedByAffiliation
           )
@@ -144,7 +138,7 @@ describe('InstitutionsManager', function() {
         this.institutionId,
         true,
         error => {
-          should.not.exist(error)
+          expect(error).not.to.exist
           sinon.assert.calledOnce(
             this.NotificationsBuilder.redundantPersonalSubscription
           )
@@ -184,7 +178,7 @@ describe('InstitutionsManager', function() {
       this.InstitutionsManager.checkInstitutionUsers(
         this.institutionId,
         (error, usersSummary) => {
-          should.not.exist(error)
+          expect(error).not.to.exist
 
           usersSummary.confirmedEmailUsers.total.should.equal(3)
           usersSummary.confirmedEmailUsers.totalProUsers.should.equal(1)
@@ -217,7 +211,7 @@ describe('InstitutionsManager', function() {
       this.InstitutionsManager.getInstitutionUsersSubscriptions(
         this.institutionId,
         (error, subscriptions) => {
-          should.not.exist(error)
+          expect(error).not.to.exist
           sinon.assert.calledOnce(this.subscriptionExec)
           done()
         }

+ 1 - 11
services/web/test/unit/src/Metadata/MetaControllerTests.js

@@ -9,9 +9,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Metadata/MetaController'
 const SandboxedModule = require('sandboxed-module')
@@ -27,15 +25,7 @@ describe('MetaController', function() {
       getMetaForDoc: sinon.stub()
     }
     return (this.MetadataController = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': {
-          log: sinon.stub(),
-          warn: sinon.stub(),
-          err: sinon.stub()
-        },
         '../Editor/EditorRealTimeController': this.EditorRealTimeController,
         './MetaHandler': this.MetaHandler
       }

+ 1 - 6
services/web/test/unit/src/Metadata/MetaHandlerTests.js

@@ -10,9 +10,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-chai.should()
-const { expect } = chai
+const { expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Metadata/MetaHandler'
 const SandboxedModule = require('sandboxed-module')
@@ -54,9 +52,6 @@ describe('MetaHandler', function() {
     }
 
     return (this.MetaHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         '../Project/ProjectEntityHandler': this.ProjectEntityHandler,
         '../DocumentUpdater/DocumentUpdaterHandler': this

+ 1 - 3
services/web/test/unit/src/Newsletter/NewsletterManagerTests.js

@@ -27,11 +27,9 @@ describe('NewsletterManager', function() {
 
     this.NewsletterManager = SandboxedModule.require(MODULE_PATH, {
       requires: {
-        'logger-sharelatex': { info: sinon.stub() },
         'mailchimp-api-v3': this.Mailchimp,
         'settings-sharelatex': this.Settings
-      },
-      globals: { console: console }
+      }
     }).promises
 
     this.user = {

+ 1 - 9
services/web/test/unit/src/Notifications/NotificationsBuilderTests.js

@@ -1,5 +1,4 @@
 const SandboxedModule = require('sandboxed-module')
-require('chai').should()
 const sinon = require('sinon')
 const modulePath = require('path').join(
   __dirname,
@@ -15,17 +14,10 @@ describe('NotificationsBuilder', function() {
       this.settings = { apis: { v1: { url: 'v1.url', user: '', pass: '' } } }
       this.request = sinon.stub()
       this.controller = SandboxedModule.require(modulePath, {
-        globals: {
-          console: console
-        },
         requires: {
           './NotificationsHandler': this.handler,
           'settings-sharelatex': this.settings,
-          request: this.request,
-          'logger-sharelatex': {
-            log() {},
-            err() {}
-          }
+          request: this.request
         }
       })
     })

+ 0 - 8
services/web/test/unit/src/Notifications/NotificationsControllerTests.js

@@ -13,7 +13,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-require('chai').should()
 const sinon = require('sinon')
 const modulePath = require('path').join(
   __dirname,
@@ -46,15 +45,8 @@ describe('NotificationsController', function() {
       getLoggedInUserId: sinon.stub().returns(this.req.session.user._id)
     }
     return (this.controller = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         './NotificationsHandler': this.handler,
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        },
         '../Authentication/AuthenticationController': this
           .AuthenticationController
       }

+ 1 - 9
services/web/test/unit/src/Notifications/NotificationsHandlerTests.js

@@ -14,7 +14,6 @@
  */
 const SandboxedModule = require('sandboxed-module')
 const { assert } = require('chai')
-require('chai').should()
 const sinon = require('sinon')
 const modulePath = require('path').join(
   __dirname,
@@ -30,18 +29,11 @@ describe('NotificationsHandler', function() {
   beforeEach(function() {
     this.request = sinon.stub().callsArgWith(1)
     return (this.handler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': {
           apis: { notifications: { url: notificationUrl } }
         },
-        request: this.request,
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        }
+        request: this.request
       }
     }))
   })

+ 0 - 9
services/web/test/unit/src/PasswordReset/PasswordResetControllerTests.js

@@ -50,18 +50,9 @@ describe('PasswordResetController', function() {
       }
     }
     this.PasswordResetController = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': this.settings,
         './PasswordResetHandler': this.PasswordResetHandler,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err: sinon.stub(),
-          error() {}
-        },
         '../../infrastructure/RateLimiter': this.RateLimiter,
         '../Authentication/AuthenticationController': (this.AuthenticationController = {
           getLoggedInUserId: sinon.stub(),

+ 2 - 11
services/web/test/unit/src/PasswordReset/PasswordResetHandlerTests.js

@@ -15,15 +15,11 @@ const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
 const path = require('path')
 const sinon = require('sinon')
-const sinonChai = require('sinon-chai')
-const chai = require('chai')
+const { expect } = require('chai')
 const modulePath = path.join(
   __dirname,
   '../../../../app/src/Features/PasswordReset/PasswordResetHandler'
 )
-const should = require('chai').should()
-chai.use(sinonChai)
-const { expect } = chai
 
 describe('PasswordResetHandler', function() {
   beforeEach(function() {
@@ -45,7 +41,6 @@ describe('PasswordResetHandler', function() {
       }
     }
     this.PasswordResetHandler = SandboxedModule.require(modulePath, {
-      globals: { console: console },
       requires: {
         '../User/UserAuditLogHandler': (this.UserAuditLogHandler = {
           promises: {
@@ -56,11 +51,7 @@ describe('PasswordResetHandler', function() {
         '../Security/OneTimeTokenHandler': this.OneTimeTokenHandler,
         '../Email/EmailHandler': this.EmailHandler,
         '../Authentication/AuthenticationManager': this.AuthenticationManager,
-        'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        }
+        'settings-sharelatex': this.settings
       }
     })
     this.token = '12312321i'

+ 1 - 10
services/web/test/unit/src/Project/DocLinesComparitorTests.js

@@ -12,21 +12,12 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
 const sinon = require('sinon')
-const chai = require('chai')
-const should = chai.should()
 const modulePath = '../../../../app/src/Features/Project/DocLinesComparitor.js'
 const SandboxedModule = require('sandboxed-module')
 
 describe('doc lines comparitor', function() {
   beforeEach(function() {
-    return (this.comparitor = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
-      requires: {
-        'logger-sharelatex': { log() {} }
-      }
-    }))
+    return (this.comparitor = SandboxedModule.require(modulePath, {}))
   })
 
   it('should return true when the lines are the same', function() {

+ 1 - 9
services/web/test/unit/src/Project/ProjectApiControllerTests.js

@@ -10,24 +10,16 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const should = require('chai').should()
 const modulePath = '../../../../app/src/Features/Project/ProjectApiController'
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-require('chai').should()
 
 describe('Project api controller', function() {
   beforeEach(function() {
     this.ProjectDetailsHandler = { getDetails: sinon.stub() }
     this.controller = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        './ProjectDetailsHandler': this.ProjectDetailsHandler,
-        'logger-sharelatex': {
-          log() {}
-        }
+        './ProjectDetailsHandler': this.ProjectDetailsHandler
       }
     })
     this.project_id = '321l3j1kjkjl'

+ 1 - 6
services/web/test/unit/src/Project/ProjectCollabratecDetailsTest.js

@@ -15,11 +15,9 @@ const { ObjectId } = require('mongodb')
 const Path = require('path')
 const SandboxedModule = require('sandboxed-module')
 const assert = require('assert')
-const chai = require('chai')
+const { expect } = require('chai')
 const sinon = require('sinon')
 
-const { expect } = chai
-
 const modulePath = Path.join(
   __dirname,
   '../../../../app/src/Features/Project/ProjectCollabratecDetailsHandler'
@@ -34,9 +32,6 @@ describe('ProjectCollabratecDetailsHandler', function() {
     this.ProjectCollabratecDetailsHandler = SandboxedModule.require(
       modulePath,
       {
-        globals: {
-          console: console
-        },
         requires: {
           mongodb: { ObjectId },
           '../../models/Project': { Project: this.ProjectModel }

+ 0 - 10
services/web/test/unit/src/Project/ProjectControllerTests.js

@@ -66,7 +66,6 @@ describe('ProjectController', function() {
     this.EditorController = { renameProject: sinon.stub() }
     this.InactiveProjectManager = { reactivateProjectIfRequired: sinon.stub() }
     this.ProjectUpdateHandler = { markAsOpened: sinon.stub() }
-    this.ReferencesSearchHandler = { indexProjectReferences: sinon.stub() }
     this.ProjectGetter = {
       findAllUsersProjects: sinon.stub(),
       getProject: sinon.stub()
@@ -127,16 +126,9 @@ describe('ProjectController', function() {
     }
 
     this.ProjectController = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         'settings-sharelatex': this.settings,
-        'logger-sharelatex': {
-          log() {},
-          err() {}
-        },
         '@overleaf/metrics': this.Metrics,
         './ProjectDeleter': this.ProjectDeleter,
         './ProjectDuplicator': this.ProjectDuplicator,
@@ -152,8 +144,6 @@ describe('ProjectController', function() {
         '../Authorization/AuthorizationManager': this.AuthorizationManager,
         '../InactiveData/InactiveProjectManager': this.InactiveProjectManager,
         './ProjectUpdateHandler': this.ProjectUpdateHandler,
-        '../ReferencesSearch/ReferencesSearchHandler': this
-          .ReferencesSearchHandler,
         './ProjectGetter': this.ProjectGetter,
         './ProjectDetailsHandler': this.ProjectDetailsHandler,
         '../Authentication/AuthenticationController': this

+ 0 - 4
services/web/test/unit/src/Project/ProjectCreationHandlerTests.js

@@ -61,9 +61,6 @@ describe('ProjectCreationHandler', function() {
     this.AnalyticsManager = { recordEvent: sinon.stub() }
 
     this.handler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
         '../../models/User': {
@@ -76,7 +73,6 @@ describe('ProjectCreationHandler', function() {
         './ProjectDetailsHandler': this.ProjectDetailsHandler,
         'settings-sharelatex': this.Settings,
         '../Analytics/AnalyticsManager': this.AnalyticsManager,
-        'logger-sharelatex': { log() {} },
         '@overleaf/metrics': {
           inc() {},
           timeAsyncMethod() {}

+ 2 - 13
services/web/test/unit/src/Project/ProjectDeleterTests.js

@@ -1,8 +1,7 @@
 const modulePath = '../../../../app/src/Features/Project/ProjectDeleter'
 const SandboxedModule = require('sandboxed-module')
 const sinon = require('sinon')
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const tk = require('timekeeper')
 const moment = require('moment')
 const { Project } = require('../helpers/models/Project')
@@ -93,12 +92,6 @@ describe('ProjectDeleter', function() {
       }
     }
 
-    this.logger = {
-      err: sinon.stub(),
-      log: sinon.stub(),
-      warn: sinon.stub()
-    }
-
     this.ProjectDetailsHandler = {
       promises: {
         generateUniqueName: sinon.stub().resolves(this.project.name)
@@ -150,11 +143,7 @@ describe('ProjectDeleter', function() {
         '../Docstore/DocstoreManager': this.DocstoreManager,
         './ProjectDetailsHandler': this.ProjectDetailsHandler,
         '../../infrastructure/mongodb': { db: this.db, ObjectId },
-        '../History/HistoryManager': this.HistoryManager,
-        'logger-sharelatex': this.logger
-      },
-      globals: {
-        console: console
+        '../History/HistoryManager': this.HistoryManager
       }
     })
   })

+ 0 - 8
services/web/test/unit/src/Project/ProjectDetailsHandlerTests.js

@@ -66,9 +66,6 @@ describe('ProjectDetailsHandler', function() {
       defaultFeatures: 'default-features'
     }
     this.handler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         './ProjectHelper': ProjectHelper,
         './ProjectGetter': this.ProjectGetter,
@@ -77,11 +74,6 @@ describe('ProjectDetailsHandler', function() {
         },
         '../User/UserGetter': this.UserGetter,
         '../ThirdPartyDataStore/TpdsUpdateSender': this.TpdsUpdateSender,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        },
         '../TokenGenerator/TokenGenerator': this.TokenGenerator,
         'settings-sharelatex': this.settings
       }

+ 1 - 9
services/web/test/unit/src/Project/ProjectDuplicatorTests.js

@@ -200,9 +200,6 @@ describe('ProjectDuplicator', function() {
     }
 
     this.ProjectDuplicator = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         '../../models/Doc': { Doc: this.Doc },
         '../../models/File': { File: this.File },
@@ -218,12 +215,7 @@ describe('ProjectDuplicator', function() {
         './ProjectGetter': this.ProjectGetter,
         './ProjectLocator': this.ProjectLocator,
         './ProjectOptionsHandler': this.ProjectOptionsHandler,
-        '../ThirdPartyDataStore/TpdsProjectFlusher': this.TpdsProjectFlusher,
-        'logger-sharelatex': {
-          log() {},
-          warn() {},
-          err() {}
-        }
+        '../ThirdPartyDataStore/TpdsProjectFlusher': this.TpdsProjectFlusher
       }
     })
   })

+ 16 - 20
services/web/test/unit/src/Project/ProjectEditorHandlerTests.js

@@ -10,9 +10,7 @@
  * DS102: Remove unnecessary code created because of implicit returns
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-const { expect } = chai
-const should = chai.should()
+const { expect } = require('chai')
 
 const modulePath = '../../../../app/src/Features/Project/ProjectEditorHandler'
 const SandboxedModule = require('sandboxed-module')
@@ -122,27 +120,27 @@ describe('ProjectEditorHandler', function() {
       })
 
       it('should include the id', function() {
-        should.exist(this.result._id)
+        expect(this.result._id).to.exist
         return this.result._id.should.equal('project-id')
       })
 
       it('should include the name', function() {
-        should.exist(this.result.name)
+        expect(this.result.name).to.exist
         return this.result.name.should.equal('Project Name')
       })
 
       it('should include the root doc id', function() {
-        should.exist(this.result.rootDoc_id)
+        expect(this.result.rootDoc_id).to.exist
         return this.result.rootDoc_id.should.equal('file-id')
       })
 
       it('should include the public access level', function() {
-        should.exist(this.result.publicAccesLevel)
+        expect(this.result.publicAccesLevel).to.exist
         return this.result.publicAccesLevel.should.equal('private')
       })
 
       it('should include the owner', function() {
-        should.exist(this.result.owner)
+        expect(this.result.owner).to.exist
         this.result.owner._id.should.equal('owner-id')
         this.result.owner.email.should.equal('owner@sharelatex.com')
         this.result.owner.first_name.should.equal('Owner')
@@ -151,7 +149,7 @@ describe('ProjectEditorHandler', function() {
       })
 
       it('should include the deletedDocs', function() {
-        should.exist(this.result.deletedDocs)
+        expect(this.result.deletedDocs).to.exist
         this.result.deletedDocs.should.deep.equal([
           {
             // omit deletedAt field
@@ -162,8 +160,8 @@ describe('ProjectEditorHandler', function() {
       })
 
       it('invites should not include the token', function() {
-        should.not.exist(this.result.invites[0].token)
-        should.not.exist(this.result.invites[1].token)
+        expect(this.result.invites[0].token).not.to.exist
+        expect(this.result.invites[1].token).not.to.exist
       })
 
       it('should gather readOnly_refs and collaberators_refs into a list of members', function() {
@@ -178,7 +176,7 @@ describe('ProjectEditorHandler', function() {
 
         this.result.members.length.should.equal(2)
 
-        should.exist(findMember('read-only-id'))
+        expect(findMember('read-only-id')).to.exist
         findMember('read-only-id').privileges.should.equal('readOnly')
         findMember('read-only-id').first_name.should.equal('Read')
         findMember('read-only-id').last_name.should.equal('Only')
@@ -186,7 +184,7 @@ describe('ProjectEditorHandler', function() {
           'read-only@sharelatex.com'
         )
 
-        should.exist(findMember('read-write-id'))
+        expect(findMember('read-write-id')).to.exist
         findMember('read-write-id').privileges.should.equal('readAndWrite')
         findMember('read-write-id').first_name.should.equal('Read')
         findMember('read-write-id').last_name.should.equal('Write')
@@ -218,9 +216,8 @@ describe('ProjectEditorHandler', function() {
         this.result.rootFolder[0].folders[0].fileRefs[0].created.should.equal(
           this.created
         )
-        return should.not.exist(
-          this.result.rootFolder[0].folders[0].fileRefs[0].size
-        )
+        return expect(this.result.rootFolder[0].folders[0].fileRefs[0].size).not
+          .to.exist
       })
 
       it('should include docs in the project but not the lines', function() {
@@ -228,13 +225,12 @@ describe('ProjectEditorHandler', function() {
         this.result.rootFolder[0].folders[0].docs[0].name.should.equal(
           'main.tex'
         )
-        return should.not.exist(
-          this.result.rootFolder[0].folders[0].docs[0].lines
-        )
+        return expect(this.result.rootFolder[0].folders[0].docs[0].lines).not.to
+          .exist
       })
 
       it('should include invites', function() {
-        should.exist(this.result.invites)
+        expect(this.result.invites).to.exist
         return this.result.invites.should.deep.equal(this.invites)
       })
     })

+ 1 - 12
services/web/test/unit/src/Project/ProjectEntityHandlerTests.js

@@ -13,10 +13,7 @@
  * DS206: Consider reworking classes to avoid initClass
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-const { assert } = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { assert, expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Project/ProjectEntityHandler'
 const SandboxedModule = require('sandboxed-module')
@@ -60,15 +57,7 @@ describe('ProjectEntityHandler', function() {
     this.callback = sinon.stub()
 
     return (this.ProjectEntityHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub(),
-          err() {}
-        }),
         '../Docstore/DocstoreManager': (this.DocstoreManager = {}),
         '../../Features/DocumentUpdater/DocumentUpdaterHandler': this
           .DocumentUpdaterHandler,

+ 0 - 10
services/web/test/unit/src/Project/ProjectEntityMongoUpdateHandlerTests.js

@@ -62,12 +62,6 @@ describe('ProjectEntityMongoUpdateHandler', function() {
       rootFolder: [this.rootFolder]
     }
 
-    this.logger = {
-      log: sinon.stub(),
-      warn: sinon.stub(),
-      error: sinon.stub(),
-      err() {}
-    }
     this.Settings = { maxEntitiesPerProject: 100 }
     this.CooldownManager = {}
     this.LockManager = {
@@ -184,12 +178,8 @@ describe('ProjectEntityMongoUpdateHandler', function() {
     }
 
     this.subject = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         mongodb: { ObjectId },
-        'logger-sharelatex': this.logger,
         'settings-sharelatex': this.Settings,
         '../Cooldown/CooldownManager': this.CooldownManager,
         '../../models/Folder': { Folder: this.FolderModel },

+ 1 - 13
services/web/test/unit/src/Project/ProjectEntityUpdateHandlerTests.js

@@ -1,5 +1,4 @@
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const sinon = require('sinon')
 const Errors = require('../../../../app/src/Features/Errors/Errors')
 const SandboxedModule = require('sandboxed-module')
@@ -82,13 +81,6 @@ describe('ProjectEntityUpdateHandler', function() {
       resyncProjectHistory: sinon.stub(),
       deleteDoc: sinon.stub().yields()
     }
-    this.logger = {
-      info: sinon.stub(),
-      log: sinon.stub(),
-      warn: sinon.stub(),
-      error: sinon.stub(),
-      err() {}
-    }
     this.fs = {
       unlink: sinon.stub().yields()
     }
@@ -152,12 +144,8 @@ describe('ProjectEntityUpdateHandler', function() {
       emitToRoom: sinon.stub()
     }
     this.ProjectEntityUpdateHandler = SandboxedModule.require(MODULE_PATH, {
-      globals: {
-        console: console
-      },
       requires: {
         'settings-sharelatex': { validRootDocExtensions: ['tex'] },
-        'logger-sharelatex': this.logger,
         fs: this.fs,
         '../../models/Doc': { Doc: this.DocModel },
         '../Docstore/DocstoreManager': this.DocstoreManager,

+ 2 - 8
services/web/test/unit/src/Project/ProjectGetterTests.js

@@ -1,6 +1,5 @@
 const sinon = require('sinon')
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const modulePath = '../../../../app/src/Features/Project/ProjectGetter.js'
 const SandboxedModule = require('sandboxed-module')
 const { ObjectId } = require('mongodb')
@@ -43,7 +42,6 @@ describe('ProjectGetter', function() {
       lockKey: sinon.stub().returnsArg(0)
     }
     this.ProjectGetter = SandboxedModule.require(modulePath, {
-      globals: { console },
       requires: {
         '../../infrastructure/mongodb': { db: this.db, ObjectId },
         '@overleaf/metrics': {
@@ -58,11 +56,7 @@ describe('ProjectGetter', function() {
         '../Collaborators/CollaboratorsGetter': this.CollaboratorsGetter,
         '../../infrastructure/LockManager': this.LockManager,
         './ProjectEntityMongoUpdateHandler': this
-          .ProjectEntityMongoUpdateHandler,
-        'logger-sharelatex': {
-          err() {},
-          log() {}
-        }
+          .ProjectEntityMongoUpdateHandler
       }
     })
   })

+ 1 - 2
services/web/test/unit/src/Project/ProjectHelperTests.js

@@ -1,5 +1,4 @@
-const chai = require('chai')
-const { expect } = chai
+const { expect } = require('chai')
 const SandboxedModule = require('sandboxed-module')
 const { ObjectId } = require('mongodb')
 

+ 1 - 12
services/web/test/unit/src/Project/ProjectHistoryHandlerTests.js

@@ -12,10 +12,7 @@
  * DS206: Consider reworking classes to avoid initClass
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const chai = require('chai')
-const { assert } = require('chai')
-const should = chai.should()
-const { expect } = chai
+const { assert, expect } = require('chai')
 const sinon = require('sinon')
 const modulePath = '../../../../app/src/Features/Project/ProjectHistoryHandler'
 const SandboxedModule = require('sandboxed-module')
@@ -46,15 +43,7 @@ describe('ProjectHistoryHandler', function() {
     this.callback = sinon.stub()
 
     return (this.ProjectHistoryHandler = SandboxedModule.require(modulePath, {
-      globals: {
-        console: console
-      },
       requires: {
-        'logger-sharelatex': (this.logger = {
-          log: sinon.stub(),
-          error: sinon.stub(),
-          err() {}
-        }),
         'settings-sharelatex': (this.Settings = {}),
         '../../models/Project': {
           Project: this.ProjectModel

Some files were not shown because too many files changed in this diff