Kaynağa Gözat

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

[web] last infrastructure conversions

GitOrigin-RevId: 68aa11625a9bc6d0d5324ecd95bb5ac52af8ee96
Andrew Rumble 8 ay önce
ebeveyn
işleme
d748d8d606
100 değiştirilmiş dosya ile 215 ekleme ve 202 silme
  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
 // Metrics must be initialized before importing anything else
 import { metricsModuleImportStartTime } from '@overleaf/metrics/initialize.js'
 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 metrics from '@overleaf/metrics'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
@@ -13,10 +13,10 @@ import https from 'node:https'
 import Serializers from './app/src/infrastructure/LoggerSerializers.mjs'
 import Serializers from './app/src/infrastructure/LoggerSerializers.mjs'
 import Server from './app/src/infrastructure/Server.mjs'
 import Server from './app/src/infrastructure/Server.mjs'
 import QueueWorkers from './app/src/infrastructure/QueueWorkers.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'
 import { fileURLToPath } from 'node:url'
 
 
 metrics.gauge(
 metrics.gauge(

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

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

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

@@ -1,7 +1,7 @@
 import AuthenticationController from './../Authentication/AuthenticationController.mjs'
 import AuthenticationController from './../Authentication/AuthenticationController.mjs'
 import AnalyticsController from './AnalyticsController.mjs'
 import AnalyticsController from './AnalyticsController.mjs'
 import AnalyticsProxy from './AnalyticsProxy.mjs'
 import AnalyticsProxy from './AnalyticsProxy.mjs'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 
 const rateLimiters = {
 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 _ from 'lodash'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import AnalyticsRegistrationSourceHelper from '../Analytics/AnalyticsRegistrationSourceHelper.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 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 { expressify, promisify } from '@overleaf/promise-utils'
 import { handleAuthenticateErrors } from './AuthenticationErrors.mjs'
 import { handleAuthenticateErrors } from './AuthenticationErrors.mjs'
 import EmailHelper from '../Helpers/EmailHelper.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 Settings from '@overleaf/settings'
 import { User } from '../../models/User.mjs'
 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 bcrypt from 'bcrypt'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
 
 

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

@@ -1,7 +1,7 @@
 // @ts-check
 // @ts-check
 import { ForbiddenError, UserNotFoundError } from '../Errors/Errors.js'
 import { ForbiddenError, UserNotFoundError } from '../Errors/Errors.js'
 import PermissionsManager from './PermissionsManager.mjs'
 import PermissionsManager from './PermissionsManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
 import Features from '../../infrastructure/Features.mjs'
 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 { callbackify } from 'node:util'
 
 
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 const { ForbiddenError } = Errors
 const { ForbiddenError } = Errors
 
 

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

@@ -1,5 +1,5 @@
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import ChatApiHandler from './ChatApiHandler.mjs'
 import ChatApiHandler from './ChatApiHandler.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import SessionManager from '../Authentication/SessionManager.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 ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.mjs'
 import LimitationsManager from '../Subscription/LimitationsManager.mjs'
 import LimitationsManager from '../Subscription/LimitationsManager.mjs'
 import PrivilegeLevels from '../Authorization/PrivilegeLevels.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'
 import Features from '../../infrastructure/Features.mjs'
 
 
 const { hasAdminAccess } = AdminAuthorizationHelper
 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 EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import SessionManager from '../Authentication/SessionManager.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 { expressify } from '@overleaf/promise-utils'
 import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.mjs'
 import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.mjs'
 import Errors from '../Errors/Errors.js'
 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 AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import CollaboratorsInviteController from './CollaboratorsInviteController.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 RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import CaptchaMiddleware from '../Captcha/CaptchaMiddleware.mjs'
 import CaptchaMiddleware from '../Captcha/CaptchaMiddleware.mjs'
 import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.mjs'
 import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.mjs'

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

@@ -6,7 +6,7 @@ import {
   fetchStringWithResponse,
   fetchStringWithResponse,
   RequestFailedError,
   RequestFailedError,
 } from '@overleaf/fetch-utils'
 } from '@overleaf/fetch-utils'
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import Cookie from 'cookie'
 import Cookie from 'cookie'
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import Metrics from '@overleaf/metrics'
 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 Settings from '@overleaf/settings'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
 import SessionManager from '../Authentication/SessionManager.mjs'
 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 ClsiCookieManagerFactory from './ClsiCookieManager.mjs'
 import Path from 'node:path'
 import Path from 'node:path'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 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 Crypto from 'node:crypto'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
-import RedisWrapper from '../../infrastructure/RedisWrapper.js'
+import RedisWrapper from '../../infrastructure/RedisWrapper.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectRootDocManager from '../Project/ProjectRootDocManager.mjs'
 import ProjectRootDocManager from '../Project/ProjectRootDocManager.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import ClsiManager from './ClsiManager.mjs'
 import ClsiManager from './ClsiManager.mjs'
 import Metrics from '@overleaf/metrics'
 import Metrics from '@overleaf/metrics'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import UserAnalyticsIdCache from '../Analytics/UserAnalyticsIdCache.mjs'
 import UserAnalyticsIdCache from '../Analytics/UserAnalyticsIdCache.mjs'
 import { callbackify, callbackifyMultiResult } from '@overleaf/promise-utils'
 import { callbackify, callbackifyMultiResult } from '@overleaf/promise-utils'
 let CompileManager
 let CompileManager

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

@@ -1,7 +1,7 @@
 import SessionManager from '../Authentication/SessionManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import ContactManager from './ContactManager.mjs'
 import ContactManager from './ContactManager.mjs'
 import UserGetter from '../User/UserGetter.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'
 import { expressify } from '@overleaf/promise-utils'
 
 
 function _formatContact(contact) {
 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 logger from '@overleaf/logger'
 import { promisify } from '@overleaf/promise-utils'
 import { promisify } from '@overleaf/promise-utils'
 const rclient = RedisWrapper.client('cooldown')
 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 logger from '@overleaf/logger'
 import DocumentUpdaterHandler from './DocumentUpdaterHandler.mjs'
 import DocumentUpdaterHandler from './DocumentUpdaterHandler.mjs'
 import ProjectLocator from '../Project/ProjectLocator.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'
 import { expressify } from '@overleaf/promise-utils'
 
 
 async function getDoc(req, res) {
 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 logger from '@overleaf/logger'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 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 REQUEST_TIMEOUT_MS = 30 * 1000
 const RESYNC_TIMEOUT_MS = 6 * 60 * 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 ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.mjs'
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import _ from 'lodash'
 import _ from 'lodash'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 async function getDocument(req, res) {
 async function getDocument(req, res) {
   const { Project_id: projectId, doc_id: docId } = req.params
   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 ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectZipStreamManager from './ProjectZipStreamManager.mjs'
 import ProjectZipStreamManager from './ProjectZipStreamManager.mjs'
 import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mjs'
 import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mjs'
-import { prepareZipAttachment } from '../../infrastructure/Response.js'
+import { prepareZipAttachment } from '../../infrastructure/Response.mjs'
 
 
 let ProjectDownloadsController
 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 { expressify } from '@overleaf/promise-utils'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
 import CollaboratorsGetter from '../Collaborators/CollaboratorsGetter.mjs'
 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
 const ProjectAccess = CollaboratorsGetter.ProjectAccess
 
 

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

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

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

@@ -1,7 +1,7 @@
 import EditorHttpController from './EditorHttpController.mjs'
 import EditorHttpController from './EditorHttpController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.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'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 
 const rateLimiters = {
 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 nodemailer from 'nodemailer'
 import aws from '@aws-sdk/client-ses'
 import aws from '@aws-sdk/client-ses'
 import OError from '@overleaf/o-error'
 import OError from '@overleaf/o-error'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import _ from 'lodash'
 import _ from 'lodash'
 
 
 const EMAIL_SETTINGS = Settings.email || {}
 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 SessionManager from '../Authentication/SessionManager.mjs'
 import SamlLogHandler from '../SamlLog/SamlLogHandler.mjs'
 import SamlLogHandler from '../SamlLog/SamlLogHandler.mjs'
 import HttpErrorHandler from './HttpErrorHandler.mjs'
 import HttpErrorHandler from './HttpErrorHandler.mjs'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 import { expressifyErrorHandler } from '@overleaf/promise-utils'
 import { expressifyErrorHandler } from '@overleaf/promise-utils'
 
 
 function notFound(req, res) {
 function notFound(req, res) {

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

@@ -1,6 +1,6 @@
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
-import { plainTextResponse } from '../../infrastructure/Response.js'
+import { plainTextResponse } from '../../infrastructure/Response.mjs'
 
 
 function renderJSONError(res, message, info = {}) {
 function renderJSONError(res, message, info = {}) {
   if (info.message) {
   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 ProjectLocator from '../Project/ProjectLocator.mjs'
 import HistoryManager from '../History/HistoryManager.mjs'
 import HistoryManager from '../History/HistoryManager.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
-import { preparePlainTextResponse } from '../../infrastructure/Response.js'
+import { preparePlainTextResponse } from '../../infrastructure/Response.mjs'
 
 
 async function getFile(req, res) {
 async function getFile(req, res) {
   const projectId = req.params.Project_id
   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 { File } from '../../models/File.mjs'
 import OError from '@overleaf/o-error'
 import OError from '@overleaf/o-error'
 import { promisifyAll } from '@overleaf/promise-utils'
 import { promisifyAll } from '@overleaf/promise-utils'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 const FileStoreHandler = {
 const FileStoreHandler = {
   RETRY_ATTEMPTS: 3,
   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 settings from '@overleaf/settings'
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import UserGetter from '../User/UserGetter.mjs'
 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 Settings from '@overleaf/settings'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import logger from '@overleaf/logger'
 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 {
 export default {
   redirect,
   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 ProjectDetailsHandler from '../Project/ProjectDetailsHandler.mjs'
 import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.mjs'
 import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.mjs'
 import RestoreManager from './RestoreManager.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 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
 // Number of seconds after which the browser should send a request to revalidate
 // blobs
 // 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 UserGetter from '../User/UserGetter.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectGetter from '../Project/ProjectGetter.mjs'
 import HistoryBackupDeletionHandler from './HistoryBackupDeletionHandler.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 Metrics from '@overleaf/metrics'
 import { NotFoundError } from '../Errors/Errors.js'
 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 DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.mjs'
 import DocstoreManager from '../Docstore/DocstoreManager.mjs'
 import DocstoreManager from '../Docstore/DocstoreManager.mjs'
 import ProjectOptionsHandler from '../Project/ProjectOptionsHandler.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
 const { db, ObjectId, READ_PREFERENCE_SECONDARY } = mongodb
 
 

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

@@ -1,7 +1,7 @@
 // @ts-check
 // @ts-check
 
 
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
-import { RateLimiter } from '../../infrastructure/RateLimiter.js'
+import { RateLimiter } from '../../infrastructure/RateLimiter.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.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 Settings from '@overleaf/settings'
 import Path from 'node:path'
 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 FileSystemImportManager from '../Uploads/FileSystemImportManager.mjs'
 import FileTypeManager from '../Uploads/FileTypeManager.mjs'
 import FileTypeManager from '../Uploads/FileTypeManager.mjs'
 import EditorController from '../Editor/EditorController.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 ProjectGetter from '../Project/ProjectGetter.mjs'
 import ProjectUpdateHandler from '../Project/ProjectUpdateHandler.mjs'
 import ProjectUpdateHandler from '../Project/ProjectUpdateHandler.mjs'
 import { Project } from '../../models/Project.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 { callbackifyAll } from '@overleaf/promise-utils'
 import Metrics from '@overleaf/metrics'
 import Metrics from '@overleaf/metrics'
 
 

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

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

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

@@ -20,9 +20,9 @@ import {
   OutputFileFetchFailedError,
   OutputFileFetchFailedError,
   FileTooLargeError,
   FileTooLargeError,
 } from '../Errors/Errors.js'
 } 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 EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
 import ProjectOutputFileAgent from './ProjectOutputFileAgent.mjs'
 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 EditorController from '../Editor/EditorController.mjs'
 import ProjectLocator from '../Project/ProjectLocator.mjs'
 import ProjectLocator from '../Project/ProjectLocator.mjs'
 import { Project } from '../../models/Project.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 AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.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 RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import LinkedFilesController from './LinkedFilesController.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 OError from '@overleaf/o-error'
 import EmailsHelper from '../Helpers/EmailHelper.mjs'
 import EmailsHelper from '../Helpers/EmailHelper.mjs'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 
 
 const setNewUserPasswordSchema = z.object({
 const setNewUserPasswordSchema = z.object({
   body: 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 PasswordResetController from './PasswordResetController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import CaptchaMiddleware from '../../Features/Captcha/CaptchaMiddleware.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'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 
 const rateLimiter = new RateLimiter('password_reset_rate_limit', {
 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 TagsHandler from '../Tags/TagsHandler.mjs'
 import TutorialHandler from '../Tutorial/TutorialHandler.mjs'
 import TutorialHandler from '../Tutorial/TutorialHandler.mjs'
 import UserUpdater from '../User/UserUpdater.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 UserGetter from '../User/UserGetter.mjs'
 import { isStandaloneAiAddOnPlanCode } from '../Subscription/AiHelper.mjs'
 import { isStandaloneAiAddOnPlanCode } from '../Subscription/AiHelper.mjs'
 import SubscriptionController from '../Subscription/SubscriptionController.mjs'
 import SubscriptionController from '../Subscription/SubscriptionController.mjs'

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

@@ -3,8 +3,8 @@ import {
   db,
   db,
   ObjectId,
   ObjectId,
   READ_PREFERENCE_SECONDARY,
   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 { callbackify } from 'node:util'
 import { Project } from '../../models/Project.mjs'
 import { Project } from '../../models/Project.mjs'
 import { DeletedProject } from '../../models/DeletedProject.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 _ from 'lodash'
 import TagsHandler from '../Tags/TagsHandler.mjs'
 import TagsHandler from '../Tags/TagsHandler.mjs'
 import ClsiCacheManager from '../Compile/ClsiCacheManager.mjs'
 import ClsiCacheManager from '../Compile/ClsiCacheManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 export default {
 export default {
   duplicate: callbackify(duplicate),
   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 CooldownManager from '../Cooldown/CooldownManager.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
 import { Folder } from '../../models/Folder.mjs'
 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 { Project } from '../../models/Project.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectGetter from './ProjectGetter.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 DocumentUpdaterHandler from '../../Features/DocumentUpdater/DocumentUpdaterHandler.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
 import FileStoreHandler from '../FileStore/FileStoreHandler.mjs'
 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 { Project } from '../../models/Project.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectEntityHandler from './ProjectEntityHandler.mjs'
 import ProjectGetter from './ProjectGetter.mjs'
 import ProjectGetter from './ProjectGetter.mjs'
@@ -19,7 +19,7 @@ import ProjectUpdateHandler from './ProjectUpdateHandler.mjs'
 import ProjectEntityMongoUpdateHandler from './ProjectEntityMongoUpdateHandler.mjs'
 import ProjectEntityMongoUpdateHandler from './ProjectEntityMongoUpdateHandler.mjs'
 import SafePath from './SafePath.mjs'
 import SafePath from './SafePath.mjs'
 import TpdsUpdateSender from '../ThirdPartyDataStore/TpdsUpdateSender.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 EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import { callbackifyMultiResult, callbackify } from '@overleaf/promise-utils'
 import { callbackifyMultiResult, callbackify } from '@overleaf/promise-utils'
 import { iterablePaths } from './IterablePath.mjs'
 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 Mongo from '../Helpers/Mongo.mjs'
 import OError from '@overleaf/o-error'
 import OError from '@overleaf/o-error'
 import { Project } from '../../models/Project.mjs'
 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 { DeletedProject } from '../../models/DeletedProject.mjs'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import ProjectEntityMongoUpdateHandler from './ProjectEntityMongoUpdateHandler.mjs'
 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 Features from '../../infrastructure/Features.mjs'
 import SubscriptionViewModelBuilder from '../Subscription/SubscriptionViewModelBuilder.mjs'
 import SubscriptionViewModelBuilder from '../Subscription/SubscriptionViewModelBuilder.mjs'
 import NotificationsHandler from '../Notifications/NotificationsHandler.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 { OError, V1ConnectionError } from '../Errors/Errors.js'
 import { User } from '../../models/User.mjs'
 import { User } from '../../models/User.mjs'
 import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.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 { Project } from '../../models/Project.mjs'
 import settings from '@overleaf/settings'
 import settings from '@overleaf/settings'
 import { callbackify } from 'node:util'
 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 Errors from '../Errors/Errors.js'
 import mongodb from 'mongodb-legacy'
 import mongodb from 'mongodb-legacy'
 const safeCompilers = ['xelatex', 'pdflatex', 'latex', 'lualatex']
 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 _ from 'lodash'
 import { promisifyAll } from '@overleaf/promise-utils'
 import { promisifyAll } from '@overleaf/promise-utils'
 import logger from '@overleaf/logger'
 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 rootDocResets = new BackgroundTaskTracker('root doc resets')
 const ProjectRootDocManager = {
 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 { callbackify } from '@overleaf/promise-utils'
 import Settings from '@overleaf/settings'
 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 crypto from 'node:crypto'
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
 import { callbackify } from 'node:util'
 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 TpdsProjectFlusher from '../ThirdPartyDataStore/TpdsProjectFlusher.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import EditorRealTimeController from '../Editor/EditorRealTimeController.mjs'
 import SystemMessageManager from '../SystemMessages/SystemMessageManager.mjs'
 import SystemMessageManager from '../SystemMessages/SystemMessageManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 const AdminController = {
 const AdminController = {
   _sendDisconnectAllUsersMessage: delay => {
   _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 { callbackify } from 'node:util'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
 import Errors from '../Errors/Errors.js'
 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 SessionManager from '../Authentication/SessionManager.mjs'
 import LearnedWordsManager from './LearnedWordsManager.mjs'
 import LearnedWordsManager from './LearnedWordsManager.mjs'
-import { z, validateReq } from '../../infrastructure/Validation.js'
+import { z, validateReq } from '../../infrastructure/Validation.mjs'
 
 
 const learnSchema = z.object({
 const learnSchema = z.object({
   body: 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 UserGetter from '../User/UserGetter.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import Queues from '../../infrastructure/Queues.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 { AI_ADD_ON_CODE } from './AiHelper.mjs'
 // import { fetchNothing } from '@overleaf/fetch-utils'
 // import { fetchNothing } from '@overleaf/fetch-utils'
 import metrics from '@overleaf/metrics'
 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 Errors from './Errors.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 import AuthorizationManager from '../Authorization/AuthorizationManager.mjs'
 import AuthorizationManager from '../Authorization/AuthorizationManager.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import async from 'async'
 import async from 'async'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import RecurlyClient from './RecurlyClient.mjs'
 import RecurlyClient from './RecurlyClient.mjs'
@@ -32,7 +32,7 @@ import { User } from '../../models/User.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import UserGetter from '../User/UserGetter.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import { sanitizeSessionUserForFrontEnd } from '../../infrastructure/FrontEndUser.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 { IndeterminateInvoiceError } from '../Errors/Errors.js'
 import SubscriptionLocator from './SubscriptionLocator.mjs'
 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 SessionManager from '../Authentication/SessionManager.mjs'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import { expressify } from '@overleaf/promise-utils'
 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 UserGetter from '../User/UserGetter.mjs'
 import { Subscription } from '../../models/Subscription.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 { isProfessionalGroupPlan } from './PlansHelper.mjs'
 import {
 import {
   MissingBillingInfoError,
   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 PlansLocator from './PlansLocator.mjs'
 import TeamInvitesHandler from './TeamInvitesHandler.mjs'
 import TeamInvitesHandler from './TeamInvitesHandler.mjs'
 import GroupPlansData from './GroupPlansData.mjs'
 import GroupPlansData from './GroupPlansData.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import PaymentProviderEntities from './PaymentProviderEntities.mjs'
 import PaymentProviderEntities from './PaymentProviderEntities.mjs'
 import {
 import {
   ManuallyCollectedError,
   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 { callbackify } from '@overleaf/promise-utils'
 import UserUpdater from '../User/UserUpdater.mjs'
 import UserUpdater from '../User/UserUpdater.mjs'
 import { IndeterminateInvoiceError } from '../Errors/Errors.js'
 import { IndeterminateInvoiceError } from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 /**
 /**
  * @import { PaymentProviderSubscriptionChange } from './PaymentProviderEntities.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 SubscriptionController from './SubscriptionController.mjs'
 import SubscriptionGroupController from './SubscriptionGroupController.mjs'
 import SubscriptionGroupController from './SubscriptionGroupController.mjs'
 import TeamInvitesController from './TeamInvitesController.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 RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import Settings from '@overleaf/settings'
 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 { callbackify } from '@overleaf/promise-utils'
 import { Subscription } from '../../models/Subscription.mjs'
 import { Subscription } from '../../models/Subscription.mjs'
 import SubscriptionLocator from './SubscriptionLocator.mjs'
 import SubscriptionLocator from './SubscriptionLocator.mjs'
@@ -13,8 +13,8 @@ import UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import UserUpdater from '../User/UserUpdater.mjs'
 import UserUpdater from '../User/UserUpdater.mjs'
 import AccountMappingHelper from '../Analytics/AccountMappingHelper.mjs'
 import AccountMappingHelper from '../Analytics/AccountMappingHelper.mjs'
 import { SSOConfig } from '../../models/SSOConfig.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
  * @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 { V1ConnectionError } from '../Errors/Errors.js'
 import FeaturesHelper from './FeaturesHelper.mjs'
 import FeaturesHelper from './FeaturesHelper.mjs'
 import { formatCurrency } from '../../util/currency.js'
 import { formatCurrency } from '../../util/currency.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs'
 
 
 const { MEMBERS_LIMIT_ADD_ON_CODE } = PaymentProviderEntities
 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 HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import PermissionsManager from '../Authorization/PermissionsManager.mjs'
 import EmailHandler from '../Email/EmailHandler.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 UserAuditLogHandler from '../User/UserAuditLogHandler.mjs'
 import { sanitizeSessionUserForFrontEnd } from '../../infrastructure/FrontEndUser.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 logger from '@overleaf/logger'
 import crypto from 'node:crypto'
 import crypto from 'node:crypto'
 import settings from '@overleaf/settings'
 import settings from '@overleaf/settings'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import mongodb from 'mongodb-legacy'
 import mongodb from 'mongodb-legacy'
 import { Subscription } from '../../models/Subscription.mjs'
 import { Subscription } from '../../models/Subscription.mjs'
 import { SSOConfig } from '../../models/SSOConfig.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 { SystemMessage } from '../../models/SystemMessage.mjs'
-import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.js'
+import { addRequiredCleanupHandlerBeforeDrainingConnections } from '../../infrastructure/GracefulShutdown.mjs'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import { callbackifyAll } from '@overleaf/promise-utils'
 import logger from '@overleaf/logger'
 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 TagsHandler from './TagsHandler.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import Errors from '../Errors/Errors.js'
 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'
 import { expressify } from '@overleaf/promise-utils'
 
 
 async function _getTags(userId, _req, res) {
 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 AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import TemplatesController from './TemplatesController.mjs'
 import TemplatesController from './TemplatesController.mjs'
 import TemplatesMiddleware from './TemplatesMiddleware.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 RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.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 FileTypeManager from '../Uploads/FileTypeManager.mjs'
 import CooldownManager from '../Cooldown/CooldownManager.mjs'
 import CooldownManager from '../Cooldown/CooldownManager.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 async function newUpdate(
 async function newUpdate(
   userId,
   userId,

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

@@ -1,7 +1,7 @@
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import AuthenticationController from '../Authentication/AuthenticationController.mjs'
 import ProjectUploadController from './ProjectUploadController.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 RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 import Settings from '@overleaf/settings'
 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 AuthenticationManager from '../Authentication/AuthenticationManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import SessionManager from '../Authentication/SessionManager.mjs'
 import Features from '../../infrastructure/Features.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 UserAuditLogHandler from './UserAuditLogHandler.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import UserUpdater from './UserUpdater.mjs'
 import UserUpdater from './UserUpdater.mjs'
@@ -19,8 +19,8 @@ import EmailHandler from '../Email/EmailHandler.mjs'
 import UrlHelper from '../Helpers/UrlHelper.mjs'
 import UrlHelper from '../Helpers/UrlHelper.mjs'
 import { promisify } from 'node:util'
 import { promisify } from 'node:util'
 import { expressify } from '@overleaf/promise-utils'
 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'
 import OneTimeTokenHandler from '../Security/OneTimeTokenHandler.mjs'
 
 
 async function _sendSecurityAlertClearedSessions(user) {
 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 UserSessionsManager from './UserSessionsManager.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.mjs'
 import InstitutionsAPI from '../Institutions/InstitutionsAPI.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 Errors from '../Errors/Errors.js'
 import OnboardingDataCollectionManager from '../OnboardingDataCollection/OnboardingDataCollectionManager.mjs'
 import OnboardingDataCollectionManager from '../OnboardingDataCollection/OnboardingDataCollectionManager.mjs'
 import EmailHandler from '../Email/EmailHandler.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 AnalyticsManager from '../Analytics/AnalyticsManager.mjs'
 import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.mjs'
 import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.mjs'
 import UserAuditLogHandler from './UserAuditLogHandler.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 Features from '../../infrastructure/Features.mjs'
 import tsscmp from 'tsscmp'
 import tsscmp from 'tsscmp'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 const AUDIT_LOG_TOKEN_PREFIX_LENGTH = 10
 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 { callbackify } from 'node:util'
-import { db } from '../../infrastructure/mongodb.js'
+import { db } from '../../infrastructure/mongodb.mjs'
 import moment from 'moment'
 import moment from 'moment'
 import settings from '@overleaf/settings'
 import settings from '@overleaf/settings'
 import InstitutionsAPI from '../Institutions/InstitutionsAPI.mjs'
 import InstitutionsAPI from '../Institutions/InstitutionsAPI.mjs'
@@ -8,9 +8,9 @@ import Errors from '../Errors/Errors.js'
 import Features from '../../infrastructure/Features.mjs'
 import Features from '../../infrastructure/Features.mjs'
 import { User } from '../../models/User.mjs'
 import { User } from '../../models/User.mjs'
 import Mongo from '../Helpers/Mongo.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 FeaturesHelper from '../Subscription/FeaturesHelper.mjs'
-import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.js'
+import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.mjs'
 
 
 const { normalizeQuery, normalizeMultiQuery } = Mongo
 const { normalizeQuery, normalizeMultiQuery } = Mongo
 const InstitutionsAPIPromises = InstitutionsAPI.promises
 const InstitutionsAPIPromises = InstitutionsAPI.promises

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

@@ -1,6 +1,6 @@
 import { callbackify } from 'node:util'
 import { callbackify } from 'node:util'
 import TeamInvitesHandler from '../Subscription/TeamInvitesHandler.mjs'
 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) {
 async function populateTeamInvites(user) {
   return await TeamInvitesHandler.promises.createTeamInvitesForLegacyInvitedEmail(
   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 _ from 'lodash'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
 import Features from '../../infrastructure/Features.mjs'
 import Features from '../../infrastructure/Features.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 
 
 async function settingsPage(req, res) {
 async function settingsPage(req, res) {
   const userId = SessionManager.getLoggedInUserId(req.session)
   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 rclient = RedisWrapper.client('websessions')
 
 
 const UserSessionsRedis = {
 const UserSessionsRedis = {

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

@@ -1,6 +1,6 @@
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import OError from '@overleaf/o-error'
 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 Mongo from '../Helpers/Mongo.mjs'
 import { callbackify } from 'node:util'
 import { callbackify } from 'node:util'
 import UserGetter from './UserGetter.mjs'
 import UserGetter from './UserGetter.mjs'
@@ -17,10 +17,10 @@ import EmailChangeHelper from '../Analytics/EmailChangeHelper.mjs'
 import SubscriptionLocator from '../Subscription/SubscriptionLocator.mjs'
 import SubscriptionLocator from '../Subscription/SubscriptionLocator.mjs'
 import NotificationsBuilder from '../Notifications/NotificationsBuilder.mjs'
 import NotificationsBuilder from '../Notifications/NotificationsBuilder.mjs'
 import _ from 'lodash'
 import _ from 'lodash'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import UserSessionsManager from './UserSessionsManager.mjs'
 import ThirdPartyIdentityManager from './ThirdPartyIdentityManager.mjs'
 import ThirdPartyIdentityManager from './ThirdPartyIdentityManager.mjs'
-import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.js'
+import AsyncLocalStorage from '../../infrastructure/AsyncLocalStorage.mjs'
 
 
 const { normalizeQuery } = Mongo
 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 UserMembershipHandler from './UserMembershipHandler.mjs'
 import Errors from '../Errors/Errors.js'
 import Errors from '../Errors/Errors.js'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
 import EmailHelper from '../Helpers/EmailHelper.mjs'
-import { csvAttachment } from '../../infrastructure/Response.js'
+import { csvAttachment } from '../../infrastructure/Response.mjs'
 import UserMembershipErrors from './UserMembershipErrors.mjs'
 import UserMembershipErrors from './UserMembershipErrors.mjs'
 import { SSOConfig } from '../../models/SSOConfig.mjs'
 import { SSOConfig } from '../../models/SSOConfig.mjs'
 import { Parser as CSVParser } from 'json2csv'
 import { Parser as CSVParser } from 'json2csv'
 import { expressify } from '@overleaf/promise-utils'
 import { expressify } from '@overleaf/promise-utils'
 import PlansLocator from '../Subscription/PlansLocator.mjs'
 import PlansLocator from '../Subscription/PlansLocator.mjs'
 import RecurlyClient from '../Subscription/RecurlyClient.mjs'
 import RecurlyClient from '../Subscription/RecurlyClient.mjs'
-import Modules from '../../infrastructure/Modules.js'
+import Modules from '../../infrastructure/Modules.mjs'
 import UserMembershipAuthorization from './UserMembershipAuthorization.mjs'
 import UserMembershipAuthorization from './UserMembershipAuthorization.mjs'
 
 
 async function manageGroupMembers(req, res, next) {
 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 Errors from '../Errors/Errors.js'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import HttpErrorHandler from '../Errors/HttpErrorHandler.mjs'
 import TemplatesManager from '../Templates/TemplatesManager.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'
 import AdminAuthorizationHelper from '../Helpers/AdminAuthorizationHelper.mjs'
 
 
 const { useAdminCapabilities } = AdminAuthorizationHelper
 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 UserMembershipController from './UserMembershipController.mjs'
 import SubscriptionGroupController from '../Subscription/SubscriptionGroupController.mjs'
 import SubscriptionGroupController from '../Subscription/SubscriptionGroupController.mjs'
 import TeamInvitesController from '../Subscription/TeamInvitesController.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'
 import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.mjs'
 
 
 const rateLimiters = {
 const rateLimiters = {

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

@@ -1,5 +1,5 @@
 // @ts-check
 // @ts-check
-const { AsyncLocalStorage } = require('node:async_hooks')
+import { AsyncLocalStorage } from 'node:async_hooks'
 
 
 /**
 /**
  * @typedef {Object} RequestContext
  * @typedef {Object} RequestContext
@@ -31,7 +31,7 @@ function removeItem(key) {
   }
   }
 }
 }
 
 
-module.exports = {
+export default {
   middleware,
   middleware,
   storage: asyncLocalStorage,
   storage: asyncLocalStorage,
   removeItem,
   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 Features from './Features.mjs'
 import SessionManager from '../Features/Authentication/SessionManager.mjs'
 import SessionManager from '../Features/Authentication/SessionManager.mjs'
 import PackageVersions from './PackageVersions.js'
 import PackageVersions from './PackageVersions.js'
-import Modules from './Modules.js'
+import Modules from './Modules.mjs'
 import Errors from '../Features/Errors/Errors.js'
 import Errors from '../Features/Errors/Errors.js'
 import AdminAuthorizationHelper from '../Features/Helpers/AdminAuthorizationHelper.mjs'
 import AdminAuthorizationHelper from '../Features/Helpers/AdminAuthorizationHelper.mjs'
-import { addOptionalCleanupHandlerAfterDrainingConnections } from './GracefulShutdown.js'
+import { addOptionalCleanupHandlerAfterDrainingConnections } from './GracefulShutdown.mjs'
 import { sanitizeSessionUserForFrontEnd } from './FrontEndUser.mjs'
 import { sanitizeSessionUserForFrontEnd } from './FrontEndUser.mjs'
 import { expressify } from '@overleaf/promise-utils'
 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
  * DS207: Consider shorter variations of null checks
  * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  * 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) {
   constructor(options) {
     options.autoDestroy = true
     options.autoDestroy = true
     super(options)
     super(options)
@@ -179,8 +180,8 @@ const FileWriter = {
   },
   },
 }
 }
 
 
-module.exports = FileWriter
-module.exports.promises = promisifyAll(FileWriter, {
+FileWriter.promises = promisifyAll(FileWriter, {
   without: ['ensureDumpFolderExists'],
   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.
   - 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 optionalCleanupHandlersBeforeStoppingTraffic = []
 const requiredCleanupHandlersBeforeDrainingConnections = []
 const requiredCleanupHandlersBeforeDrainingConnections = []
 const optionalCleanupHandlersAfterDrainingConnections = []
 const optionalCleanupHandlersAfterDrainingConnections = []
 const connectionDrainer = []
 const connectionDrainer = []
 
 
-function addConnectionDrainer(label, handler) {
+export function addConnectionDrainer(label, handler) {
   connectionDrainer.push({ label, handler })
   connectionDrainer.push({ label, handler })
 }
 }
 
 
-function addOptionalCleanupHandlerBeforeStoppingTraffic(label, handler) {
+export function addOptionalCleanupHandlerBeforeStoppingTraffic(label, handler) {
   optionalCleanupHandlersBeforeStoppingTraffic.push({ label, handler })
   optionalCleanupHandlersBeforeStoppingTraffic.push({ label, handler })
 }
 }
 
 
-function addRequiredCleanupHandlerBeforeDrainingConnections(label, handler) {
+export function addRequiredCleanupHandlerBeforeDrainingConnections(
+  label,
+  handler
+) {
   requiredCleanupHandlersBeforeDrainingConnections.push({ label, handler })
   requiredCleanupHandlersBeforeDrainingConnections.push({ label, handler })
 }
 }
 
 
-function addOptionalCleanupHandlerAfterDrainingConnections(label, handler) {
+export function addOptionalCleanupHandlerAfterDrainingConnections(
+  label,
+  handler
+) {
   optionalCleanupHandlersAfterDrainingConnections.push({ label, handler })
   optionalCleanupHandlersAfterDrainingConnections.push({ label, handler })
 }
 }
 
 
@@ -55,7 +63,7 @@ async function runHandlers(stage, handlers, logOnly) {
  * @param {import('net').Server} [server]
  * @param {import('net').Server} [server]
  * @param {number|string} [signal]
  * @param {number|string} [signal]
  */
  */
-async function gracefulShutdown(server, signal) {
+export async function gracefulShutdown(server, signal) {
   logger.warn({ signal }, 'graceful shutdown: started shutdown sequence')
   logger.warn({ signal }, 'graceful shutdown: started shutdown sequence')
   Settings.shuttingDown = true
   Settings.shuttingDown = true
 
 
@@ -110,7 +118,7 @@ async function gracefulShutdown(server, signal) {
   logger.info({}, 'graceful shutdown: ready to exit')
   logger.info({}, 'graceful shutdown: ready to exit')
 }
 }
 
 
-function triggerGracefulShutdown(server, signal) {
+export function triggerGracefulShutdown(server, signal) {
   gracefulShutdown(server, signal).catch(err => {
   gracefulShutdown(server, signal).catch(err => {
     logger.err(
     logger.err(
       { err },
       { err },
@@ -119,7 +127,7 @@ function triggerGracefulShutdown(server, signal) {
   })
   })
 }
 }
 
 
-class BackgroundTaskTracker {
+export class BackgroundTaskTracker {
   constructor(label) {
   constructor(label) {
     // Do not leak any handles, just record the number of pending jobs.
     // 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
     // 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,
   BackgroundTaskTracker,
   addConnectionDrainer,
   addConnectionDrainer,
   addOptionalCleanupHandlerBeforeStoppingTraffic,
   addOptionalCleanupHandlerBeforeStoppingTraffic,

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

@@ -1,6 +1,6 @@
 //  @ts-check
 //  @ts-check
 
 
-const Settings = require('@overleaf/settings')
+import Settings from '@overleaf/settings'
 
 
 /**
 /**
  * @import { HttpPermissionsPolicy } from './types'
  * @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 rclient = RedisWrapper.client('lock')
 
 
-const RedisWebLocker = require('@overleaf/redis-wrapper/RedisWebLocker')
-
 // this method creates a lock manager with the provided timeout options
 // this method creates a lock manager with the provided timeout options
 function createLockManager(options) {
 function createLockManager(options) {
   return new RedisWebLocker({
   return new RedisWebLocker({
@@ -33,4 +32,4 @@ LockManager.withTimeout = function (timeout) {
   return createLockManager(lockManagerSettingsWithTimeout)
   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
 // @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',
   name: 'analytics_queue',
   help: 'Number of events sent to the analytics queue',
   help: 'Number of events sent to the analytics queue',
   labelNames: ['status', 'event_type'],
   labelNames: ['status', 'event_type'],
 })
 })
 
 
-exports.revertFileDurationSeconds = new Metrics.prom.Histogram({
+const revertFileDurationSeconds = new Metrics.prom.Histogram({
   name: 'timer_revert_file_duration_seconds',
   name: 'timer_revert_file_duration_seconds',
   help: 'Duration of the file restore operation',
   help: 'Duration of the file restore operation',
   buckets: [0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
   buckets: [0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5],
   labelNames: ['type'],
   labelNames: ['type'],
 })
 })
 
 
-exports.revertProjectDurationSeconds = new Metrics.prom.Histogram({
+const revertProjectDurationSeconds = new Metrics.prom.Histogram({
   name: 'timer_revert_project_duration_seconds',
   name: 'timer_revert_project_duration_seconds',
   help: 'Duration of the project restore operation',
   help: 'Duration of the project restore operation',
   buckets: [0.5, 1, 2, 5, 10, 30, 60, 120, 300, 900, 1800],
   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
 // @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 { WebModule } from "../../../types/web-module" */
 /** @import { RequestHandler } from "express" */
 /** @import { RequestHandler } from "express" */
 
 
-const MODULE_BASE_PATH = Path.join(__dirname, '/../../../modules')
+const MODULE_BASE_PATH = Path.join(import.meta.dirname, '/../../../modules')
 
 
 /** @type {WebModule[]} */
 /** @type {WebModule[]} */
 const _modules = []
 const _modules = []
@@ -207,7 +208,7 @@ async function getMiddleware(name) {
   return _middleware[name] || []
   return _middleware[name] || []
 }
 }
 
 
-module.exports = {
+export default {
   applyNonCsrfRouter,
   applyNonCsrfRouter,
   applyRouter,
   applyRouter,
   linkedFileAgentsIncludes,
   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('autoIndex', false)
 mongoose.set('strictQuery', false)
 mongoose.set('strictQuery', false)
@@ -54,4 +54,4 @@ mongoose.Promise = global.Promise
 
 
 mongoose.connectionPromise = connectionPromise
 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 {
 import {
   addOptionalCleanupHandlerBeforeStoppingTraffic,
   addOptionalCleanupHandlerBeforeStoppingTraffic,
   addRequiredCleanupHandlerBeforeDrainingConnections,
   addRequiredCleanupHandlerBeforeDrainingConnections,
-} from './GracefulShutdown.js'
+} from './GracefulShutdown.mjs'
 
 
 import EmailHandler from '../Features/Email/EmailHandler.mjs'
 import EmailHandler from '../Features/Email/EmailHandler.mjs'
 import logger from '@overleaf/logger'
 import logger from '@overleaf/logger'
 import OError from '@overleaf/o-error'
 import OError from '@overleaf/o-error'
-import Modules from './Modules.js'
+import Modules from './Modules.mjs'
 
 
 /**
 /**
  * @typedef {{
  * @typedef {{

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

@@ -1,7 +1,7 @@
 import Queue from 'bull'
 import Queue from 'bull'
 import Settings from '@overleaf/settings'
 import Settings from '@overleaf/settings'
 import Features from '../infrastructure/Features.mjs'
 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
 // 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
 // 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')
 const rclient = RedisWrapper.client('ratelimiter')
 
 
 /**
 /**
  * Wrapper over the RateLimiterRedis class
  * Wrapper over the RateLimiterRedis class
  */
  */
-class RateLimiter {
+export class RateLimiter {
   #opts
   #opts
 
 
   /**
   /**
@@ -122,13 +122,13 @@ class RateLimiter {
  * Shared rate limiters
  * Shared rate limiters
  */
  */
 
 
-const openProjectRateLimiter = new RateLimiter('open-project', {
+export const openProjectRateLimiter = new RateLimiter('open-project', {
   points: 15,
   points: 15,
   duration: 60,
   duration: 60,
 })
 })
 
 
 // Keep in sync with the can-skip-captcha options.
 // Keep in sync with the can-skip-captcha options.
-const overleafLoginRateLimiter = new RateLimiter(
+export const overleafLoginRateLimiter = new RateLimiter(
   'overleaf-login',
   'overleaf-login',
   Settings.rateLimit?.login?.ip || {
   Settings.rateLimit?.login?.ip || {
     points: 20,
     points: 20,
@@ -137,7 +137,7 @@ const overleafLoginRateLimiter = new RateLimiter(
   }
   }
 )
 )
 
 
-module.exports = {
+export default {
   RateLimiter,
   RateLimiter,
   openProjectRateLimiter,
   openProjectRateLimiter,
   overleafLoginRateLimiter,
   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`
  * A per-feature interface to Redis, looks up the feature in `settings.redis`
@@ -23,4 +23,4 @@ async function cleanupTestRedis() {
   await redis.cleanupTestRedis(rclient)
   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')) {
   if (!filename || !filename.endsWith('.csv')) {
     throw new Error('filename must end with .csv')
     throw new Error('filename must end with .csv')
   }
   }
@@ -8,23 +8,23 @@ function csvAttachment(res, body, filename) {
   res.send(body)
   res.send(body)
 }
 }
 
 
-function preparePlainTextResponse(res) {
+export function preparePlainTextResponse(res) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.contentType('text/plain; charset=utf-8')
   res.contentType('text/plain; charset=utf-8')
 }
 }
 
 
-function plainTextResponse(res, body) {
+export function plainTextResponse(res, body) {
   preparePlainTextResponse(res)
   preparePlainTextResponse(res)
   res.send(body)
   res.send(body)
 }
 }
 
 
-function xmlResponse(res, body) {
+export function xmlResponse(res, body) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.contentType('application/xml; charset=utf-8')
   res.contentType('application/xml; charset=utf-8')
   res.send(body)
   res.send(body)
 }
 }
 
 
-function prepareZipAttachment(res, filename) {
+export function prepareZipAttachment(res, filename) {
   if (!filename || !filename.endsWith('.zip')) {
   if (!filename || !filename.endsWith('.zip')) {
     throw new Error('filename must end with .zip')
     throw new Error('filename must end with .zip')
   }
   }
@@ -33,12 +33,12 @@ function prepareZipAttachment(res, filename) {
   res.setHeader('X-Content-Type-Options', 'nosniff')
   res.setHeader('X-Content-Type-Options', 'nosniff')
 }
 }
 
 
-function zipAttachment(res, body, filename) {
+export function zipAttachment(res, body, filename) {
   prepareZipAttachment(res, filename)
   prepareZipAttachment(res, filename)
   res.send(body)
   res.send(body)
 }
 }
 
 
-module.exports = {
+export default {
   csvAttachment,
   csvAttachment,
   plainTextResponse,
   plainTextResponse,
   preparePlainTextResponse,
   preparePlainTextResponse,

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

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

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor