Procházet zdrojové kódy

Merge pull request #3949 from overleaf/msm-reenable-eslint-const-rule

Reenable eslint `prefer-const` rule

GitOrigin-RevId: 4f3825be8b8dff381095209085a36eaab76260d5
Miguel Serrano před 5 roky
rodič
revize
f9871103bf
100 změnil soubory, kde provedl 280 přidání a 289 odebrání
  1. 0 1
      services/web/.eslintrc
  2. 3 3
      services/web/app/src/Features/Authentication/AuthenticationController.js
  3. 1 1
      services/web/app/src/Features/Collaborators/CollaboratorsGetter.js
  4. 1 1
      services/web/app/src/Features/Compile/ClsiManager.js
  5. 1 1
      services/web/app/src/Features/Compile/ClsiStateManager.js
  6. 1 1
      services/web/app/src/Features/Compile/CompileController.js
  7. 2 2
      services/web/app/src/Features/Compile/CompileManager.js
  8. 2 2
      services/web/app/src/Features/Documents/DocumentHelper.js
  9. 3 3
      services/web/app/src/Features/Downloads/ProjectZipStreamManager.js
  10. 1 1
      services/web/app/src/Features/Email/EmailSender.js
  11. 1 1
      services/web/app/src/Features/Institutions/InstitutionsManager.js
  12. 2 2
      services/web/app/src/Features/Metadata/MetaHandler.js
  13. 1 1
      services/web/app/src/Features/PasswordReset/PasswordResetController.js
  14. 1 1
      services/web/app/src/Features/Project/ProjectCollabratecDetailsHandler.js
  15. 2 2
      services/web/app/src/Features/Project/ProjectController.js
  16. 6 6
      services/web/app/src/Features/Project/ProjectDeleter.js
  17. 1 1
      services/web/app/src/Features/Project/ProjectEditorHandler.js
  18. 12 12
      services/web/app/src/Features/Project/ProjectEntityHandler.js
  19. 5 5
      services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js
  20. 5 5
      services/web/app/src/Features/Project/ProjectLocator.js
  21. 1 1
      services/web/app/src/Features/Project/ProjectRootDocManager.js
  22. 1 1
      services/web/app/src/Features/Project/SafePath.js
  23. 4 4
      services/web/app/src/Features/Subscription/FeaturesUpdater.js
  24. 1 1
      services/web/app/src/Features/Subscription/PlansLocator.js
  25. 1 1
      services/web/app/src/Features/Subscription/SubscriptionUpdater.js
  26. 1 1
      services/web/app/src/Features/Subscription/UserFeaturesUpdater.js
  27. 1 1
      services/web/app/src/Features/Templates/TemplatesManager.js
  28. 1 1
      services/web/app/src/Features/Uploads/ArchiveManager.js
  29. 1 1
      services/web/app/src/Features/Uploads/FileTypeManager.js
  30. 1 1
      services/web/app/src/Features/User/UserController.js
  31. 3 3
      services/web/app/src/Features/User/UserDeleter.js
  32. 1 1
      services/web/app/src/Features/User/UserInfoController.js
  33. 1 1
      services/web/app/src/Features/User/UserPagesController.js
  34. 1 2
      services/web/app/src/Features/User/UserSessionsManager.js
  35. 1 1
      services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js
  36. 2 2
      services/web/app/src/Features/UserMembership/UserMembershipHandler.js
  37. 3 3
      services/web/app/src/Features/UserMembership/UserMembershipMiddleware.js
  38. 1 1
      services/web/app/src/Features/UserMembership/UserMembershipsHandler.js
  39. 1 1
      services/web/app/src/infrastructure/ExpressLocals.js
  40. 7 7
      services/web/app/src/infrastructure/Modules.js
  41. 2 2
      services/web/app/src/infrastructure/Views.js
  42. 1 1
      services/web/frontend/js/directives/asyncForm.js
  43. 1 2
      services/web/frontend/js/directives/focus.js
  44. 1 1
      services/web/frontend/js/features/chat/components/message-content.js
  45. 2 2
      services/web/frontend/js/features/file-tree/util/find-in-tree.js
  46. 1 1
      services/web/frontend/js/features/file-tree/util/safe-path.js
  47. 2 2
      services/web/frontend/js/features/outline/outline-parser.js
  48. 1 1
      services/web/frontend/js/features/preview/components/preview-toolbar.js
  49. 1 1
      services/web/frontend/js/ide.js
  50. 1 1
      services/web/frontend/js/ide/colors/ColorManager.js
  51. 4 4
      services/web/frontend/js/ide/connection/ConnectionManager.js
  52. 1 1
      services/web/frontend/js/ide/connection/SocketIoShim.js
  53. 1 1
      services/web/frontend/js/ide/directives/layout.js
  54. 6 6
      services/web/frontend/js/ide/editor/Document.js
  55. 1 1
      services/web/frontend/js/ide/editor/ShareJsDoc.js
  56. 1 1
      services/web/frontend/js/ide/editor/controllers/SavingNotificationController.js
  57. 1 1
      services/web/frontend/js/ide/editor/directives/aceEditor.js
  58. 7 8
      services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager.js
  59. 2 2
      services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/CommandManager.js
  60. 2 2
      services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/EnvironmentManager.js
  61. 1 1
      services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/PackageManager.js
  62. 5 5
      services/web/frontend/js/ide/editor/directives/aceEditor/highlights/HighlightsManager.js
  63. 2 2
      services/web/frontend/js/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.js
  64. 2 2
      services/web/frontend/js/ide/editor/directives/aceEditor/track-changes/TrackChangesAdapter.js
  65. 12 12
      services/web/frontend/js/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.js
  66. 12 12
      services/web/frontend/js/ide/file-tree/FileTreeManager.js
  67. 1 1
      services/web/frontend/js/ide/file-tree/controllers/FileTreeEntityController.js
  68. 1 1
      services/web/frontend/js/ide/file-tree/controllers/FileTreeFolderController.js
  69. 1 1
      services/web/frontend/js/ide/file-tree/controllers/FileTreeRootFolderController.js
  70. 1 1
      services/web/frontend/js/ide/files/services/files.js
  71. 7 7
      services/web/frontend/js/ide/history/HistoryManager.js
  72. 31 31
      services/web/frontend/js/ide/history/HistoryV2Manager.js
  73. 4 4
      services/web/frontend/js/ide/history/components/historyFileEntity.js
  74. 4 4
      services/web/frontend/js/ide/history/controllers/HistoryListController.js
  75. 2 4
      services/web/frontend/js/ide/history/controllers/HistoryV2ToolbarController.js
  76. 3 3
      services/web/frontend/js/ide/human-readable-logs/HumanReadableLogs.js
  77. 4 4
      services/web/frontend/js/ide/metadata/services/metadata.js
  78. 1 1
      services/web/frontend/js/ide/online-users/OnlineUsersManager.js
  79. 4 4
      services/web/frontend/js/ide/pdf/controllers/PdfController.js
  80. 1 1
      services/web/frontend/js/ide/pdfng/directives/pdfAnnotations.js
  81. 1 1
      services/web/frontend/js/ide/pdfng/directives/pdfHighlights.js
  82. 1 1
      services/web/frontend/js/ide/pdfng/directives/pdfJs.js
  83. 1 1
      services/web/frontend/js/ide/pdfng/directives/pdfPage.js
  84. 4 4
      services/web/frontend/js/ide/pdfng/directives/pdfRenderer.js
  85. 3 3
      services/web/frontend/js/ide/pdfng/directives/pdfViewer.js
  86. 15 15
      services/web/frontend/js/ide/review-panel/RangesTracker.js
  87. 15 15
      services/web/frontend/js/ide/review-panel/controllers/ReviewPanelController.js
  88. 1 1
      services/web/frontend/js/ide/review-panel/directives/resolvedCommentsDropdown.js
  89. 1 1
      services/web/frontend/js/ide/review-panel/directives/reviewPanelSorted.js
  90. 1 1
      services/web/frontend/js/ide/review-panel/filters/orderOverviewEntries.js
  91. 1 1
      services/web/frontend/js/ide/services/ide.js
  92. 1 1
      services/web/frontend/js/ide/settings/services/settings.js
  93. 2 2
      services/web/frontend/js/ide/share/controllers/ShareProjectModalController.js
  94. 1 2
      services/web/frontend/js/main/account-upgrade.js
  95. 1 1
      services/web/frontend/js/main/affiliations/controllers/UserAffiliationsController.js
  96. 2 2
      services/web/frontend/js/main/affiliations/factories/UserAffiliationsDataService.js
  97. 1 1
      services/web/frontend/js/main/learn.js
  98. 1 1
      services/web/frontend/js/main/new-subscription.js
  99. 2 4
      services/web/frontend/js/main/plans.js
  100. 2 2
      services/web/frontend/js/main/project-list/notifications-controller.js

+ 0 - 1
services/web/.eslintrc

@@ -43,7 +43,6 @@
     // TODO: re-enable and fix
     // TODO: re-enable and fix
     "no-prototype-builtins": "off",
     "no-prototype-builtins": "off",
     "no-var": "off",
     "no-var": "off",
-    "prefer-const": "off",
     "array-callback-return": "off",
     "array-callback-return": "off",
     "no-unreachable-loop": "off",
     "no-unreachable-loop": "off",
     "no-loss-of-precision": "off",
     "no-loss-of-precision": "off",

+ 3 - 3
services/web/app/src/Features/Authentication/AuthenticationController.js

@@ -187,7 +187,7 @@ const AuthenticationController = {
     if (!sessionUser) {
     if (!sessionUser) {
       return
       return
     }
     }
-    for (let key in props) {
+    for (const key in props) {
       const value = props[key]
       const value = props[key]
       sessionUser[key] = value
       sessionUser[key] = value
     }
     }
@@ -362,7 +362,7 @@ const AuthenticationController = {
   },
   },
 
 
   httpAuth: basicAuth(function (user, pass) {
   httpAuth: basicAuth(function (user, pass) {
-    let expectedPassword = Settings.httpAuthUsers[user]
+    const expectedPassword = Settings.httpAuthUsers[user]
     const isValid =
     const isValid =
       expectedPassword &&
       expectedPassword &&
       expectedPassword.length === pass.length &&
       expectedPassword.length === pass.length &&
@@ -499,7 +499,7 @@ function _afterLoginSessionSetup(req, user, callback) {
       req.sessionStore.generate(req)
       req.sessionStore.generate(req)
       // Note: the validation token is not writable, so it does not get
       // Note: the validation token is not writable, so it does not get
       // transferred to the new session below.
       // transferred to the new session below.
-      for (let key in oldSession) {
+      for (const key in oldSession) {
         const value = oldSession[key]
         const value = oldSession[key]
         if (key !== '__tmp' && key !== 'csrfSecret') {
         if (key !== '__tmp' && key !== 'csrfSecret') {
           req.session[key] = value
           req.session[key] = value

+ 1 - 1
services/web/app/src/Features/Collaborators/CollaboratorsGetter.js

@@ -86,7 +86,7 @@ async function getInvitedMembersWithPrivilegeLevelsFromFields(
   collaboratorIds,
   collaboratorIds,
   readOnlyIds
   readOnlyIds
 ) {
 ) {
-  let members = _getMemberIdsWithPrivilegeLevelsFromFields(
+  const members = _getMemberIdsWithPrivilegeLevelsFromFields(
     ownerId,
     ownerId,
     collaboratorIds,
     collaboratorIds,
     readOnlyIds,
     readOnlyIds,

+ 1 - 1
services/web/app/src/Features/Compile/ClsiManager.js

@@ -651,7 +651,7 @@ const ClsiManager = {
         )
         )
       }
       }
       const docs = {}
       const docs = {}
-      for (let doc of docUpdaterDocs || []) {
+      for (const doc of docUpdaterDocs || []) {
         const path = docPath[doc._id]
         const path = docPath[doc._id]
         docs[path] = doc
         docs[path] = doc
       }
       }

+ 1 - 1
services/web/app/src/Features/Compile/ClsiStateManager.js

@@ -59,7 +59,7 @@ module.exports = ClsiStateManager = {
         const optionsList = (() => {
         const optionsList = (() => {
           const result = []
           const result = []
           const object = options || {}
           const object = options || {}
-          for (let key in object) {
+          for (const key in object) {
             const value = object[key]
             const value = object[key]
             if (!['isAutoCompile'].includes(key)) {
             if (!['isAutoCompile'].includes(key)) {
               result.push(`option ${key}:${value}`)
               result.push(`option ${key}:${value}`)

+ 1 - 1
services/web/app/src/Features/Compile/CompileController.js

@@ -526,7 +526,7 @@ module.exports = CompileController = {
       // do not send any others, there's a proxying loop if Host: is passed!
       // do not send any others, there's a proxying loop if Host: is passed!
       if (req.query != null ? req.query.pdfng : undefined) {
       if (req.query != null ? req.query.pdfng : undefined) {
         const newHeaders = {}
         const newHeaders = {}
-        for (let h in req.headers) {
+        for (const h in req.headers) {
           const v = req.headers[h]
           const v = req.headers[h]
           if (/^(If-|Range)/i.test(h)) {
           if (/^(If-|Range)/i.test(h)) {
             newHeaders[h] = req.headers[h]
             newHeaders[h] = req.headers[h]

+ 2 - 2
services/web/app/src/Features/Compile/CompileManager.js

@@ -69,7 +69,7 @@ module.exports = CompileManager = {
                     if (error != null) {
                     if (error != null) {
                       return callback(error)
                       return callback(error)
                     }
                     }
-                    for (let key in limits) {
+                    for (const key in limits) {
                       const value = limits[key]
                       const value = limits[key]
                       options[key] = value
                       options[key] = value
                     }
                     }
@@ -175,7 +175,7 @@ module.exports = CompileManager = {
             if (error != null) {
             if (error != null) {
               return callback(error)
               return callback(error)
             }
             }
-            let ownerFeatures = (owner && owner.features) || {}
+            const ownerFeatures = (owner && owner.features) || {}
             // put alpha users into their own compile group
             // put alpha users into their own compile group
             if (owner && owner.alphaProgram) {
             if (owner && owner.alphaProgram) {
               ownerFeatures.compileGroup = 'alpha'
               ownerFeatures.compileGroup = 'alpha'

+ 2 - 2
services/web/app/src/Features/Documents/DocumentHelper.js

@@ -19,7 +19,7 @@ module.exports = DocumentHelper = {
     }
     }
     const TITLE_WITH_CURLY_BRACES = /\\[tT]itle\*?\s*{([^}]+)}/
     const TITLE_WITH_CURLY_BRACES = /\\[tT]itle\*?\s*{([^}]+)}/
     const TITLE_WITH_SQUARE_BRACES = /\\[tT]itle\s*\[([^\]]+)\]/
     const TITLE_WITH_SQUARE_BRACES = /\\[tT]itle\s*\[([^\]]+)\]/
-    for (let line of Array.from(
+    for (const line of Array.from(
       DocumentHelper._getLinesFromContent(content, maxContentToScan)
       DocumentHelper._getLinesFromContent(content, maxContentToScan)
     )) {
     )) {
       var match
       var match
@@ -39,7 +39,7 @@ module.exports = DocumentHelper = {
     if (maxContentToScan == null) {
     if (maxContentToScan == null) {
       maxContentToScan = 30000
       maxContentToScan = 30000
     }
     }
-    for (let line of Array.from(
+    for (const line of Array.from(
       DocumentHelper._getLinesFromContent(content, maxContentToScan)
       DocumentHelper._getLinesFromContent(content, maxContentToScan)
     )) {
     )) {
       // We've had problems with this regex locking up CPU.
       // We've had problems with this regex locking up CPU.

+ 3 - 3
services/web/app/src/Features/Downloads/ProjectZipStreamManager.js

@@ -38,7 +38,7 @@ module.exports = ProjectZipStreamManager = {
     callback(null, archive)
     callback(null, archive)
 
 
     const jobs = []
     const jobs = []
-    for (let project_id of Array.from(project_ids || [])) {
+    for (const project_id of Array.from(project_ids || [])) {
       ;(project_id =>
       ;(project_id =>
         jobs.push(callback =>
         jobs.push(callback =>
           ProjectGetter.getProject(
           ProjectGetter.getProject(
@@ -123,7 +123,7 @@ module.exports = ProjectZipStreamManager = {
         return callback(error)
         return callback(error)
       }
       }
       const jobs = []
       const jobs = []
-      for (let path in docs) {
+      for (const path in docs) {
         const doc = docs[path]
         const doc = docs[path]
         ;(function (path, doc) {
         ;(function (path, doc) {
           if (path[0] === '/') {
           if (path[0] === '/') {
@@ -151,7 +151,7 @@ module.exports = ProjectZipStreamManager = {
           return callback(error)
           return callback(error)
         }
         }
         const jobs = []
         const jobs = []
-        for (let path in files) {
+        for (const path in files) {
           const file = files[path]
           const file = files[path]
           ;((path, file) =>
           ;((path, file) =>
             jobs.push(callback =>
             jobs.push(callback =>

+ 1 - 1
services/web/app/src/Features/Email/EmailSender.js

@@ -83,7 +83,7 @@ async function sendEmail(options) {
       throw new OError('rate limit hit sending email')
       throw new OError('rate limit hit sending email')
     }
     }
     metrics.inc('email')
     metrics.inc('email')
-    let sendMailOptions = {
+    const sendMailOptions = {
       to: options.to,
       to: options.to,
       from: EMAIL_SETTINGS.fromAddress || '',
       from: EMAIL_SETTINGS.fromAddress || '',
       subject: options.subject,
       subject: options.subject,

+ 1 - 1
services/web/app/src/Features/Institutions/InstitutionsManager.js

@@ -168,7 +168,7 @@ var checkFeatures = function (institutionId, users) {
     },
     },
   }
   }
   users.forEach(function (user) {
   users.forEach(function (user) {
-    let isSSOEntitled = SAMLIdentityManager.userHasEntitlement(
+    const isSSOEntitled = SAMLIdentityManager.userHasEntitlement(
       user,
       user,
       institutionId
       institutionId
     )
     )

+ 2 - 2
services/web/app/src/Features/Metadata/MetaHandler.js

@@ -85,7 +85,7 @@ module.exports = MetaHandler = {
     const label_re = MetaHandler.labelRegex()
     const label_re = MetaHandler.labelRegex()
     const package_re = MetaHandler.usepackageRegex()
     const package_re = MetaHandler.usepackageRegex()
     const req_package_re = MetaHandler.ReqPackageRegex()
     const req_package_re = MetaHandler.ReqPackageRegex()
-    for (let line of Array.from(lines)) {
+    for (const line of Array.from(lines)) {
       var labelMatch
       var labelMatch
       var clean, messy, packageMatch
       var clean, messy, packageMatch
       while ((labelMatch = label_re.exec(line))) {
       while ((labelMatch = label_re.exec(line))) {
@@ -123,7 +123,7 @@ module.exports = MetaHandler = {
 
 
   extractMetaFromProjectDocs(projectDocs) {
   extractMetaFromProjectDocs(projectDocs) {
     const projectMeta = {}
     const projectMeta = {}
-    for (let _path in projectDocs) {
+    for (const _path in projectDocs) {
       const doc = projectDocs[_path]
       const doc = projectDocs[_path]
       projectMeta[doc._id] = MetaHandler.extractMetaFromDoc(doc.lines)
       projectMeta[doc._id] = MetaHandler.extractMetaFromDoc(doc.lines)
     }
     }

+ 1 - 1
services/web/app/src/Features/PasswordReset/PasswordResetController.js

@@ -30,7 +30,7 @@ async function setNewUserPassword(req, res, next) {
       password,
       password,
       auditLog
       auditLog
     )
     )
-    let { found, reset, userId } = result
+    const { found, reset, userId } = result
     if (!found) return res.sendStatus(404)
     if (!found) return res.sendStatus(404)
     if (!reset) return res.sendStatus(500)
     if (!reset) return res.sendStatus(500)
     await UserSessionsManager.promises.revokeAllUserSessions(
     await UserSessionsManager.promises.revokeAllUserSessions(

+ 1 - 1
services/web/app/src/Features/Project/ProjectCollabratecDetailsHandler.js

@@ -113,7 +113,7 @@ module.exports = ProjectCollabratecDetailsHandler = {
     if (!Array.isArray(collabratec_users)) {
     if (!Array.isArray(collabratec_users)) {
       callback(new Error('collabratec_users must be array'))
       callback(new Error('collabratec_users must be array'))
     }
     }
-    for (let collabratec_user of Array.from(collabratec_users)) {
+    for (const collabratec_user of Array.from(collabratec_users)) {
       try {
       try {
         collabratec_user.user_id = ObjectId(collabratec_user.user_id)
         collabratec_user.user_id = ObjectId(collabratec_user.user_id)
       } catch (error1) {
       } catch (error1) {

+ 2 - 2
services/web/app/src/Features/Project/ProjectController.js

@@ -1035,7 +1035,7 @@ const ProjectController = {
       affiliations = []
       affiliations = []
     }
     }
     const portalTemplates = []
     const portalTemplates = []
-    for (let aff of affiliations) {
+    for (const aff of affiliations) {
       if (
       if (
         aff.portal &&
         aff.portal &&
         aff.portal.slug &&
         aff.portal.slug &&
@@ -1082,7 +1082,7 @@ function generateThemeList() {
     Path.join(__dirname, '/../../../../node_modules/ace-builds/src-noconflict')
     Path.join(__dirname, '/../../../../node_modules/ace-builds/src-noconflict')
   )
   )
   const result = []
   const result = []
-  for (let file of files) {
+  for (const file of files) {
     if (file.slice(-2) === 'js' && /^theme-/.test(file)) {
     if (file.slice(-2) === 'js' && /^theme-/.test(file)) {
       const cleanName = file.slice(0, -3).slice(6)
       const cleanName = file.slice(0, -3).slice(6)
       result.push(THEME_LIST.push(cleanName))
       result.push(THEME_LIST.push(cleanName))

+ 6 - 6
services/web/app/src/Features/Project/ProjectDeleter.js

@@ -111,7 +111,7 @@ async function restoreProject(projectId) {
 
 
 async function archiveProject(projectId, userId) {
 async function archiveProject(projectId, userId) {
   try {
   try {
-    let project = await Project.findOne({ _id: projectId }).exec()
+    const project = await Project.findOne({ _id: projectId }).exec()
     if (!project) {
     if (!project) {
       throw new Errors.NotFoundError('project not found')
       throw new Errors.NotFoundError('project not found')
     }
     }
@@ -133,7 +133,7 @@ async function archiveProject(projectId, userId) {
 
 
 async function unarchiveProject(projectId, userId) {
 async function unarchiveProject(projectId, userId) {
   try {
   try {
-    let project = await Project.findOne({ _id: projectId }).exec()
+    const project = await Project.findOne({ _id: projectId }).exec()
     if (!project) {
     if (!project) {
       throw new Errors.NotFoundError('project not found')
       throw new Errors.NotFoundError('project not found')
     }
     }
@@ -156,7 +156,7 @@ async function unarchiveProject(projectId, userId) {
 
 
 async function trashProject(projectId, userId) {
 async function trashProject(projectId, userId) {
   try {
   try {
-    let project = await Project.findOne({ _id: projectId }).exec()
+    const project = await Project.findOne({ _id: projectId }).exec()
     if (!project) {
     if (!project) {
       throw new Errors.NotFoundError('project not found')
       throw new Errors.NotFoundError('project not found')
     }
     }
@@ -182,7 +182,7 @@ async function trashProject(projectId, userId) {
 
 
 async function untrashProject(projectId, userId) {
 async function untrashProject(projectId, userId) {
   try {
   try {
-    let project = await Project.findOne({ _id: projectId }).exec()
+    const project = await Project.findOne({ _id: projectId }).exec()
     if (!project) {
     if (!project) {
       throw new Errors.NotFoundError('project not found')
       throw new Errors.NotFoundError('project not found')
     }
     }
@@ -279,7 +279,7 @@ async function deleteProject(projectId, options = {}) {
 
 
 async function undeleteProject(projectId, options = {}) {
 async function undeleteProject(projectId, options = {}) {
   projectId = ObjectId(projectId)
   projectId = ObjectId(projectId)
-  let deletedProject = await DeletedProject.findOne({
+  const deletedProject = await DeletedProject.findOne({
     'deleterData.deletedProjectId': projectId,
     'deleterData.deletedProjectId': projectId,
   }).exec()
   }).exec()
 
 
@@ -291,7 +291,7 @@ async function undeleteProject(projectId, options = {}) {
     throw new Errors.NotFoundError('project_too_old_to_restore')
     throw new Errors.NotFoundError('project_too_old_to_restore')
   }
   }
 
 
-  let restored = new Project(deletedProject.project)
+  const restored = new Project(deletedProject.project)
 
 
   if (options.userId) {
   if (options.userId) {
     restored.owner_ref = options.userId
     restored.owner_ref = options.userId

+ 1 - 1
services/web/app/src/Features/Project/ProjectEditorHandler.js

@@ -100,7 +100,7 @@ module.exports = ProjectEditorHandler = {
     let owner = null
     let owner = null
     let ownerFeatures = null
     let ownerFeatures = null
     const filteredMembers = []
     const filteredMembers = []
-    for (let member of Array.from(members || [])) {
+    for (const member of Array.from(members || [])) {
       if (member.privilegeLevel === 'owner') {
       if (member.privilegeLevel === 'owner') {
         ownerFeatures = member.user.features
         ownerFeatures = member.user.features
         owner = this.buildUserModelView(member.user, 'owner')
         owner = this.buildUserModelView(member.user, 'owner')

+ 12 - 12
services/web/app/src/Features/Project/ProjectEntityHandler.js

@@ -15,7 +15,7 @@ const ProjectEntityHandler = {
 
 
       // Turn array from docstore into a dictionary based on doc id
       // Turn array from docstore into a dictionary based on doc id
       const docContents = {}
       const docContents = {}
-      for (let docContent of docContentsArray) {
+      for (const docContent of docContentsArray) {
         docContents[docContent._id] = docContent
         docContents[docContent._id] = docContent
       }
       }
 
 
@@ -27,9 +27,9 @@ const ProjectEntityHandler = {
           return callback(error)
           return callback(error)
         }
         }
         const docs = {}
         const docs = {}
-        for (let folderPath in folders) {
+        for (const folderPath in folders) {
           const folder = folders[folderPath]
           const folder = folders[folderPath]
-          for (let doc of folder.docs || []) {
+          for (const doc of folder.docs || []) {
             const content = docContents[doc._id.toString()]
             const content = docContents[doc._id.toString()]
             if (content != null) {
             if (content != null) {
               docs[path.join(folderPath, doc.name)] = {
               docs[path.join(folderPath, doc.name)] = {
@@ -56,9 +56,9 @@ const ProjectEntityHandler = {
         return callback(err)
         return callback(err)
       }
       }
       const files = {}
       const files = {}
-      for (let folderPath in folders) {
+      for (const folderPath in folders) {
         const folder = folders[folderPath]
         const folder = folders[folderPath]
-        for (let file of folder.fileRefs || []) {
+        for (const file of folder.fileRefs || []) {
           if (file != null) {
           if (file != null) {
             files[path.join(folderPath, file.name)] = file
             files[path.join(folderPath, file.name)] = file
           }
           }
@@ -91,14 +91,14 @@ const ProjectEntityHandler = {
       }
       }
       const docs = []
       const docs = []
       const files = []
       const files = []
-      for (let folderPath in folders) {
+      for (const folderPath in folders) {
         const folder = folders[folderPath]
         const folder = folders[folderPath]
-        for (let doc of folder.docs || []) {
+        for (const doc of folder.docs || []) {
           if (doc != null) {
           if (doc != null) {
             docs.push({ path: path.join(folderPath, doc.name), doc })
             docs.push({ path: path.join(folderPath, doc.name), doc })
           }
           }
         }
         }
-        for (let file of folder.fileRefs || []) {
+        for (const file of folder.fileRefs || []) {
           if (file != null) {
           if (file != null) {
             files.push({ path: path.join(folderPath, file.name), file })
             files.push({ path: path.join(folderPath, file.name), file })
           }
           }
@@ -129,9 +129,9 @@ const ProjectEntityHandler = {
         return callback(err)
         return callback(err)
       }
       }
       const docPath = {}
       const docPath = {}
-      for (let folderPath in folders) {
+      for (const folderPath in folders) {
         const folder = folders[folderPath]
         const folder = folders[folderPath]
-        for (let doc of folder.docs || []) {
+        for (const doc of folder.docs || []) {
           docPath[doc._id] = path.join(folderPath, doc.name)
           docPath[doc._id] = path.join(folderPath, doc.name)
         }
         }
       }
       }
@@ -160,7 +160,7 @@ const ProjectEntityHandler = {
         return callback(new Errors.NotFoundError('no project'))
         return callback(new Errors.NotFoundError('no project'))
       }
       }
       function recursivelyFindDocInFolder(basePath, docId, folder) {
       function recursivelyFindDocInFolder(basePath, docId, folder) {
-        let docInCurrentFolder = (folder.docs || []).find(
+        const docInCurrentFolder = (folder.docs || []).find(
           currentDoc => currentDoc._id.toString() === docId.toString()
           currentDoc => currentDoc._id.toString() === docId.toString()
         )
         )
         if (docInCurrentFolder != null) {
         if (docInCurrentFolder != null) {
@@ -208,7 +208,7 @@ const ProjectEntityHandler = {
     const folders = {}
     const folders = {}
     function processFolder(basePath, folder) {
     function processFolder(basePath, folder) {
       folders[basePath] = folder
       folders[basePath] = folder
-      for (let childFolder of folder.folders || []) {
+      for (const childFolder of folder.folders || []) {
         if (childFolder.name != null) {
         if (childFolder.name != null) {
           processFolder(path.join(basePath, childFolder.name), childFolder)
           processFolder(path.join(basePath, childFolder.name), childFolder)
         }
         }

+ 5 - 5
services/web/app/src/Features/Project/ProjectEntityUpdateHandler.js

@@ -1175,7 +1175,7 @@ const ProjectEntityUpdateHandler = {
   ),
   ),
 
 
   mkdirp: wrapWithLock(function (projectId, path, callback) {
   mkdirp: wrapWithLock(function (projectId, path, callback) {
-    for (let folder of path.split('/')) {
+    for (const folder of path.split('/')) {
       if (folder.length > 0 && !SafePath.isCleanFilename(folder)) {
       if (folder.length > 0 && !SafePath.isCleanFilename(folder)) {
         return callback(new Errors.InvalidNameError('invalid element name'))
         return callback(new Errors.InvalidNameError('invalid element name'))
       }
       }
@@ -1189,7 +1189,7 @@ const ProjectEntityUpdateHandler = {
   }),
   }),
 
 
   mkdirpWithExactCase: wrapWithLock(function (projectId, path, callback) {
   mkdirpWithExactCase: wrapWithLock(function (projectId, path, callback) {
-    for (let folder of path.split('/')) {
+    for (const folder of path.split('/')) {
       if (folder.length > 0 && !SafePath.isCleanFilename(folder)) {
       if (folder.length > 0 && !SafePath.isCleanFilename(folder)) {
         return callback(new Errors.InvalidNameError('invalid element name'))
         return callback(new Errors.InvalidNameError('invalid element name'))
       }
       }
@@ -1381,7 +1381,7 @@ const ProjectEntityUpdateHandler = {
   ),
   ),
 
 
   isPathValidForRootDoc(docPath) {
   isPathValidForRootDoc(docPath) {
-    let docExtension = Path.extname(docPath)
+    const docExtension = Path.extname(docPath)
     return VALID_ROOT_DOC_REGEXP.test(docExtension)
     return VALID_ROOT_DOC_REGEXP.test(docExtension)
   },
   },
 
 
@@ -1458,10 +1458,10 @@ const ProjectEntityUpdateHandler = {
     } else if (entityType.indexOf('folder') !== -1) {
     } else if (entityType.indexOf('folder') !== -1) {
       changes = { oldDocs: [], oldFiles: [] }
       changes = { oldDocs: [], oldFiles: [] }
       const _recurseFolder = (folder, folderPath) => {
       const _recurseFolder = (folder, folderPath) => {
-        for (let doc of folder.docs) {
+        for (const doc of folder.docs) {
           changes.oldDocs.push({ doc, path: Path.join(folderPath, doc.name) })
           changes.oldDocs.push({ doc, path: Path.join(folderPath, doc.name) })
         }
         }
-        for (let file of folder.fileRefs) {
+        for (const file of folder.fileRefs) {
           changes.oldFiles.push({
           changes.oldFiles.push({
             file,
             file,
             path: Path.join(folderPath, file.name),
             path: Path.join(folderPath, file.name),

+ 5 - 5
services/web/app/src/Features/Project/ProjectLocator.js

@@ -46,7 +46,7 @@ function findElement(options, _callback) {
           return
           return
         }
         }
         const newPath = {}
         const newPath = {}
-        for (let key of Object.keys(path)) {
+        for (const key of Object.keys(path)) {
           const value = path[key]
           const value = path[key]
           newPath[key] = value
           newPath[key] = value
         } // make a value copy of the string
         } // make a value copy of the string
@@ -179,7 +179,7 @@ function _findElementByPathWithProject(
     }
     }
     const needleFolderName = foldersList[level]
     const needleFolderName = foldersList[level]
     let found = false
     let found = false
-    for (let folder of haystackFolder.folders) {
+    for (const folder of haystackFolder.folders) {
       if (matchFn(folder.name, needleFolderName)) {
       if (matchFn(folder.name, needleFolderName)) {
         found = true
         found = true
         if (level === foldersList.length - 1) {
         if (level === foldersList.length - 1) {
@@ -203,19 +203,19 @@ function _findElementByPathWithProject(
     if (entityName == null) {
     if (entityName == null) {
       return cb(null, folder, 'folder')
       return cb(null, folder, 'folder')
     }
     }
-    for (let file of folder.fileRefs || []) {
+    for (const file of folder.fileRefs || []) {
       if (matchFn(file != null ? file.name : undefined, entityName)) {
       if (matchFn(file != null ? file.name : undefined, entityName)) {
         result = file
         result = file
         type = 'file'
         type = 'file'
       }
       }
     }
     }
-    for (let doc of folder.docs || []) {
+    for (const doc of folder.docs || []) {
       if (matchFn(doc != null ? doc.name : undefined, entityName)) {
       if (matchFn(doc != null ? doc.name : undefined, entityName)) {
         result = doc
         result = doc
         type = 'doc'
         type = 'doc'
       }
       }
     }
     }
-    for (let childFolder of folder.folders || []) {
+    for (const childFolder of folder.folders || []) {
       if (
       if (
         matchFn(childFolder != null ? childFolder.name : undefined, entityName)
         matchFn(childFolder != null ? childFolder.name : undefined, entityName)
       ) {
       ) {

+ 1 - 1
services/web/app/src/Features/Project/ProjectRootDocManager.js

@@ -228,7 +228,7 @@ module.exports = ProjectRootDocManager = {
                 return callback(error)
                 return callback(error)
               }
               }
               let rootDocValid = false
               let rootDocValid = false
-              for (let doc_id in docPaths) {
+              for (const doc_id in docPaths) {
                 const _path = docPaths[doc_id]
                 const _path = docPaths[doc_id]
                 if (doc_id === project.rootDoc_id) {
                 if (doc_id === project.rootDoc_id) {
                   rootDocValid = true
                   rootDocValid = true

+ 1 - 1
services/web/app/src/Features/Project/SafePath.js

@@ -112,7 +112,7 @@ prototype\
         return false
         return false
       }
       }
 
 
-      for (let element of Array.from(elements)) {
+      for (const element of Array.from(elements)) {
         if (element.length > 0 && !SafePath.isCleanFilename(element)) {
         if (element.length > 0 && !SafePath.isCleanFilename(element)) {
           return false
           return false
         }
         }

+ 4 - 4
services/web/app/src/Features/Subscription/FeaturesUpdater.js

@@ -139,8 +139,8 @@ const FeaturesUpdater = {
       ) {
       ) {
         return callback(null, {})
         return callback(null, {})
       }
       }
-      let activeFeaturesOverrides = []
-      for (let featuresOverride of user.featuresOverrides) {
+      const activeFeaturesOverrides = []
+      for (const featuresOverride of user.featuresOverrides) {
         if (
         if (
           !featuresOverride.expiresAt ||
           !featuresOverride.expiresAt ||
           featuresOverride.expiresAt > new Date()
           featuresOverride.expiresAt > new Date()
@@ -181,7 +181,7 @@ const FeaturesUpdater = {
 
 
   _mergeFeatures(featuresA, featuresB) {
   _mergeFeatures(featuresA, featuresB) {
     const features = Object.assign({}, featuresA)
     const features = Object.assign({}, featuresA)
-    for (let key in featuresB) {
+    for (const key in featuresB) {
       // Special merging logic for non-boolean features
       // Special merging logic for non-boolean features
       if (key === 'compileGroup') {
       if (key === 'compileGroup') {
         if (
         if (
@@ -239,7 +239,7 @@ const FeaturesUpdater = {
       return {}
       return {}
     }
     }
 
 
-    let mismatchReasons = {}
+    const mismatchReasons = {}
     const featureKeys = [
     const featureKeys = [
       ...new Set([
       ...new Set([
         ...Object.keys(currentFeatures),
         ...Object.keys(currentFeatures),

+ 1 - 1
services/web/app/src/Features/Subscription/PlansLocator.js

@@ -11,7 +11,7 @@ function ensurePlansAreSetupCorrectly() {
 }
 }
 
 
 function findLocalPlanInSettings(planCode) {
 function findLocalPlanInSettings(planCode) {
-  for (let plan of Settings.plans) {
+  for (const plan of Settings.plans) {
     if (plan.planCode === planCode) {
     if (plan.planCode === planCode) {
       return plan
       return plan
     }
     }

+ 1 - 1
services/web/app/src/Features/Subscription/SubscriptionUpdater.js

@@ -184,7 +184,7 @@ const SubscriptionUpdater = {
         if (err) {
         if (err) {
           return callback(err)
           return callback(err)
         }
         }
-        let subscription = deletedSubscription.subscription
+        const subscription = deletedSubscription.subscription
         async.series(
         async.series(
           [
           [
             cb =>
             cb =>

+ 1 - 1
services/web/app/src/Features/Subscription/UserFeaturesUpdater.js

@@ -4,7 +4,7 @@ module.exports = {
   updateFeatures(userId, features, callback) {
   updateFeatures(userId, features, callback) {
     const conditions = { _id: userId }
     const conditions = { _id: userId }
     const update = {}
     const update = {}
-    for (let key in features) {
+    for (const key in features) {
       const value = features[key]
       const value = features[key]
       update[`features.${key}`] = value
       update[`features.${key}`] = value
     }
     }

+ 1 - 1
services/web/app/src/Features/Templates/TemplatesManager.js

@@ -168,7 +168,7 @@ const TemplatesManager = {
 
 
   promises: {
   promises: {
     async fetchFromV1(templateId) {
     async fetchFromV1(templateId) {
-      let { body, statusCode } = await requestPromise({
+      const { body, statusCode } = await requestPromise({
         baseUrl: settings.apis.v1.url,
         baseUrl: settings.apis.v1.url,
         url: `/api/v2/templates/${templateId}`,
         url: `/api/v2/templates/${templateId}`,
         method: 'GET',
         method: 'GET',

+ 1 - 1
services/web/app/src/Features/Uploads/ArchiveManager.js

@@ -88,7 +88,7 @@ const ArchiveManager = {
       return callback() // don't give a destfile for directory
       return callback() // don't give a destfile for directory
     }
     }
     // check that the file does not use a relative path
     // check that the file does not use a relative path
-    for (let dir of Array.from(transformedFilename.split('/'))) {
+    for (const dir of Array.from(transformedFilename.split('/'))) {
       if (dir === '..') {
       if (dir === '..') {
         return callback(new Error('relative path'))
         return callback(new Error('relative path'))
       }
       }

+ 1 - 1
services/web/app/src/Features/Uploads/FileTypeManager.js

@@ -99,7 +99,7 @@ const FileTypeManager = {
 
 
   shouldIgnore(path, callback) {
   shouldIgnore(path, callback) {
     const name = Path.basename(path)
     const name = Path.basename(path)
-    let extension = Path.extname(name).toLowerCase()
+    const extension = Path.extname(name).toLowerCase()
     let ignore = false
     let ignore = false
     if (name.startsWith('.') && name !== '.latexmkrc') {
     if (name.startsWith('.') && name !== '.latexmkrc') {
       ignore = true
       ignore = true

+ 1 - 1
services/web/app/src/Features/User/UserController.js

@@ -216,7 +216,7 @@ const UserController = {
           { deleterUser: user, ipAddress: req.ip },
           { deleterUser: user, ipAddress: req.ip },
           err => {
           err => {
             if (err) {
             if (err) {
-              let errorData = {
+              const errorData = {
                 message: 'error while deleting user account',
                 message: 'error while deleting user account',
                 info: { userId },
                 info: { userId },
               }
               }

+ 3 - 3
services/web/app/src/Features/User/UserDeleter.js

@@ -36,7 +36,7 @@ async function deleteUser(userId, options = {}) {
   }
   }
 
 
   try {
   try {
-    let user = await User.findById(userId).exec()
+    const user = await User.findById(userId).exec()
     logger.log({ user }, 'deleting user')
     logger.log({ user }, 'deleting user')
 
 
     await ensureCanDeleteUser(user)
     await ensureCanDeleteUser(user)
@@ -62,7 +62,7 @@ async function deleteMongoUser(userId) {
 }
 }
 
 
 async function expireDeletedUser(userId) {
 async function expireDeletedUser(userId) {
-  let deletedUser = await DeletedUser.findOne({
+  const deletedUser = await DeletedUser.findOne({
     'deleterData.deletedUserId': userId,
     'deleterData.deletedUserId': userId,
   }).exec()
   }).exec()
 
 
@@ -73,7 +73,7 @@ async function expireDeletedUser(userId) {
 
 
 async function expireDeletedUsersAfterDuration() {
 async function expireDeletedUsersAfterDuration() {
   const DURATION = 90
   const DURATION = 90
-  let deletedUsers = await DeletedUser.find({
+  const deletedUsers = await DeletedUser.find({
     'deleterData.deletedAt': {
     'deleterData.deletedAt': {
       $lt: new Date(moment().subtract(DURATION, 'days')),
       $lt: new Date(moment().subtract(DURATION, 'days')),
     },
     },

+ 1 - 1
services/web/app/src/Features/User/UserInfoController.js

@@ -65,7 +65,7 @@ module.exports = UserController = {
       return {}
       return {}
     }
     }
     const formattedUser = { id: user._id.toString() }
     const formattedUser = { id: user._id.toString() }
-    for (let key of [
+    for (const key of [
       'first_name',
       'first_name',
       'last_name',
       'last_name',
       'email',
       'email',

+ 1 - 1
services/web/app/src/Features/User/UserPagesController.js

@@ -173,7 +173,7 @@ const UserPagesController = {
   _translateProviderDescriptions(providers, req) {
   _translateProviderDescriptions(providers, req) {
     const result = {}
     const result = {}
     if (providers) {
     if (providers) {
-      for (let provider in providers) {
+      for (const provider in providers) {
         const data = providers[provider]
         const data = providers[provider]
         data.description = req.i18n.translate(
         data.description = req.i18n.translate(
           data.descriptionKey,
           data.descriptionKey,

+ 1 - 2
services/web/app/src/Features/User/UserSessionsManager.js

@@ -1,4 +1,3 @@
-let UserSessionsManager
 const OError = require('@overleaf/o-error')
 const OError = require('@overleaf/o-error')
 const Settings = require('settings-sharelatex')
 const Settings = require('settings-sharelatex')
 const logger = require('logger-sharelatex')
 const logger = require('logger-sharelatex')
@@ -8,7 +7,7 @@ const { promisify } = require('util')
 const UserSessionsRedis = require('./UserSessionsRedis')
 const UserSessionsRedis = require('./UserSessionsRedis')
 const rclient = UserSessionsRedis.client()
 const rclient = UserSessionsRedis.client()
 
 
-UserSessionsManager = {
+const UserSessionsManager = {
   // mimic the key used by the express sessions
   // mimic the key used by the express sessions
   _sessionKey(sessionId) {
   _sessionKey(sessionId) {
     return `sess:${sessionId}`
     return `sess:${sessionId}`

+ 1 - 1
services/web/app/src/Features/UserMembership/UserMembershipAuthorization.js

@@ -1,4 +1,4 @@
-let UserMembershipAuthorization = {
+const UserMembershipAuthorization = {
   hasStaffAccess(requiredStaffAccess) {
   hasStaffAccess(requiredStaffAccess) {
     return req => {
     return req => {
       if (!req.user) {
       if (!req.user) {

+ 2 - 2
services/web/app/src/Features/UserMembership/UserMembershipHandler.js

@@ -94,8 +94,8 @@ var getPopulatedListOfMembers = function (entity, attributes, callback) {
   }
   }
   const userObjects = []
   const userObjects = []
 
 
-  for (let attribute of Array.from(attributes)) {
-    for (let userObject of Array.from(entity[attribute] || [])) {
+  for (const attribute of Array.from(attributes)) {
+    for (const userObject of Array.from(entity[attribute] || [])) {
       // userObject can be an email as String, a user id as ObjectId or an
       // userObject can be an email as String, a user id as ObjectId or an
       // invite as Object with an email attribute as String. We want to pass to
       // invite as Object with an email attribute as String. We want to pass to
       // UserMembershipViewModel either an email as (String) or a user id (ObjectId)
       // UserMembershipViewModel either an email as (String) or a user id (ObjectId)

+ 3 - 3
services/web/app/src/Features/UserMembership/UserMembershipMiddleware.js

@@ -10,7 +10,7 @@ const TemplatesManager = require('../Templates/TemplatesManager')
 
 
 // set of middleware arrays or functions that checks user access to an entity
 // set of middleware arrays or functions that checks user access to an entity
 // (publisher, institution, group, template, etc.)
 // (publisher, institution, group, template, etc.)
-let UserMembershipMiddleware = {
+const UserMembershipMiddleware = {
   requireTeamMetricsAccess: [
   requireTeamMetricsAccess: [
     AuthenticationController.requireLogin(),
     AuthenticationController.requireLogin(),
     fetchEntityConfig('team'),
     fetchEntityConfig('team'),
@@ -198,7 +198,7 @@ function fetchEntityConfig(entityName) {
 // fetch the entity with id and config, and set it in the request
 // fetch the entity with id and config, and set it in the request
 function fetchEntity() {
 function fetchEntity() {
   return expressify(async (req, res, next) => {
   return expressify(async (req, res, next) => {
-    let entity = await UserMembershipHandler.promises.getEntityWithoutAuthorizationCheck(
+    const entity = await UserMembershipHandler.promises.getEntityWithoutAuthorizationCheck(
       req.params.id,
       req.params.id,
       req.entityConfig
       req.entityConfig
     )
     )
@@ -281,7 +281,7 @@ function requireV1Template() {
 // retur values is truly. Redirect to restricted otherwise
 // retur values is truly. Redirect to restricted otherwise
 function allowAccessIfAny(accessFunctions) {
 function allowAccessIfAny(accessFunctions) {
   return (req, res, next) => {
   return (req, res, next) => {
-    for (let accessFunction of accessFunctions) {
+    for (const accessFunction of accessFunctions) {
       if (accessFunction(req)) {
       if (accessFunction(req)) {
         return next()
         return next()
       }
       }

+ 1 - 1
services/web/app/src/Features/UserMembership/UserMembershipsHandler.js

@@ -26,7 +26,7 @@ const UserMembershipsHandler = {
       callback = function (error) {}
       callback = function (error) {}
     }
     }
     const entityConfigs = []
     const entityConfigs = []
-    for (let key in UserMembershipEntityConfigs) {
+    for (const key in UserMembershipEntityConfigs) {
       const entityConfig = UserMembershipEntityConfigs[key]
       const entityConfig = UserMembershipEntityConfigs[key]
       if (entityConfig.fields && entityConfig.fields.write != null) {
       if (entityConfig.fields && entityConfig.fields.write != null) {
         entityConfigs.push(entityConfig)
         entityConfigs.push(entityConfig)

+ 1 - 1
services/web/app/src/infrastructure/ExpressLocals.js

@@ -299,7 +299,7 @@ module.exports = function (webRouter, privateApiRouter, publicApiRouter) {
   webRouter.use(function (req, res, next) {
   webRouter.use(function (req, res, next) {
     // Clone the nav settings so they can be modified for each request
     // Clone the nav settings so they can be modified for each request
     res.locals.nav = {}
     res.locals.nav = {}
-    for (let key in Settings.nav) {
+    for (const key in Settings.nav) {
       res.locals.nav[key] = _.clone(Settings.nav[key])
       res.locals.nav[key] = _.clone(Settings.nav[key])
     }
     }
     res.locals.templates = Settings.templateLinks
     res.locals.templates = Settings.templateLinks

+ 7 - 7
services/web/app/src/infrastructure/Modules.js

@@ -12,7 +12,7 @@ const _hooks = {}
 let _viewIncludes = {}
 let _viewIncludes = {}
 
 
 function loadModules() {
 function loadModules() {
-  for (let moduleName of fs.readdirSync(MODULE_BASE_PATH)) {
+  for (const moduleName of fs.readdirSync(MODULE_BASE_PATH)) {
     if (fs.existsSync(Path.join(MODULE_BASE_PATH, moduleName, 'index.js'))) {
     if (fs.existsSync(Path.join(MODULE_BASE_PATH, moduleName, 'index.js'))) {
       const loadedModule = require(Path.join(
       const loadedModule = require(Path.join(
         MODULE_BASE_PATH,
         MODULE_BASE_PATH,
@@ -35,7 +35,7 @@ function applyRouter(webRouter, privateApiRouter, publicApiRouter) {
 }
 }
 
 
 function applyNonCsrfRouter(webRouter, privateApiRouter, publicApiRouter) {
 function applyNonCsrfRouter(webRouter, privateApiRouter, publicApiRouter) {
-  for (let module of _modules) {
+  for (const module of _modules) {
     if (module.nonCsrfRouter != null) {
     if (module.nonCsrfRouter != null) {
       module.nonCsrfRouter.apply(webRouter, privateApiRouter, publicApiRouter)
       module.nonCsrfRouter.apply(webRouter, privateApiRouter, publicApiRouter)
     }
     }
@@ -53,7 +53,7 @@ function loadViewIncludes(app) {
   _viewIncludes = {}
   _viewIncludes = {}
   for (const module of _modules) {
   for (const module of _modules) {
     const object = module.viewIncludes || {}
     const object = module.viewIncludes || {}
-    for (let view in object) {
+    for (const view in object) {
       const partial = object[view]
       const partial = object[view]
       if (!_viewIncludes[view]) {
       if (!_viewIncludes[view]) {
         _viewIncludes[view] = []
         _viewIncludes[view] = []
@@ -77,7 +77,7 @@ function loadViewIncludes(app) {
 function moduleIncludes(view, locals) {
 function moduleIncludes(view, locals) {
   const compiledPartials = _viewIncludes[view] || []
   const compiledPartials = _viewIncludes[view] || []
   let html = ''
   let html = ''
-  for (let compiledPartial of compiledPartials) {
+  for (const compiledPartial of compiledPartials) {
     html += compiledPartial(locals)
     html += compiledPartial(locals)
   }
   }
   return html
   return html
@@ -89,8 +89,8 @@ function moduleIncludesAvailable(view) {
 
 
 function linkedFileAgentsIncludes() {
 function linkedFileAgentsIncludes() {
   const agents = {}
   const agents = {}
-  for (let module of _modules) {
-    for (let name in module.linkedFileAgents) {
+  for (const module of _modules) {
+    for (const name in module.linkedFileAgents) {
       const agentFunction = module.linkedFileAgents[name]
       const agentFunction = module.linkedFileAgents[name]
       agents[name] = agentFunction()
       agents[name] = agentFunction()
     }
     }
@@ -101,7 +101,7 @@ function linkedFileAgentsIncludes() {
 function attachHooks() {
 function attachHooks() {
   for (var module of _modules) {
   for (var module of _modules) {
     if (module.hooks != null) {
     if (module.hooks != null) {
-      for (let hook in module.hooks) {
+      for (const hook in module.hooks) {
         const method = module.hooks[hook]
         const method = module.hooks[hook]
         attachHook(hook, method)
         attachHook(hook, method)
       }
       }

+ 2 - 2
services/web/app/src/infrastructure/Views.js

@@ -28,11 +28,11 @@ const viewList = globby
 
 
 module.exports = {
 module.exports = {
   precompileViews(app) {
   precompileViews(app) {
-    let startTime = Date.now()
+    const startTime = Date.now()
     let success = 0
     let success = 0
     let failures = 0
     let failures = 0
     viewList.forEach(view => {
     viewList.forEach(view => {
-      let filename = path.resolve(view + '.pug') // express views are cached using the absolute path
+      const filename = path.resolve(view + '.pug') // express views are cached using the absolute path
       try {
       try {
         pug.compileFile(filename, {
         pug.compileFile(filename, {
           cache: true,
           cache: true,

+ 1 - 1
services/web/frontend/js/directives/asyncForm.js

@@ -36,7 +36,7 @@ App.directive('asyncForm', ($http, validateCaptcha, validateCaptchaV3) => ({
 
 
     const submitRequest = function (grecaptchaResponse) {
     const submitRequest = function (grecaptchaResponse) {
       const formData = {}
       const formData = {}
-      for (let data of Array.from(element.serializeArray())) {
+      for (const data of Array.from(element.serializeArray())) {
         formData[data.name] = data.value
         formData[data.name] = data.value
       }
       }
 
 

+ 1 - 2
services/web/frontend/js/directives/focus.js

@@ -10,7 +10,6 @@
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
  */
 import App from '../base'
 import App from '../base'
-let selectName
 App.directive('focusWhen', $timeout => ({
 App.directive('focusWhen', $timeout => ({
   restrict: 'A',
   restrict: 'A',
   link(scope, element, attr) {
   link(scope, element, attr) {
@@ -79,7 +78,7 @@ App.directive('focus', $timeout => ({
   },
   },
 }))
 }))
 
 
-selectName = function (element) {
+function selectName(element) {
   // Select up to last '.'. I.e. everything except the file extension
   // Select up to last '.'. I.e. everything except the file extension
   element.focus()
   element.focus()
   const name = element.val()
   const name = element.val()

+ 1 - 1
services/web/frontend/js/features/chat/components/message-content.js

@@ -25,7 +25,7 @@ function MessageContent({ content }) {
 
 
   useEffect(() => {
   useEffect(() => {
     // adds attributes to all the links generated by <Linkify/>, required due to https://github.com/tasti/react-linkify/issues/99
     // adds attributes to all the links generated by <Linkify/>, required due to https://github.com/tasti/react-linkify/issues/99
-    for (let a of root.current.getElementsByTagName('a')) {
+    for (const a of root.current.getElementsByTagName('a')) {
       a.setAttribute('target', '_blank')
       a.setAttribute('target', '_blank')
       a.setAttribute('rel', 'noreferrer noopener')
       a.setAttribute('rel', 'noreferrer noopener')
     }
     }

+ 2 - 2
services/web/frontend/js/features/file-tree/util/find-in-tree.js

@@ -7,7 +7,7 @@ export function findInTreeOrThrow(tree, id) {
 }
 }
 
 
 export function findAllInTreeOrThrow(tree, ids) {
 export function findAllInTreeOrThrow(tree, ids) {
-  let list = new Set()
+  const list = new Set()
   ids.forEach(id => {
   ids.forEach(id => {
     list.add(findInTreeOrThrow(tree, id))
     list.add(findInTreeOrThrow(tree, id))
   })
   })
@@ -26,7 +26,7 @@ export function findAllFolderIdsInFolder(folder) {
 }
 }
 
 
 export function findAllFolderIdsInFolders(folders) {
 export function findAllFolderIdsInFolders(folders) {
-  let list = new Set()
+  const list = new Set()
   folders.forEach(folder => {
   folders.forEach(folder => {
     findAllFolderIdsInFolder(folder).forEach(folderId => {
     findAllFolderIdsInFolder(folder).forEach(folderId => {
       list.add(folderId)
       list.add(folderId)

+ 1 - 1
services/web/frontend/js/features/file-tree/util/safe-path.js

@@ -91,7 +91,7 @@ export function isCleanPath(path) {
     return false
     return false
   }
   }
 
 
-  for (let element of Array.from(elements)) {
+  for (const element of Array.from(elements)) {
     if (element.length > 0 && !isCleanFilename(element)) {
     if (element.length > 0 && !isCleanFilename(element)) {
       return false
       return false
     }
     }

+ 2 - 2
services/web/frontend/js/features/outline/outline-parser.js

@@ -94,8 +94,8 @@ function matchDisplayTitle(title) {
 }
 }
 
 
 function nestOutline(flatOutline) {
 function nestOutline(flatOutline) {
-  let parentOutlines = {}
-  let nestedOutlines = []
+  const parentOutlines = {}
+  const nestedOutlines = []
   flatOutline.forEach(outline => {
   flatOutline.forEach(outline => {
     const parentOutlineLevels = Object.keys(parentOutlines)
     const parentOutlineLevels = Object.keys(parentOutlines)
 
 

+ 1 - 1
services/web/frontend/js/features/preview/components/preview-toolbar.js

@@ -95,7 +95,7 @@ function PreviewToolbar({
 
 
     itemsWidth += 10 // add extra for some spacing between items
     itemsWidth += 10 // add extra for some spacing between items
 
 
-    let canShowText = itemsWidth < toolbarWidth
+    const canShowText = itemsWidth < toolbarWidth
 
 
     if (!canShowText) {
     if (!canShowText) {
       _checkToggleText(
       _checkToggleText(

+ 1 - 1
services/web/frontend/js/ide.js

@@ -176,7 +176,7 @@ App.controller(
 
 
     ide.validFileRegex = '^[^*/]*$' // Don't allow * and /
     ide.validFileRegex = '^[^*/]*$' // Don't allow * and /
 
 
-    let useFallbackWebsocket =
+    const useFallbackWebsocket =
       window.location &&
       window.location &&
       window.location.search &&
       window.location.search &&
       window.location.search.match(/ws=fallback/)
       window.location.search.match(/ws=fallback/)

+ 1 - 1
services/web/frontend/js/ide/colors/ColorManager.js

@@ -82,7 +82,7 @@ export default ColorManager = {
 
 
   getHueForId(id) {
   getHueForId(id) {
     const hash = CryptoJS(id)
     const hash = CryptoJS(id)
-    let hue =
+    const hue =
       parseInt(hash.toString().slice(0, 8), 16) %
       parseInt(hash.toString().slice(0, 8), 16) %
       (this.TOTAL_HUES - this.OWN_HUE_BLOCKED_SIZE * 2)
       (this.TOTAL_HUES - this.OWN_HUE_BLOCKED_SIZE * 2)
     return hue
     return hue

+ 4 - 4
services/web/frontend/js/ide/connection/ConnectionManager.js

@@ -140,7 +140,7 @@ export default ConnectionManager = (function () {
       // handle network-level websocket errors (e.g. failed dns lookups)
       // handle network-level websocket errors (e.g. failed dns lookups)
 
 
       let connectionAttempt = 1
       let connectionAttempt = 1
-      let connectionErrorHandler = err => {
+      const connectionErrorHandler = err => {
         if (
         if (
           window.wsRetryHandshake &&
           window.wsRetryHandshake &&
           connectionAttempt++ < window.wsRetryHandshake
           connectionAttempt++ < window.wsRetryHandshake
@@ -195,7 +195,7 @@ export default ConnectionManager = (function () {
         })
         })
 
 
         // we have passed authentication so we can now join the project
         // we have passed authentication so we can now join the project
-        let connectionJobId = this.$scope.connection.jobId
+        const connectionJobId = this.$scope.connection.jobId
         setTimeout(() => {
         setTimeout(() => {
           this.joinProject(connectionJobId)
           this.joinProject(connectionJobId)
         }, 100)
         }, 100)
@@ -279,7 +279,7 @@ The editor will refresh automatically in ${delay} seconds.\
     updateConnectionManagerState(state) {
     updateConnectionManagerState(state) {
       this.$scope.$apply(() => {
       this.$scope.$apply(() => {
         this.$scope.connection.jobId += 1
         this.$scope.connection.jobId += 1
-        let jobId = this.$scope.connection.jobId
+        const jobId = this.$scope.connection.jobId
         sl_console.log(
         sl_console.log(
           `[updateConnectionManagerState ${jobId}] from ${this.$scope.connection.state} to ${state}`
           `[updateConnectionManagerState ${jobId}] from ${this.$scope.connection.state} to ${state}`
         )
         )
@@ -473,7 +473,7 @@ Something went wrong connecting to your project. Please refresh if this continue
 
 
     startAutoReconnectCountdown() {
     startAutoReconnectCountdown() {
       this.updateConnectionManagerState('waitingCountdown')
       this.updateConnectionManagerState('waitingCountdown')
-      let connectionId = this.$scope.connection.jobId
+      const connectionId = this.$scope.connection.jobId
       let countdown
       let countdown
       sl_console.log('[ConnectionManager] starting autoreconnect countdown')
       sl_console.log('[ConnectionManager] starting autoreconnect countdown')
       const twoMinutes = 2 * 60 * 1000
       const twoMinutes = 2 * 60 * 1000

+ 1 - 1
services/web/frontend/js/ide/connection/SocketIoShim.js

@@ -16,7 +16,7 @@ const transparentMethods = [
   'on',
   'on',
   'removeListener',
   'removeListener',
 ]
 ]
-for (let method of transparentMethods) {
+for (const method of transparentMethods) {
   SocketShimBase.prototype[method] = function () {
   SocketShimBase.prototype[method] = function () {
     this._socket[method].apply(this._socket, arguments)
     this._socket[method].apply(this._socket, arguments)
   }
   }

+ 1 - 1
services/web/frontend/js/ide/directives/layout.js

@@ -169,7 +169,7 @@ export default App.directive('layout', ($parse, $compile, ide) => ({
         element.layout().resizeAll()
         element.layout().resizeAll()
 
 
         if (attrs.resizeOn != null) {
         if (attrs.resizeOn != null) {
-          for (let event of Array.from(attrs.resizeOn.split(','))) {
+          for (const event of Array.from(attrs.resizeOn.split(','))) {
             scope.$on(event, () => onExternalResize())
             scope.$on(event, () => onExternalResize())
           }
           }
         }
         }

+ 6 - 6
services/web/frontend/js/ide/editor/Document.js

@@ -57,7 +57,7 @@ export default Document = (function () {
 
 
     static hasUnsavedChanges() {
     static hasUnsavedChanges() {
       const object = this.openDocs || {}
       const object = this.openDocs || {}
-      for (let doc_id in object) {
+      for (const doc_id in object) {
         const doc = object[doc_id]
         const doc = object[doc_id]
         if (doc.hasBufferedOps()) {
         if (doc.hasBufferedOps()) {
           return true
           return true
@@ -69,7 +69,7 @@ export default Document = (function () {
     static flushAll() {
     static flushAll() {
       return (() => {
       return (() => {
         const result = []
         const result = []
-        for (let doc_id in this.openDocs) {
+        for (const doc_id in this.openDocs) {
           const doc = this.openDocs[doc_id]
           const doc = this.openDocs[doc_id]
           result.push(doc.flush())
           result.push(doc.flush())
         }
         }
@@ -464,7 +464,7 @@ export default Document = (function () {
     }
     }
 
 
     _callJoinCallbacks() {
     _callJoinCallbacks() {
-      for (let callback of Array.from(this._joinCallbacks || [])) {
+      for (const callback of Array.from(this._joinCallbacks || [])) {
         callback()
         callback()
       }
       }
       return delete this._joinCallbacks
       return delete this._joinCallbacks
@@ -537,7 +537,7 @@ export default Document = (function () {
     _decodeRanges(ranges) {
     _decodeRanges(ranges) {
       const decodeFromWebsockets = text => decodeURIComponent(escape(text))
       const decodeFromWebsockets = text => decodeURIComponent(escape(text))
       try {
       try {
-        for (let change of Array.from(ranges.changes || [])) {
+        for (const change of Array.from(ranges.changes || [])) {
           if (change.op.i != null) {
           if (change.op.i != null) {
             change.op.i = decodeFromWebsockets(change.op.i)
             change.op.i = decodeFromWebsockets(change.op.i)
           }
           }
@@ -547,7 +547,7 @@ export default Document = (function () {
         }
         }
         return (() => {
         return (() => {
           const result = []
           const result = []
-          for (let comment of Array.from(ranges.comments || [])) {
+          for (const comment of Array.from(ranges.comments || [])) {
             if (comment.op.c != null) {
             if (comment.op.c != null) {
               result.push((comment.op.c = decodeFromWebsockets(comment.op.c)))
               result.push((comment.op.c = decodeFromWebsockets(comment.op.c)))
             } else {
             } else {
@@ -717,7 +717,7 @@ export default Document = (function () {
         ;({ track_changes_as } = this)
         ;({ track_changes_as } = this)
       }
       }
       this.ranges.track_changes = track_changes_as != null
       this.ranges.track_changes = track_changes_as != null
-      for (let op of Array.from(ops)) {
+      for (const op of Array.from(ops)) {
         this.ranges.applyOp(op, { user_id: track_changes_as })
         this.ranges.applyOp(op, { user_id: track_changes_as })
       }
       }
       if (old_id_seed != null) {
       if (old_id_seed != null) {

+ 1 - 1
services/web/frontend/js/ide/editor/ShareJsDoc.js

@@ -320,7 +320,7 @@ export default ShareJsDoc = (function () {
       // compute size of an op from its components
       // compute size of an op from its components
       // (total number of characters inserted and deleted)
       // (total number of characters inserted and deleted)
       let size = 0
       let size = 0
-      for (let component of Array.from(op || [])) {
+      for (const component of Array.from(op || [])) {
         if ((component != null ? component.i : undefined) != null) {
         if ((component != null ? component.i : undefined) != null) {
           size += component.i.length
           size += component.i.length
         }
         }

+ 1 - 1
services/web/frontend/js/ide/editor/controllers/SavingNotificationController.js

@@ -37,7 +37,7 @@ export default App.controller(
       let newUnsavedCount = 0
       let newUnsavedCount = 0
       let maxUnsavedSeconds = 0
       let maxUnsavedSeconds = 0
 
 
-      for (let doc_id in Document.openDocs) {
+      for (const doc_id in Document.openDocs) {
         const doc = Document.openDocs[doc_id]
         const doc = Document.openDocs[doc_id]
         const saving = doc.pollSavedStatus()
         const saving = doc.pollSavedStatus()
         if (!saving) {
         if (!saving) {

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

@@ -408,7 +408,7 @@ App.directive(
         }
         }
 
 
         if (attrs.resizeOn != null) {
         if (attrs.resizeOn != null) {
-          for (let event of Array.from(attrs.resizeOn.split(','))) {
+          for (const event of Array.from(attrs.resizeOn.split(','))) {
             scope.$on(event, function () {
             scope.$on(event, function () {
               scope.$applyAsync(() => {
               scope.$applyAsync(() => {
                 const previousScreenPosition = getCursorScreenPosition()
                 const previousScreenPosition = getCursorScreenPosition()

+ 7 - 8
services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/AutoCompleteManager.js

@@ -69,12 +69,12 @@ class AutoCompleteManager {
           )
           )
           if (match) {
           if (match) {
             // eslint-disable-next-line no-unused-vars
             // eslint-disable-next-line no-unused-vars
-            let commandName = match[1]
+            const commandName = match[1]
             const graphicsPaths = Preamble.getGraphicsPaths()
             const graphicsPaths = Preamble.getGraphicsPaths()
             const result = []
             const result = []
-            for (let graphic of Graphics.getGraphicsFiles()) {
+            for (const graphic of Graphics.getGraphicsFiles()) {
               let { path } = graphic
               let { path } = graphic
-              for (let graphicsPath of graphicsPaths) {
+              for (const graphicsPath of graphicsPaths) {
                 if (path.indexOf(graphicsPath) === 0) {
                 if (path.indexOf(graphicsPath) === 0) {
                   path = path.slice(graphicsPath.length)
                   path = path.slice(graphicsPath.length)
                   break
                   break
@@ -103,10 +103,10 @@ class AutoCompleteManager {
             // eslint-disable-next-line no-unused-vars
             // eslint-disable-next-line no-unused-vars
             const commandName = match[1]
             const commandName = match[1]
             const result = []
             const result = []
-            for (let file of Files.getTeXFiles()) {
+            for (const file of Files.getTeXFiles()) {
               if (file.id !== this.$scope.docId && !file.deleted && file.path) {
               if (file.id !== this.$scope.docId && !file.deleted && file.path) {
                 const { path } = file
                 const { path } = file
-                let cleanPath = path.replace(/(.+)\.tex$/i, '$1')
+                const cleanPath = path.replace(/(.+)\.tex$/i, '$1')
                 result.push({
                 result.push({
                   caption: `\\${commandName}{${path}}`,
                   caption: `\\${commandName}{${path}}`,
                   value: `\\${commandName}{${cleanPath}}`,
                   value: `\\${commandName}{${cleanPath}}`,
@@ -141,7 +141,7 @@ class AutoCompleteManager {
                 score: 60,
                 score: 60,
               })
               })
             }
             }
-            for (let label of metadataManager.getAllLabels()) {
+            for (const label of metadataManager.getAllLabels()) {
               result.push({
               result.push({
                 caption: `\\${commandName}{${label}}`,
                 caption: `\\${commandName}{${label}}`,
                 value: `\\${commandName}{${label}}`,
                 value: `\\${commandName}{${label}}`,
@@ -414,7 +414,6 @@ class AutoCompleteManager {
       Autocomplete.startCommand = {
       Autocomplete.startCommand = {
         name: 'startAutocomplete',
         name: 'startAutocomplete',
         exec: editor => {
         exec: editor => {
-          let filtered
           if (!editor.completer) {
           if (!editor.completer) {
             editor.completer = new Autocomplete()
             editor.completer = new Autocomplete()
           }
           }
@@ -429,7 +428,7 @@ class AutoCompleteManager {
           )
           )
           container.css({ 'font-size': this.$scope.fontSize + 'px' })
           container.css({ 'font-size': this.$scope.fontSize + 'px' })
           // Dynamically set width of autocomplete popup
           // Dynamically set width of autocomplete popup
-          filtered =
+          const filtered =
             editor.completer.completions &&
             editor.completer.completions &&
             editor.completer.completions.filtered
             editor.completer.completions.filtered
           if (filtered) {
           if (filtered) {

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

@@ -152,7 +152,7 @@ export default CommandManager = class CommandManager {
 
 
     const packages = this.metadataManager.getAllPackages()
     const packages = this.metadataManager.getAllPackages()
     const packageCommands = []
     const packageCommands = []
-    for (let pkg in packages) {
+    for (const pkg in packages) {
       const snippets = packages[pkg]
       const snippets = packages[pkg]
       for (snippet of Array.from(snippets)) {
       for (snippet of Array.from(snippets)) {
         packageCommands.push(snippet)
         packageCommands.push(snippet)
@@ -164,7 +164,7 @@ export default CommandManager = class CommandManager {
     const parser = new Parser(doc, prefix)
     const parser = new Parser(doc, prefix)
     const commands = parser.parse()
     const commands = parser.parse()
     let completions = []
     let completions = []
-    for (let command of Array.from(commands)) {
+    for (const command of Array.from(commands)) {
       if (!commandNames[command[0]]) {
       if (!commandNames[command[0]]) {
         let caption = `\\${command[0]}`
         let caption = `\\${command[0]}`
         const score = caption === prefix ? 99 : 50
         const score = caption === prefix ? 99 : 50

+ 2 - 2
services/web/frontend/js/ide/editor/directives/aceEditor/auto-complete/EnvironmentManager.js

@@ -201,10 +201,10 @@ class EnvironmentManager {
     }
     }
 
 
     const parsedItemsMap = {}
     const parsedItemsMap = {}
-    for (let environment of Array.from(customEnvironments)) {
+    for (const environment of Array.from(customEnvironments)) {
       parsedItemsMap[environment.name] = environment
       parsedItemsMap[environment.name] = environment
     }
     }
-    for (let command of Array.from(beginCommands)) {
+    for (const command of Array.from(beginCommands)) {
       parsedItemsMap[command.name] = command
       parsedItemsMap[command.name] = command
     }
     }
     const parsedItems = _.values(parsedItemsMap)
     const parsedItems = _.values(parsedItemsMap)

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

@@ -120,7 +120,7 @@ class PackageManager {
   getCompletions(editor, session, pos, prefix, callback) {
   getCompletions(editor, session, pos, prefix, callback) {
     const usedPackages = Object.keys(this.metadataManager.getAllPackages())
     const usedPackages = Object.keys(this.metadataManager.getAllPackages())
     const packageSnippets = []
     const packageSnippets = []
-    for (let pkg of Array.from(packages)) {
+    for (const pkg of Array.from(packages)) {
       if (!Array.from(usedPackages).includes(pkg)) {
       if (!Array.from(usedPackages).includes(pkg)) {
         packageSnippets.push({
         packageSnippets.push({
           caption: `\\usepackage{${pkg}}`,
           caption: `\\usepackage{${pkg}}`,

+ 5 - 5
services/web/frontend/js/ide/editor/directives/aceEditor/highlights/HighlightsManager.js

@@ -109,7 +109,7 @@ export default HighlightsManager = class HighlightsManager {
     this._clearMarkers()
     this._clearMarkers()
     this._clearLabels()
     this._clearLabels()
 
 
-    for (let annotation of Array.from(this.$scope.highlights || [])) {
+    for (const annotation of Array.from(this.$scope.highlights || [])) {
       ;(annotation => {
       ;(annotation => {
         const colorScheme = ColorManager.getColorScheme(
         const colorScheme = ColorManager.getColorScheme(
           annotation.hue,
           annotation.hue,
@@ -161,7 +161,7 @@ export default HighlightsManager = class HighlightsManager {
 
 
   showAnnotationLabels(position) {
   showAnnotationLabels(position) {
     let labelToShow = null
     let labelToShow = null
-    for (let label of Array.from(this.labels || [])) {
+    for (const label of Array.from(this.labels || [])) {
       if (label.range.contains(position.row, position.column)) {
       if (label.range.contains(position.row, position.column)) {
         labelToShow = label
         labelToShow = label
       }
       }
@@ -252,7 +252,7 @@ export default HighlightsManager = class HighlightsManager {
       let highlightsAfter = 0
       let highlightsAfter = 0
       this.lastHiddenHighlightBefore = null
       this.lastHiddenHighlightBefore = null
       this.firstHiddenHighlightAfter = null
       this.firstHiddenHighlightAfter = null
-      for (let annotation of Array.from(this.$scope.highlights || [])) {
+      for (const annotation of Array.from(this.$scope.highlights || [])) {
         const range = annotation.highlight || annotation.strikeThrough
         const range = annotation.highlight || annotation.strikeThrough
         if (range == null) {
         if (range == null) {
           continue
           continue
@@ -281,7 +281,7 @@ export default HighlightsManager = class HighlightsManager {
   scrollToFirstHighlight() {
   scrollToFirstHighlight() {
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let annotation of Array.from(this.$scope.highlights || [])) {
+      for (const annotation of Array.from(this.$scope.highlights || [])) {
         const range = annotation.highlight || annotation.strikeThrough
         const range = annotation.highlight || annotation.strikeThrough
         if (range == null) {
         if (range == null) {
           continue
           continue
@@ -294,7 +294,7 @@ export default HighlightsManager = class HighlightsManager {
   }
   }
 
 
   _clearMarkers() {
   _clearMarkers() {
-    for (let marker_id of Array.from(this.markerIds)) {
+    for (const marker_id of Array.from(this.markerIds)) {
       this.editor.getSession().removeMarker(marker_id)
       this.editor.getSession().removeMarker(marker_id)
     }
     }
     return (this.markerIds = [])
     return (this.markerIds = [])

+ 2 - 2
services/web/frontend/js/ide/editor/directives/aceEditor/spell-check/SpellCheckManager.js

@@ -298,7 +298,7 @@ class SpellCheckManager {
             return null
             return null
           }
           }
           const misspelled = []
           const misspelled = []
-          for (let misspelling of result.misspellings) {
+          for (const misspelling of result.misspellings) {
             word = words[misspelling.index]
             word = words[misspelling.index]
             const position = positions[misspelling.index]
             const position = positions[misspelling.index]
             misspelled[misspelling.index] = true
             misspelled[misspelling.index] = true
@@ -360,7 +360,7 @@ class SpellCheckManager {
     const positions = []
     const positions = []
     for (let row = 0; row < lines.length; row++) {
     for (let row = 0; row < lines.length; row++) {
       let line = lines[row]
       let line = lines[row]
-      let rowIdx = rowNumsToCheck[row]
+      const rowIdx = rowNumsToCheck[row]
       line = this.blankOutBlacklistedCommands(line)
       line = this.blankOutBlacklistedCommands(line)
       var result
       var result
       WORD_REGEX.lastIndex = 0 // reset global stateful regexp for this usage
       WORD_REGEX.lastIndex = 0 // reset global stateful regexp for this usage

+ 2 - 2
services/web/frontend/js/ide/editor/directives/aceEditor/track-changes/TrackChangesAdapter.js

@@ -16,9 +16,9 @@ class TrackChangesAdapter {
 
 
   clearAnnotations() {
   clearAnnotations() {
     const session = this.editor.getSession()
     const session = this.editor.getSession()
-    for (let change_id in this.changeIdToMarkerIdMap) {
+    for (const change_id in this.changeIdToMarkerIdMap) {
       const markers = this.changeIdToMarkerIdMap[change_id]
       const markers = this.changeIdToMarkerIdMap[change_id]
-      for (let marker_name in markers) {
+      for (const marker_name in markers) {
         const marker_id = markers[marker_name]
         const marker_id = markers[marker_name]
         session.removeMarker(marker_id)
         session.removeMarker(marker_id)
       }
       }

+ 12 - 12
services/web/frontend/js/ide/editor/directives/aceEditor/track-changes/TrackChangesManager.js

@@ -160,7 +160,7 @@ class TrackChangesManager {
   }
   }
 
 
   redrawAnnotations() {
   redrawAnnotations() {
-    for (let change of Array.from(this.rangesTracker.changes)) {
+    for (const change of Array.from(this.rangesTracker.changes)) {
       if (change.op.i != null) {
       if (change.op.i != null) {
         this.adapter.onInsertAdded(change)
         this.adapter.onInsertAdded(change)
       } else if (change.op.d != null) {
       } else if (change.op.d != null) {
@@ -350,7 +350,7 @@ class TrackChangesManager {
     changes.sort((a, b) => b.op.p - a.op.p)
     changes.sort((a, b) => b.op.p - a.op.p)
 
 
     const session = this.editor.getSession()
     const session = this.editor.getSession()
-    for (let change of Array.from(changes)) {
+    for (const change of Array.from(changes)) {
       if (change.op.d != null) {
       if (change.op.d != null) {
         const content = change.op.d
         const content = change.op.d
         const position = this.adapter.shareJsOffsetToRowColumn(change.op.p)
         const position = this.adapter.shareJsOffsetToRowColumn(change.op.p)
@@ -387,12 +387,12 @@ class TrackChangesManager {
 
 
   hideCommentsByThreadIds(thread_ids) {
   hideCommentsByThreadIds(thread_ids) {
     const resolve_ids = {}
     const resolve_ids = {}
-    let comments = this.rangesTracker.comments || []
-    for (let id of Array.from(thread_ids)) {
+    const comments = this.rangesTracker.comments || []
+    for (const id of Array.from(thread_ids)) {
       resolve_ids[id] = true
       resolve_ids[id] = true
     }
     }
 
 
-    for (let comment of comments) {
+    for (const comment of comments) {
       if (resolve_ids[comment.op.t]) {
       if (resolve_ids[comment.op.t]) {
         this.adapter.onCommentRemoved(comment)
         this.adapter.onCommentRemoved(comment)
       }
       }
@@ -401,8 +401,8 @@ class TrackChangesManager {
   }
   }
 
 
   showCommentByThreadId(thread_id) {
   showCommentByThreadId(thread_id) {
-    let comments = this.rangesTracker.comments || []
-    for (let comment of comments) {
+    const comments = this.rangesTracker.comments || []
+    for (const comment of comments) {
       if (comment.op.t === thread_id && !this.isCommentResolved(comment)) {
       if (comment.op.t === thread_id && !this.isCommentResolved(comment)) {
         this.adapter.onCommentAdded(comment)
         this.adapter.onCommentAdded(comment)
       }
       }
@@ -427,7 +427,7 @@ class TrackChangesManager {
     this._cutState.docId = this.$scope.docId
     this._cutState.docId = this.$scope.docId
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let comment of Array.from(this.rangesTracker.comments)) {
+      for (const comment of Array.from(this.rangesTracker.comments)) {
         const comment_start = comment.op.p
         const comment_start = comment.op.p
         const comment_end = comment_start + comment.op.c.length
         const comment_end = comment_start + comment.op.c.length
         if (selection_start <= comment_start && comment_end <= selection_end) {
         if (selection_start <= comment_start && comment_end <= selection_end) {
@@ -465,7 +465,7 @@ class TrackChangesManager {
           pasted_text === this._cutState.text &&
           pasted_text === this._cutState.text &&
           this.$scope.docId === this._cutState.docId
           this.$scope.docId === this._cutState.docId
         ) {
         ) {
-          for (let { comment, offset, text } of Array.from(
+          for (const { comment, offset, text } of Array.from(
             this._cutState.comments
             this._cutState.comments
           )) {
           )) {
             const op = { c: text, p: paste_offset + offset, t: comment.id }
             const op = { c: text, p: paste_offset + offset, t: comment.id }
@@ -519,7 +519,7 @@ class TrackChangesManager {
       }
       }
     }
     }
 
 
-    for (let comment of Array.from(this.rangesTracker.comments)) {
+    for (const comment of Array.from(this.rangesTracker.comments)) {
       if (this.adapter.changeIdToMarkerIdMap[comment.id] != null) {
       if (this.adapter.changeIdToMarkerIdMap[comment.id] != null) {
         ;({
         ;({
           background_marker_id,
           background_marker_id,
@@ -583,7 +583,7 @@ class TrackChangesManager {
     const { renderer } = this.editor
     const { renderer } = this.editor
     const entries = this._getCurrentDocEntries()
     const entries = this._getCurrentDocEntries()
     const object = entries || {}
     const object = entries || {}
-    for (let entry_id in object) {
+    for (const entry_id in object) {
       const entry = object[entry_id]
       const entry = object[entry_id]
       const doc_position = this.adapter.shareJsOffsetToRowColumn(entry.offset)
       const doc_position = this.adapter.shareJsOffsetToRowColumn(entry.offset)
       const screen_position = session.documentToScreenPosition(
       const screen_position = session.documentToScreenPosition(
@@ -612,7 +612,7 @@ class TrackChangesManager {
     const entries = this._getCurrentDocEntries() || {}
     const entries = this._getCurrentDocEntries() || {}
     const entriesLength = Object.keys(entries).length
     const entriesLength = Object.keys(entries).length
     let changed = false
     let changed = false
-    for (let entry_id in entries) {
+    for (const entry_id in entries) {
       const entry = entries[entry_id]
       const entry = entries[entry_id]
       const old = entry.visible
       const old = entry.visible
       entry.visible =
       entry.visible =

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

@@ -275,7 +275,7 @@ export default FileTreeManager = class FileTreeManager {
   }
   }
 
 
   _findEntityByIdInFolder(folder, id) {
   _findEntityByIdInFolder(folder, id) {
-    for (let entity of Array.from(folder.children || [])) {
+    for (const entity of Array.from(folder.children || [])) {
       if (entity.id === id) {
       if (entity.id === id) {
         return entity
         return entity
       } else if (entity.children != null) {
       } else if (entity.children != null) {
@@ -309,7 +309,7 @@ export default FileTreeManager = class FileTreeManager {
       return this._findEntityByPathInFolder(folder, rest)
       return this._findEntityByPathInFolder(folder, rest)
     }
     }
 
 
-    for (let entity of Array.from(folder.children)) {
+    for (const entity of Array.from(folder.children)) {
       if (entity.name === name) {
       if (entity.name === name) {
         if (rest === '') {
         if (rest === '') {
           return entity
           return entity
@@ -329,7 +329,7 @@ export default FileTreeManager = class FileTreeManager {
 
 
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let entity of Array.from(this.$scope.deletedDocs || [])) {
+      for (const entity of Array.from(this.$scope.deletedDocs || [])) {
         result.push(callback(entity))
         result.push(callback(entity))
       }
       }
       return result
       return result
@@ -339,7 +339,7 @@ export default FileTreeManager = class FileTreeManager {
   _forEachEntityInFolder(folder, path, callback) {
   _forEachEntityInFolder(folder, path, callback) {
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let entity of Array.from(folder.children || [])) {
+      for (const entity of Array.from(folder.children || [])) {
         var childPath
         var childPath
         if (path != null) {
         if (path != null) {
           childPath = path + '/' + entity.name
           childPath = path + '/' + entity.name
@@ -362,7 +362,7 @@ export default FileTreeManager = class FileTreeManager {
   }
   }
 
 
   _getEntityPathInFolder(folder, entity) {
   _getEntityPathInFolder(folder, entity) {
-    for (let child of Array.from(folder.children || [])) {
+    for (const child of Array.from(folder.children || [])) {
       if (child === entity) {
       if (child === entity) {
         return entity.name
         return entity.name
       } else if (child.type === 'folder') {
       } else if (child.type === 'folder') {
@@ -417,7 +417,7 @@ export default FileTreeManager = class FileTreeManager {
       selected: rawFolder._id === this.selected_entity_id,
       selected: rawFolder._id === this.selected_entity_id,
     }
     }
 
 
-    for (let doc of Array.from(rawFolder.docs || [])) {
+    for (const doc of Array.from(rawFolder.docs || [])) {
       folder.children.push({
       folder.children.push({
         name: doc.name,
         name: doc.name,
         id: doc._id,
         id: doc._id,
@@ -426,7 +426,7 @@ export default FileTreeManager = class FileTreeManager {
       })
       })
     }
     }
 
 
-    for (let file of Array.from(rawFolder.fileRefs || [])) {
+    for (const file of Array.from(rawFolder.fileRefs || [])) {
       folder.children.push({
       folder.children.push({
         name: file.name,
         name: file.name,
         id: file._id,
         id: file._id,
@@ -437,7 +437,7 @@ export default FileTreeManager = class FileTreeManager {
       })
       })
     }
     }
 
 
-    for (let childFolder of Array.from(rawFolder.folders || [])) {
+    for (const childFolder of Array.from(rawFolder.folders || [])) {
       folder.children.push(this._parseFolder(childFolder))
       folder.children.push(this._parseFolder(childFolder))
     }
     }
 
 
@@ -487,7 +487,7 @@ export default FileTreeManager = class FileTreeManager {
   }
   }
 
 
   _getEntityPathInFolder(folder, entity) {
   _getEntityPathInFolder(folder, entity) {
-    for (let child of Array.from(folder.children || [])) {
+    for (const child of Array.from(folder.children || [])) {
       if (child === entity) {
       if (child === entity) {
         return entity.name
         return entity.name
       } else if (child.type === 'folder') {
       } else if (child.type === 'folder') {
@@ -511,7 +511,7 @@ export default FileTreeManager = class FileTreeManager {
     if (startFolder == null) {
     if (startFolder == null) {
       startFolder = this.$scope.rootFolder
       startFolder = this.$scope.rootFolder
     }
     }
-    for (let entity of Array.from(startFolder.children || [])) {
+    for (const entity of Array.from(startFolder.children || [])) {
       // The 'current' folder is either the one selected, or
       // The 'current' folder is either the one selected, or
       // the one containing the selected doc/file
       // the one containing the selected doc/file
       if (entity.selected) {
       if (entity.selected) {
@@ -534,7 +534,7 @@ export default FileTreeManager = class FileTreeManager {
   }
   }
 
 
   projectContainsFolder() {
   projectContainsFolder() {
-    for (let entity of Array.from(this.$scope.rootFolder.children)) {
+    for (const entity of Array.from(this.$scope.rootFolder.children)) {
       if (entity.type === 'folder') {
       if (entity.type === 'folder') {
         return true
         return true
       }
       }
@@ -543,7 +543,7 @@ export default FileTreeManager = class FileTreeManager {
   }
   }
 
 
   existsInThisFolder(folder, name) {
   existsInThisFolder(folder, name) {
-    for (let entity of Array.from(
+    for (const entity of Array.from(
       (folder != null ? folder.children : undefined) || []
       (folder != null ? folder.children : undefined) || []
     )) {
     )) {
       if (entity.name === name) {
       if (entity.name === name) {

+ 1 - 1
services/web/frontend/js/ide/file-tree/controllers/FileTreeEntityController.js

@@ -150,7 +150,7 @@ export default App.controller(
 
 
     $scope.delete = function () {
     $scope.delete = function () {
       $scope.state.inflight = true
       $scope.state.inflight = true
-      for (let entity of Array.from($scope.entities)) {
+      for (const entity of Array.from($scope.entities)) {
         ide.fileTreeManager.deleteEntity(entity)
         ide.fileTreeManager.deleteEntity(entity)
       }
       }
       return $modalInstance.close()
       return $modalInstance.close()

+ 1 - 1
services/web/frontend/js/ide/file-tree/controllers/FileTreeFolderController.js

@@ -44,7 +44,7 @@ export default App.controller(
 
 
       const ids = $scope.entity.children.map(entity => entity.id)
       const ids = $scope.entity.children.map(entity => entity.id)
 
 
-      for (let dropped_entity of Array.from(entities)) {
+      for (const dropped_entity of Array.from(entities)) {
         if (!ids.includes(dropped_entity.id)) {
         if (!ids.includes(dropped_entity.id)) {
           try {
           try {
             ide.fileTreeManager.moveEntity(dropped_entity, $scope.entity)
             ide.fileTreeManager.moveEntity(dropped_entity, $scope.entity)

+ 1 - 1
services/web/frontend/js/ide/file-tree/controllers/FileTreeRootFolderController.js

@@ -27,7 +27,7 @@ export default App.controller(
 
 
       const ids = rootFolder.children.map(entity => entity.id)
       const ids = rootFolder.children.map(entity => entity.id)
 
 
-      for (let dropped_entity of Array.from(entities)) {
+      for (const dropped_entity of Array.from(entities)) {
         if (!ids.includes(dropped_entity.id)) {
         if (!ids.includes(dropped_entity.id)) {
           try {
           try {
             ide.fileTreeManager.moveEntity(dropped_entity, rootFolder)
             ide.fileTreeManager.moveEntity(dropped_entity, rootFolder)

+ 1 - 1
services/web/frontend/js/ide/files/services/files.js

@@ -4,7 +4,7 @@ import App from '../../../base'
 export default App.factory('files', function (ide) {
 export default App.factory('files', function (ide) {
   const Files = {
   const Files = {
     getTeXFiles() {
     getTeXFiles() {
-      let texFiles = []
+      const texFiles = []
       ide.fileTreeManager.forEachEntity(function (entity, _folder, path) {
       ide.fileTreeManager.forEachEntity(function (entity, _folder, path) {
         if (
         if (
           entity.type === 'doc' &&
           entity.type === 'doc' &&

+ 7 - 7
services/web/frontend/js/ide/history/HistoryManager.js

@@ -273,10 +273,10 @@ export default HistoryManager = (function () {
         this.$scope.history.updates.length - 1
         this.$scope.history.updates.length - 1
       ]
       ]
 
 
-      for (let update of Array.from(updates)) {
+      for (const update of Array.from(updates)) {
         update.pathnames = [] // Used for display
         update.pathnames = [] // Used for display
         const object = update.docs || {}
         const object = update.docs || {}
-        for (let doc_id in object) {
+        for (const doc_id in object) {
           const doc = object[doc_id]
           const doc = object[doc_id]
           doc.entity = this.ide.fileTreeManager.findEntityById(doc_id, {
           doc.entity = this.ide.fileTreeManager.findEntityById(doc_id, {
             includeDeleted: true,
             includeDeleted: true,
@@ -284,7 +284,7 @@ export default HistoryManager = (function () {
           update.pathnames.push(doc.entity.name)
           update.pathnames.push(doc.entity.name)
         }
         }
 
 
-        for (let user of Array.from(update.meta.users || [])) {
+        for (const user of Array.from(update.meta.users || [])) {
           if (user != null) {
           if (user != null) {
             user.hue = ColorManager.getHueForUserId(user.id)
             user.hue = ColorManager.getHueForUserId(user.id)
           }
           }
@@ -322,10 +322,10 @@ export default HistoryManager = (function () {
           ? this.$scope.history.selection.doc.id
           ? this.$scope.history.selection.doc.id
           : undefined
           : undefined
 
 
-      for (let update of Array.from(
+      for (const update of Array.from(
         this.$scope.history.selection.updates || []
         this.$scope.history.selection.updates || []
       )) {
       )) {
-        for (let doc_id in update.docs) {
+        for (const doc_id in update.docs) {
           const doc = update.docs[doc_id]
           const doc = update.docs[doc_id]
           if (doc_id === selected_doc_id) {
           if (doc_id === selected_doc_id) {
             if (fromV != null && toV != null) {
             if (fromV != null && toV != null) {
@@ -353,7 +353,7 @@ export default HistoryManager = (function () {
     _selectDocFromUpdates() {
     _selectDocFromUpdates() {
       let doc, doc_id
       let doc, doc_id
       const affected_docs = {}
       const affected_docs = {}
-      for (let update of Array.from(this.$scope.history.selection.updates)) {
+      for (const update of Array.from(this.$scope.history.selection.updates)) {
         for (doc_id in update.docs) {
         for (doc_id in update.docs) {
           doc = update.docs[doc_id]
           doc = update.docs[doc_id]
           affected_docs[doc_id] = doc.entity
           affected_docs[doc_id] = doc.entity
@@ -376,7 +376,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     _updateContainsUserId(update, user_id) {
     _updateContainsUserId(update, user_id) {
-      for (let user of Array.from(update.meta.users)) {
+      for (const user of Array.from(update.meta.users)) {
         if ((user != null ? user.id : undefined) === user_id) {
         if ((user != null ? user.id : undefined) === user_id) {
           return true
           return true
         }
         }

+ 31 - 31
services/web/frontend/js/ide/history/HistoryV2Manager.js

@@ -71,7 +71,7 @@ export default HistoryManager = (function () {
       }
       }
 
 
       this.$scope.isHistoryLoading = () => {
       this.$scope.isHistoryLoading = () => {
-        let selection = this.$scope.history.selection
+        const selection = this.$scope.history.selection
         return (
         return (
           this.$scope.history.loadingFileTree ||
           this.$scope.history.loadingFileTree ||
           (this.$scope.history.viewMode === HistoryViewModes.POINT_IN_TIME &&
           (this.$scope.history.viewMode === HistoryViewModes.POINT_IN_TIME &&
@@ -153,7 +153,7 @@ export default HistoryManager = (function () {
         labels: null,
         labels: null,
         loadingFileTree: true,
         loadingFileTree: true,
       }
       }
-      let _deregisterFeatureWatcher = this.$scope.$watch(
+      const _deregisterFeatureWatcher = this.$scope.$watch(
         'project.features.versioning',
         'project.features.versioning',
         hasVersioning => {
         hasVersioning => {
           if (hasVersioning != null) {
           if (hasVersioning != null) {
@@ -222,21 +222,21 @@ export default HistoryManager = (function () {
     }
     }
 
 
     setHoverFrom(fromV) {
     setHoverFrom(fromV) {
-      let selection = this.$scope.history.selection
+      const selection = this.$scope.history.selection
       selection.hoveredRange.fromV = fromV
       selection.hoveredRange.fromV = fromV
       selection.hoveredRange.toV = selection.range.toV
       selection.hoveredRange.toV = selection.range.toV
       this.$scope.history.hoveringOverListSelectors = true
       this.$scope.history.hoveringOverListSelectors = true
     }
     }
 
 
     setHoverTo(toV) {
     setHoverTo(toV) {
-      let selection = this.$scope.history.selection
+      const selection = this.$scope.history.selection
       selection.hoveredRange.toV = toV
       selection.hoveredRange.toV = toV
       selection.hoveredRange.fromV = selection.range.fromV
       selection.hoveredRange.fromV = selection.range.fromV
       this.$scope.history.hoveringOverListSelectors = true
       this.$scope.history.hoveringOverListSelectors = true
     }
     }
 
 
     resetHover() {
     resetHover() {
-      let selection = this.$scope.history.selection
+      const selection = this.$scope.history.selection
       selection.hoveredRange.toV = null
       selection.hoveredRange.toV = null
       selection.hoveredRange.fromV = null
       selection.hoveredRange.fromV = null
       this.$scope.history.hoveringOverListSelectors = false
       this.$scope.history.hoveringOverListSelectors = false
@@ -278,7 +278,7 @@ export default HistoryManager = (function () {
 
 
     _loadFileTree(toV, fromV) {
     _loadFileTree(toV, fromV) {
       let url = `/project/${this.$scope.project_id}/filetree/diff`
       let url = `/project/${this.$scope.project_id}/filetree/diff`
-      let selection = this.$scope.history.selection
+      const selection = this.$scope.history.selection
       const query = [`from=${fromV}`, `to=${toV}`]
       const query = [`from=${fromV}`, `to=${toV}`]
       url += `?${query.join('&')}`
       url += `?${query.join('&')}`
 
 
@@ -300,7 +300,7 @@ export default HistoryManager = (function () {
         .get(url, { timeout: this._loadFileTreeRequestCanceller.promise })
         .get(url, { timeout: this._loadFileTreeRequestCanceller.promise })
         .then(response => {
         .then(response => {
           this.$scope.history.selection.files = response.data.diff
           this.$scope.history.selection.files = response.data.diff
-          for (let file of this.$scope.history.selection.files) {
+          for (const file of this.$scope.history.selection.files) {
             if (file.newPathname != null) {
             if (file.newPathname != null) {
               file.oldPathname = file.pathname
               file.oldPathname = file.pathname
               file.pathname = file.newPathname
               file.pathname = file.newPathname
@@ -334,12 +334,12 @@ export default HistoryManager = (function () {
     }
     }
 
 
     autoSelectFile() {
     autoSelectFile() {
-      let selectedPathname = null
-      let files = this.$scope.history.selection.files
+      const selectedPathname = null
+      const files = this.$scope.history.selection.files
       let fileToSelect = null
       let fileToSelect = null
       let previouslySelectedFile = null
       let previouslySelectedFile = null
       let previouslySelectedFileHasOp = false
       let previouslySelectedFileHasOp = false
-      let filesWithOps = this._getFilesWithOps()
+      const filesWithOps = this._getFilesWithOps()
       const orderedOpTypes = ['edited', 'added', 'renamed', 'removed']
       const orderedOpTypes = ['edited', 'added', 'renamed', 'removed']
 
 
       if (this._previouslySelectedPathname != null) {
       if (this._previouslySelectedPathname != null) {
@@ -353,8 +353,8 @@ export default HistoryManager = (function () {
       if (previouslySelectedFile != null && previouslySelectedFileHasOp) {
       if (previouslySelectedFile != null && previouslySelectedFileHasOp) {
         fileToSelect = previouslySelectedFile
         fileToSelect = previouslySelectedFile
       } else {
       } else {
-        for (let opType of orderedOpTypes) {
-          let fileWithMatchingOpType = _.find(filesWithOps, {
+        for (const opType of orderedOpTypes) {
+          const fileWithMatchingOpType = _.find(filesWithOps, {
             operation: opType,
             operation: opType,
           })
           })
           if (fileWithMatchingOpType != null) {
           if (fileWithMatchingOpType != null) {
@@ -368,13 +368,13 @@ export default HistoryManager = (function () {
           if (previouslySelectedFile != null) {
           if (previouslySelectedFile != null) {
             fileToSelect = previouslySelectedFile
             fileToSelect = previouslySelectedFile
           } else {
           } else {
-            let mainFile = _.find(files, function (file) {
+            const mainFile = _.find(files, function (file) {
               return /main\.tex$/.test(file.pathname)
               return /main\.tex$/.test(file.pathname)
             })
             })
             if (mainFile != null) {
             if (mainFile != null) {
               fileToSelect = mainFile
               fileToSelect = mainFile
             } else {
             } else {
-              let anyTeXFile = _.find(files, function (file) {
+              const anyTeXFile = _.find(files, function (file) {
                 return /\.tex$/.test(file.pathname)
                 return /\.tex$/.test(file.pathname)
               })
               })
               if (anyTeXFile != null) {
               if (anyTeXFile != null) {
@@ -393,18 +393,18 @@ export default HistoryManager = (function () {
     _getFilesWithOps() {
     _getFilesWithOps() {
       let filesWithOps
       let filesWithOps
       if (this.$scope.history.viewMode === HistoryViewModes.POINT_IN_TIME) {
       if (this.$scope.history.viewMode === HistoryViewModes.POINT_IN_TIME) {
-        let currentUpdate = this.getUpdateForVersion(
+        const currentUpdate = this.getUpdateForVersion(
           this.$scope.history.selection.range.toV
           this.$scope.history.selection.range.toV
         )
         )
         filesWithOps = []
         filesWithOps = []
         if (currentUpdate != null) {
         if (currentUpdate != null) {
-          for (let pathname of currentUpdate.pathnames) {
+          for (const pathname of currentUpdate.pathnames) {
             filesWithOps.push({
             filesWithOps.push({
               pathname: pathname,
               pathname: pathname,
               operation: 'edited',
               operation: 'edited',
             })
             })
           }
           }
-          for (let op of currentUpdate.project_ops) {
+          for (const op of currentUpdate.project_ops) {
             let fileWithOp
             let fileWithOp
             if (op.add != null) {
             if (op.add != null) {
               fileWithOp = {
               fileWithOp = {
@@ -450,7 +450,7 @@ export default HistoryManager = (function () {
         return
         return
       }
       }
 
 
-      let toV = this.$scope.history.updates[0].toV
+      const toV = this.$scope.history.updates[0].toV
       let fromV = null
       let fromV = null
 
 
       let indexOfLastUpdateNotByMe = 0
       let indexOfLastUpdateNotByMe = 0
@@ -474,7 +474,7 @@ export default HistoryManager = (function () {
         return
         return
       }
       }
       let versionToSelect = this.$scope.history.updates[0].toV
       let versionToSelect = this.$scope.history.updates[0].toV
-      let range = this.$scope.history.selection.range
+      const range = this.$scope.history.selection.range
       if (
       if (
         range.toV != null &&
         range.toV != null &&
         range.fromV != null &&
         range.fromV != null &&
@@ -504,7 +504,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     selectVersionForPointInTime(version) {
     selectVersionForPointInTime(version) {
-      let selection = this.$scope.history.selection
+      const selection = this.$scope.history.selection
       if (
       if (
         selection.range.toV !== version &&
         selection.range.toV !== version &&
         selection.range.fromV !== version
         selection.range.fromV !== version
@@ -516,7 +516,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     selectVersionsForCompare(toV, fromV) {
     selectVersionsForCompare(toV, fromV) {
-      let range = this.$scope.history.selection.range
+      const range = this.$scope.history.selection.range
       if (range.toV !== toV || range.fromV !== fromV) {
       if (range.toV !== toV || range.fromV !== fromV) {
         range.toV = toV
         range.toV = toV
         range.fromV = fromV
         range.fromV = fromV
@@ -559,7 +559,7 @@ export default HistoryManager = (function () {
         return
         return
       }
       }
 
 
-      for (let update of Array.from(this.$scope.history.updates)) {
+      for (const update of Array.from(this.$scope.history.updates)) {
         if (update.toV === labelToSelect.version) {
         if (update.toV === labelToSelect.version) {
           updateToSelect = update
           updateToSelect = update
           break
           break
@@ -569,7 +569,7 @@ export default HistoryManager = (function () {
       if (updateToSelect != null) {
       if (updateToSelect != null) {
         this.selectVersionForPointInTime(updateToSelect.toV)
         this.selectVersionForPointInTime(updateToSelect.toV)
       } else {
       } else {
-        let selection = this.$scope.history.selection
+        const selection = this.$scope.history.selection
         selection.range.toV = labelToSelect.version
         selection.range.toV = labelToSelect.version
         selection.range.fromV = labelToSelect.version
         selection.range.fromV = labelToSelect.version
         this.loadFileTreeForVersion(labelToSelect.version)
         this.loadFileTreeForVersion(labelToSelect.version)
@@ -577,7 +577,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     getUpdateForVersion(version) {
     getUpdateForVersion(version) {
-      for (let update of this.$scope.history.updates) {
+      for (const update of this.$scope.history.updates) {
         if (update.toV === version) {
         if (update.toV === version) {
           return update
           return update
         }
         }
@@ -585,7 +585,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     autoSelectLabelsForComparison() {
     autoSelectLabelsForComparison() {
-      let labels = this.$scope.history.labels
+      const labels = this.$scope.history.labels
       let nLabels = 0
       let nLabels = 0
       if (Array.isArray(labels)) {
       if (Array.isArray(labels)) {
         nLabels = labels.length
         nLabels = labels.length
@@ -657,11 +657,11 @@ export default HistoryManager = (function () {
     }
     }
 
 
     _loadLabels(labels, lastUpdateToV) {
     _loadLabels(labels, lastUpdateToV) {
-      let sortedLabels = this._sortLabelsByVersionAndDate(labels)
-      let labelsWithoutPseudoLabel = this._deletePseudoCurrentStateLabelIfExistent(
+      const sortedLabels = this._sortLabelsByVersionAndDate(labels)
+      const labelsWithoutPseudoLabel = this._deletePseudoCurrentStateLabelIfExistent(
         sortedLabels
         sortedLabels
       )
       )
-      let labelsWithPseudoLabelIfNeeded = this._addPseudoCurrentStateLabelIfNeeded(
+      const labelsWithPseudoLabelIfNeeded = this._addPseudoCurrentStateLabelIfNeeded(
         labelsWithoutPseudoLabel,
         labelsWithoutPseudoLabel,
         lastUpdateToV
         lastUpdateToV
       )
       )
@@ -680,7 +680,7 @@ export default HistoryManager = (function () {
         (labels.length && labels[0].version !== mostRecentVersion) ||
         (labels.length && labels[0].version !== mostRecentVersion) ||
         labels.length === 0
         labels.length === 0
       ) {
       ) {
-        let pseudoCurrentStateLabel = {
+        const pseudoCurrentStateLabel = {
           id: '1',
           id: '1',
           isPseudoCurrentStateLabel: true,
           isPseudoCurrentStateLabel: true,
           version: mostRecentVersion,
           version: mostRecentVersion,
@@ -911,7 +911,7 @@ export default HistoryManager = (function () {
       const iterable = updates || []
       const iterable = updates || []
       for (let i = 0; i < iterable.length; i++) {
       for (let i = 0; i < iterable.length; i++) {
         const update = iterable[i]
         const update = iterable[i]
-        for (let user of Array.from(update.meta.users || [])) {
+        for (const user of Array.from(update.meta.users || [])) {
           if (user != null) {
           if (user != null) {
             user.hue = ColorManager.getHueForUserId(user.id)
             user.hue = ColorManager.getHueForUserId(user.id)
           }
           }
@@ -986,7 +986,7 @@ export default HistoryManager = (function () {
     }
     }
 
 
     _updateContainsUserId(update, user_id) {
     _updateContainsUserId(update, user_id) {
-      for (let user of Array.from(update.meta.users)) {
+      for (const user of Array.from(update.meta.users)) {
         if ((user != null ? user.id : undefined) === user_id) {
         if ((user != null ? user.id : undefined) === user_id) {
           return true
           return true
         }
         }

+ 4 - 4
services/web/frontend/js/ide/history/components/historyFileEntity.js

@@ -16,7 +16,7 @@ const historyFileEntityController = function ($scope, $element, $attrs) {
   const ctrl = this
   const ctrl = this
   ctrl.hasOperation = false
   ctrl.hasOperation = false
   ctrl.getRenameTooltip = i18nRenamedStr => {
   ctrl.getRenameTooltip = i18nRenamedStr => {
-    let [simplifiedOldPathname, simplifiedPathname] = _getSimplifiedPaths(
+    const [simplifiedOldPathname, simplifiedPathname] = _getSimplifiedPaths(
       ctrl.fileEntity.oldPathname,
       ctrl.fileEntity.oldPathname,
       ctrl.fileEntity.pathname
       ctrl.fileEntity.pathname
     )
     )
@@ -37,9 +37,9 @@ const historyFileEntityController = function ($scope, $element, $attrs) {
   }
   }
 
 
   const _getSimplifiedPaths = (path1, path2) => {
   const _getSimplifiedPaths = (path1, path2) => {
-    let path1Parts = path1.split('/')
-    let path2Parts = path2.split('/')
-    let maxIterations = Math.min(path1Parts.length, path2Parts.length) - 1
+    const path1Parts = path1.split('/')
+    const path2Parts = path2.split('/')
+    const maxIterations = Math.min(path1Parts.length, path2Parts.length) - 1
     for (
     for (
       var commonPartIndex = 0;
       var commonPartIndex = 0;
       commonPartIndex < maxIterations;
       commonPartIndex < maxIterations;

+ 4 - 4
services/web/frontend/js/ide/history/controllers/HistoryListController.js

@@ -61,7 +61,7 @@ App.controller('HistoryListController', function ($scope, $modal, ide) {
     $scope.history.selection.updates = []
     $scope.history.selection.updates = []
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let update of Array.from($scope.history.updates)) {
+      for (const update of Array.from($scope.history.updates)) {
         var inSelection
         var inSelection
         if (update.selectedTo) {
         if (update.selectedTo) {
           inSelection = true
           inSelection = true
@@ -140,7 +140,7 @@ App.controller('HistoryListController', function ($scope, $modal, ide) {
   $scope.resetHoverState = () =>
   $scope.resetHoverState = () =>
     (() => {
     (() => {
       const result = []
       const result = []
-      for (let update of Array.from($scope.history.updates)) {
+      for (const update of Array.from($scope.history.updates)) {
         delete update.hoverSelectedFrom
         delete update.hoverSelectedFrom
         delete update.hoverSelectedTo
         delete update.hoverSelectedTo
         result.push(delete update.inHoverSelection)
         result.push(delete update.inHoverSelection)
@@ -160,7 +160,7 @@ export default App.controller(
       'update.selectedFrom',
       'update.selectedFrom',
       function (selectedFrom, oldSelectedFrom) {
       function (selectedFrom, oldSelectedFrom) {
         if (selectedFrom) {
         if (selectedFrom) {
-          for (let update of Array.from($scope.history.updates)) {
+          for (const update of Array.from($scope.history.updates)) {
             if (update !== $scope.update) {
             if (update !== $scope.update) {
               update.selectedFrom = false
               update.selectedFrom = false
             }
             }
@@ -172,7 +172,7 @@ export default App.controller(
 
 
     $scope.$watch('update.selectedTo', function (selectedTo, oldSelectedTo) {
     $scope.$watch('update.selectedTo', function (selectedTo, oldSelectedTo) {
       if (selectedTo) {
       if (selectedTo) {
-        for (let update of Array.from($scope.history.updates)) {
+        for (const update of Array.from($scope.history.updates)) {
           if (update !== $scope.update) {
           if (update !== $scope.update) {
             update.selectedTo = false
             update.selectedTo = false
           }
           }

+ 2 - 4
services/web/frontend/js/ide/history/controllers/HistoryV2ToolbarController.js

@@ -15,8 +15,6 @@ import App from '../../../base'
 export default App.controller(
 export default App.controller(
   'HistoryV2ToolbarController',
   'HistoryV2ToolbarController',
   ($scope, $modal, ide, eventTracking, waitFor) => {
   ($scope, $modal, ide, eventTracking, waitFor) => {
-    let openEntity
-
     $scope.currentUpdate = null
     $scope.currentUpdate = null
     $scope.currentLabel = null
     $scope.currentLabel = null
 
 
@@ -29,7 +27,7 @@ export default App.controller(
       showOnlyLabels: false,
       showOnlyLabels: false,
     }
     }
 
 
-    let _deregistershowOnlyLabelsWatcher = $scope.$watch(
+    const _deregistershowOnlyLabelsWatcher = $scope.$watch(
       'history.showOnlyLabels',
       'history.showOnlyLabels',
       showOnlyLabels => {
       showOnlyLabels => {
         if (showOnlyLabels != null) {
         if (showOnlyLabels != null) {
@@ -103,7 +101,7 @@ export default App.controller(
       })
       })
     }
     }
 
 
-    openEntity = function (data) {
+    function openEntity(data) {
       const { id, type } = data
       const { id, type } = data
       return waitFor(() => ide.fileTreeManager.findEntityById(id), 3000)
       return waitFor(() => ide.fileTreeManager.findEntityById(id), 3000)
         .then(function (entity) {
         .then(function (entity) {

+ 3 - 3
services/web/frontend/js/ide/human-readable-logs/HumanReadableLogs.js

@@ -11,7 +11,7 @@ export default {
     }
     }
 
 
     const _getRule = function (logMessage) {
     const _getRule = function (logMessage) {
-      for (let rule of ruleset) {
+      for (const rule of ruleset) {
         if (rule.regexToMatch.test(logMessage)) {
         if (rule.regexToMatch.test(logMessage)) {
           return rule
           return rule
         }
         }
@@ -20,7 +20,7 @@ export default {
 
 
     const seenErrorTypes = {} // keep track of types of errors seen
     const seenErrorTypes = {} // keep track of types of errors seen
 
 
-    for (let entry of parsedLogEntries.all) {
+    for (const entry of parsedLogEntries.all) {
       const ruleDetails = _getRule(entry.message)
       const ruleDetails = _getRule(entry.message)
 
 
       if (ruleDetails != null) {
       if (ruleDetails != null) {
@@ -70,7 +70,7 @@ export default {
     }
     }
 
 
     // filter out the suppressed errors (from the array entries in parsedLogEntries)
     // filter out the suppressed errors (from the array entries in parsedLogEntries)
-    for (let key in parsedLogEntries) {
+    for (const key in parsedLogEntries) {
       const errors = parsedLogEntries[key]
       const errors = parsedLogEntries[key]
       if (typeof errors === 'object' && errors.length > 0) {
       if (typeof errors === 'object' && errors.length > 0) {
         parsedLogEntries[key] = Array.from(errors).filter(
         parsedLogEntries[key] = Array.from(errors).filter(

+ 4 - 4
services/web/frontend/js/ide/metadata/services/metadata.js

@@ -42,7 +42,7 @@ export default App.factory('metadata', function ($http, ide) {
     _.flattenDeep(
     _.flattenDeep(
       (() => {
       (() => {
         const result = []
         const result = []
-        for (let docId in state.documents) {
+        for (const docId in state.documents) {
           const meta = state.documents[docId]
           const meta = state.documents[docId]
           result.push(meta.labels)
           result.push(meta.labels)
         }
         }
@@ -52,9 +52,9 @@ export default App.factory('metadata', function ($http, ide) {
 
 
   metadata.getAllPackages = function () {
   metadata.getAllPackages = function () {
     const packageCommandMapping = {}
     const packageCommandMapping = {}
-    for (let _docId in state.documents) {
+    for (const _docId in state.documents) {
       const meta = state.documents[_docId]
       const meta = state.documents[_docId]
-      for (let packageName in meta.packages) {
+      for (const packageName in meta.packages) {
         const commandSnippets = meta.packages[packageName]
         const commandSnippets = meta.packages[packageName]
         packageCommandMapping[packageName] = commandSnippets
         packageCommandMapping[packageName] = commandSnippets
       }
       }
@@ -70,7 +70,7 @@ export default App.factory('metadata', function ($http, ide) {
         if (data.projectMeta) {
         if (data.projectMeta) {
           return (() => {
           return (() => {
             const result = []
             const result = []
-            for (let docId in data.projectMeta) {
+            for (const docId in data.projectMeta) {
               const docMeta = data.projectMeta[docId]
               const docMeta = data.projectMeta[docId]
               result.push((state.documents[docId] = docMeta))
               result.push((state.documents[docId] = docMeta))
             }
             }

+ 1 - 1
services/web/frontend/js/ide/online-users/OnlineUsersManager.js

@@ -43,7 +43,7 @@ export default OnlineUsersManager = (function () {
           'clientTracking.getConnectedUsers',
           'clientTracking.getConnectedUsers',
           (error, connectedUsers) => {
           (error, connectedUsers) => {
             this.$scope.onlineUsers = {}
             this.$scope.onlineUsers = {}
-            for (let user of Array.from(connectedUsers || [])) {
+            for (const user of Array.from(connectedUsers || [])) {
               if (user.client_id === this.ide.socket.publicId) {
               if (user.client_id === this.ide.socket.publicId) {
                 // Don't store myself
                 // Don't store myself
                 continue
                 continue

+ 4 - 4
services/web/frontend/js/ide/pdf/controllers/PdfController.js

@@ -565,10 +565,10 @@ App.controller(
       }
       }
 
 
       function accumulateResults(newEntries) {
       function accumulateResults(newEntries) {
-        for (let key of ['all', 'errors', 'warnings', 'typesetting']) {
+        for (const key of ['all', 'errors', 'warnings', 'typesetting']) {
           if (newEntries[key]) {
           if (newEntries[key]) {
             if (newEntries.type != null) {
             if (newEntries.type != null) {
-              for (let entry of newEntries[key]) {
+              for (const entry of newEntries[key]) {
                 entry.type = newEntries.type
                 entry.type = newEntries.type
               }
               }
             }
             }
@@ -590,7 +590,7 @@ App.controller(
       function processChkTex(log) {
       function processChkTex(log) {
         const errors = []
         const errors = []
         const warnings = []
         const warnings = []
-        for (let line of log.split('\n')) {
+        for (const line of log.split('\n')) {
           var m
           var m
           if ((m = line.match(/^(\S+):(\d+):(\d+): (Error|Warning): (.*)/))) {
           if ((m = line.match(/^(\S+):(\d+):(\d+): (Error|Warning): (.*)/))) {
             const result = {
             const result = {
@@ -731,7 +731,7 @@ App.controller(
       if (doc == null) {
       if (doc == null) {
         return null
         return null
       }
       }
-      for (let line of doc.split('\n')) {
+      for (const line of doc.split('\n')) {
         if (/^[^%]*\\documentclass/.test(line)) {
         if (/^[^%]*\\documentclass/.test(line)) {
           return ide.editorManager.getCurrentDocId()
           return ide.editorManager.getCurrentDocId()
         }
         }

+ 1 - 1
services/web/frontend/js/ide/pdfng/directives/pdfAnnotations.js

@@ -13,7 +13,7 @@ App.factory('pdfAnnotations', function () {
 
 
     setAnnotations(annotations) {
     setAnnotations(annotations) {
       const result = []
       const result = []
-      for (let annotation of annotations) {
+      for (const annotation of annotations) {
         switch (annotation.subtype) {
         switch (annotation.subtype) {
           case 'Link':
           case 'Link':
             result.push(this.addLink(annotation))
             result.push(this.addLink(annotation))

+ 1 - 1
services/web/frontend/js/ide/pdfng/directives/pdfHighlights.js

@@ -42,7 +42,7 @@ export default App.factory('pdfHighlights', function () {
     }
     }
 
 
     clearHighlights() {
     clearHighlights() {
-      for (let h of Array.from(this.highlightElements)) {
+      for (const h of Array.from(this.highlightElements)) {
         if (h != null) {
         if (h != null) {
           h.parentNode.removeChild(h)
           h.parentNode.removeChild(h)
         }
         }

+ 1 - 1
services/web/frontend/js/ide/pdfng/directives/pdfJs.js

@@ -124,7 +124,7 @@ export default App.directive('pdfng', ($timeout, localStorage) => ({
     }
     }
 
 
     if (attrs.resizeOn != null) {
     if (attrs.resizeOn != null) {
-      for (let event of Array.from(attrs.resizeOn.split(','))) {
+      for (const event of Array.from(attrs.resizeOn.split(','))) {
         scope.$on(event, function (e) {})
         scope.$on(event, function (e) {})
       }
       }
     }
     }

+ 1 - 1
services/web/frontend/js/ide/pdfng/directives/pdfPage.js

@@ -133,7 +133,7 @@ export default App.directive(
         scope.document.getPdfViewport(scope.page.pageNum).then(viewport =>
         scope.document.getPdfViewport(scope.page.pageNum).then(viewport =>
           (() => {
           (() => {
             const result1 = []
             const result1 = []
-            for (let hl of Array.from(pageHighlights)) {
+            for (const hl of Array.from(pageHighlights)) {
               // console.log 'adding highlight', h, viewport
               // console.log 'adding highlight', h, viewport
               const top = viewport.viewBox[3] - hl.v
               const top = viewport.viewBox[3] - hl.v
               result1.push(
               result1.push(

+ 4 - 4
services/web/frontend/js/ide/pdfng/directives/pdfRenderer.js

@@ -95,10 +95,10 @@ export default App.factory(
             clearTimeout(this.queueTimer)
             clearTimeout(this.queueTimer)
           }
           }
           // clear any existing timers, render tasks
           // clear any existing timers, render tasks
-          for (let timer of Array.from(this.spinTimer || [])) {
+          for (const timer of Array.from(this.spinTimer || [])) {
             clearTimeout(timer)
             clearTimeout(timer)
           }
           }
-          for (let page of Array.from(this.pageState || [])) {
+          for (const page of Array.from(this.pageState || [])) {
             __guard__(page != null ? page.loadTask : undefined, x => x.cancel())
             __guard__(page != null ? page.loadTask : undefined, x => x.cancel())
             __guard__(page != null ? page.renderTask : undefined, x1 =>
             __guard__(page != null ? page.renderTask : undefined, x1 =>
               x1.cancel()
               x1.cancel()
@@ -233,7 +233,7 @@ export default App.factory(
             this.queuedPages[page.pagenum] = true
             this.queuedPages[page.pagenum] = true
           }
           }
           // clear any unfinished spinner timers on pages that aren't in the queue any more
           // clear any unfinished spinner timers on pages that aren't in the queue any more
-          for (let pagenum in this.spinTimer) {
+          for (const pagenum in this.spinTimer) {
             if (!this.queuedPages[pagenum]) {
             if (!this.queuedPages[pagenum]) {
               clearTimeout(this.spinTimer[pagenum])
               clearTimeout(this.spinTimer[pagenum])
               delete this.spinTimer[pagenum]
               delete this.spinTimer[pagenum]
@@ -258,7 +258,7 @@ export default App.factory(
           const [canvas, pagenum] = Array.from(this.getPageDetails(page))
           const [canvas, pagenum] = Array.from(this.getPageDetails(page))
           canvas.addClass('pdfng-loading')
           canvas.addClass('pdfng-loading')
           return (this.spinTimer[pagenum] = setTimeout(() => {
           return (this.spinTimer[pagenum] = setTimeout(() => {
-            for (let queuedPage of Array.from(this.renderQueue)) {
+            for (const queuedPage of Array.from(this.renderQueue)) {
               if (pagenum === queuedPage.pagenum) {
               if (pagenum === queuedPage.pagenum) {
                 this.spinner.add(canvas, { static: true })
                 this.spinner.add(canvas, { static: true })
                 this.spinTimerDone[pagenum] = true
                 this.spinTimerDone[pagenum] = true

+ 3 - 3
services/web/frontend/js/ide/pdfng/directives/pdfViewer.js

@@ -829,9 +829,9 @@ export default App.directive('pdfViewer', ($q, $timeout, pdfSpinner) => ({
 }))
 }))
 
 
 function __range__(left, right, inclusive) {
 function __range__(left, right, inclusive) {
-  let range = []
-  let ascending = left < right
-  let end = !inclusive ? right : ascending ? right + 1 : right - 1
+  const range = []
+  const ascending = left < right
+  const end = !inclusive ? right : ascending ? right + 1 : right - 1
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
   for (let i = left; ascending ? i < end : i > end; ascending ? i++ : i--) {
     range.push(i)
     range.push(i)
   }
   }

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

@@ -106,7 +106,7 @@ export default RangesTracker = class RangesTracker {
 
 
   getComment(comment_id) {
   getComment(comment_id) {
     let comment = null
     let comment = null
-    for (let c of Array.from(this.comments)) {
+    for (const c of Array.from(this.comments)) {
       if (c.id === comment_id) {
       if (c.id === comment_id) {
         comment = c
         comment = c
         break
         break
@@ -127,7 +127,7 @@ export default RangesTracker = class RangesTracker {
   moveCommentId(comment_id, position, text) {
   moveCommentId(comment_id, position, text) {
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let comment of Array.from(this.comments)) {
+      for (const comment of Array.from(this.comments)) {
         if (comment.id === comment_id) {
         if (comment.id === comment_id) {
           comment.op.p = position
           comment.op.p = position
           comment.op.c = text
           comment.op.c = text
@@ -142,7 +142,7 @@ export default RangesTracker = class RangesTracker {
 
 
   getChange(change_id) {
   getChange(change_id) {
     let change = null
     let change = null
-    for (let c of Array.from(this.changes)) {
+    for (const c of Array.from(this.changes)) {
       if (c.id === change_id) {
       if (c.id === change_id) {
         change = c
         change = c
         break
         break
@@ -155,11 +155,11 @@ export default RangesTracker = class RangesTracker {
     const changes_response = []
     const changes_response = []
     const ids_map = {}
     const ids_map = {}
 
 
-    for (let change_id of Array.from(change_ids)) {
+    for (const change_id of Array.from(change_ids)) {
       ids_map[change_id] = true
       ids_map[change_id] = true
     }
     }
 
 
-    for (let change of Array.from(this.changes)) {
+    for (const change of Array.from(this.changes)) {
       if (ids_map[change.id]) {
       if (ids_map[change.id]) {
         delete ids_map[change.id]
         delete ids_map[change.id]
         changes_response.push(change)
         changes_response.push(change)
@@ -187,13 +187,13 @@ export default RangesTracker = class RangesTracker {
     }
     }
     const i = this.changes.length
     const i = this.changes.length
     const remove_change_id = {}
     const remove_change_id = {}
-    for (let change_id of Array.from(change_to_remove_ids)) {
+    for (const change_id of Array.from(change_to_remove_ids)) {
       remove_change_id[change_id] = true
       remove_change_id[change_id] = true
     }
     }
 
 
     const remaining_changes = []
     const remaining_changes = []
 
 
-    for (let change of Array.from(this.changes)) {
+    for (const change of Array.from(this.changes)) {
       if (remove_change_id[change.id]) {
       if (remove_change_id[change.id]) {
         delete remove_change_id[change.id]
         delete remove_change_id[change.id]
         this._markAsDirty(change, 'change', 'removed')
         this._markAsDirty(change, 'change', 'removed')
@@ -207,7 +207,7 @@ export default RangesTracker = class RangesTracker {
 
 
   validate(text) {
   validate(text) {
     let content
     let content
-    for (let change of Array.from(this.changes)) {
+    for (const change of Array.from(this.changes)) {
       if (change.op.i != null) {
       if (change.op.i != null) {
         content = text.slice(change.op.p, change.op.p + change.op.i.length)
         content = text.slice(change.op.p, change.op.p + change.op.i.length)
         if (content !== change.op.i) {
         if (content !== change.op.i) {
@@ -219,7 +219,7 @@ export default RangesTracker = class RangesTracker {
         }
         }
       }
       }
     }
     }
-    for (let comment of Array.from(this.comments)) {
+    for (const comment of Array.from(this.comments)) {
       content = text.slice(comment.op.p, comment.op.p + comment.op.c.length)
       content = text.slice(comment.op.p, comment.op.p + comment.op.c.length)
       if (content !== comment.op.c) {
       if (content !== comment.op.c) {
         throw new Error(
         throw new Error(
@@ -287,7 +287,7 @@ export default RangesTracker = class RangesTracker {
   applyInsertToComments(op) {
   applyInsertToComments(op) {
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let comment of Array.from(this.comments)) {
+      for (const comment of Array.from(this.comments)) {
         if (op.p <= comment.op.p) {
         if (op.p <= comment.op.p) {
           comment.op.p += op.i.length
           comment.op.p += op.i.length
           result.push(this._markAsDirty(comment, 'comment', 'moved'))
           result.push(this._markAsDirty(comment, 'comment', 'moved'))
@@ -312,7 +312,7 @@ export default RangesTracker = class RangesTracker {
     const op_end = op.p + op_length
     const op_end = op.p + op_length
     return (() => {
     return (() => {
       const result = []
       const result = []
-      for (let comment of Array.from(this.comments)) {
+      for (const comment of Array.from(this.comments)) {
         const comment_start = comment.op.p
         const comment_start = comment.op.p
         const comment_end = comment.op.p + comment.op.c.length
         const comment_end = comment.op.p + comment.op.c.length
         const comment_length = comment_end - comment_start
         const comment_length = comment_end - comment_start
@@ -492,7 +492,7 @@ export default RangesTracker = class RangesTracker {
             },
             },
             metadata: {},
             metadata: {},
           }
           }
-          for (let key in change.metadata) {
+          for (const key in change.metadata) {
             const value = change.metadata[key]
             const value = change.metadata[key]
             after_change.metadata[key] = value
             after_change.metadata[key] = value
           }
           }
@@ -736,7 +736,7 @@ export default RangesTracker = class RangesTracker {
       }
       }
     })
     })
 
 
-    for (let modification of Array.from(op_modifications)) {
+    for (const modification of Array.from(op_modifications)) {
       if (modification.i != null) {
       if (modification.i != null) {
         content =
         content =
           content.slice(0, modification.p) +
           content.slice(0, modification.p) +
@@ -770,7 +770,7 @@ export default RangesTracker = class RangesTracker {
     let previous_change = null
     let previous_change = null
     const remove_changes = []
     const remove_changes = []
     const moved_changes = []
     const moved_changes = []
-    for (let change of Array.from(this.changes)) {
+    for (const change of Array.from(this.changes)) {
       if (
       if (
         (previous_change != null ? previous_change.op.i : undefined) != null &&
         (previous_change != null ? previous_change.op.i : undefined) != null &&
         change.op.i != null
         change.op.i != null
@@ -830,7 +830,7 @@ export default RangesTracker = class RangesTracker {
 
 
   _clone(object) {
   _clone(object) {
     const clone = {}
     const clone = {}
-    for (let k in object) {
+    for (const k in object) {
       const v = object[k]
       const v = object[k]
       clone[k] = v
       clone[k] = v
     }
     }

+ 15 - 15
services/web/frontend/js/ide/review-panel/controllers/ReviewPanelController.js

@@ -51,7 +51,7 @@ export default App.controller(
         ) {
         ) {
           return UserTypes.MEMBER
           return UserTypes.MEMBER
         }
         }
-        for (let member of Array.from(project.members)) {
+        for (const member of Array.from(project.members)) {
           if (member._id === user_id) {
           if (member._id === user_id) {
             return UserTypes.MEMBER
             return UserTypes.MEMBER
           }
           }
@@ -106,7 +106,7 @@ export default App.controller(
 
 
     window.addEventListener('beforeunload', function () {
     window.addEventListener('beforeunload', function () {
       const collapsedStates = {}
       const collapsedStates = {}
-      for (let doc in $scope.reviewPanel.overview.docsCollapsedState) {
+      for (const doc in $scope.reviewPanel.overview.docsCollapsedState) {
         const state = $scope.reviewPanel.overview.docsCollapsedState[doc]
         const state = $scope.reviewPanel.overview.docsCollapsedState[doc]
         if (state) {
         if (state) {
           collapsedStates[doc] = state
           collapsedStates[doc] = state
@@ -159,7 +159,7 @@ export default App.controller(
       ) {
       ) {
         return (() => {
         return (() => {
           const result = []
           const result = []
-          for (let member of Array.from(members)) {
+          for (const member of Array.from(members)) {
             if (member.privileges === 'readAndWrite') {
             if (member.privileges === 'readAndWrite') {
               if ($scope.reviewPanel.trackChangesState[member._id] == null) {
               if ($scope.reviewPanel.trackChangesState[member._id] == null) {
                 // An added member will have track changes enabled if track changes is on for everyone
                 // An added member will have track changes enabled if track changes is on for everyone
@@ -347,7 +347,7 @@ export default App.controller(
         const entries =
         const entries =
           $scope.reviewPanel.entries[$scope.editor.open_doc_id] || {}
           $scope.reviewPanel.entries[$scope.editor.open_doc_id] || {}
         const permEntries = {}
         const permEntries = {}
-        for (let entry in entries) {
+        for (const entry in entries) {
           const entryData = entries[entry]
           const entryData = entries[entry]
           if (!['add-comment', 'bulk-actions'].includes(entry)) {
           if (!['add-comment', 'bulk-actions'].includes(entry)) {
             permEntries[entry] = entryData
             permEntries[entry] = entryData
@@ -374,7 +374,7 @@ export default App.controller(
           const docs = response.data
           const docs = response.data
           return (() => {
           return (() => {
             const result = []
             const result = []
-            for (let doc of Array.from(docs)) {
+            for (const doc of Array.from(docs)) {
               if (
               if (
                 $scope.reviewPanel.overview.docsCollapsedState[doc.id] == null
                 $scope.reviewPanel.overview.docsCollapsedState[doc.id] == null
               ) {
               ) {
@@ -485,7 +485,7 @@ export default App.controller(
         ensureThreadsAreLoaded()
         ensureThreadsAreLoaded()
       }
       }
 
 
-      for (let comment of Array.from(rangesTracker.comments)) {
+      for (const comment of Array.from(rangesTracker.comments)) {
         var new_comment
         var new_comment
         changed = true
         changed = true
         delete delete_changes[comment.id]
         delete delete_changes[comment.id]
@@ -515,7 +515,7 @@ export default App.controller(
         }
         }
       }
       }
 
 
-      for (let change_id in delete_changes) {
+      for (const change_id in delete_changes) {
         const _ = delete_changes[change_id]
         const _ = delete_changes[change_id]
         changed = true
         changed = true
         delete entries[change_id]
         delete entries[change_id]
@@ -567,7 +567,7 @@ export default App.controller(
           }
           }
         }
         }
 
 
-        for (let id in entries) {
+        for (const id in entries) {
           const entry = entries[id]
           const entry = entries[id]
           let isChangeEntryAndWithinSelection = false
           let isChangeEntryAndWithinSelection = false
           if (
           if (
@@ -604,7 +604,7 @@ export default App.controller(
           }
           }
 
 
           if (isChangeEntryAndWithinSelection) {
           if (isChangeEntryAndWithinSelection) {
-            for (let entry_id of Array.from(entry.entry_ids)) {
+            for (const entry_id of Array.from(entry.entry_ids)) {
               $scope.reviewPanel.selectedEntryIds.push(entry_id)
               $scope.reviewPanel.selectedEntryIds.push(entry_id)
             }
             }
             $scope.reviewPanel.nVisibleSelectedChanges++
             $scope.reviewPanel.nVisibleSelectedChanges++
@@ -841,7 +841,7 @@ export default App.controller(
       if (thread == null) {
       if (thread == null) {
         return
         return
       }
       }
-      for (let message of Array.from(thread.messages)) {
+      for (const message of Array.from(thread.messages)) {
         if (message.id === comment_id) {
         if (message.id === comment_id) {
           message.content = content
           message.content = content
         }
         }
@@ -955,7 +955,7 @@ export default App.controller(
       }
       }
       $scope.reviewPanel.trackChangesOnForEveryone = newValue
       $scope.reviewPanel.trackChangesOnForEveryone = newValue
       const { project } = $scope
       const { project } = $scope
-      for (let member of Array.from(project.members)) {
+      for (const member of Array.from(project.members)) {
         _setUserTCState(member._id, newValue, isLocal)
         _setUserTCState(member._id, newValue, isLocal)
       }
       }
       _setGuestsTCState(newValue, isLocal)
       _setGuestsTCState(newValue, isLocal)
@@ -981,7 +981,7 @@ export default App.controller(
         data.on = true
         data.on = true
       } else {
       } else {
         data.on_for = {}
         data.on_for = {}
-        for (let userId in $scope.reviewPanel.trackChangesState) {
+        for (const userId in $scope.reviewPanel.trackChangesState) {
           const userState = $scope.reviewPanel.trackChangesState[userId]
           const userState = $scope.reviewPanel.trackChangesState[userId]
           data.on_for[userId] = userState.value
           data.on_for[userId] = userState.value
         }
         }
@@ -1001,7 +1001,7 @@ export default App.controller(
         const { project } = $scope
         const { project } = $scope
         $scope.reviewPanel.trackChangesOnForEveryone = false
         $scope.reviewPanel.trackChangesOnForEveryone = false
         _setGuestsTCState(state.__guests__ === true)
         _setGuestsTCState(state.__guests__ === true)
-        for (let member of Array.from(project.members)) {
+        for (const member of Array.from(project.members)) {
           _setUserTCState(
           _setUserTCState(
             member._id,
             member._id,
             state[member._id] != null ? state[member._id] : false
             state[member._id] != null ? state[member._id] : false
@@ -1130,7 +1130,7 @@ export default App.controller(
           }
           }
           return (() => {
           return (() => {
             const result = []
             const result = []
-            for (let user of Array.from(users)) {
+            for (const user of Array.from(users)) {
               if (user.id != null) {
               if (user.id != null) {
                 result.push(($scope.users[user.id] = formatUser(user)))
                 result.push(($scope.users[user.id] = formatUser(user)))
               } else {
               } else {
@@ -1162,7 +1162,7 @@ export default App.controller(
           }
           }
           for (thread_id in threads) {
           for (thread_id in threads) {
             const thread = threads[thread_id]
             const thread = threads[thread_id]
-            for (let comment of Array.from(thread.messages)) {
+            for (const comment of Array.from(thread.messages)) {
               formatComment(comment)
               formatComment(comment)
             }
             }
             if (thread.resolved_by_user != null) {
             if (thread.resolved_by_user != null) {

+ 1 - 1
services/web/frontend/js/ide/review-panel/directives/resolvedCommentsDropdown.js

@@ -75,7 +75,7 @@ export default App.directive('resolvedCommentsDropdown', () => ({
           result.push(
           result.push(
             (() => {
             (() => {
               const result1 = []
               const result1 = []
-              for (let entryId in docEntries) {
+              for (const entryId in docEntries) {
                 const entry = docEntries[entryId]
                 const entry = docEntries[entryId]
                 if (
                 if (
                   entry.type === 'comment' &&
                   entry.type === 'comment' &&

+ 1 - 1
services/web/frontend/js/ide/review-panel/directives/reviewPanelSorted.js

@@ -48,7 +48,7 @@ export default App.directive('reviewPanelSorted', $timeout => ({
       }
       }
 
 
       const entries = []
       const entries = []
-      for (let el of Array.from(element.find('.rp-entry-wrapper'))) {
+      for (const el of Array.from(element.find('.rp-entry-wrapper'))) {
         entry = {
         entry = {
           $indicator_el: $(el).find('.rp-entry-indicator'),
           $indicator_el: $(el).find('.rp-entry-indicator'),
           $box_el: $(el).find('.rp-entry'),
           $box_el: $(el).find('.rp-entry'),

+ 1 - 1
services/web/frontend/js/ide/review-panel/filters/orderOverviewEntries.js

@@ -12,7 +12,7 @@ export default App.filter(
   () =>
   () =>
     function (items) {
     function (items) {
       const array = []
       const array = []
-      for (let key in items) {
+      for (const key in items) {
         const value = items[key]
         const value = items[key]
         value.entry_id = key
         value.entry_id = key
         array.push(value)
         array.push(value)

+ 1 - 1
services/web/frontend/js/ide/services/ide.js

@@ -66,7 +66,7 @@ App.factory(
       meta.recent_events = this.recentEvents
       meta.recent_events = this.recentEvents
       const errorObj = {}
       const errorObj = {}
       if (typeof error === 'object') {
       if (typeof error === 'object') {
-        for (let key of Array.from(Object.getOwnPropertyNames(error))) {
+        for (const key of Array.from(Object.getOwnPropertyNames(error))) {
           errorObj[key] = error[key]
           errorObj[key] = error[key]
         }
         }
       } else if (typeof error === 'string') {
       } else if (typeof error === 'string') {

+ 1 - 1
services/web/frontend/js/ide/settings/services/settings.js

@@ -15,7 +15,7 @@ import App from '../../../base'
 export default App.factory('settings', (ide, eventTracking) => ({
 export default App.factory('settings', (ide, eventTracking) => ({
   saveSettings(data) {
   saveSettings(data) {
     // Tracking code.
     // Tracking code.
-    for (let key of Array.from(Object.keys(data))) {
+    for (const key of Array.from(Object.keys(data))) {
       const changedSetting = key
       const changedSetting = key
       const changedSettingVal = data[key]
       const changedSettingVal = data[key]
       eventTracking.sendMB('setting-changed', {
       eventTracking.sendMB('setting-changed', {

+ 2 - 2
services/web/frontend/js/ide/share/controllers/ShareProjectModalController.js

@@ -69,7 +69,7 @@ App.controller('ShareProjectModalController', function (
   function processContactsResponse(response) {
   function processContactsResponse(response) {
     const { data } = response
     const { data } = response
     $scope.autocompleteContacts = data.contacts || []
     $scope.autocompleteContacts = data.contacts || []
-    for (let contact of $scope.autocompleteContacts) {
+    for (const contact of $scope.autocompleteContacts) {
       if (contact.type === 'user') {
       if (contact.type === 'user') {
         if (
         if (
           contact.first_name === contact.email.split('@')[0] &&
           contact.first_name === contact.email.split('@')[0] &&
@@ -103,7 +103,7 @@ App.controller('ShareProjectModalController', function (
       ) {
       ) {
         return false
         return false
       }
       }
-      for (let text of [contact.name, contact.email]) {
+      for (const text of [contact.name, contact.email]) {
         if (
         if (
           text != null &&
           text != null &&
           text.toLowerCase().indexOf($query.toLowerCase()) > -1
           text.toLowerCase().indexOf($query.toLowerCase()) > -1

+ 1 - 2
services/web/frontend/js/main/account-upgrade.js

@@ -30,11 +30,10 @@ function startFreeTrial(source, version, $scope, eventTracking) {
 function upgradePlan(source, $scope) {
 function upgradePlan(source, $scope) {
   const w = window.open()
   const w = window.open()
   const go = function () {
   const go = function () {
-    let url
     if (typeof ga === 'function') {
     if (typeof ga === 'function') {
       ga('send', 'event', 'subscription-funnel', 'upgraded-plan', source)
       ga('send', 'event', 'subscription-funnel', 'upgraded-plan', source)
     }
     }
-    url = '/user/subscription'
+    const url = '/user/subscription'
 
 
     if ($scope) {
     if ($scope) {
       $scope.startedFreeTrial = true
       $scope.startedFreeTrial = true

+ 1 - 1
services/web/frontend/js/main/affiliations/controllers/UserAffiliationsController.js

@@ -189,7 +189,7 @@ export default App.controller(
       _monitorRequest(
       _monitorRequest(
         UserAffiliationsDataService.setDefaultUserEmail(userEmail.email)
         UserAffiliationsDataService.setDefaultUserEmail(userEmail.email)
       ).then(function () {
       ).then(function () {
-        for (let email of $scope.userEmails || []) {
+        for (const email of $scope.userEmails || []) {
           email.default = false
           email.default = false
         }
         }
         userEmail.default = true
         userEmail.default = true

+ 2 - 2
services/web/frontend/js/main/affiliations/factories/UserAffiliationsDataService.js

@@ -400,8 +400,8 @@ const commonDomains = [
   'foxmail',
   'foxmail',
 ]
 ]
 
 
-for (let domain of commonDomains) {
-  for (let tld of commonTLDs) {
+for (const domain of commonDomains) {
+  for (const tld of commonTLDs) {
     domainsBlackList[`${domain}.${tld}`] = true
     domainsBlackList[`${domain}.${tld}`] = true
   }
   }
 }
 }

+ 1 - 1
services/web/frontend/js/main/learn.js

@@ -58,7 +58,7 @@ App.controller(
       const lines = content.split('\n')
       const lines = content.split('\n')
       // Only show the lines that have a highlighted match
       // Only show the lines that have a highlighted match
       const matching_lines = []
       const matching_lines = []
-      for (let line of Array.from(lines)) {
+      for (const line of Array.from(lines)) {
         if (!/^\[edit\]/.test(line)) {
         if (!/^\[edit\]/.test(line)) {
           content += line + '\n'
           content += line + '\n'
           if (/<em>/.test(line)) {
           if (/<em>/.test(line)) {

+ 1 - 1
services/web/frontend/js/main/new-subscription.js

@@ -125,7 +125,7 @@ export default App.controller(
       $scope.monthlyBilling = pricing.items.plan.period.length === 1
       $scope.monthlyBilling = pricing.items.plan.period.length === 1
 
 
       $scope.availableCurrencies = {}
       $scope.availableCurrencies = {}
-      for (let currencyCode in pricing.items.plan.price) {
+      for (const currencyCode in pricing.items.plan.price) {
         if (MultiCurrencyPricing.plans[currencyCode]) {
         if (MultiCurrencyPricing.plans[currencyCode]) {
           $scope.availableCurrencies[currencyCode] =
           $scope.availableCurrencies[currencyCode] =
             MultiCurrencyPricing.plans[currencyCode]
             MultiCurrencyPricing.plans[currencyCode]

+ 2 - 4
services/web/frontend/js/main/plans.js

@@ -244,8 +244,6 @@ App.controller(
     $filter,
     $filter,
     $location
     $location
   ) {
   ) {
-    let switchEvent
-
     $scope.plans = MultiCurrencyPricing.plans
     $scope.plans = MultiCurrencyPricing.plans
 
 
     $scope.currencyCode = MultiCurrencyPricing.currencyCode
     $scope.currencyCode = MultiCurrencyPricing.currencyCode
@@ -331,7 +329,7 @@ App.controller(
 
 
     var eventLabel = (label, location) => label
     var eventLabel = (label, location) => label
 
 
-    switchEvent = function (e, label, location) {
+    function switchEvent(e, label, location) {
       e.preventDefault()
       e.preventDefault()
       const gaLabel = eventLabel(label, location)
       const gaLabel = eventLabel(label, location)
       eventTracking.send('subscription-funnel', 'plans-page', gaLabel)
       eventTracking.send('subscription-funnel', 'plans-page', gaLabel)
@@ -439,7 +437,7 @@ App.controller(
     }
     }
 
 
     $scope.recalculatePrice = function () {
     $scope.recalculatePrice = function () {
-      let { usage, plan_code, currency, size } = $scope.selected
+      const { usage, plan_code, currency, size } = $scope.selected
       const price = $scope.prices[usage][plan_code][currency][size]
       const price = $scope.prices[usage][plan_code][currency][size]
       const currencySymbol = $scope.options.currencySymbols[currency]
       const currencySymbol = $scope.options.currencySymbols[currency]
       $scope.displayPrice = `${currencySymbol}${price}`
       $scope.displayPrice = `${currencySymbol}${price}`

+ 2 - 2
services/web/frontend/js/main/project-list/notifications-controller.js

@@ -2,7 +2,7 @@ import App from '../../base'
 
 
 const ExposedSettings = window.ExposedSettings
 const ExposedSettings = window.ExposedSettings
 App.controller('NotificationsController', function ($scope, $http) {
 App.controller('NotificationsController', function ($scope, $http) {
-  for (let notification of $scope.notifications || []) {
+  for (const notification of $scope.notifications || []) {
     notification.hide = false
     notification.hide = false
   }
   }
 
 
@@ -98,7 +98,7 @@ App.controller(
       }
       }
       return false
       return false
     }
     }
-    for (let userEmail of $scope.userEmails) {
+    for (const userEmail of $scope.userEmails) {
       userEmail.hide = false
       userEmail.hide = false
     }
     }
 
 

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů