Преглед изворни кода

Merge pull request #29795 from overleaf/ar-last-infrastructure-conversions

[web] last infrastructure conversions

GitOrigin-RevId: 68aa11625a9bc6d0d5324ecd95bb5ac52af8ee96
Andrew Rumble пре 8 месеци
родитељ
комит
d748d8d606
100 измењених фајлова са 215 додато и 202 уклоњено
  1. 5 5
      services/web/app.mjs
  2. 1 1
      services/web/app/src/Features/Analytics/AnalyticsManager.mjs
  3. 1 1
      services/web/app/src/Features/Analytics/AnalyticsRouter.mjs
  4. 2 2
      services/web/app/src/Features/Authentication/AuthenticationController.mjs
  5. 1 1
      services/web/app/src/Features/Authentication/AuthenticationManager.mjs
  6. 1 1
      services/web/app/src/Features/Authorization/PermissionsController.mjs
  7. 1 1
      services/web/app/src/Features/Authorization/PermissionsManager.mjs
  8. 1 1
      services/web/app/src/Features/Chat/ChatController.mjs
  9. 1 1
      services/web/app/src/Features/Collaborators/CollaboratorsController.mjs
  10. 2 2
      services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs
  11. 1 1
      services/web/app/src/Features/Collaborators/CollaboratorsRouter.mjs
  12. 1 1
      services/web/app/src/Features/Compile/ClsiCookieManager.mjs
  13. 2 2
      services/web/app/src/Features/Compile/CompileController.mjs
  14. 2 2
      services/web/app/src/Features/Compile/CompileManager.mjs
  15. 1 1
      services/web/app/src/Features/Contacts/ContactController.mjs
  16. 1 1
      services/web/app/src/Features/Cooldown/CooldownManager.mjs
  17. 1 1
      services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.mjs
  18. 1 1
      services/web/app/src/Features/DocumentUpdater/DocumentUpdaterHandler.mjs
  19. 2 2
      services/web/app/src/Features/Documents/DocumentController.mjs
  20. 1 1
      services/web/app/src/Features/Downloads/ProjectDownloadsController.mjs
  21. 1 1
      services/web/app/src/Features/Editor/EditorHttpController.mjs
  22. 1 1
      services/web/app/src/Features/Editor/EditorRealTimeController.mjs
  23. 1 1
      services/web/app/src/Features/Editor/EditorRouter.mjs
  24. 1 1
      services/web/app/src/Features/Email/EmailSender.mjs
  25. 1 1
      services/web/app/src/Features/Errors/ErrorController.mjs
  26. 1 1
      services/web/app/src/Features/Errors/HttpErrorHandler.mjs
  27. 1 1
      services/web/app/src/Features/FileStore/FileStoreController.mjs
  28. 1 1
      services/web/app/src/Features/FileStore/FileStoreHandler.mjs
  29. 1 1
      services/web/app/src/Features/HealthCheck/HealthCheckController.mjs
  30. 1 1
      services/web/app/src/Features/Helpers/AdminAuthorizationHelper.mjs
  31. 1 1
      services/web/app/src/Features/Helpers/AsyncFormHelper.mjs
  32. 2 2
      services/web/app/src/Features/History/HistoryController.mjs
  33. 1 1
      services/web/app/src/Features/History/HistoryManager.mjs
  34. 1 1
      services/web/app/src/Features/History/HistoryRangesSupportMigration.mjs
  35. 1 1
      services/web/app/src/Features/History/HistoryRouter.mjs
  36. 2 2
      services/web/app/src/Features/History/RestoreManager.mjs
  37. 2 2
      services/web/app/src/Features/InactiveData/InactiveProjectManager.mjs
  38. 1 1
      services/web/app/src/Features/Institutions/InstitutionsAPI.mjs
  39. 3 3
      services/web/app/src/Features/LinkedFiles/LinkedFilesController.mjs
  40. 1 1
      services/web/app/src/Features/LinkedFiles/LinkedFilesHandler.mjs
  41. 1 1
      services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.mjs
  42. 1 1
      services/web/app/src/Features/PasswordReset/PasswordResetController.mjs
  43. 1 1
      services/web/app/src/Features/PasswordReset/PasswordResetRouter.mjs
  44. 2 2
      services/web/app/src/Features/Project/ProjectController.mjs
  45. 2 2
      services/web/app/src/Features/Project/ProjectDeleter.mjs
  46. 1 1
      services/web/app/src/Features/Project/ProjectDuplicator.mjs
  47. 1 1
      services/web/app/src/Features/Project/ProjectEntityMongoUpdateHandler.mjs
  48. 2 2
      services/web/app/src/Features/Project/ProjectEntityUpdateHandler.mjs
  49. 2 2
      services/web/app/src/Features/Project/ProjectGetter.mjs
  50. 1 1
      services/web/app/src/Features/Project/ProjectListController.mjs
  51. 1 1
      services/web/app/src/Features/Project/ProjectOptionsHandler.mjs
  52. 1 1
      services/web/app/src/Features/Project/ProjectRootDocManager.mjs
  53. 1 1
      services/web/app/src/Features/Security/LoginRateLimiter.mjs
  54. 1 1
      services/web/app/src/Features/Security/OneTimeTokenHandler.mjs
  55. 1 1
      services/web/app/src/Features/ServerAdmin/AdminController.mjs
  56. 1 1
      services/web/app/src/Features/Spelling/LearnedWordsManager.mjs
  57. 1 1
      services/web/app/src/Features/Spelling/SpellingController.mjs
  58. 1 1
      services/web/app/src/Features/Subscription/FeaturesUpdater.mjs
  59. 2 2
      services/web/app/src/Features/Subscription/SubscriptionController.mjs
  60. 2 2
      services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs
  61. 1 1
      services/web/app/src/Features/Subscription/SubscriptionGroupHandler.mjs
  62. 1 1
      services/web/app/src/Features/Subscription/SubscriptionHandler.mjs
  63. 1 1
      services/web/app/src/Features/Subscription/SubscriptionRouter.mjs
  64. 3 3
      services/web/app/src/Features/Subscription/SubscriptionUpdater.mjs
  65. 1 1
      services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.mjs
  66. 2 2
      services/web/app/src/Features/Subscription/TeamInvitesController.mjs
  67. 1 1
      services/web/app/src/Features/Subscription/TeamInvitesHandler.mjs
  68. 1 1
      services/web/app/src/Features/SystemMessages/SystemMessageManager.mjs
  69. 1 1
      services/web/app/src/Features/Tags/TagsController.mjs
  70. 1 1
      services/web/app/src/Features/Templates/TemplatesRouter.mjs
  71. 1 1
      services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.mjs
  72. 1 1
      services/web/app/src/Features/Uploads/UploadsRouter.mjs
  73. 3 3
      services/web/app/src/Features/User/UserController.mjs
  74. 1 1
      services/web/app/src/Features/User/UserDeleter.mjs
  75. 2 2
      services/web/app/src/Features/User/UserEmailsController.mjs
  76. 3 3
      services/web/app/src/Features/User/UserGetter.mjs
  77. 1 1
      services/web/app/src/Features/User/UserHandler.mjs
  78. 1 1
      services/web/app/src/Features/User/UserPagesController.mjs
  79. 1 1
      services/web/app/src/Features/User/UserSessionsRedis.mjs
  80. 3 3
      services/web/app/src/Features/User/UserUpdater.mjs
  81. 2 2
      services/web/app/src/Features/UserMembership/UserMembershipController.mjs
  82. 1 1
      services/web/app/src/Features/UserMembership/UserMembershipMiddleware.mjs
  83. 1 1
      services/web/app/src/Features/UserMembership/UserMembershipRouter.mjs
  84. 2 2
      services/web/app/src/infrastructure/AsyncLocalStorage.mjs
  85. 2 2
      services/web/app/src/infrastructure/ExpressLocals.mjs
  86. 16 15
      services/web/app/src/infrastructure/FileWriter.mjs
  87. 21 13
      services/web/app/src/infrastructure/GracefulShutdown.mjs
  88. 2 2
      services/web/app/src/infrastructure/HttpPermissionsPolicy.mjs
  89. 4 5
      services/web/app/src/infrastructure/LockManager.mjs
  90. 10 4
      services/web/app/src/infrastructure/Metrics.mjs
  91. 10 9
      services/web/app/src/infrastructure/Modules.mjs
  92. 6 6
      services/web/app/src/infrastructure/Mongoose.mjs
  93. 2 2
      services/web/app/src/infrastructure/QueueWorkers.mjs
  94. 1 1
      services/web/app/src/infrastructure/Queues.mjs
  95. 10 10
      services/web/app/src/infrastructure/RateLimiter.mjs
  96. 4 4
      services/web/app/src/infrastructure/RedisWrapper.mjs
  97. 0 5
      services/web/app/src/infrastructure/RequestContentTypeDetection.js
  98. 3 0
      services/web/app/src/infrastructure/RequestContentTypeDetection.mjs
  99. 7 7
      services/web/app/src/infrastructure/Response.mjs
  100. 1 1
      services/web/app/src/infrastructure/ServeStaticWrapper.mjs

+ 5 - 5
services/web/app.mjs

@@ -1,7 +1,7 @@
 // Metrics must be initialized before importing anything else
 import { metricsModuleImportStartTime } from '@overleaf/metrics/initialize.js'
 
-import Modules from './app/src/infrastructure/Modules.js'
+import Modules from './app/src/infrastructure/Modules.mjs'
 import metrics from '@overleaf/metrics'
 import Settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
@@ -13,10 +13,10 @@ import https from 'node:https'
 import Serializers from './app/src/infrastructure/LoggerSerializers.mjs'
 import Server from './app/src/infrastructure/Server.mjs'
 import QueueWorkers from './app/src/infrastructure/QueueWorkers.mjs'
-import mongodb from './app/src/infrastructure/mongodb.js'
-import mongoose from './app/src/infrastructure/Mongoose.js'
-import { triggerGracefulShutdown } from './app/src/infrastructure/GracefulShutdown.js'
-import FileWriter from './app/src/infrastructure/FileWriter.js'
+import mongodb from './app/src/infrastructure/mongodb.mjs'
+import mongoose from './app/src/infrastructure/Mongoose.mjs'
+import { triggerGracefulShutdown } from './app/src/infrastructure/GracefulShutdown.mjs'
+import FileWriter from './app/src/infrastructure/FileWriter.mjs'
 import { fileURLToPath } from 'node:url'
 
 metrics.gauge(

+ 1 - 1
services/web/app/src/Features/Analytics/AnalyticsManager.mjs

@@ -1,7 +1,7 @@
 import SessionManager from '../Authentication/SessionManager.mjs'
 import UserAnalyticsIdCache from './UserAnalyticsIdCache.mjs'
 import Settings from '@overleaf/settings'
-import Metrics from '../../infrastructure/Metrics.js'
+import Metrics from '../../infrastructure/Metrics.mjs'
 import Queues from '../../infrastructure/Queues.mjs'
 import crypto, { createHash } from 'node:crypto'
 import _ from 'lodash'

+ 1 - 1
services/web/app/src/Features/Analytics/AnalyticsRouter.mjs

@@ -1,7 +1,7 @@
 import AuthenticationController from './../Authentication/AuthenticationController.mjs'
 import AnalyticsController from './AnalyticsController.mjs'
 import AnalyticsProxy from './AnalyticsProxy.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 const rateLimiters = {

+ 2 - 2
services/web/app/src/Features/Authentication/AuthenticationController.mjs

@@ -19,9 +19,9 @@ import AsyncFormHelper from '../Helpers/AsyncFormHelper.mjs'
 import _ from 'lodash'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import AnalyticsRegistrationSourceHelper from '../Analytics/AnalyticsRegistrationSourceHelper.mjs'
-import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.js'
+import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.mjs'
 import AdminAuthorizationHelper from '../Helpers/AdminAuthorizationHelper.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify, promisify } from '@overleaf/promise-utils'
 import { handleAuthenticateErrors } from './AuthenticationErrors.mjs'
 import EmailHelper from '../Helpers/EmailHelper.mjs'

+ 1 - 1
services/web/app/src/Features/Authentication/AuthenticationManager.mjs

@@ -1,6 +1,6 @@
 import Settings from '@overleaf/settings'
 import { User } from '../../models/User.mjs'
-import { db, ObjectId } from '../../infrastructure/mongodb.js'
+import { db, ObjectId } from '../../infrastructure/mongodb.mjs'
 import bcrypt from 'bcrypt'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
 

+ 1 - 1
services/web/app/src/Features/Authorization/PermissionsController.mjs

@@ -1,7 +1,7 @@
 // @ts-check
 import { ForbiddenError, UserNotFoundError } from '../Errors/Errors.js'
 import PermissionsManager from './PermissionsManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import Features from '../../infrastructure/Features.mjs'
 

+ 1 - 1
services/web/app/src/Features/Authorization/PermissionsManager.mjs

@@ -44,7 +44,7 @@
 import { callbackify } from 'node:util'
 
 import Errors from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 const { ForbiddenError } = Errors
 

+ 1 - 1
services/web/app/src/Features/Chat/ChatController.mjs

@@ -1,5 +1,5 @@
 import { expressify } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import ChatApiHandler from './ChatApiHandler.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'

+ 1 - 1
services/web/app/src/Features/Collaborators/CollaboratorsController.mjs

@@ -15,7 +15,7 @@ import TokenAccessHandler from '../TokenAccess/TokenAccessHandler.mjs'
 import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.mjs'
 import LimitationsManager from '../Subscription/LimitationsManager.mjs'
 import PrivilegeLevels from '../Authorization/PrivilegeLevels.mjs'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 import Features from '../../infrastructure/Features.mjs'
 
 const { hasAdminAccess } = AdminAuthorizationHelper

+ 2 - 2
services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs

@@ -10,8 +10,8 @@ import EmailHelper from '../Helpers/EmailHelper.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.mjs'
 import Errors from '../Errors/Errors.js'

+ 1 - 1
services/web/app/src/Features/Collaborators/CollaboratorsRouter.mjs

@@ -2,7 +2,7 @@ import CollaboratorsController from './CollaboratorsController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import CollaboratorsInviteController from './CollaboratorsInviteController.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import CaptchaMiddleware from '../Captcha/CaptchaMiddleware.mjs'
 import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.mjs'

+ 1 - 1
services/web/app/src/Features/Compile/ClsiCookieManager.mjs

@@ -6,7 +6,7 @@ import {
   fetchStringWithResponse,
   RequestFailedError,
 } from '@overleaf/fetch-utils'
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import Cookie from 'cookie'
 import logger from '@overleaf/logger'
 import Metrics from '@overleaf/metrics'

+ 2 - 2
services/web/app/src/Features/Compile/CompileController.mjs

@@ -10,8 +10,8 @@ import logger from '@overleaf/logger'
 import Settings from '@overleaf/settings'
 import Errors from '../Errors/Errors.js'
 import SessionManager from '../Authentication/SessionManager.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
-import Validation from '../../infrastructure/Validation.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
+import Validation from '../../infrastructure/Validation.mjs'
 import ClsiCookieManagerFactory from './ClsiCookieManager.mjs'
 import Path from 'node:path'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'

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

@@ -1,12 +1,12 @@
 import Crypto from 'node:crypto'
 import Settings from '@overleaf/settings'
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectRootDocManager from '../Project/ProjectRootDocManager.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import ClsiManager from './ClsiManager.mjs'
 import Metrics from '@overleaf/metrics'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import UserAnalyticsIdCache from '../Analytics/UserAnalyticsIdCache.mjs'
 import { callbackify, callbackifyMultiResult } from '@overleaf/promise-utils'
 let CompileManager

+ 1 - 1
services/web/app/src/Features/Contacts/ContactController.mjs

@@ -1,7 +1,7 @@
 import SessionManager from '../Authentication/SessionManager.mjs'
 import ContactManager from './ContactManager.mjs'
 import UserGetter from '../User/UserGetter.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify } from '@overleaf/promise-utils'
 
 function _formatContact(contact) {

+ 1 - 1
services/web/app/src/Features/Cooldown/CooldownManager.mjs

@@ -1,4 +1,4 @@
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import logger from '@overleaf/logger'
 import { promisify } from '@overleaf/promise-utils'
 const rclient = RedisWrapper.client('cooldown')

+ 1 - 1
services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.mjs

@@ -1,7 +1,7 @@
 import logger from '@overleaf/logger'
 import DocumentUpdaterHandler from './DocumentUpdaterHandler.mjs'
 import ProjectLocator from '../Project/ProjectLocator.mjs'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 import { expressify } from '@overleaf/promise-utils'
 
 async function getDoc(req, res) {

+ 1 - 1
services/web/app/src/Features/DocumentUpdater/DocumentUpdaterHandler.mjs

@@ -10,7 +10,7 @@ import _ from 'lodash'
 import logger from '@overleaf/logger'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 const REQUEST_TIMEOUT_MS = 30 * 1000
 const RESYNC_TIMEOUT_MS = 6 * 60 * 1000

+ 2 - 2
services/web/app/src/Features/Documents/DocumentController.mjs

@@ -5,9 +5,9 @@ import ProjectEntityHandler from '../Project/ProjectEntityHandler.mjs'
 import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.mjs'
 import logger from '@overleaf/logger'
 import _ from 'lodash'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 import { expressify } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 async function getDocument(req, res) {
   const { Project_id: projectId, doc_id: docId } = req.params

+ 1 - 1
services/web/app/src/Features/Downloads/ProjectDownloadsController.mjs

@@ -14,7 +14,7 @@ import Metrics from '@overleaf/metrics'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectZipStreamManager from './ProjectZipStreamManager.mjs'
 import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mjs'
-import { prepareZipAttachment } from '../../infrastructure/Response.js'
+import { prepareZipAttachment } from '../../infrastructure/Response.mjs'
 
 let ProjectDownloadsController
 

+ 1 - 1
services/web/app/src/Features/Editor/EditorHttpController.mjs

@@ -11,7 +11,7 @@ import Errors from '../Errors/Errors.js'
 import { expressify } from '@overleaf/promise-utils'
 import Settings from '@overleaf/settings'
 import CollaboratorsGetter from '../Collaborators/CollaboratorsGetter.mjs'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 
 const ProjectAccess = CollaboratorsGetter.ProjectAccess
 

+ 1 - 1
services/web/app/src/Features/Editor/EditorRealTimeController.mjs

@@ -12,7 +12,7 @@
  */
 import Settings from '@overleaf/settings'
 import Metrics from '@overleaf/metrics'
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import os from 'node:os'
 import crypto from 'node:crypto'
 let EditorRealTimeController

+ 1 - 1
services/web/app/src/Features/Editor/EditorRouter.mjs

@@ -1,7 +1,7 @@
 import EditorHttpController from './EditorHttpController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 const rateLimiters = {

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

@@ -5,7 +5,7 @@ import Settings from '@overleaf/settings'
 import nodemailer from 'nodemailer'
 import aws from '@aws-sdk/client-ses'
 import OError from '@overleaf/o-error'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import _ from 'lodash'
 
 const EMAIL_SETTINGS = Settings.email || {}

+ 1 - 1
services/web/app/src/Features/Errors/ErrorController.mjs

@@ -3,7 +3,7 @@ import Errors from './Errors.js'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import SamlLogHandler from '../SamlLog/SamlLogHandler.mjs'
 import HttpErrorHandler from './HttpErrorHandler.mjs'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 import { expressifyErrorHandler } from '@overleaf/promise-utils'
 
 function notFound(req, res) {

+ 1 - 1
services/web/app/src/Features/Errors/HttpErrorHandler.mjs

@@ -1,6 +1,6 @@
 import logger from '@overleaf/logger'
 import Settings from '@overleaf/settings'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 
 function renderJSONError(res, message, info = {}) {
   if (info.message) {

+ 1 - 1
services/web/app/src/Features/FileStore/FileStoreController.mjs

@@ -7,7 +7,7 @@ import Metrics from '@overleaf/metrics'
 import ProjectLocator from '../Project/ProjectLocator.mjs'
 import HistoryManager from '../History/HistoryManager.mjs'
 import Errors from '../Errors/Errors.js'
-import { preparePlainTextResponse } from '../../infrastructure/Response.js'
+import { preparePlainTextResponse } from '../../infrastructure/Response.mjs'
 
 async function getFile(req, res) {
   const projectId = req.params.Project_id

+ 1 - 1
services/web/app/src/Features/FileStore/FileStoreHandler.mjs

@@ -7,7 +7,7 @@ import ProjectDetailsHandler from '../Project/ProjectDetailsHandler.mjs'
 import { File } from '../../models/File.mjs'
 import OError from '@overleaf/o-error'
 import { promisifyAll } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 const FileStoreHandler = {
   RETRY_ATTEMPTS: 3,

+ 1 - 1
services/web/app/src/Features/HealthCheck/HealthCheckController.mjs

@@ -1,4 +1,4 @@
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
 import UserGetter from '../User/UserGetter.mjs'

+ 1 - 1
services/web/app/src/Features/Helpers/AdminAuthorizationHelper.mjs

@@ -1,5 +1,5 @@
 import Settings from '@overleaf/settings'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import logger from '@overleaf/logger'

+ 1 - 1
services/web/app/src/Features/Helpers/AsyncFormHelper.mjs

@@ -1,4 +1,4 @@
-import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.js'
+import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.mjs'
 
 export default {
   redirect,

+ 2 - 2
services/web/app/src/Features/History/HistoryController.mjs

@@ -23,9 +23,9 @@ import HistoryManager from './HistoryManager.mjs'
 import ProjectDetailsHandler from '../Project/ProjectDetailsHandler.mjs'
 import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.mjs'
 import RestoreManager from './RestoreManager.mjs'
-import { prepareZipAttachment } from '../../infrastructure/Response.js'
+import { prepareZipAttachment } from '../../infrastructure/Response.mjs'
 import Features from '../../infrastructure/Features.mjs'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 
 // Number of seconds after which the browser should send a request to revalidate
 // blobs

+ 1 - 1
services/web/app/src/Features/History/HistoryManager.mjs

@@ -11,7 +11,7 @@ import OError from '@overleaf/o-error'
 import UserGetter from '../User/UserGetter.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import HistoryBackupDeletionHandler from './HistoryBackupDeletionHandler.mjs'
-import { db, waitForDb } from '../../infrastructure/mongodb.js'
+import { db, waitForDb } from '../../infrastructure/mongodb.mjs'
 import Metrics from '@overleaf/metrics'
 import { NotFoundError } from '../Errors/Errors.js'
 

+ 1 - 1
services/web/app/src/Features/History/HistoryRangesSupportMigration.mjs

@@ -7,7 +7,7 @@ import HistoryManager from '../History/HistoryManager.mjs'
 import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mjs'
 import DocstoreManager from '../Docstore/DocstoreManager.mjs'
 import ProjectOptionsHandler from '../Project/ProjectOptionsHandler.mjs'
-import mongodb from '../../infrastructure/mongodb.js'
+import mongodb from '../../infrastructure/mongodb.mjs'
 
 const { db, ObjectId, READ_PREFERENCE_SECONDARY } = mongodb
 

+ 1 - 1
services/web/app/src/Features/History/HistoryRouter.mjs

@@ -1,7 +1,7 @@
 // @ts-check
 
 import Settings from '@overleaf/settings'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'

+ 2 - 2
services/web/app/src/Features/History/RestoreManager.mjs

@@ -1,7 +1,7 @@
 import Settings from '@overleaf/settings'
 import Path from 'node:path'
-import FileWriter from '../../infrastructure/FileWriter.js'
-import Metrics from '../../infrastructure/Metrics.js'
+import FileWriter from '../../infrastructure/FileWriter.mjs'
+import Metrics from '../../infrastructure/Metrics.mjs'
 import FileSystemImportManager from '../Uploads/FileSystemImportManager.mjs'
 import FileTypeManager from '../Uploads/FileTypeManager.mjs'
 import EditorController from '../Editor/EditorController.mjs'

+ 2 - 2
services/web/app/src/Features/InactiveData/InactiveProjectManager.mjs

@@ -5,8 +5,8 @@ import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mj
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectUpdateHandler from '../Project/ProjectUpdateHandler.mjs'
 import { Project } from '../../models/Project.mjs'
-import Modules from '../../infrastructure/Modules.js'
-import { READ_PREFERENCE_SECONDARY } from '../../infrastructure/mongodb.js'
+import Modules from '../../infrastructure/Modules.mjs'
+import { READ_PREFERENCE_SECONDARY } from '../../infrastructure/mongodb.mjs'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import Metrics from '@overleaf/metrics'
 

+ 1 - 1
services/web/app/src/Features/Institutions/InstitutionsAPI.mjs

@@ -10,7 +10,7 @@ import {
   InvalidInstitutionalEmailError,
 } from '../Errors/Errors.js'
 import { fetchJson, fetchNothing } from '@overleaf/fetch-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 function _makeRequestOptions(options) {
   const requestOptions = {

+ 3 - 3
services/web/app/src/Features/LinkedFiles/LinkedFilesController.mjs

@@ -20,9 +20,9 @@ import {
   OutputFileFetchFailedError,
   FileTooLargeError,
 } from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
-import { plainTextResponse } from '../../infrastructure/Response.js'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import Modules from '../../infrastructure/Modules.mjs'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import ProjectOutputFileAgent from './ProjectOutputFileAgent.mjs'

+ 1 - 1
services/web/app/src/Features/LinkedFiles/LinkedFilesHandler.mjs

@@ -1,4 +1,4 @@
-import FileWriter from '../../infrastructure/FileWriter.js'
+import FileWriter from '../../infrastructure/FileWriter.mjs'
 import EditorController from '../Editor/EditorController.mjs'
 import ProjectLocator from '../Project/ProjectLocator.mjs'
 import { Project } from '../../models/Project.mjs'

+ 1 - 1
services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.mjs

@@ -1,6 +1,6 @@
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import LinkedFilesController from './LinkedFilesController.mjs'
 

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

@@ -8,7 +8,7 @@ import UserSessionsManager from '../User/UserSessionsManager.mjs'
 import OError from '@overleaf/o-error'
 import EmailsHelper from '../Helpers/EmailHelper.mjs'
 import { expressify } from '@overleaf/promise-utils'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 
 const setNewUserPasswordSchema = z.object({
   body: z.object({

+ 1 - 1
services/web/app/src/Features/PasswordReset/PasswordResetRouter.mjs

@@ -1,7 +1,7 @@
 import PasswordResetController from './PasswordResetController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import CaptchaMiddleware from '../../Features/Captcha/CaptchaMiddleware.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 const rateLimiter = new RateLimiter('password_reset_rate_limit', {

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

@@ -44,8 +44,8 @@ import PublicAccessLevels from '../Authorization/PublicAccessLevels.mjs'
 import TagsHandler from '../Tags/TagsHandler.mjs'
 import TutorialHandler from '../Tutorial/TutorialHandler.mjs'
 import UserUpdater from '../User/UserUpdater.mjs'
-import Modules from '../../infrastructure/Modules.js'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import Modules from '../../infrastructure/Modules.mjs'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import { isStandaloneAiAddOnPlanCode } from '../Subscription/AiHelper.mjs'
 import SubscriptionController from '../Subscription/SubscriptionController.mjs'

+ 2 - 2
services/web/app/src/Features/Project/ProjectDeleter.mjs

@@ -3,8 +3,8 @@ import {
   db,
   ObjectId,
   READ_PREFERENCE_SECONDARY,
-} from '../../infrastructure/mongodb.js'
-import Modules from '../../infrastructure/Modules.js'
+} from '../../infrastructure/mongodb.mjs'
+import Modules from '../../infrastructure/Modules.mjs'
 import { callbackify } from 'node:util'
 import { Project } from '../../models/Project.mjs'
 import { DeletedProject } from '../../models/DeletedProject.mjs'

+ 1 - 1
services/web/app/src/Features/Project/ProjectDuplicator.mjs

@@ -20,7 +20,7 @@ import TpdsProjectFlusher from '../ThirdPartyDataStore/TpdsProjectFlusher.mjs'
 import _ from 'lodash'
 import TagsHandler from '../Tags/TagsHandler.mjs'
 import ClsiCacheManager from '../Compile/ClsiCacheManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 export default {
   duplicate: callbackify(duplicate),

+ 1 - 1
services/web/app/src/Features/Project/ProjectEntityMongoUpdateHandler.mjs

@@ -8,7 +8,7 @@ import OError from '@overleaf/o-error'
 import CooldownManager from '../Cooldown/CooldownManager.mjs'
 import Errors from '../Errors/Errors.js'
 import { Folder } from '../../models/Folder.mjs'
-import LockManager from '../../infrastructure/LockManager.js'
+import LockManager from '../../infrastructure/LockManager.mjs'
 import { Project } from '../../models/Project.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectGetter from './ProjectGetter.mjs'

+ 2 - 2
services/web/app/src/Features/Project/ProjectEntityUpdateHandler.mjs

@@ -9,7 +9,7 @@ import DocstoreManager from '../Docstore/DocstoreManager.mjs'
 import DocumentUpdaterHandler from '../../Features/DocumentUpdater/DocumentUpdaterHandler.mjs'
 import Errors from '../Errors/Errors.js'
 import FileStoreHandler from '../FileStore/FileStoreHandler.mjs'
-import LockManager from '../../infrastructure/LockManager.js'
+import LockManager from '../../infrastructure/LockManager.mjs'
 import { Project } from '../../models/Project.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectGetter from './ProjectGetter.mjs'
@@ -19,7 +19,7 @@ import ProjectUpdateHandler from './ProjectUpdateHandler.mjs'
 import ProjectEntityMongoUpdateHandler from './ProjectEntityMongoUpdateHandler.mjs'
 import SafePath from './SafePath.mjs'
 import TpdsUpdateSender from '../ThirdPartyDataStore/TpdsUpdateSender.mjs'
-import FileWriter from '../../infrastructure/FileWriter.js'
+import FileWriter from '../../infrastructure/FileWriter.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import { callbackifyMultiResult, callbackify } from '@overleaf/promise-utils'
 import { iterablePaths } from './IterablePath.mjs'

+ 2 - 2
services/web/app/src/Features/Project/ProjectGetter.mjs

@@ -1,8 +1,8 @@
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import Mongo from '../Helpers/Mongo.mjs'
 import OError from '@overleaf/o-error'
 import { Project } from '../../models/Project.mjs'
-import LockManager from '../../infrastructure/LockManager.js'
+import LockManager from '../../infrastructure/LockManager.mjs'
 import { DeletedProject } from '../../models/DeletedProject.mjs'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import ProjectEntityMongoUpdateHandler from './ProjectEntityMongoUpdateHandler.mjs'

+ 1 - 1
services/web/app/src/Features/Project/ProjectListController.mjs

@@ -17,7 +17,7 @@ import logger from '@overleaf/logger'
 import Features from '../../infrastructure/Features.mjs'
 import SubscriptionViewModelBuilder from '../Subscription/SubscriptionViewModelBuilder.mjs'
 import NotificationsHandler from '../Notifications/NotificationsHandler.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { OError, V1ConnectionError } from '../Errors/Errors.js'
 import { User } from '../../models/User.mjs'
 import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.mjs'

+ 1 - 1
services/web/app/src/Features/Project/ProjectOptionsHandler.mjs

@@ -1,7 +1,7 @@
 import { Project } from '../../models/Project.mjs'
 import settings from '@overleaf/settings'
 import { callbackify } from 'node:util'
-import { db, ObjectId } from '../../infrastructure/mongodb.js'
+import { db, ObjectId } from '../../infrastructure/mongodb.mjs'
 import Errors from '../Errors/Errors.js'
 import mongodb from 'mongodb-legacy'
 const safeCompilers = ['xelatex', 'pdflatex', 'latex', 'lualatex']

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

@@ -23,7 +23,7 @@ import globby from 'globby'
 import _ from 'lodash'
 import { promisifyAll } from '@overleaf/promise-utils'
 import logger from '@overleaf/logger'
-import { BackgroundTaskTracker } from '../../infrastructure/GracefulShutdown.js'
+import { BackgroundTaskTracker } from '../../infrastructure/GracefulShutdown.mjs'
 
 const rootDocResets = new BackgroundTaskTracker('root doc resets')
 const ProjectRootDocManager = {

+ 1 - 1
services/web/app/src/Features/Security/LoginRateLimiter.mjs

@@ -1,4 +1,4 @@
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import { callbackify } from '@overleaf/promise-utils'
 import Settings from '@overleaf/settings'
 

+ 1 - 1
services/web/app/src/Features/Security/OneTimeTokenHandler.mjs

@@ -1,5 +1,5 @@
 import crypto from 'node:crypto'
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import Errors from '../Errors/Errors.js'
 import { callbackify } from 'node:util'
 

+ 1 - 1
services/web/app/src/Features/ServerAdmin/AdminController.mjs

@@ -6,7 +6,7 @@ import TpdsUpdateSender from '../ThirdPartyDataStore/TpdsUpdateSender.mjs'
 import TpdsProjectFlusher from '../ThirdPartyDataStore/TpdsProjectFlusher.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import SystemMessageManager from '../SystemMessages/SystemMessageManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 const AdminController = {
   _sendDisconnectAllUsersMessage: delay => {

+ 1 - 1
services/web/app/src/Features/Spelling/LearnedWordsManager.mjs

@@ -1,4 +1,4 @@
-import mongodb from '../../infrastructure/mongodb.js'
+import mongodb from '../../infrastructure/mongodb.mjs'
 import { callbackify } from 'node:util'
 import Settings from '@overleaf/settings'
 import Errors from '../Errors/Errors.js'

+ 1 - 1
services/web/app/src/Features/Spelling/SpellingController.mjs

@@ -2,7 +2,7 @@
 
 import SessionManager from '../Authentication/SessionManager.mjs'
 import LearnedWordsManager from './LearnedWordsManager.mjs'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 
 const learnSchema = z.object({
   body: z.object({

+ 1 - 1
services/web/app/src/Features/Subscription/FeaturesUpdater.mjs

@@ -14,7 +14,7 @@ import InstitutionsFeatures from '../Institutions/InstitutionsFeatures.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import Queues from '../../infrastructure/Queues.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { AI_ADD_ON_CODE } from './AiHelper.mjs'
 // import { fetchNothing } from '@overleaf/fetch-utils'
 import metrics from '@overleaf/metrics'

+ 2 - 2
services/web/app/src/Features/Subscription/SubscriptionController.mjs

@@ -19,7 +19,7 @@ import OError from '@overleaf/o-error'
 import Errors from './Errors.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 import AuthorizationManager from '../Authorization/AuthorizationManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import async from 'async'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import RecurlyClient from './RecurlyClient.mjs'
@@ -32,7 +32,7 @@ import { User } from '../../models/User.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import { sanitizeSessionUserForFrontEnd } from '../../infrastructure/FrontEndUser.mjs'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 import { IndeterminateInvoiceError } from '../Errors/Errors.js'
 import SubscriptionLocator from './SubscriptionLocator.mjs'
 

+ 2 - 2
services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs

@@ -6,10 +6,10 @@ import SubscriptionLocator from './SubscriptionLocator.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import { expressify } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import { Subscription } from '../../models/Subscription.mjs'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 import { isProfessionalGroupPlan } from './PlansHelper.mjs'
 import {
   MissingBillingInfoError,

+ 1 - 1
services/web/app/src/Features/Subscription/SubscriptionGroupHandler.mjs

@@ -10,7 +10,7 @@ import { User } from '../../models/User.mjs'
 import PlansLocator from './PlansLocator.mjs'
 import TeamInvitesHandler from './TeamInvitesHandler.mjs'
 import GroupPlansData from './GroupPlansData.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import PaymentProviderEntities from './PaymentProviderEntities.mjs'
 import {
   ManuallyCollectedError,

+ 1 - 1
services/web/app/src/Features/Subscription/SubscriptionHandler.mjs

@@ -13,7 +13,7 @@ import EmailHandler from '../Email/EmailHandler.mjs'
 import { callbackify } from '@overleaf/promise-utils'
 import UserUpdater from '../User/UserUpdater.mjs'
 import { IndeterminateInvoiceError } from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 /**
  * @import { PaymentProviderSubscriptionChange } from './PaymentProviderEntities.mjs'

+ 1 - 1
services/web/app/src/Features/Subscription/SubscriptionRouter.mjs

@@ -3,7 +3,7 @@ import PermissionsController from '../Authorization/PermissionsController.mjs'
 import SubscriptionController from './SubscriptionController.mjs'
 import SubscriptionGroupController from './SubscriptionGroupController.mjs'
 import TeamInvitesController from './TeamInvitesController.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import Settings from '@overleaf/settings'
 

+ 3 - 3
services/web/app/src/Features/Subscription/SubscriptionUpdater.mjs

@@ -1,4 +1,4 @@
-import { db, ObjectId } from '../../infrastructure/mongodb.js'
+import { db, ObjectId } from '../../infrastructure/mongodb.mjs'
 import { callbackify } from '@overleaf/promise-utils'
 import { Subscription } from '../../models/Subscription.mjs'
 import SubscriptionLocator from './SubscriptionLocator.mjs'
@@ -13,8 +13,8 @@ import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import UserUpdater from '../User/UserUpdater.mjs'
 import AccountMappingHelper from '../Analytics/AccountMappingHelper.mjs'
 import { SSOConfig } from '../../models/SSOConfig.mjs'
-import mongoose from '../../infrastructure/Mongoose.js'
-import Modules from '../../infrastructure/Modules.js'
+import mongoose from '../../infrastructure/Mongoose.mjs'
+import Modules from '../../infrastructure/Modules.mjs'
 
 /**
  * @typedef {import('../../../../types/subscription/dashboard/subscription').Subscription} Subscription

+ 1 - 1
services/web/app/src/Features/Subscription/SubscriptionViewModelBuilder.mjs

@@ -17,7 +17,7 @@ import { callbackify } from '@overleaf/promise-utils'
 import { V1ConnectionError } from '../Errors/Errors.js'
 import FeaturesHelper from './FeaturesHelper.mjs'
 import { formatCurrency } from '../../util/currency.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 
 const { MEMBERS_LIMIT_ADD_ON_CODE } = PaymentProviderEntities

+ 2 - 2
services/web/app/src/Features/Subscription/TeamInvitesController.mjs

@@ -12,8 +12,8 @@ import { expressify } from '@overleaf/promise-utils'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import EmailHandler from '../Email/EmailHandler.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
-import Modules from '../../infrastructure/Modules.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import { sanitizeSessionUserForFrontEnd } from '../../infrastructure/FrontEndUser.mjs'
 

+ 1 - 1
services/web/app/src/Features/Subscription/TeamInvitesHandler.mjs

@@ -1,7 +1,7 @@
 import logger from '@overleaf/logger'
 import crypto from 'node:crypto'
 import settings from '@overleaf/settings'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import mongodb from 'mongodb-legacy'
 import { Subscription } from '../../models/Subscription.mjs'
 import { SSOConfig } from '../../models/SSOConfig.mjs'

+ 1 - 1
services/web/app/src/Features/SystemMessages/SystemMessageManager.mjs

@@ -1,5 +1,5 @@
 import { SystemMessage } from '../../models/SystemMessage.mjs'
-import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.js'
+import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.mjs'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import logger from '@overleaf/logger'
 

+ 1 - 1
services/web/app/src/Features/Tags/TagsController.mjs

@@ -1,7 +1,7 @@
 import TagsHandler from './TagsHandler.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import Errors from '../Errors/Errors.js'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 import { expressify } from '@overleaf/promise-utils'
 
 async function _getTags(userId, _req, res) {

+ 1 - 1
services/web/app/src/Features/Templates/TemplatesRouter.mjs

@@ -1,7 +1,7 @@
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import TemplatesController from './TemplatesController.mjs'
 import TemplatesMiddleware from './TemplatesMiddleware.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.mjs'
 

+ 1 - 1
services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.mjs

@@ -10,7 +10,7 @@ import ProjectRootDocManager from '../Project/ProjectRootDocManager.mjs'
 import FileTypeManager from '../Uploads/FileTypeManager.mjs'
 import CooldownManager from '../Cooldown/CooldownManager.mjs'
 import Errors from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 async function newUpdate(
   userId,

+ 1 - 1
services/web/app/src/Features/Uploads/UploadsRouter.mjs

@@ -1,7 +1,7 @@
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import ProjectUploadController from './ProjectUploadController.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import Settings from '@overleaf/settings'
 

+ 3 - 3
services/web/app/src/Features/User/UserController.mjs

@@ -8,7 +8,7 @@ import metrics from '@overleaf/metrics'
 import AuthenticationManager from '../Authentication/AuthenticationManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import Features from '../../infrastructure/Features.mjs'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import UserUpdater from './UserUpdater.mjs'
@@ -19,8 +19,8 @@ import EmailHandler from '../Email/EmailHandler.mjs'
 import UrlHelper from '../Helpers/UrlHelper.mjs'
 import { promisify } from 'node:util'
 import { expressify } from '@overleaf/promise-utils'
-import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.js'
-import Modules from '../../infrastructure/Modules.js'
+import { acceptsJson } from '../../infrastructure/RequestContentTypeDetection.mjs'
+import Modules from '../../infrastructure/Modules.mjs'
 import OneTimeTokenHandler from '../Security/OneTimeTokenHandler.mjs'
 
 async function _sendSecurityAlertClearedSessions(user) {

+ 1 - 1
services/web/app/src/Features/User/UserDeleter.mjs

@@ -14,7 +14,7 @@ import UserMembershipsHandler from '../UserMembership/UserMembershipsHandler.mjs
 import UserSessionsManager from './UserSessionsManager.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.mjs'
 import InstitutionsAPI from '../Institutions/InstitutionsAPI.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import Errors from '../Errors/Errors.js'
 import OnboardingDataCollectionManager from '../OnboardingDataCollection/OnboardingDataCollectionManager.mjs'
 import EmailHandler from '../Email/EmailHandler.mjs'

+ 2 - 2
services/web/app/src/Features/User/UserEmailsController.mjs

@@ -16,10 +16,10 @@ import AsyncFormHelper from '../Helpers/AsyncFormHelper.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import Features from '../../infrastructure/Features.mjs'
 import tsscmp from 'tsscmp'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 const AUDIT_LOG_TOKEN_PREFIX_LENGTH = 10
 

+ 3 - 3
services/web/app/src/Features/User/UserGetter.mjs

@@ -1,5 +1,5 @@
 import { callbackify } from 'node:util'
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import moment from 'moment'
 import settings from '@overleaf/settings'
 import InstitutionsAPI from '../Institutions/InstitutionsAPI.mjs'
@@ -8,9 +8,9 @@ import Errors from '../Errors/Errors.js'
 import Features from '../../infrastructure/Features.mjs'
 import { User } from '../../models/User.mjs'
 import Mongo from '../Helpers/Mongo.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import FeaturesHelper from '../Subscription/FeaturesHelper.mjs'
-import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.js'
+import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.mjs'
 
 const { normalizeQuery, normalizeMultiQuery } = Mongo
 const InstitutionsAPIPromises = InstitutionsAPI.promises

+ 1 - 1
services/web/app/src/Features/User/UserHandler.mjs

@@ -1,6 +1,6 @@
 import { callbackify } from 'node:util'
 import TeamInvitesHandler from '../Subscription/TeamInvitesHandler.mjs'
-import { db, READ_PREFERENCE_SECONDARY } from '../../infrastructure/mongodb.js'
+import { db, READ_PREFERENCE_SECONDARY } from '../../infrastructure/mongodb.mjs'
 
 async function populateTeamInvites(user) {
   return await TeamInvitesHandler.promises.createTeamInvitesForLegacyInvitedEmail(

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

@@ -10,7 +10,7 @@ import SubscriptionLocator from '../Subscription/SubscriptionLocator.mjs'
 import _ from 'lodash'
 import { expressify } from '@overleaf/promise-utils'
 import Features from '../../infrastructure/Features.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 async function settingsPage(req, res) {
   const userId = SessionManager.getLoggedInUserId(req.session)

+ 1 - 1
services/web/app/src/Features/User/UserSessionsRedis.mjs

@@ -1,4 +1,4 @@
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 const rclient = RedisWrapper.client('websessions')
 
 const UserSessionsRedis = {

+ 3 - 3
services/web/app/src/Features/User/UserUpdater.mjs

@@ -1,6 +1,6 @@
 import logger from '@overleaf/logger'
 import OError from '@overleaf/o-error'
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import Mongo from '../Helpers/Mongo.mjs'
 import { callbackify } from 'node:util'
 import UserGetter from './UserGetter.mjs'
@@ -17,10 +17,10 @@ import EmailChangeHelper from '../Analytics/EmailChangeHelper.mjs'
 import SubscriptionLocator from '../Subscription/SubscriptionLocator.mjs'
 import NotificationsBuilder from '../Notifications/NotificationsBuilder.mjs'
 import _ from 'lodash'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import ThirdPartyIdentityManager from './ThirdPartyIdentityManager.mjs'
-import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.js'
+import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.mjs'
 
 const { normalizeQuery } = Mongo
 

+ 2 - 2
services/web/app/src/Features/UserMembership/UserMembershipController.mjs

@@ -2,14 +2,14 @@ import SessionManager from '../Authentication/SessionManager.mjs'
 import UserMembershipHandler from './UserMembershipHandler.mjs'
 import Errors from '../Errors/Errors.js'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
-import { csvAttachment } from '../../infrastructure/Response.js'
+import { csvAttachment } from '../../infrastructure/Response.mjs'
 import UserMembershipErrors from './UserMembershipErrors.mjs'
 import { SSOConfig } from '../../models/SSOConfig.mjs'
 import { Parser as CSVParser } from 'json2csv'
 import { expressify } from '@overleaf/promise-utils'
 import PlansLocator from '../Subscription/PlansLocator.mjs'
 import RecurlyClient from '../Subscription/RecurlyClient.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserMembershipAuthorization from './UserMembershipAuthorization.mjs'
 
 async function manageGroupMembers(req, res, next) {

+ 1 - 1
services/web/app/src/Features/UserMembership/UserMembershipMiddleware.mjs

@@ -10,7 +10,7 @@ import EntityConfigs from './UserMembershipEntityConfigs.mjs'
 import Errors from '../Errors/Errors.js'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import TemplatesManager from '../Templates/TemplatesManager.mjs'
-import { z, zz, validateReq } from '../../infrastructure/Validation.js'
+import { z, zz, validateReq } from '../../infrastructure/Validation.mjs'
 import AdminAuthorizationHelper from '../Helpers/AdminAuthorizationHelper.mjs'
 
 const { useAdminCapabilities } = AdminAuthorizationHelper

+ 1 - 1
services/web/app/src/Features/UserMembership/UserMembershipRouter.mjs

@@ -2,7 +2,7 @@ import UserMembershipMiddleware from './UserMembershipMiddleware.mjs'
 import UserMembershipController from './UserMembershipController.mjs'
 import SubscriptionGroupController from '../Subscription/SubscriptionGroupController.mjs'
 import TeamInvitesController from '../Subscription/TeamInvitesController.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 const rateLimiters = {

+ 2 - 2
services/web/app/src/infrastructure/AsyncLocalStorage.js → services/web/app/src/infrastructure/AsyncLocalStorage.mjs

@@ -1,5 +1,5 @@
 // @ts-check
-const { AsyncLocalStorage } = require('node:async_hooks')
+import { AsyncLocalStorage } from 'node:async_hooks'
 
 /**
  * @typedef {Object} RequestContext
@@ -31,7 +31,7 @@ function removeItem(key) {
   }
 }
 
-module.exports = {
+export default {
   middleware,
   storage: asyncLocalStorage,
   removeItem,

+ 2 - 2
services/web/app/src/infrastructure/ExpressLocals.mjs

@@ -9,10 +9,10 @@ import contentDisposition from 'content-disposition'
 import Features from './Features.mjs'
 import SessionManager from '../Features/Authentication/SessionManager.mjs'
 import PackageVersions from './PackageVersions.js'
-import Modules from './Modules.js'
+import Modules from './Modules.mjs'
 import Errors from '../Features/Errors/Errors.js'
 import AdminAuthorizationHelper from '../Features/Helpers/AdminAuthorizationHelper.mjs'
-import { addOptionalCleanupHandlerAfterDrainingConnections } from './GracefulShutdown.js'
+import { addOptionalCleanupHandlerAfterDrainingConnections } from './GracefulShutdown.mjs'
 import { sanitizeSessionUserForFrontEnd } from './FrontEndUser.mjs'
 import { expressify } from '@overleaf/promise-utils'
 

+ 16 - 15
services/web/app/src/infrastructure/FileWriter.js → services/web/app/src/infrastructure/FileWriter.mjs

@@ -5,18 +5,19 @@
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  */
-const fs = require('fs')
-const OError = require('@overleaf/o-error')
-const logger = require('@overleaf/logger')
-const crypto = require('crypto')
-const _ = require('lodash')
-const Settings = require('@overleaf/settings')
-const request = require('request')
-const { Transform, pipeline } = require('stream')
-const { FileTooLargeError } = require('../Features/Errors/Errors')
-const { promisifyAll } = require('@overleaf/promise-utils')
-
-class SizeLimitedStream extends Transform {
+import fs from 'node:fs'
+
+import OError from '@overleaf/o-error'
+import logger from '@overleaf/logger'
+import crypto from 'node:crypto'
+import _ from 'lodash'
+import Settings from '@overleaf/settings'
+import request from 'request'
+import { Transform, pipeline } from 'node:stream'
+import { FileTooLargeError } from '../Features/Errors/Errors.js'
+import { promisifyAll } from '@overleaf/promise-utils'
+
+export class SizeLimitedStream extends Transform {
   constructor(options) {
     options.autoDestroy = true
     super(options)
@@ -179,8 +180,8 @@ const FileWriter = {
   },
 }
 
-module.exports = FileWriter
-module.exports.promises = promisifyAll(FileWriter, {
+FileWriter.promises = promisifyAll(FileWriter, {
   without: ['ensureDumpFolderExists'],
 })
-module.exports.SizeLimitedStream = SizeLimitedStream
+
+export default FileWriter

+ 21 - 13
services/web/app/src/infrastructure/GracefulShutdown.js → services/web/app/src/infrastructure/GracefulShutdown.mjs

@@ -9,29 +9,37 @@
   - By now the node app should exit on its own.
  */
 
-const logger = require('@overleaf/logger')
-const OError = require('@overleaf/o-error')
-const Settings = require('@overleaf/settings')
-const Metrics = require('@overleaf/metrics')
-const sleep = require('util').promisify(setTimeout)
+import logger from '@overleaf/logger'
+
+import OError from '@overleaf/o-error'
+import Settings from '@overleaf/settings'
+import Metrics from '@overleaf/metrics'
+import { setTimeout as sleep } from 'node:timers/promises'
+
 const optionalCleanupHandlersBeforeStoppingTraffic = []
 const requiredCleanupHandlersBeforeDrainingConnections = []
 const optionalCleanupHandlersAfterDrainingConnections = []
 const connectionDrainer = []
 
-function addConnectionDrainer(label, handler) {
+export function addConnectionDrainer(label, handler) {
   connectionDrainer.push({ label, handler })
 }
 
-function addOptionalCleanupHandlerBeforeStoppingTraffic(label, handler) {
+export function addOptionalCleanupHandlerBeforeStoppingTraffic(label, handler) {
   optionalCleanupHandlersBeforeStoppingTraffic.push({ label, handler })
 }
 
-function addRequiredCleanupHandlerBeforeDrainingConnections(label, handler) {
+export function addRequiredCleanupHandlerBeforeDrainingConnections(
+  label,
+  handler
+) {
   requiredCleanupHandlersBeforeDrainingConnections.push({ label, handler })
 }
 
-function addOptionalCleanupHandlerAfterDrainingConnections(label, handler) {
+export function addOptionalCleanupHandlerAfterDrainingConnections(
+  label,
+  handler
+) {
   optionalCleanupHandlersAfterDrainingConnections.push({ label, handler })
 }
 
@@ -55,7 +63,7 @@ async function runHandlers(stage, handlers, logOnly) {
  * @param {import('net').Server} [server]
  * @param {number|string} [signal]
  */
-async function gracefulShutdown(server, signal) {
+export async function gracefulShutdown(server, signal) {
   logger.warn({ signal }, 'graceful shutdown: started shutdown sequence')
   Settings.shuttingDown = true
 
@@ -110,7 +118,7 @@ async function gracefulShutdown(server, signal) {
   logger.info({}, 'graceful shutdown: ready to exit')
 }
 
-function triggerGracefulShutdown(server, signal) {
+export function triggerGracefulShutdown(server, signal) {
   gracefulShutdown(server, signal).catch(err => {
     logger.err(
       { err },
@@ -119,7 +127,7 @@ function triggerGracefulShutdown(server, signal) {
   })
 }
 
-class BackgroundTaskTracker {
+export class BackgroundTaskTracker {
   constructor(label) {
     // Do not leak any handles, just record the number of pending jobs.
     // In case we miss the cleanup of one job, the worst thing that can happen
@@ -141,7 +149,7 @@ class BackgroundTaskTracker {
   }
 }
 
-module.exports = {
+export default {
   BackgroundTaskTracker,
   addConnectionDrainer,
   addOptionalCleanupHandlerBeforeStoppingTraffic,

+ 2 - 2
services/web/app/src/infrastructure/HttpPermissionsPolicy.js → services/web/app/src/infrastructure/HttpPermissionsPolicy.mjs

@@ -1,6 +1,6 @@
 //  @ts-check
 
-const Settings = require('@overleaf/settings')
+import Settings from '@overleaf/settings'
 
 /**
  * @import { HttpPermissionsPolicy } from './types'
@@ -85,4 +85,4 @@ class HttpPermissionsPolicyMiddleware {
   }
 }
 
-module.exports = HttpPermissionsPolicyMiddleware
+export default HttpPermissionsPolicyMiddleware

+ 4 - 5
services/web/app/src/infrastructure/LockManager.js → services/web/app/src/infrastructure/LockManager.mjs

@@ -1,9 +1,8 @@
-const settings = require('@overleaf/settings')
-const RedisWrapper = require('./RedisWrapper')
+import settings from '@overleaf/settings'
+import RedisWrapper from './RedisWrapper.mjs'
+import RedisWebLocker from '@overleaf/redis-wrapper/RedisWebLocker.js'
 const rclient = RedisWrapper.client('lock')
 
-const RedisWebLocker = require('@overleaf/redis-wrapper/RedisWebLocker')
-
 // this method creates a lock manager with the provided timeout options
 function createLockManager(options) {
   return new RedisWebLocker({
@@ -33,4 +32,4 @@ LockManager.withTimeout = function (timeout) {
   return createLockManager(lockManagerSettingsWithTimeout)
 }
 
-module.exports = LockManager
+export default LockManager

+ 10 - 4
services/web/app/src/infrastructure/Metrics.js → services/web/app/src/infrastructure/Metrics.mjs

@@ -1,22 +1,28 @@
 // @ts-check
 
-const Metrics = require('@overleaf/metrics')
+import Metrics from '@overleaf/metrics'
 
-exports.analyticsQueue = new Metrics.prom.Counter({
+const analyticsQueue = new Metrics.prom.Counter({
   name: 'analytics_queue',
   help: 'Number of events sent to the analytics queue',
   labelNames: ['status', 'event_type'],
 })
 
-exports.revertFileDurationSeconds = new Metrics.prom.Histogram({
+const revertFileDurationSeconds = new Metrics.prom.Histogram({
   name: 'timer_revert_file_duration_seconds',
   help: 'Duration of the file restore operation',
   buckets: [0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
   labelNames: ['type'],
 })
 
-exports.revertProjectDurationSeconds = new Metrics.prom.Histogram({
+const revertProjectDurationSeconds = new Metrics.prom.Histogram({
   name: 'timer_revert_project_duration_seconds',
   help: 'Duration of the project restore operation',
   buckets: [0.5, 1, 2, 5, 10, 30, 60, 120, 300, 900, 1800],
 })
+
+export default {
+  analyticsQueue,
+  revertFileDurationSeconds,
+  revertProjectDurationSeconds,
+}

+ 10 - 9
services/web/app/src/infrastructure/Modules.js → services/web/app/src/infrastructure/Modules.mjs

@@ -1,17 +1,18 @@
 // @ts-check
 
-const fs = require('fs')
-const Path = require('path')
-const { promisify, callbackify } = require('util')
-const Settings = require('@overleaf/settings')
-const Views = require('./Views')
-const _ = require('lodash')
-const Metrics = require('@overleaf/metrics')
+import fs from 'node:fs'
+
+import Path from 'node:path'
+import { promisify, callbackify } from 'node:util'
+import Settings from '@overleaf/settings'
+import Views from './Views.mjs'
+import _ from 'lodash'
+import Metrics from '@overleaf/metrics'
 
 /** @import { WebModule } from "../../../types/web-module" */
 /** @import { RequestHandler } from "express" */
 
-const MODULE_BASE_PATH = Path.join(__dirname, '/../../../modules')
+const MODULE_BASE_PATH = Path.join(import.meta.dirname, '/../../../modules')
 
 /** @type {WebModule[]} */
 const _modules = []
@@ -207,7 +208,7 @@ async function getMiddleware(name) {
   return _middleware[name] || []
 }
 
-module.exports = {
+export default {
   applyNonCsrfRouter,
   applyRouter,
   linkedFileAgentsIncludes,

+ 6 - 6
services/web/app/src/infrastructure/Mongoose.js → services/web/app/src/infrastructure/Mongoose.mjs

@@ -1,8 +1,8 @@
-const mongoose = require('mongoose')
-const Settings = require('@overleaf/settings')
-const Metrics = require('@overleaf/metrics')
-const logger = require('@overleaf/logger')
-const { addConnectionDrainer } = require('./GracefulShutdown')
+import mongoose from 'mongoose'
+import Settings from '@overleaf/settings'
+import Metrics from '@overleaf/metrics'
+import logger from '@overleaf/logger'
+import { addConnectionDrainer } from './GracefulShutdown.mjs'
 
 mongoose.set('autoIndex', false)
 mongoose.set('strictQuery', false)
@@ -54,4 +54,4 @@ mongoose.Promise = global.Promise
 
 mongoose.connectionPromise = connectionPromise
 
-module.exports = mongoose
+export default mongoose

+ 2 - 2
services/web/app/src/infrastructure/QueueWorkers.mjs

@@ -7,12 +7,12 @@ import FeaturesUpdater from '../Features/Subscription/FeaturesUpdater.mjs'
 import {
   addOptionalCleanupHandlerBeforeStoppingTraffic,
   addRequiredCleanupHandlerBeforeDrainingConnections,
-} from './GracefulShutdown.js'
+} from './GracefulShutdown.mjs'
 
 import EmailHandler from '../Features/Email/EmailHandler.mjs'
 import logger from '@overleaf/logger'
 import OError from '@overleaf/o-error'
-import Modules from './Modules.js'
+import Modules from './Modules.mjs'
 
 /**
  * @typedef {{

+ 1 - 1
services/web/app/src/infrastructure/Queues.mjs

@@ -1,7 +1,7 @@
 import Queue from 'bull'
 import Settings from '@overleaf/settings'
 import Features from '../infrastructure/Features.mjs'
-import { addConnectionDrainer } from './GracefulShutdown.js'
+import { addConnectionDrainer } from './GracefulShutdown.mjs'
 
 // Bull will keep a fixed number of the most recently completed jobs. This is
 // useful to inspect recently completed jobs. The bull prometheus exporter also

+ 10 - 10
services/web/app/src/infrastructure/RateLimiter.js → services/web/app/src/infrastructure/RateLimiter.mjs

@@ -1,16 +1,16 @@
-const Settings = require('@overleaf/settings')
-const Metrics = require('@overleaf/metrics')
-const logger = require('@overleaf/logger')
-const RedisWrapper = require('./RedisWrapper')
-const RateLimiterFlexible = require('rate-limiter-flexible')
-const OError = require('@overleaf/o-error')
+import Settings from '@overleaf/settings'
+import Metrics from '@overleaf/metrics'
+import logger from '@overleaf/logger'
+import RedisWrapper from './RedisWrapper.mjs'
+import RateLimiterFlexible from 'rate-limiter-flexible'
+import OError from '@overleaf/o-error'
 
 const rclient = RedisWrapper.client('ratelimiter')
 
 /**
  * Wrapper over the RateLimiterRedis class
  */
-class RateLimiter {
+export class RateLimiter {
   #opts
 
   /**
@@ -122,13 +122,13 @@ class RateLimiter {
  * Shared rate limiters
  */
 
-const openProjectRateLimiter = new RateLimiter('open-project', {
+export const openProjectRateLimiter = new RateLimiter('open-project', {
   points: 15,
   duration: 60,
 })
 
 // Keep in sync with the can-skip-captcha options.
-const overleafLoginRateLimiter = new RateLimiter(
+export const overleafLoginRateLimiter = new RateLimiter(
   'overleaf-login',
   Settings.rateLimit?.login?.ip || {
     points: 20,
@@ -137,7 +137,7 @@ const overleafLoginRateLimiter = new RateLimiter(
   }
 )
 
-module.exports = {
+export default {
   RateLimiter,
   openProjectRateLimiter,
   overleafLoginRateLimiter,

+ 4 - 4
services/web/app/src/infrastructure/RedisWrapper.js → services/web/app/src/infrastructure/RedisWrapper.mjs

@@ -1,6 +1,6 @@
-const Settings = require('@overleaf/settings')
-const redis = require('@overleaf/redis-wrapper')
-const { addConnectionDrainer } = require('./GracefulShutdown')
+import Settings from '@overleaf/settings'
+import redis from '@overleaf/redis-wrapper'
+import { addConnectionDrainer } from './GracefulShutdown.mjs'
 
 /**
  * A per-feature interface to Redis, looks up the feature in `settings.redis`
@@ -23,4 +23,4 @@ async function cleanupTestRedis() {
   await redis.cleanupTestRedis(rclient)
 }
 
-module.exports = { client, cleanupTestRedis }
+export default { client, cleanupTestRedis }

+ 0 - 5
services/web/app/src/infrastructure/RequestContentTypeDetection.js

@@ -1,5 +0,0 @@
-module.exports = {
-  acceptsJson(req) {
-    return req.accepts(['html', 'json']) === 'json'
-  },
-}

+ 3 - 0
services/web/app/src/infrastructure/RequestContentTypeDetection.mjs

@@ -0,0 +1,3 @@
+export function acceptsJson(req) {
+  return req.accepts(['html', 'json']) === 'json'
+}

+ 7 - 7
services/web/app/src/infrastructure/Response.js → services/web/app/src/infrastructure/Response.mjs

@@ -1,4 +1,4 @@
-function csvAttachment(res, body, filename) {
+export function csvAttachment(res, body, filename) {
   if (!filename || !filename.endsWith('.csv')) {
     throw new Error('filename must end with .csv')
   }
@@ -8,23 +8,23 @@ function csvAttachment(res, body, filename) {
   res.send(body)
 }
 
-function preparePlainTextResponse(res) {
+export function preparePlainTextResponse(res) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.contentType('text/plain; charset=utf-8')
 }
 
-function plainTextResponse(res, body) {
+export function plainTextResponse(res, body) {
   preparePlainTextResponse(res)
   res.send(body)
 }
 
-function xmlResponse(res, body) {
+export function xmlResponse(res, body) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.contentType('application/xml; charset=utf-8')
   res.send(body)
 }
 
-function prepareZipAttachment(res, filename) {
+export function prepareZipAttachment(res, filename) {
   if (!filename || !filename.endsWith('.zip')) {
     throw new Error('filename must end with .zip')
   }
@@ -33,12 +33,12 @@ function prepareZipAttachment(res, filename) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
 }
 
-function zipAttachment(res, body, filename) {
+export function zipAttachment(res, body, filename) {
   prepareZipAttachment(res, filename)
   res.send(body)
 }
 
-module.exports = {
+export default {
   csvAttachment,
   plainTextResponse,
   preparePlainTextResponse,

+ 1 - 1
services/web/app/src/infrastructure/ServeStaticWrapper.mjs

@@ -1,5 +1,5 @@
 import express from 'express'
-import { plainTextResponse } from './Response.js'
+import { plainTextResponse } from './Response.mjs'
 
 /*
     This wrapper is implemented specifically to handle "Premature Close" errors.

Неке датотеке нису приказане због велике количине промена