From c6c62088cca1145d9fe5b1372298a9cc1e4bb529 Mon Sep 17 00:00:00 2001 From: Andrew Rumble Date: Thu, 10 Oct 2024 11:15:51 +0100 Subject: [PATCH] Migrate Features to ES modules GitOrigin-RevId: 4e9d3176b4b5a5504afc102e569a27d7788864a3 --- services/web/app.mjs | 4 +- ...sController.js => AnalyticsController.mjs} | 14 ++--- .../{AnalyticsProxy.js => AnalyticsProxy.mjs} | 8 +-- ...AnalyticsRouter.js => AnalyticsRouter.mjs} | 12 ++-- ....js => AnalyticsUTMTrackingMiddleware.mjs} | 18 +++--- ...ontroller.js => BetaProgramController.mjs} | 16 ++--- ...ogramHandler.js => BetaProgramHandler.mjs} | 10 ++-- ...troller.js => CollaboratorsController.mjs} | 42 ++++++------- ...ndler.js => CollaboratorsEmailHandler.mjs} | 10 ++-- ...r.js => CollaboratorsInviteController.mjs} | 42 ++++++------- ...dler.js => CollaboratorsInviteHandler.mjs} | 32 +++++----- ...atorsRouter.js => CollaboratorsRouter.mjs} | 22 +++---- ...actController.js => ContactController.mjs} | 12 ++-- .../{ContactRouter.js => ContactRouter.mjs} | 10 ++-- ...wnMiddleware.js => CooldownMiddleware.mjs} | 9 +-- ...oller.js => DocumentUpdaterController.mjs} | 12 ++-- ...ntController.js => DocumentController.mjs} | 20 +++---- ...ller.js => ProjectDownloadsController.mjs} | 16 ++--- ...Manager.js => ProjectZipStreamManager.mjs} | 14 ++--- .../{EditorRouter.js => EditorRouter.mjs} | 14 ++--- ...rtsController.js => ExportsController.mjs} | 9 +-- .../{ExportsHandler.js => ExportsHandler.mjs} | 25 ++++---- ...eController.js => FileStoreController.mjs} | 13 ++-- ...ontroller.js => HealthCheckController.mjs} | 17 +++--- ...n.js => HistoryRangesSupportMigration.mjs} | 24 ++++---- ...oller.js => InactiveProjectController.mjs} | 4 +- ...ontroller.js => LinkedFilesController.mjs} | 40 ++++++------- ...edFilesRouter.js => LinkedFilesRouter.mjs} | 14 ++--- ...ileAgent.js => ProjectOutputFileAgent.mjs} | 22 +++---- .../LinkedFiles/{UrlAgent.js => UrlAgent.mjs} | 18 +++--- .../{MetaController.js => MetaController.mjs} | 12 ++-- .../{MetaHandler.js => MetaHandler.mjs} | 10 ++-- .../{packageMapping.js => packageMapping.mjs} | 2 +- ...troller.js => NotificationsController.mjs} | 8 +-- ...troller.js => PasswordResetController.mjs} | 22 +++---- ...setHandler.js => PasswordResetHandler.mjs} | 21 +++---- ...ResetRouter.js => PasswordResetRouter.mjs} | 14 ++--- ...esComparitor.js => DocLinesComparitor.mjs} | 4 +- ...Controller.js => ProjectApiController.mjs} | 7 ++- ...ontroller.js => ProjectListController.mjs} | 59 ++++++++++--------- .../{ReferalConnect.js => ReferalConnect.mjs} | 2 +- ...ralController.js => ReferalController.mjs} | 6 +- .../{ReferalHandler.js => ReferalHandler.mjs} | 6 +- ...Controller.js => ReferencesController.mjs} | 13 ++-- ...rencesHandler.js => ReferencesHandler.mjs} | 27 +++++---- ...ngController.js => SpellingController.mjs} | 12 ++-- .../{HomeController.js => HomeController.mjs} | 23 ++++---- ...icPageHelpers.js => StaticPageHelpers.mjs} | 5 +- ...icPagesRouter.js => StaticPagesRouter.mjs} | 7 ++- ...Controller.js => UniversityController.mjs} | 5 +- ...ler.js => SubscriptionGroupController.mjs} | 19 +++--- ...iptionRouter.js => SubscriptionRouter.mjs} | 20 +++---- ...ontroller.js => TeamInvitesController.mjs} | 36 +++++------ .../{SurveyCache.js => SurveyCache.mjs} | 8 +-- .../{SurveyHandler.js => SurveyHandler.mjs} | 11 ++-- .../{TagsController.js => TagsController.mjs} | 10 ++-- .../{TpdsController.js => TpdsController.mjs} | 28 ++++----- ...dsQueueManager.js => TpdsQueueManager.mjs} | 8 +-- ...UpdateHandler.js => TpdsUpdateHandler.mjs} | 28 ++++----- ...ontroller.js => TokenAccessController.mjs} | 53 ++++++++--------- ...nAccessRouter.js => TokenAccessRouter.mjs} | 8 +-- ...alController.js => TutorialController.mjs} | 8 +-- ...troller.js => ProjectUploadController.mjs} | 34 ++++++----- .../{UploadsRouter.js => UploadsRouter.mjs} | 14 ++--- ...sController.js => UserPagesController.mjs} | 30 +++++----- ...roller.js => UserMembershipController.mjs} | 22 +++---- ...shipRouter.js => UserMembershipRouter.mjs} | 14 ++--- .../V1/{V1Handler.js => V1Handler.mjs} | 12 ++-- ...ests.js => BetaProgramControllerTests.mjs} | 47 ++++++++------- ...erTests.js => BetaProgramHandlerTests.mjs} | 36 ++++++----- 70 files changed, 622 insertions(+), 612 deletions(-) rename services/web/app/src/Features/Analytics/{AnalyticsController.js => AnalyticsController.mjs} (74%) rename services/web/app/src/Features/Analytics/{AnalyticsProxy.js => AnalyticsProxy.mjs} (79%) rename services/web/app/src/Features/Analytics/{AnalyticsRouter.js => AnalyticsRouter.mjs} (74%) rename services/web/app/src/Features/Analytics/{AnalyticsUTMTrackingMiddleware.js => AnalyticsUTMTrackingMiddleware.mjs} (78%) rename services/web/app/src/Features/BetaProgram/{BetaProgramController.js => BetaProgramController.mjs} (75%) rename services/web/app/src/Features/BetaProgram/{BetaProgramHandler.js => BetaProgramHandler.mjs} (73%) rename services/web/app/src/Features/Collaborators/{CollaboratorsController.js => CollaboratorsController.mjs} (81%) rename services/web/app/src/Features/Collaborators/{CollaboratorsEmailHandler.js => CollaboratorsEmailHandler.mjs} (82%) rename services/web/app/src/Features/Collaborators/{CollaboratorsInviteController.js => CollaboratorsInviteController.mjs} (89%) rename services/web/app/src/Features/Collaborators/{CollaboratorsInviteHandler.js => CollaboratorsInviteHandler.mjs} (86%) rename services/web/app/src/Features/Collaborators/{CollaboratorsRouter.js => CollaboratorsRouter.mjs} (84%) rename services/web/app/src/Features/Contacts/{ContactController.js => ContactController.mjs} (81%) rename services/web/app/src/Features/Contacts/{ContactRouter.js => ContactRouter.mjs} (63%) rename services/web/app/src/Features/Cooldown/{CooldownMiddleware.js => CooldownMiddleware.mjs} (88%) rename services/web/app/src/Features/DocumentUpdater/{DocumentUpdaterController.js => DocumentUpdaterController.mjs} (74%) rename services/web/app/src/Features/Documents/{DocumentController.js => DocumentController.mjs} (79%) rename services/web/app/src/Features/Downloads/{ProjectDownloadsController.js => ProjectDownloadsController.mjs} (83%) rename services/web/app/src/Features/Downloads/{ProjectZipStreamManager.js => ProjectZipStreamManager.mjs} (91%) rename services/web/app/src/Features/Editor/{EditorRouter.js => EditorRouter.mjs} (84%) rename services/web/app/src/Features/Exports/{ExportsController.js => ExportsController.mjs} (95%) rename services/web/app/src/Features/Exports/{ExportsHandler.js => ExportsHandler.mjs} (92%) rename services/web/app/src/Features/FileStore/{FileStoreController.js => FileStoreController.mjs} (90%) rename services/web/app/src/Features/HealthCheck/{HealthCheckController.js => HealthCheckController.mjs} (92%) rename services/web/app/src/Features/History/{HistoryRangesSupportMigration.js => HistoryRangesSupportMigration.mjs} (92%) rename services/web/app/src/Features/InactiveData/{InactiveProjectController.js => InactiveProjectController.mjs} (93%) rename services/web/app/src/Features/LinkedFiles/{LinkedFilesController.js => LinkedFilesController.mjs} (88%) rename services/web/app/src/Features/LinkedFiles/{LinkedFilesRouter.js => LinkedFilesRouter.mjs} (70%) rename services/web/app/src/Features/LinkedFiles/{ProjectOutputFileAgent.js => ProjectOutputFileAgent.mjs} (91%) rename services/web/app/src/Features/LinkedFiles/{UrlAgent.js => UrlAgent.mjs} (77%) rename services/web/app/src/Features/Metadata/{MetaController.js => MetaController.mjs} (82%) rename services/web/app/src/Features/Metadata/{MetaHandler.js => MetaHandler.mjs} (90%) rename services/web/app/src/Features/Metadata/{packageMapping.js => packageMapping.mjs} (99%) rename services/web/app/src/Features/Notifications/{NotificationsController.js => NotificationsController.mjs} (83%) rename services/web/app/src/Features/PasswordReset/{PasswordResetController.js => PasswordResetController.mjs} (89%) rename services/web/app/src/Features/PasswordReset/{PasswordResetHandler.js => PasswordResetHandler.mjs} (84%) rename services/web/app/src/Features/PasswordReset/{PasswordResetRouter.js => PasswordResetRouter.mjs} (78%) rename services/web/app/src/Features/Project/{DocLinesComparitor.js => DocLinesComparitor.mjs} (85%) rename services/web/app/src/Features/Project/{ProjectApiController.js => ProjectApiController.mjs} (84%) rename services/web/app/src/Features/Project/{ProjectListController.js => ProjectListController.mjs} (92%) rename services/web/app/src/Features/Referal/{ReferalConnect.js => ReferalConnect.mjs} (98%) rename services/web/app/src/Features/Referal/{ReferalController.js => ReferalController.mjs} (71%) rename services/web/app/src/Features/Referal/{ReferalHandler.js => ReferalHandler.mjs} (77%) rename services/web/app/src/Features/References/{ReferencesController.js => ReferencesController.mjs} (80%) rename services/web/app/src/Features/References/{ReferencesHandler.js => ReferencesHandler.mjs} (90%) rename services/web/app/src/Features/Spelling/{SpellingController.js => SpellingController.mjs} (86%) rename services/web/app/src/Features/StaticPages/{HomeController.js => HomeController.mjs} (75%) rename services/web/app/src/Features/StaticPages/{StaticPageHelpers.js => StaticPageHelpers.mjs} (92%) rename services/web/app/src/Features/StaticPages/{StaticPagesRouter.js => StaticPagesRouter.mjs} (86%) rename services/web/app/src/Features/StaticPages/{UniversityController.js => UniversityController.mjs} (76%) rename services/web/app/src/Features/Subscription/{SubscriptionGroupController.js => SubscriptionGroupController.mjs} (84%) rename services/web/app/src/Features/Subscription/{SubscriptionRouter.js => SubscriptionRouter.mjs} (89%) rename services/web/app/src/Features/Subscription/{TeamInvitesController.js => TeamInvitesController.mjs} (88%) rename services/web/app/src/Features/Survey/{SurveyCache.js => SurveyCache.mjs} (63%) rename services/web/app/src/Features/Survey/{SurveyHandler.js => SurveyHandler.mjs} (87%) rename services/web/app/src/Features/Tags/{TagsController.js => TagsController.mjs} (92%) rename services/web/app/src/Features/ThirdPartyDataStore/{TpdsController.js => TpdsController.mjs} (88%) rename services/web/app/src/Features/ThirdPartyDataStore/{TpdsQueueManager.js => TpdsQueueManager.mjs} (61%) rename services/web/app/src/Features/ThirdPartyDataStore/{TpdsUpdateHandler.js => TpdsUpdateHandler.mjs} (86%) rename services/web/app/src/Features/TokenAccess/{TokenAccessController.js => TokenAccessController.mjs} (91%) rename services/web/app/src/Features/TokenAccess/{TokenAccessRouter.js => TokenAccessRouter.mjs} (78%) rename services/web/app/src/Features/Tutorial/{TutorialController.js => TutorialController.mjs} (85%) rename services/web/app/src/Features/Uploads/{ProjectUploadController.js => ProjectUploadController.mjs} (84%) rename services/web/app/src/Features/Uploads/{UploadsRouter.js => UploadsRouter.mjs} (74%) rename services/web/app/src/Features/User/{UserPagesController.js => UserPagesController.mjs} (91%) rename services/web/app/src/Features/UserMembership/{UserMembershipController.js => UserMembershipController.mjs} (91%) rename services/web/app/src/Features/UserMembership/{UserMembershipRouter.js => UserMembershipRouter.mjs} (89%) rename services/web/app/src/Features/V1/{V1Handler.js => V1Handler.mjs} (92%) rename services/web/test/unit/src/BetaProgram/{BetaProgramControllerTests.js => BetaProgramControllerTests.mjs} (83%) rename services/web/test/unit/src/BetaProgram/{BetaProgramHandlerTests.js => BetaProgramHandlerTests.mjs} (82%) diff --git a/services/web/app.mjs b/services/web/app.mjs index a8127dd0bc..085c6cd71c 100644 --- a/services/web/app.mjs +++ b/services/web/app.mjs @@ -6,12 +6,12 @@ import metrics from '@overleaf/metrics' import Settings from '@overleaf/settings' import logger from '@overleaf/logger' import PlansLocator from './app/src/Features/Subscription/PlansLocator.js' -import SiteAdminHandler from './app/src/infrastructure/SiteAdminHandler.js' +import SiteAdminHandler from './app/src/infrastructure/SiteAdminHandler.mjs' import http from 'node:http' import https from 'node:https' -import * as Serializers from './app/src/infrastructure/LoggerSerializers.js' +import * as Serializers from './app/src/infrastructure/LoggerSerializers.mjs' import Server from './app/src/infrastructure/Server.mjs' import QueueWorkers from './app/src/infrastructure/QueueWorkers.js' diff --git a/services/web/app/src/Features/Analytics/AnalyticsController.js b/services/web/app/src/Features/Analytics/AnalyticsController.mjs similarity index 74% rename from services/web/app/src/Features/Analytics/AnalyticsController.js rename to services/web/app/src/Features/Analytics/AnalyticsController.mjs index b5fc3a3ced..7665e7ecd9 100644 --- a/services/web/app/src/Features/Analytics/AnalyticsController.js +++ b/services/web/app/src/Features/Analytics/AnalyticsController.mjs @@ -1,9 +1,9 @@ -const metrics = require('@overleaf/metrics') -const AnalyticsManager = require('./AnalyticsManager') -const SessionManager = require('../Authentication/SessionManager') -const GeoIpLookup = require('../../infrastructure/GeoIpLookup') -const Features = require('../../infrastructure/Features') -const { expressify } = require('@overleaf/promise-utils') +import metrics from '@overleaf/metrics' +import AnalyticsManager from './AnalyticsManager.js' +import SessionManager from '../Authentication/SessionManager.js' +import GeoIpLookup from '../../infrastructure/GeoIpLookup.js' +import Features from '../../infrastructure/Features.js' +import { expressify } from '@overleaf/promise-utils' async function updateEditingSession(req, res, next) { if (!Features.hasFeature('analytics')) { @@ -46,7 +46,7 @@ function recordEvent(req, res, next) { res.sendStatus(202) } -module.exports = { +export default { updateEditingSession: expressify(updateEditingSession), recordEvent, } diff --git a/services/web/app/src/Features/Analytics/AnalyticsProxy.js b/services/web/app/src/Features/Analytics/AnalyticsProxy.mjs similarity index 79% rename from services/web/app/src/Features/Analytics/AnalyticsProxy.js rename to services/web/app/src/Features/Analytics/AnalyticsProxy.mjs index 366fb0d9a8..e7296ad740 100644 --- a/services/web/app/src/Features/Analytics/AnalyticsProxy.js +++ b/services/web/app/src/Features/Analytics/AnalyticsProxy.mjs @@ -1,8 +1,8 @@ -const settings = require('@overleaf/settings') -const Errors = require('../Errors/Errors') -const httpProxy = require('express-http-proxy') +import settings from '@overleaf/settings' +import Errors from '../Errors/Errors.js' +import httpProxy from 'express-http-proxy' -module.exports = { +export default { call(basePath) { if (!settings.apis.analytics) { return (req, res, next) => diff --git a/services/web/app/src/Features/Analytics/AnalyticsRouter.js b/services/web/app/src/Features/Analytics/AnalyticsRouter.mjs similarity index 74% rename from services/web/app/src/Features/Analytics/AnalyticsRouter.js rename to services/web/app/src/Features/Analytics/AnalyticsRouter.mjs index 70c98c7298..523bbcf146 100644 --- a/services/web/app/src/Features/Analytics/AnalyticsRouter.js +++ b/services/web/app/src/Features/Analytics/AnalyticsRouter.mjs @@ -1,8 +1,8 @@ -const AuthenticationController = require('./../Authentication/AuthenticationController') -const AnalyticsController = require('./AnalyticsController') -const AnalyticsProxy = require('./AnalyticsProxy') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') +import AuthenticationController from './../Authentication/AuthenticationController.js' +import AnalyticsController from './AnalyticsController.mjs' +import AnalyticsProxy from './AnalyticsProxy.mjs' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' const rateLimiters = { recordEvent: new RateLimiter('analytics-record-event', { @@ -19,7 +19,7 @@ const rateLimiters = { ), } -module.exports = { +export default { apply(webRouter, privateApiRouter, publicApiRouter) { webRouter.post( '/event/:event([a-z0-9-_]+)', diff --git a/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.js b/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs similarity index 78% rename from services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.js rename to services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs index d03a43fef5..c5b51001a1 100644 --- a/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.js +++ b/services/web/app/src/Features/Analytics/AnalyticsUTMTrackingMiddleware.mjs @@ -1,11 +1,11 @@ -const _ = require('lodash') -const RequestHelper = require('./RequestHelper') -const AnalyticsManager = require('./AnalyticsManager') -const querystring = require('querystring') -const { URL } = require('url') -const Settings = require('@overleaf/settings') -const OError = require('@overleaf/o-error') -const logger = require('@overleaf/logger') +import _ from 'lodash' +import RequestHelper from './RequestHelper.js' +import AnalyticsManager from './AnalyticsManager.js' +import querystring from 'querystring' +import { URL } from 'url' +import Settings from '@overleaf/settings' +import OError from '@overleaf/o-error' +import logger from '@overleaf/logger' function recordUTMTags() { return function (req, res, next) { @@ -53,6 +53,6 @@ function recordUTMTags() { } } -module.exports = { +export default { recordUTMTags, } diff --git a/services/web/app/src/Features/BetaProgram/BetaProgramController.js b/services/web/app/src/Features/BetaProgram/BetaProgramController.mjs similarity index 75% rename from services/web/app/src/Features/BetaProgram/BetaProgramController.js rename to services/web/app/src/Features/BetaProgram/BetaProgramController.mjs index d60ca93b6c..c7df6da6bf 100644 --- a/services/web/app/src/Features/BetaProgram/BetaProgramController.js +++ b/services/web/app/src/Features/BetaProgram/BetaProgramController.mjs @@ -1,10 +1,10 @@ -const BetaProgramHandler = require('./BetaProgramHandler') -const OError = require('@overleaf/o-error') -const UserGetter = require('../User/UserGetter') -const logger = require('@overleaf/logger') -const SessionManager = require('../Authentication/SessionManager') -const SplitTestSessionHandler = require('../SplitTests/SplitTestSessionHandler') -const { expressify } = require('@overleaf/promise-utils') +import BetaProgramHandler from './BetaProgramHandler.mjs' +import OError from '@overleaf/o-error' +import UserGetter from '../User/UserGetter.js' +import logger from '@overleaf/logger' +import SessionManager from '../Authentication/SessionManager.js' +import SplitTestSessionHandler from '../SplitTests/SplitTestSessionHandler.js' +import { expressify } from '@overleaf/promise-utils' async function optIn(req, res) { const userId = SessionManager.getLoggedInUserId(req.session) @@ -50,7 +50,7 @@ async function optInPage(req, res) { }) } -module.exports = { +export default { optIn: expressify(optIn), optOut: expressify(optOut), optInPage: expressify(optInPage), diff --git a/services/web/app/src/Features/BetaProgram/BetaProgramHandler.js b/services/web/app/src/Features/BetaProgram/BetaProgramHandler.mjs similarity index 73% rename from services/web/app/src/Features/BetaProgram/BetaProgramHandler.js rename to services/web/app/src/Features/BetaProgram/BetaProgramHandler.mjs index 68ee193023..d9861f41fb 100644 --- a/services/web/app/src/Features/BetaProgram/BetaProgramHandler.js +++ b/services/web/app/src/Features/BetaProgram/BetaProgramHandler.mjs @@ -1,7 +1,7 @@ -const { callbackify } = require('util') -const metrics = require('@overleaf/metrics') -const UserUpdater = require('../User/UserUpdater') -const AnalyticsManager = require('../Analytics/AnalyticsManager') +import { callbackify } from 'util' +import metrics from '@overleaf/metrics' +import UserUpdater from '../User/UserUpdater.js' +import AnalyticsManager from '../Analytics/AnalyticsManager.js' async function optIn(userId) { await UserUpdater.promises.updateUser(userId, { $set: { betaProgram: true } }) @@ -25,7 +25,7 @@ async function optOut(userId) { ) } -module.exports = { +export default { optIn: callbackify(optIn), optOut: callbackify(optOut), promises: { diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsController.js b/services/web/app/src/Features/Collaborators/CollaboratorsController.mjs similarity index 81% rename from services/web/app/src/Features/Collaborators/CollaboratorsController.js rename to services/web/app/src/Features/Collaborators/CollaboratorsController.mjs index 22ab26bb53..118e5f003a 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsController.js +++ b/services/web/app/src/Features/Collaborators/CollaboratorsController.mjs @@ -1,24 +1,26 @@ -const OError = require('@overleaf/o-error') -const HttpErrorHandler = require('../../Features/Errors/HttpErrorHandler') -const { ObjectId } = require('mongodb-legacy') -const CollaboratorsHandler = require('./CollaboratorsHandler') -const CollaboratorsGetter = require('./CollaboratorsGetter') -const OwnershipTransferHandler = require('./OwnershipTransferHandler') -const SessionManager = require('../Authentication/SessionManager') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const TagsHandler = require('../Tags/TagsHandler') -const Errors = require('../Errors/Errors') -const logger = require('@overleaf/logger') -const { expressify } = require('@overleaf/promise-utils') -const { hasAdminAccess } = require('../Helpers/AdminAuthorizationHelper') -const TokenAccessHandler = require('../TokenAccess/TokenAccessHandler') -const ProjectAuditLogHandler = require('../Project/ProjectAuditLogHandler') -const ProjectGetter = require('../Project/ProjectGetter') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const LimitationsManager = require('../Subscription/LimitationsManager') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') +import OError from '@overleaf/o-error' +import HttpErrorHandler from '../../Features/Errors/HttpErrorHandler.js' +import mongodb from 'mongodb-legacy' +import CollaboratorsHandler from './CollaboratorsHandler.js' +import CollaboratorsGetter from './CollaboratorsGetter.js' +import OwnershipTransferHandler from './OwnershipTransferHandler.js' +import SessionManager from '../Authentication/SessionManager.js' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import TagsHandler from '../Tags/TagsHandler.js' +import Errors from '../Errors/Errors.js' +import logger from '@overleaf/logger' +import { expressify } from '@overleaf/promise-utils' +import { hasAdminAccess } from '../Helpers/AdminAuthorizationHelper.js' +import TokenAccessHandler from '../TokenAccess/TokenAccessHandler.js' +import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import LimitationsManager from '../Subscription/LimitationsManager.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' -module.exports = { +const ObjectId = mongodb.ObjectId + +export default { removeUserFromProject: expressify(removeUserFromProject), removeSelfFromProject: expressify(removeSelfFromProject), getAllMembers: expressify(getAllMembers), diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.js b/services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.mjs similarity index 82% rename from services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.js rename to services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.mjs index 1260a81766..4064acbee1 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.js +++ b/services/web/app/src/Features/Collaborators/CollaboratorsEmailHandler.mjs @@ -1,7 +1,7 @@ -const { callbackify } = require('util') -const { Project } = require('../../models/Project') -const EmailHandler = require('../Email/EmailHandler') -const Settings = require('@overleaf/settings') +import { callbackify } from 'util' +import { Project } from '../../models/Project.js' +import EmailHandler from '../Email/EmailHandler.js' +import Settings from '@overleaf/settings' const CollaboratorsEmailHandler = { _buildInviteUrl(project, invite) { @@ -28,7 +28,7 @@ const CollaboratorsEmailHandler = { }, } -module.exports = { +export default { promises: CollaboratorsEmailHandler, notifyUserOfProjectInvite: callbackify( CollaboratorsEmailHandler.notifyUserOfProjectInvite diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.js b/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs similarity index 89% rename from services/web/app/src/Features/Collaborators/CollaboratorsInviteController.js rename to services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs index 55b50f515c..ad452b5e0b 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.js +++ b/services/web/app/src/Features/Collaborators/CollaboratorsInviteController.mjs @@ -1,23 +1,23 @@ -const { callbackify } = require('util') -const ProjectGetter = require('../Project/ProjectGetter') -const LimitationsManager = require('../Subscription/LimitationsManager') -const UserGetter = require('../User/UserGetter') -const CollaboratorsGetter = require('./CollaboratorsGetter') -const CollaboratorsInviteHandler = require('./CollaboratorsInviteHandler') -const CollaboratorsInviteGetter = require('./CollaboratorsInviteGetter') -const logger = require('@overleaf/logger') -const Settings = require('@overleaf/settings') -const EmailHelper = require('../Helpers/EmailHelper') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const AnalyticsManager = require('../Analytics/AnalyticsManager') -const SessionManager = require('../Authentication/SessionManager') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const { expressify } = require('@overleaf/promise-utils') -const ProjectAuditLogHandler = require('../Project/ProjectAuditLogHandler') -const Errors = require('../Errors/Errors') -const AuthenticationController = require('../Authentication/AuthenticationController') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') +import { callbackify } from 'util' +import ProjectGetter from '../Project/ProjectGetter.js' +import LimitationsManager from '../Subscription/LimitationsManager.js' +import UserGetter from '../User/UserGetter.js' +import CollaboratorsGetter from './CollaboratorsGetter.js' +import CollaboratorsInviteHandler from './CollaboratorsInviteHandler.mjs' +import CollaboratorsInviteGetter from './CollaboratorsInviteGetter.js' +import logger from '@overleaf/logger' +import Settings from '@overleaf/settings' +import EmailHelper from '../Helpers/EmailHelper.js' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import AnalyticsManager from '../Analytics/AnalyticsManager.js' +import SessionManager from '../Authentication/SessionManager.js' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import { expressify } from '@overleaf/promise-utils' +import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.js' +import Errors from '../Errors/Errors.js' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' // This rate limiter allows a different number of requests depending on the // number of callaborators a user is allowed. This is implemented by providing @@ -398,7 +398,7 @@ const CollaboratorsInviteController = { }, } -module.exports = { +export default { promises: CollaboratorsInviteController, getAllInvites: expressify(CollaboratorsInviteController.getAllInvites), inviteToProject: expressify(CollaboratorsInviteController.inviteToProject), diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.js b/services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.mjs similarity index 86% rename from services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.js rename to services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.mjs index 0629aa4284..79b06ca223 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.js +++ b/services/web/app/src/Features/Collaborators/CollaboratorsInviteHandler.mjs @@ -1,18 +1,18 @@ -const { callbackify } = require('util') -const { ProjectInvite } = require('../../models/ProjectInvite') -const logger = require('@overleaf/logger') -const CollaboratorsEmailHandler = require('./CollaboratorsEmailHandler') -const CollaboratorsHandler = require('./CollaboratorsHandler') -const CollaboratorsInviteGetter = require('./CollaboratorsInviteGetter') -const CollaboratorsInviteHelper = require('./CollaboratorsInviteHelper') -const UserGetter = require('../User/UserGetter') -const ProjectGetter = require('../Project/ProjectGetter') -const NotificationsBuilder = require('../Notifications/NotificationsBuilder') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const LimitationsManager = require('../Subscription/LimitationsManager') -const ProjectAuditLogHandler = require('../Project/ProjectAuditLogHandler') -const _ = require('lodash') +import { callbackify } from 'util' +import { ProjectInvite } from '../../models/ProjectInvite.js' +import logger from '@overleaf/logger' +import CollaboratorsEmailHandler from './CollaboratorsEmailHandler.mjs' +import CollaboratorsHandler from './CollaboratorsHandler.js' +import CollaboratorsInviteGetter from './CollaboratorsInviteGetter.js' +import CollaboratorsInviteHelper from './CollaboratorsInviteHelper.js' +import UserGetter from '../User/UserGetter.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import NotificationsBuilder from '../Notifications/NotificationsBuilder.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import LimitationsManager from '../Subscription/LimitationsManager.js' +import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.js' +import _ from 'lodash' const CollaboratorsInviteHandler = { async _trySendInviteNotification(projectId, sendingUser, invite) { @@ -198,7 +198,7 @@ const CollaboratorsInviteHandler = { }, } -module.exports = { +export default { promises: CollaboratorsInviteHandler, inviteToProject: callbackify(CollaboratorsInviteHandler.inviteToProject), revokeInviteForUser: callbackify( diff --git a/services/web/app/src/Features/Collaborators/CollaboratorsRouter.js b/services/web/app/src/Features/Collaborators/CollaboratorsRouter.mjs similarity index 84% rename from services/web/app/src/Features/Collaborators/CollaboratorsRouter.js rename to services/web/app/src/Features/Collaborators/CollaboratorsRouter.mjs index da0b9677b3..4ff5097124 100644 --- a/services/web/app/src/Features/Collaborators/CollaboratorsRouter.js +++ b/services/web/app/src/Features/Collaborators/CollaboratorsRouter.mjs @@ -1,13 +1,13 @@ -const CollaboratorsController = require('./CollaboratorsController') -const AuthenticationController = require('../Authentication/AuthenticationController') -const AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') -const CollaboratorsInviteController = require('./CollaboratorsInviteController') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const CaptchaMiddleware = require('../Captcha/CaptchaMiddleware') -const AnalyticsRegistrationSourceMiddleware = require('../Analytics/AnalyticsRegistrationSourceMiddleware') -const { Joi, validate } = require('../../infrastructure/Validation') +import CollaboratorsController from './CollaboratorsController.mjs' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' +import CollaboratorsInviteController from './CollaboratorsInviteController.mjs' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import CaptchaMiddleware from '../Captcha/CaptchaMiddleware.js' +import AnalyticsRegistrationSourceMiddleware from '../Analytics/AnalyticsRegistrationSourceMiddleware.js' +import { Joi, validate } from '../../infrastructure/Validation.js' const rateLimiters = { inviteToProjectByProjectId: new RateLimiter( @@ -32,7 +32,7 @@ const rateLimiters = { }), } -module.exports = { +export default { apply(webRouter) { webRouter.post( '/project/:Project_id/leave', diff --git a/services/web/app/src/Features/Contacts/ContactController.js b/services/web/app/src/Features/Contacts/ContactController.mjs similarity index 81% rename from services/web/app/src/Features/Contacts/ContactController.js rename to services/web/app/src/Features/Contacts/ContactController.mjs index b7dbf58e25..12567d64c6 100644 --- a/services/web/app/src/Features/Contacts/ContactController.js +++ b/services/web/app/src/Features/Contacts/ContactController.mjs @@ -1,8 +1,8 @@ -const SessionManager = require('../Authentication/SessionManager') -const ContactManager = require('./ContactManager') -const UserGetter = require('../User/UserGetter') -const Modules = require('../../infrastructure/Modules') -const { expressify } = require('@overleaf/promise-utils') +import SessionManager from '../Authentication/SessionManager.js' +import ContactManager from './ContactManager.js' +import UserGetter from '../User/UserGetter.js' +import Modules from '../../infrastructure/Modules.js' +import { expressify } from '@overleaf/promise-utils' function _formatContact(contact) { return { @@ -55,6 +55,6 @@ async function getContacts(req, res) { }) } -module.exports = { +export default { getContacts: expressify(getContacts), } diff --git a/services/web/app/src/Features/Contacts/ContactRouter.js b/services/web/app/src/Features/Contacts/ContactRouter.mjs similarity index 63% rename from services/web/app/src/Features/Contacts/ContactRouter.js rename to services/web/app/src/Features/Contacts/ContactRouter.mjs index ca45498449..50db64f2e5 100644 --- a/services/web/app/src/Features/Contacts/ContactRouter.js +++ b/services/web/app/src/Features/Contacts/ContactRouter.mjs @@ -1,7 +1,7 @@ -const AuthenticationController = require('../Authentication/AuthenticationController') -const SessionManager = require('../Authentication/SessionManager') -const ContactController = require('./ContactController') -const Settings = require('@overleaf/settings') +import AuthenticationController from '../Authentication/AuthenticationController.js' +import SessionManager from '../Authentication/SessionManager.js' +import ContactController from './ContactController.mjs' +import Settings from '@overleaf/settings' function contactsAuthenticationMiddleware() { if (!Settings.allowAnonymousReadAndWriteSharing) { @@ -17,7 +17,7 @@ function contactsAuthenticationMiddleware() { } } -module.exports = { +export default { apply(webRouter) { webRouter.get( '/user/contacts', diff --git a/services/web/app/src/Features/Cooldown/CooldownMiddleware.js b/services/web/app/src/Features/Cooldown/CooldownMiddleware.mjs similarity index 88% rename from services/web/app/src/Features/Cooldown/CooldownMiddleware.js rename to services/web/app/src/Features/Cooldown/CooldownMiddleware.mjs index d9cef35155..46a84eb571 100644 --- a/services/web/app/src/Features/Cooldown/CooldownMiddleware.js +++ b/services/web/app/src/Features/Cooldown/CooldownMiddleware.mjs @@ -10,11 +10,12 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -let CooldownMiddleware -const CooldownManager = require('./CooldownManager') -const logger = require('@overleaf/logger') +import CooldownManager from './CooldownManager.js' +import logger from '@overleaf/logger' -module.exports = CooldownMiddleware = { +let CooldownMiddleware + +export default CooldownMiddleware = { freezeProject(req, res, next) { const projectId = req.params.Project_id if (projectId == null) { diff --git a/services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.js b/services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.mjs similarity index 74% rename from services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.js rename to services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.mjs index ad7c0bc6ad..80f42e26c6 100644 --- a/services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.js +++ b/services/web/app/src/Features/DocumentUpdater/DocumentUpdaterController.mjs @@ -1,8 +1,8 @@ -const logger = require('@overleaf/logger') -const DocumentUpdaterHandler = require('./DocumentUpdaterHandler') -const ProjectLocator = require('../Project/ProjectLocator') -const { plainTextResponse } = require('../../infrastructure/Response') -const { expressify } = require('@overleaf/promise-utils') +import logger from '@overleaf/logger' +import DocumentUpdaterHandler from './DocumentUpdaterHandler.js' +import ProjectLocator from '../Project/ProjectLocator.js' +import { plainTextResponse } from '../../infrastructure/Response.js' +import { expressify } from '@overleaf/promise-utils' async function getDoc(req, res) { const projectId = req.params.Project_id @@ -42,7 +42,7 @@ async function getDoc(req, res) { } } -module.exports = { +export default { getDoc: expressify(getDoc), promises: { getDoc, diff --git a/services/web/app/src/Features/Documents/DocumentController.js b/services/web/app/src/Features/Documents/DocumentController.mjs similarity index 79% rename from services/web/app/src/Features/Documents/DocumentController.js rename to services/web/app/src/Features/Documents/DocumentController.mjs index c46c9b9a90..6886414291 100644 --- a/services/web/app/src/Features/Documents/DocumentController.js +++ b/services/web/app/src/Features/Documents/DocumentController.mjs @@ -1,12 +1,12 @@ -const ChatApiHandler = require('../Chat/ChatApiHandler') -const ProjectGetter = require('../Project/ProjectGetter') -const ProjectLocator = require('../Project/ProjectLocator') -const ProjectEntityHandler = require('../Project/ProjectEntityHandler') -const ProjectEntityUpdateHandler = require('../Project/ProjectEntityUpdateHandler') -const logger = require('@overleaf/logger') -const _ = require('lodash') -const { plainTextResponse } = require('../../infrastructure/Response') -const { expressify } = require('@overleaf/promise-utils') +import ChatApiHandler from '../Chat/ChatApiHandler.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import ProjectLocator from '../Project/ProjectLocator.js' +import ProjectEntityHandler from '../Project/ProjectEntityHandler.js' +import ProjectEntityUpdateHandler from '../Project/ProjectEntityUpdateHandler.js' +import logger from '@overleaf/logger' +import _ from 'lodash' +import { plainTextResponse } from '../../infrastructure/Response.js' +import { expressify } from '@overleaf/promise-utils' async function getDocument(req, res) { const { Project_id: projectId, doc_id: docId } = req.params @@ -89,7 +89,7 @@ async function setDocument(req, res) { res.json(result) } -module.exports = { +export default { getDocument: expressify(getDocument), setDocument: expressify(setDocument), } diff --git a/services/web/app/src/Features/Downloads/ProjectDownloadsController.js b/services/web/app/src/Features/Downloads/ProjectDownloadsController.mjs similarity index 83% rename from services/web/app/src/Features/Downloads/ProjectDownloadsController.js rename to services/web/app/src/Features/Downloads/ProjectDownloadsController.mjs index 7e52c4638d..6bd239b273 100644 --- a/services/web/app/src/Features/Downloads/ProjectDownloadsController.js +++ b/services/web/app/src/Features/Downloads/ProjectDownloadsController.mjs @@ -10,15 +10,15 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -let ProjectDownloadsController -const logger = require('@overleaf/logger') -const Metrics = require('@overleaf/metrics') -const ProjectGetter = require('../Project/ProjectGetter') -const ProjectZipStreamManager = require('./ProjectZipStreamManager') -const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') -const { prepareZipAttachment } = require('../../infrastructure/Response') +import Metrics from '@overleaf/metrics' +import ProjectGetter from '../Project/ProjectGetter.js' +import ProjectZipStreamManager from './ProjectZipStreamManager.mjs' +import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.js' +import { prepareZipAttachment } from '../../infrastructure/Response.js' -module.exports = ProjectDownloadsController = { +let ProjectDownloadsController + +export default ProjectDownloadsController = { downloadProject(req, res, next) { const projectId = req.params.Project_id Metrics.inc('zip-downloads') diff --git a/services/web/app/src/Features/Downloads/ProjectZipStreamManager.js b/services/web/app/src/Features/Downloads/ProjectZipStreamManager.mjs similarity index 91% rename from services/web/app/src/Features/Downloads/ProjectZipStreamManager.js rename to services/web/app/src/Features/Downloads/ProjectZipStreamManager.mjs index 11f292b572..fa65c9fa30 100644 --- a/services/web/app/src/Features/Downloads/ProjectZipStreamManager.js +++ b/services/web/app/src/Features/Downloads/ProjectZipStreamManager.mjs @@ -1,12 +1,12 @@ +import archiver from 'archiver' +import async from 'async' +import logger from '@overleaf/logger' +import ProjectEntityHandler from '../Project/ProjectEntityHandler.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import FileStoreHandler from '../FileStore/FileStoreHandler.js' let ProjectZipStreamManager -const archiver = require('archiver') -const async = require('async') -const logger = require('@overleaf/logger') -const ProjectEntityHandler = require('../Project/ProjectEntityHandler') -const ProjectGetter = require('../Project/ProjectGetter') -const FileStoreHandler = require('../FileStore/FileStoreHandler') -module.exports = ProjectZipStreamManager = { +export default ProjectZipStreamManager = { createZipStreamForMultipleProjects(projectIds, callback) { // We'll build up a zip file that contains multiple zip files const archive = archiver('zip') diff --git a/services/web/app/src/Features/Editor/EditorRouter.js b/services/web/app/src/Features/Editor/EditorRouter.mjs similarity index 84% rename from services/web/app/src/Features/Editor/EditorRouter.js rename to services/web/app/src/Features/Editor/EditorRouter.mjs index 6cc83a6808..4a75c19ff3 100644 --- a/services/web/app/src/Features/Editor/EditorRouter.js +++ b/services/web/app/src/Features/Editor/EditorRouter.mjs @@ -1,9 +1,9 @@ -const EditorHttpController = require('./EditorHttpController') -const AuthenticationController = require('../Authentication/AuthenticationController') -const AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const { validate, Joi } = require('../../infrastructure/Validation') +import EditorHttpController from './EditorHttpController.js' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.js' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import { validate, Joi } from '../../infrastructure/Validation.js' const rateLimiters = { addDocToProject: new RateLimiter('add-doc-to-project', { @@ -17,7 +17,7 @@ const rateLimiters = { joinProject: new RateLimiter('join-project', { points: 45, duration: 60 }), } -module.exports = { +export default { apply(webRouter, privateApiRouter) { webRouter.post( '/project/:Project_id/doc', diff --git a/services/web/app/src/Features/Exports/ExportsController.js b/services/web/app/src/Features/Exports/ExportsController.mjs similarity index 95% rename from services/web/app/src/Features/Exports/ExportsController.js rename to services/web/app/src/Features/Exports/ExportsController.mjs index 181de74882..28261cb5f6 100644 --- a/services/web/app/src/Features/Exports/ExportsController.js +++ b/services/web/app/src/Features/Exports/ExportsController.mjs @@ -9,11 +9,12 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -const ExportsHandler = require('./ExportsHandler') -const SessionManager = require('../Authentication/SessionManager') -const logger = require('@overleaf/logger') +import ExportsHandler from './ExportsHandler.mjs' -module.exports = { +import SessionManager from '../Authentication/SessionManager.js' +import logger from '@overleaf/logger' + +export default { exportProject(req, res, next) { const { project_id: projectId, brand_variation_id: brandVariationId } = req.params diff --git a/services/web/app/src/Features/Exports/ExportsHandler.js b/services/web/app/src/Features/Exports/ExportsHandler.mjs similarity index 92% rename from services/web/app/src/Features/Exports/ExportsHandler.js rename to services/web/app/src/Features/Exports/ExportsHandler.mjs index a83bd05e37..4ef5fead4c 100644 --- a/services/web/app/src/Features/Exports/ExportsHandler.js +++ b/services/web/app/src/Features/Exports/ExportsHandler.mjs @@ -11,21 +11,20 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ +import OError from '@overleaf/o-error' +import ProjectGetter from '../Project/ProjectGetter.js' +import ProjectHistoryHandler from '../Project/ProjectHistoryHandler.js' +import ProjectLocator from '../Project/ProjectLocator.js' +import ProjectRootDocManager from '../Project/ProjectRootDocManager.js' +import UserGetter from '../User/UserGetter.js' +import logger from '@overleaf/logger' +import settings from '@overleaf/settings' +import async from 'async' +import Request from 'request' let ExportsHandler -const OError = require('@overleaf/o-error') -const ProjectGetter = require('../Project/ProjectGetter') -const ProjectHistoryHandler = require('../Project/ProjectHistoryHandler') -const ProjectLocator = require('../Project/ProjectLocator') -const ProjectRootDocManager = require('../Project/ProjectRootDocManager') -const UserGetter = require('../User/UserGetter') -const logger = require('@overleaf/logger') -let settings = require('@overleaf/settings') -const async = require('async') -let request = require('request') -request = request.defaults() -settings = require('@overleaf/settings') +const request = Request.defaults() -module.exports = ExportsHandler = { +export default ExportsHandler = { exportProject(exportParams, callback) { if (callback == null) { callback = function () {} diff --git a/services/web/app/src/Features/FileStore/FileStoreController.js b/services/web/app/src/Features/FileStore/FileStoreController.mjs similarity index 90% rename from services/web/app/src/Features/FileStore/FileStoreController.js rename to services/web/app/src/Features/FileStore/FileStoreController.mjs index ad1ec7b597..52f320f13d 100644 --- a/services/web/app/src/Features/FileStore/FileStoreController.js +++ b/services/web/app/src/Features/FileStore/FileStoreController.mjs @@ -1,11 +1,10 @@ -const logger = require('@overleaf/logger') +import logger from '@overleaf/logger' +import FileStoreHandler from './FileStoreHandler.js' +import ProjectLocator from '../Project/ProjectLocator.js' +import Errors from '../Errors/Errors.js' +import { preparePlainTextResponse } from '../../infrastructure/Response.js' -const FileStoreHandler = require('./FileStoreHandler') -const ProjectLocator = require('../Project/ProjectLocator') -const Errors = require('../Errors/Errors') -const { preparePlainTextResponse } = require('../../infrastructure/Response') - -module.exports = { +export default { getFile(req, res) { const projectId = req.params.Project_id const fileId = req.params.File_id diff --git a/services/web/app/src/Features/HealthCheck/HealthCheckController.js b/services/web/app/src/Features/HealthCheck/HealthCheckController.mjs similarity index 92% rename from services/web/app/src/Features/HealthCheck/HealthCheckController.js rename to services/web/app/src/Features/HealthCheck/HealthCheckController.mjs index ff074cfa81..a6de9e55a4 100644 --- a/services/web/app/src/Features/HealthCheck/HealthCheckController.js +++ b/services/web/app/src/Features/HealthCheck/HealthCheckController.mjs @@ -1,14 +1,15 @@ -const RedisWrapper = require('../../infrastructure/RedisWrapper') -const rclient = RedisWrapper.client('health_check') -const settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') -const UserGetter = require('../User/UserGetter') -const { +import RedisWrapper from '../../infrastructure/RedisWrapper.js' +import settings from '@overleaf/settings' +import logger from '@overleaf/logger' +import UserGetter from '../User/UserGetter.js' +import { SmokeTestFailure, runSmokeTests, -} = require('./../../../../test/smoke/src/SmokeTests') +} from './../../../../test/smoke/src/SmokeTests.js' -module.exports = { +const rclient = RedisWrapper.client('health_check') + +export default { check(req, res, next) { if (!settings.siteIsOpen || !settings.editorIsOpen) { // always return successful health checks when site is closed diff --git a/services/web/app/src/Features/History/HistoryRangesSupportMigration.js b/services/web/app/src/Features/History/HistoryRangesSupportMigration.mjs similarity index 92% rename from services/web/app/src/Features/History/HistoryRangesSupportMigration.js rename to services/web/app/src/Features/History/HistoryRangesSupportMigration.mjs index 210c3cfe4b..54a123efe0 100644 --- a/services/web/app/src/Features/History/HistoryRangesSupportMigration.js +++ b/services/web/app/src/Features/History/HistoryRangesSupportMigration.mjs @@ -1,17 +1,15 @@ // @ts-check -const { callbackify } = require('util') -const { ObjectId } = require('mongodb-legacy') -const OError = require('@overleaf/o-error') -const logger = require('@overleaf/logger') -const HistoryManager = require('../History/HistoryManager') -const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') -const DocstoreManager = require('../Docstore/DocstoreManager') -const ProjectOptionsHandler = require('../Project/ProjectOptionsHandler') -const { - db, - READ_PREFERENCE_SECONDARY, -} = require('../../infrastructure/mongodb') +import { callbackify } from 'util' +import OError from '@overleaf/o-error' +import logger from '@overleaf/logger' +import HistoryManager from '../History/HistoryManager.js' +import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.js' +import DocstoreManager from '../Docstore/DocstoreManager.js' +import ProjectOptionsHandler from '../Project/ProjectOptionsHandler.js' +import mongodb from '../../infrastructure/mongodb.js' + +const { db, ObjectId, READ_PREFERENCE_SECONDARY } = mongodb /** * Migrate projects based on a query. @@ -267,7 +265,7 @@ async function hardResyncProject(projectId) { await HistoryManager.promises.resyncProject(projectId, { force: true }) } -module.exports = { +export default { migrateProjects: callbackify(migrateProjects), migrateProject: callbackify(migrateProject), promises: { migrateProjects, migrateProject }, diff --git a/services/web/app/src/Features/InactiveData/InactiveProjectController.js b/services/web/app/src/Features/InactiveData/InactiveProjectController.mjs similarity index 93% rename from services/web/app/src/Features/InactiveData/InactiveProjectController.js rename to services/web/app/src/Features/InactiveData/InactiveProjectController.mjs index 62bc12b773..2e41e80167 100644 --- a/services/web/app/src/Features/InactiveData/InactiveProjectController.js +++ b/services/web/app/src/Features/InactiveData/InactiveProjectController.mjs @@ -9,9 +9,9 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -const InactiveProjectManager = require('./InactiveProjectManager') +import InactiveProjectManager from './InactiveProjectManager.js' -module.exports = { +export default { deactivateOldProjects(req, res) { const numberOfProjectsToArchive = parseInt( req.body.numberOfProjectsToArchive, diff --git a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.mjs similarity index 88% rename from services/web/app/src/Features/LinkedFiles/LinkedFilesController.js rename to services/web/app/src/Features/LinkedFiles/LinkedFilesController.mjs index 186c5782f2..b6ddf815fa 100644 --- a/services/web/app/src/Features/LinkedFiles/LinkedFilesController.js +++ b/services/web/app/src/Features/LinkedFiles/LinkedFilesController.mjs @@ -10,14 +10,12 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -let LinkedFilesController -const SessionManager = require('../Authentication/SessionManager') -const Settings = require('@overleaf/settings') -const _ = require('lodash') -const AnalyticsManager = require('../../../../app/src/Features/Analytics/AnalyticsManager') -const LinkedFilesHandler = require('./LinkedFilesHandler') - -const { +import SessionManager from '../Authentication/SessionManager.js' +import Settings from '@overleaf/settings' +import _ from 'lodash' +import AnalyticsManager from '../../../../app/src/Features/Analytics/AnalyticsManager.js' +import LinkedFilesHandler from './LinkedFilesHandler.js' +import { CompileFailedError, UrlFetchFailedError, InvalidUrlError, @@ -31,20 +29,22 @@ const { FeatureNotAvailableError, RemoteServiceError, FileCannotRefreshError, -} = require('./LinkedFilesErrors') -const { +} from './LinkedFilesErrors.js' +import { OutputFileFetchFailedError, FileTooLargeError, OError, -} = require('../Errors/Errors') -const Modules = require('../../infrastructure/Modules') -const { plainTextResponse } = require('../../infrastructure/Response') -const ReferencesHandler = require('../References/ReferencesHandler') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const { expressify } = require('@overleaf/promise-utils') -const ProjectOutputFileAgent = require('./ProjectOutputFileAgent') -const ProjectFileAgent = require('./ProjectFileAgent') -const UrlAgent = require('./UrlAgent') +} from '../Errors/Errors.js' +import Modules from '../../infrastructure/Modules.js' +import { plainTextResponse } from '../../infrastructure/Response.js' +import ReferencesHandler from '../References/ReferencesHandler.mjs' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import { expressify } from '@overleaf/promise-utils' +import ProjectOutputFileAgent from './ProjectOutputFileAgent.mjs' +import ProjectFileAgent from './ProjectFileAgent.js' +import UrlAgent from './UrlAgent.mjs' + +let LinkedFilesController async function createLinkedFile(req, res, next) { const { project_id: projectId } = req.params @@ -146,7 +146,7 @@ async function refreshLinkedFile(req, res, next) { } } -module.exports = LinkedFilesController = { +export default LinkedFilesController = { Agents: null, async _cacheAgents() { diff --git a/services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.js b/services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.mjs similarity index 70% rename from services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.js rename to services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.mjs index 466592560c..53b49d093e 100644 --- a/services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.js +++ b/services/web/app/src/Features/LinkedFiles/LinkedFilesRouter.mjs @@ -1,9 +1,9 @@ -const AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware') -const AuthenticationController = require('../Authentication/AuthenticationController') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const LinkedFilesController = require('./LinkedFilesController') -const { validate, Joi } = require('../../infrastructure/Validation') +import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.js' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import LinkedFilesController from './LinkedFilesController.mjs' +import { validate, Joi } from '../../infrastructure/Validation.js' const rateLimiters = { createLinkedFile: new RateLimiter('create-linked-file', { @@ -16,7 +16,7 @@ const rateLimiters = { }), } -module.exports = { +export default { apply(webRouter) { webRouter.post( '/project/:project_id/linked_file', diff --git a/services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.js b/services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.mjs similarity index 91% rename from services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.js rename to services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.mjs index c1141efc7e..0af62b2d1c 100644 --- a/services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.js +++ b/services/web/app/src/Features/LinkedFiles/ProjectOutputFileAgent.mjs @@ -1,16 +1,16 @@ -const AuthorizationManager = require('../Authorization/AuthorizationManager') -const CompileManager = require('../Compile/CompileManager') -const ClsiManager = require('../Compile/ClsiManager') -const ProjectFileAgent = require('./ProjectFileAgent') -const _ = require('lodash') -const { +import AuthorizationManager from '../Authorization/AuthorizationManager.js' +import CompileManager from '../Compile/CompileManager.js' +import ClsiManager from '../Compile/ClsiManager.js' +import ProjectFileAgent from './ProjectFileAgent.js' +import _ from 'lodash' +import { CompileFailedError, BadDataError, AccessDeniedError, -} = require('./LinkedFilesErrors') -const { OutputFileFetchFailedError } = require('../Errors/Errors') -const LinkedFilesHandler = require('./LinkedFilesHandler') -const { promisify } = require('@overleaf/promise-utils') +} from './LinkedFilesErrors.js' +import { OutputFileFetchFailedError } from '../Errors/Errors.js' +import LinkedFilesHandler from './LinkedFilesHandler.js' +import { promisify } from '@overleaf/promise-utils' function _prepare(projectId, linkedFileData, userId, callback) { _checkAuth(projectId, linkedFileData, userId, (err, allowed) => { @@ -226,7 +226,7 @@ function _compileAndGetFileStream(linkedFileData, userId, callback) { }) } -module.exports = { +export default { createLinkedFile, refreshLinkedFile, promises: { diff --git a/services/web/app/src/Features/LinkedFiles/UrlAgent.js b/services/web/app/src/Features/LinkedFiles/UrlAgent.mjs similarity index 77% rename from services/web/app/src/Features/LinkedFiles/UrlAgent.js rename to services/web/app/src/Features/LinkedFiles/UrlAgent.mjs index f35a2395ab..12785d7c04 100644 --- a/services/web/app/src/Features/LinkedFiles/UrlAgent.js +++ b/services/web/app/src/Features/LinkedFiles/UrlAgent.mjs @@ -1,11 +1,11 @@ -const logger = require('@overleaf/logger') -const urlValidator = require('valid-url') -const { InvalidUrlError, UrlFetchFailedError } = require('./LinkedFilesErrors') -const LinkedFilesHandler = require('./LinkedFilesHandler') -const UrlHelper = require('../Helpers/UrlHelper') -const { fetchStream, RequestFailedError } = require('@overleaf/fetch-utils') -const { callbackify } = require('@overleaf/promise-utils') -const { FileTooLargeError } = require('../Errors/Errors') +import logger from '@overleaf/logger' +import urlValidator from 'valid-url' +import { InvalidUrlError, UrlFetchFailedError } from './LinkedFilesErrors.js' +import LinkedFilesHandler from './LinkedFilesHandler.js' +import UrlHelper from '../Helpers/UrlHelper.js' +import { fetchStream, RequestFailedError } from '@overleaf/fetch-utils' +import { callbackify } from '@overleaf/promise-utils' +import { FileTooLargeError } from '../Errors/Errors.js' async function createLinkedFile( projectId, @@ -76,7 +76,7 @@ function _getUrl(projectId, data, currentUserId) { return url } -module.exports = { +export default { createLinkedFile: callbackify(createLinkedFile), refreshLinkedFile: callbackify(refreshLinkedFile), promises: { createLinkedFile, refreshLinkedFile }, diff --git a/services/web/app/src/Features/Metadata/MetaController.js b/services/web/app/src/Features/Metadata/MetaController.mjs similarity index 82% rename from services/web/app/src/Features/Metadata/MetaController.js rename to services/web/app/src/Features/Metadata/MetaController.mjs index 1a0140cf18..417217ecb3 100644 --- a/services/web/app/src/Features/Metadata/MetaController.js +++ b/services/web/app/src/Features/Metadata/MetaController.mjs @@ -1,8 +1,8 @@ -const OError = require('@overleaf/o-error') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const MetaHandler = require('./MetaHandler') -const logger = require('@overleaf/logger') -const { expressify } = require('@overleaf/promise-utils') +import OError from '@overleaf/o-error' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import MetaHandler from './MetaHandler.mjs' +import logger from '@overleaf/logger' +import { expressify } from '@overleaf/promise-utils' async function getMetadata(req, res) { const { project_id: projectId } = req.params @@ -55,7 +55,7 @@ async function broadcastMetadataForDoc(req, res) { res.sendStatus(200) // 204? } -module.exports = { +export default { getMetadata: expressify(getMetadata), broadcastMetadataForDoc: expressify(broadcastMetadataForDoc), } diff --git a/services/web/app/src/Features/Metadata/MetaHandler.js b/services/web/app/src/Features/Metadata/MetaHandler.mjs similarity index 90% rename from services/web/app/src/Features/Metadata/MetaHandler.js rename to services/web/app/src/Features/Metadata/MetaHandler.mjs index 02f2c0d26e..1f7c1e2f86 100644 --- a/services/web/app/src/Features/Metadata/MetaHandler.js +++ b/services/web/app/src/Features/Metadata/MetaHandler.mjs @@ -1,7 +1,7 @@ -const ProjectEntityHandler = require('../Project/ProjectEntityHandler') -const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') -const packageMapping = require('./packageMapping') -const { callbackify } = require('@overleaf/promise-utils') +import ProjectEntityHandler from '../Project/ProjectEntityHandler.js' +import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.js' +import packageMapping from './packageMapping.mjs' +import { callbackify } from '@overleaf/promise-utils' /** @typedef {{ * labels: string[] @@ -117,7 +117,7 @@ async function getMetaForDoc(projectId, docId) { return await extractMetaFromDoc(lines) } -module.exports = { +export default { promises: { getAllMetaForProject, getMetaForDoc, diff --git a/services/web/app/src/Features/Metadata/packageMapping.js b/services/web/app/src/Features/Metadata/packageMapping.mjs similarity index 99% rename from services/web/app/src/Features/Metadata/packageMapping.js rename to services/web/app/src/Features/Metadata/packageMapping.mjs index 19d843afad..2af10a0371 100644 --- a/services/web/app/src/Features/Metadata/packageMapping.js +++ b/services/web/app/src/Features/Metadata/packageMapping.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { inputenc: [ { caption: '\\inputencoding{}', diff --git a/services/web/app/src/Features/Notifications/NotificationsController.js b/services/web/app/src/Features/Notifications/NotificationsController.mjs similarity index 83% rename from services/web/app/src/Features/Notifications/NotificationsController.js rename to services/web/app/src/Features/Notifications/NotificationsController.mjs index a0e2dcf398..ae1d9208f3 100644 --- a/services/web/app/src/Features/Notifications/NotificationsController.js +++ b/services/web/app/src/Features/Notifications/NotificationsController.mjs @@ -1,8 +1,8 @@ -const NotificationsHandler = require('./NotificationsHandler') -const SessionManager = require('../Authentication/SessionManager') -const _ = require('lodash') +import NotificationsHandler from './NotificationsHandler.js' +import SessionManager from '../Authentication/SessionManager.js' +import _ from 'lodash' -module.exports = { +export default { getAllUnreadNotifications(req, res, next) { const userId = SessionManager.getLoggedInUserId(req.session) NotificationsHandler.getUserNotifications( diff --git a/services/web/app/src/Features/PasswordReset/PasswordResetController.js b/services/web/app/src/Features/PasswordReset/PasswordResetController.mjs similarity index 89% rename from services/web/app/src/Features/PasswordReset/PasswordResetController.js rename to services/web/app/src/Features/PasswordReset/PasswordResetController.mjs index 8dd8d92c46..92860d05ab 100644 --- a/services/web/app/src/Features/PasswordReset/PasswordResetController.js +++ b/services/web/app/src/Features/PasswordReset/PasswordResetController.mjs @@ -1,13 +1,13 @@ -const PasswordResetHandler = require('./PasswordResetHandler') -const AuthenticationController = require('../Authentication/AuthenticationController') -const AuthenticationManager = require('../Authentication/AuthenticationManager') -const SessionManager = require('../Authentication/SessionManager') -const UserGetter = require('../User/UserGetter') -const UserUpdater = require('../User/UserUpdater') -const UserSessionsManager = require('../User/UserSessionsManager') -const OError = require('@overleaf/o-error') -const EmailsHelper = require('../Helpers/EmailHelper') -const { expressify } = require('@overleaf/promise-utils') +import PasswordResetHandler from './PasswordResetHandler.mjs' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import AuthenticationManager from '../Authentication/AuthenticationManager.js' +import SessionManager from '../Authentication/SessionManager.js' +import UserGetter from '../User/UserGetter.js' +import UserUpdater from '../User/UserUpdater.js' +import UserSessionsManager from '../User/UserSessionsManager.js' +import OError from '@overleaf/o-error' +import EmailsHelper from '../Helpers/EmailHelper.js' +import { expressify } from '@overleaf/promise-utils' async function setNewUserPassword(req, res, next) { let user @@ -189,7 +189,7 @@ async function renderSetPasswordForm(req, res, next) { }) } -module.exports = { +export default { renderRequestResetForm(req, res) { const errorQuery = req.query.error let error = null diff --git a/services/web/app/src/Features/PasswordReset/PasswordResetHandler.js b/services/web/app/src/Features/PasswordReset/PasswordResetHandler.mjs similarity index 84% rename from services/web/app/src/Features/PasswordReset/PasswordResetHandler.js rename to services/web/app/src/Features/PasswordReset/PasswordResetHandler.mjs index 73cded6d13..2d51eab156 100644 --- a/services/web/app/src/Features/PasswordReset/PasswordResetHandler.js +++ b/services/web/app/src/Features/PasswordReset/PasswordResetHandler.mjs @@ -1,12 +1,13 @@ -const settings = require('@overleaf/settings') -const UserAuditLogHandler = require('../User/UserAuditLogHandler') -const UserGetter = require('../User/UserGetter') -const OneTimeTokenHandler = require('../Security/OneTimeTokenHandler') -const EmailHandler = require('../Email/EmailHandler') -const AuthenticationManager = require('../Authentication/AuthenticationManager') -const { callbackify, promisify } = require('util') -const { assertUserPermissions } = - require('../Authorization/PermissionsManager').promises +import settings from '@overleaf/settings' +import UserAuditLogHandler from '../User/UserAuditLogHandler.js' +import UserGetter from '../User/UserGetter.js' +import OneTimeTokenHandler from '../Security/OneTimeTokenHandler.js' +import EmailHandler from '../Email/EmailHandler.js' +import AuthenticationManager from '../Authentication/AuthenticationManager.js' +import { callbackify, promisify } from 'util' +import PermissionsManager from '../Authorization/PermissionsManager.js' + +const assertUserPermissions = PermissionsManager.promises.assertUserPermissions const AUDIT_LOG_TOKEN_PREFIX_LENGTH = 10 @@ -138,4 +139,4 @@ PasswordResetHandler.promises = { setNewUserPassword, } -module.exports = PasswordResetHandler +export default PasswordResetHandler diff --git a/services/web/app/src/Features/PasswordReset/PasswordResetRouter.js b/services/web/app/src/Features/PasswordReset/PasswordResetRouter.mjs similarity index 78% rename from services/web/app/src/Features/PasswordReset/PasswordResetRouter.js rename to services/web/app/src/Features/PasswordReset/PasswordResetRouter.mjs index da7b4f751e..e750d1131e 100644 --- a/services/web/app/src/Features/PasswordReset/PasswordResetRouter.js +++ b/services/web/app/src/Features/PasswordReset/PasswordResetRouter.mjs @@ -1,16 +1,16 @@ -const PasswordResetController = require('./PasswordResetController') -const AuthenticationController = require('../Authentication/AuthenticationController') -const CaptchaMiddleware = require('../../Features/Captcha/CaptchaMiddleware') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const { Joi, validate } = require('../../infrastructure/Validation') +import PasswordResetController from './PasswordResetController.mjs' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import CaptchaMiddleware from '../../Features/Captcha/CaptchaMiddleware.js' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import { Joi, validate } from '../../infrastructure/Validation.js' const rateLimiter = new RateLimiter('password_reset_rate_limit', { points: 6, duration: 60, }) -module.exports = { +export default { apply(webRouter) { const rateLimit = RateLimiterMiddleware.rateLimit(rateLimiter, { ipOnly: true, diff --git a/services/web/app/src/Features/Project/DocLinesComparitor.js b/services/web/app/src/Features/Project/DocLinesComparitor.mjs similarity index 85% rename from services/web/app/src/Features/Project/DocLinesComparitor.js rename to services/web/app/src/Features/Project/DocLinesComparitor.mjs index f72bf91795..43c8ad1623 100644 --- a/services/web/app/src/Features/Project/DocLinesComparitor.js +++ b/services/web/app/src/Features/Project/DocLinesComparitor.mjs @@ -1,8 +1,8 @@ // TODO: This file was created by bulk-decaffeinate. // Sanity-check the conversion and remove this comment. -const _ = require('lodash') +import _ from 'lodash' -module.exports = { +export default { areSame(lines1, lines2) { if (!Array.isArray(lines1) || !Array.isArray(lines2)) { return false diff --git a/services/web/app/src/Features/Project/ProjectApiController.js b/services/web/app/src/Features/Project/ProjectApiController.mjs similarity index 84% rename from services/web/app/src/Features/Project/ProjectApiController.js rename to services/web/app/src/Features/Project/ProjectApiController.mjs index a0899f5e71..afdc0f3b3a 100644 --- a/services/web/app/src/Features/Project/ProjectApiController.js +++ b/services/web/app/src/Features/Project/ProjectApiController.mjs @@ -10,10 +10,11 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -const ProjectDetailsHandler = require('./ProjectDetailsHandler') -const logger = require('@overleaf/logger') +import ProjectDetailsHandler from './ProjectDetailsHandler.js' -module.exports = { +import logger from '@overleaf/logger' + +export default { getProjectDetails(req, res, next) { const { project_id: projectId } = req.params return ProjectDetailsHandler.getDetails( diff --git a/services/web/app/src/Features/Project/ProjectListController.js b/services/web/app/src/Features/Project/ProjectListController.mjs similarity index 92% rename from services/web/app/src/Features/Project/ProjectListController.js rename to services/web/app/src/Features/Project/ProjectListController.mjs index 93d541e910..50597a8d39 100644 --- a/services/web/app/src/Features/Project/ProjectListController.js +++ b/services/web/app/src/Features/Project/ProjectListController.mjs @@ -1,32 +1,33 @@ // ts-check -const _ = require('lodash') -const Metrics = require('@overleaf/metrics') -const Settings = require('@overleaf/settings') -const ProjectHelper = require('./ProjectHelper') -const ProjectGetter = require('./ProjectGetter') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') -const SessionManager = require('../Authentication/SessionManager') -const Sources = require('../Authorization/Sources') -const UserGetter = require('../User/UserGetter') -const SurveyHandler = require('../Survey/SurveyHandler') -const TagsHandler = require('../Tags/TagsHandler') -const { expressify } = require('@overleaf/promise-utils') -const logger = require('@overleaf/logger') -const Features = require('../../infrastructure/Features') -const SubscriptionViewModelBuilder = require('../Subscription/SubscriptionViewModelBuilder') -const NotificationsHandler = require('../Notifications/NotificationsHandler') -const Modules = require('../../infrastructure/Modules') -const { OError, V1ConnectionError } = require('../Errors/Errors') -const { User } = require('../../models/User') -const UserPrimaryEmailCheckHandler = require('../User/UserPrimaryEmailCheckHandler') -const UserController = require('../User/UserController') -const LimitationsManager = require('../Subscription/LimitationsManager') -const NotificationsBuilder = require('../Notifications/NotificationsBuilder') -const GeoIpLookup = require('../../infrastructure/GeoIpLookup') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const SplitTestSessionHandler = require('../SplitTests/SplitTestSessionHandler') -const SubscriptionLocator = require('../Subscription/SubscriptionLocator') -const TutorialHandler = require('../Tutorial/TutorialHandler') +import _ from 'lodash' + +import Metrics from '@overleaf/metrics' +import Settings from '@overleaf/settings' +import ProjectHelper from './ProjectHelper.js' +import ProjectGetter from './ProjectGetter.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' +import SessionManager from '../Authentication/SessionManager.js' +import Sources from '../Authorization/Sources.js' +import UserGetter from '../User/UserGetter.js' +import SurveyHandler from '../Survey/SurveyHandler.mjs' +import TagsHandler from '../Tags/TagsHandler.js' +import { expressify } from '@overleaf/promise-utils' +import logger from '@overleaf/logger' +import Features from '../../infrastructure/Features.js' +import SubscriptionViewModelBuilder from '../Subscription/SubscriptionViewModelBuilder.js' +import NotificationsHandler from '../Notifications/NotificationsHandler.js' +import Modules from '../../infrastructure/Modules.js' +import { OError, V1ConnectionError } from '../Errors/Errors.js' +import { User } from '../../models/User.js' +import UserPrimaryEmailCheckHandler from '../User/UserPrimaryEmailCheckHandler.js' +import UserController from '../User/UserController.js' +import LimitationsManager from '../Subscription/LimitationsManager.js' +import NotificationsBuilder from '../Notifications/NotificationsBuilder.js' +import GeoIpLookup from '../../infrastructure/GeoIpLookup.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import SplitTestSessionHandler from '../SplitTests/SplitTestSessionHandler.js' +import SubscriptionLocator from '../Subscription/SubscriptionLocator.js' +import TutorialHandler from '../Tutorial/TutorialHandler.js' /** * @import { GetProjectsRequest, GetProjectsResponse, AllUsersProjects, MongoProject } from "./types" @@ -763,7 +764,7 @@ function _hasActiveFilter(filters) { ) } -module.exports = { +export default { projectListPage: expressify(projectListPage), getProjectsJson: expressify(getProjectsJson), } diff --git a/services/web/app/src/Features/Referal/ReferalConnect.js b/services/web/app/src/Features/Referal/ReferalConnect.mjs similarity index 98% rename from services/web/app/src/Features/Referal/ReferalConnect.js rename to services/web/app/src/Features/Referal/ReferalConnect.mjs index 890cbf7d7d..7b65151653 100644 --- a/services/web/app/src/Features/Referal/ReferalConnect.js +++ b/services/web/app/src/Features/Referal/ReferalConnect.mjs @@ -1,4 +1,4 @@ -module.exports = { +export default { use(req, res, next) { if (req.query != null) { if (req.query.referal != null) { diff --git a/services/web/app/src/Features/Referal/ReferalController.js b/services/web/app/src/Features/Referal/ReferalController.mjs similarity index 71% rename from services/web/app/src/Features/Referal/ReferalController.js rename to services/web/app/src/Features/Referal/ReferalController.mjs index d0b0f64912..8315ac756a 100644 --- a/services/web/app/src/Features/Referal/ReferalController.js +++ b/services/web/app/src/Features/Referal/ReferalController.mjs @@ -1,7 +1,7 @@ -const ReferalHandler = require('./ReferalHandler') -const SessionManager = require('../Authentication/SessionManager') +import ReferalHandler from './ReferalHandler.mjs' +import SessionManager from '../Authentication/SessionManager.js' -module.exports = { +export default { bonus(req, res, next) { const userId = SessionManager.getLoggedInUserId(req.session) ReferalHandler.getReferedUsers(userId, (err, { referedUserCount }) => { diff --git a/services/web/app/src/Features/Referal/ReferalHandler.js b/services/web/app/src/Features/Referal/ReferalHandler.mjs similarity index 77% rename from services/web/app/src/Features/Referal/ReferalHandler.js rename to services/web/app/src/Features/Referal/ReferalHandler.mjs index 3a6092dd2b..1d389bb860 100644 --- a/services/web/app/src/Features/Referal/ReferalHandler.js +++ b/services/web/app/src/Features/Referal/ReferalHandler.mjs @@ -1,5 +1,5 @@ -const { callbackify } = require('@overleaf/promise-utils') -const { User } = require('../../models/User') +import { callbackify } from '@overleaf/promise-utils' +import { User } from '../../models/User.js' async function getReferedUsers(userId) { const projection = { refered_users: 1, refered_user_count: 1 } @@ -9,7 +9,7 @@ async function getReferedUsers(userId) { return { referedUsers, referedUserCount } } -module.exports = { +export default { getReferedUsers: callbackify(getReferedUsers), promises: { getReferedUsers, diff --git a/services/web/app/src/Features/References/ReferencesController.js b/services/web/app/src/Features/References/ReferencesController.mjs similarity index 80% rename from services/web/app/src/Features/References/ReferencesController.js rename to services/web/app/src/Features/References/ReferencesController.mjs index 5b85c74346..378f096a40 100644 --- a/services/web/app/src/Features/References/ReferencesController.js +++ b/services/web/app/src/Features/References/ReferencesController.mjs @@ -10,14 +10,13 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -let ReferencesController -const logger = require('@overleaf/logger') -const ReferencesHandler = require('./ReferencesHandler') -const settings = require('@overleaf/settings') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const { OError } = require('../Errors/Errors') +import ReferencesHandler from './ReferencesHandler.mjs' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import { OError } from '../Errors/Errors.js' -module.exports = ReferencesController = { +let ReferencesController + +export default ReferencesController = { indexAll(req, res, next) { const projectId = req.params.Project_id const { shouldBroadcast } = req.body diff --git a/services/web/app/src/Features/References/ReferencesHandler.js b/services/web/app/src/Features/References/ReferencesHandler.mjs similarity index 90% rename from services/web/app/src/Features/References/ReferencesHandler.js rename to services/web/app/src/Features/References/ReferencesHandler.mjs index 1ad2d77c86..a010395e6f 100644 --- a/services/web/app/src/Features/References/ReferencesHandler.js +++ b/services/web/app/src/Features/References/ReferencesHandler.mjs @@ -12,25 +12,26 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ +import OError from '@overleaf/o-error' +import logger from '@overleaf/logger' +import request from 'request' +import settings from '@overleaf/settings' +import Features from '../../infrastructure/Features.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import UserGetter from '../User/UserGetter.js' +import DocumentUpdaterHandler from '../DocumentUpdater/DocumentUpdaterHandler.js' +import _ from 'lodash' +import Async from 'async' +import Errors from '../Errors/Errors.js' +import { promisify } from '@overleaf/promise-utils' + let ReferencesHandler -const OError = require('@overleaf/o-error') -const logger = require('@overleaf/logger') -const request = require('request') -const settings = require('@overleaf/settings') -const Features = require('../../infrastructure/Features') -const ProjectGetter = require('../Project/ProjectGetter') -const UserGetter = require('../User/UserGetter') -const DocumentUpdaterHandler = require('../DocumentUpdater/DocumentUpdaterHandler') -const _ = require('lodash') -const Async = require('async') -const Errors = require('../Errors/Errors') -const { promisify } = require('@overleaf/promise-utils') if (!Features.hasFeature('references')) { logger.debug('references search not enabled') } -module.exports = ReferencesHandler = { +export default ReferencesHandler = { _buildDocUrl(projectId, docId) { return `${settings.apis.docstore.url}/project/${projectId}/doc/${docId}/raw` }, diff --git a/services/web/app/src/Features/Spelling/SpellingController.js b/services/web/app/src/Features/Spelling/SpellingController.mjs similarity index 86% rename from services/web/app/src/Features/Spelling/SpellingController.js rename to services/web/app/src/Features/Spelling/SpellingController.mjs index 64b7363637..aea23920a6 100644 --- a/services/web/app/src/Features/Spelling/SpellingController.js +++ b/services/web/app/src/Features/Spelling/SpellingController.mjs @@ -1,15 +1,15 @@ -const request = require('request') -const Settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') -const SessionManager = require('../Authentication/SessionManager') -const LearnedWordsManager = require('./LearnedWordsManager') +import request from 'request' +import Settings from '@overleaf/settings' +import logger from '@overleaf/logger' +import SessionManager from '../Authentication/SessionManager.js' +import LearnedWordsManager from './LearnedWordsManager.js' const TEN_SECONDS = 1000 * 10 const languageCodeIsSupported = code => Settings.languages.some(lang => lang.code === code && lang.server !== false) -module.exports = { +export default { learn(req, res, next) { const { word } = req.body const userId = SessionManager.getLoggedInUserId(req.session) diff --git a/services/web/app/src/Features/StaticPages/HomeController.js b/services/web/app/src/Features/StaticPages/HomeController.mjs similarity index 75% rename from services/web/app/src/Features/StaticPages/HomeController.js rename to services/web/app/src/Features/StaticPages/HomeController.mjs index 60cba7fe79..30304ae7e4 100644 --- a/services/web/app/src/Features/StaticPages/HomeController.js +++ b/services/web/app/src/Features/StaticPages/HomeController.mjs @@ -1,15 +1,14 @@ -const Features = require('../../infrastructure/Features') -const AnalyticsManager = require('../Analytics/AnalyticsManager') +import Features from '../../infrastructure/Features.js' +import AnalyticsManager from '../Analytics/AnalyticsManager.js' +import Path from 'path' +import fs from 'fs' +import ErrorController from '../Errors/ErrorController.js' +import SessionManager from '../Authentication/SessionManager.js' +import { expressify } from '@overleaf/promise-utils' +import logger from '@overleaf/logger' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' -const Path = require('path') -const fs = require('fs') - -const ErrorController = require('../Errors/ErrorController') -const SessionManager = require('../Authentication/SessionManager') - -const { expressify } = require('@overleaf/promise-utils') -const logger = require('@overleaf/logger') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') +const __dirname = new URL('.', import.meta.url).pathname const homepageExists = fs.existsSync( Path.join( @@ -67,7 +66,7 @@ function externalPage(page, title) { return expressify(middleware) } -module.exports = { +export default { index: expressify(index), home: expressify(home), externalPage, diff --git a/services/web/app/src/Features/StaticPages/StaticPageHelpers.js b/services/web/app/src/Features/StaticPages/StaticPageHelpers.mjs similarity index 92% rename from services/web/app/src/Features/StaticPages/StaticPageHelpers.js rename to services/web/app/src/Features/StaticPages/StaticPageHelpers.mjs index 28ab3884c6..e9fa268f8c 100644 --- a/services/web/app/src/Features/StaticPages/StaticPageHelpers.js +++ b/services/web/app/src/Features/StaticPages/StaticPageHelpers.mjs @@ -8,6 +8,8 @@ * DS102: Remove unnecessary code created because of implicit returns * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ +import _ from 'lodash' + const extensionsToProxy = [ '.png', '.xml', @@ -18,9 +20,8 @@ const extensionsToProxy = [ '.gif', '.jpg', ] -const _ = require('lodash') -module.exports = { +export default { shouldProxy(url) { const shouldProxy = _.find( extensionsToProxy, diff --git a/services/web/app/src/Features/StaticPages/StaticPagesRouter.js b/services/web/app/src/Features/StaticPages/StaticPagesRouter.mjs similarity index 86% rename from services/web/app/src/Features/StaticPages/StaticPagesRouter.js rename to services/web/app/src/Features/StaticPages/StaticPagesRouter.mjs index f1fff2294f..b81e25c7cd 100644 --- a/services/web/app/src/Features/StaticPages/StaticPagesRouter.js +++ b/services/web/app/src/Features/StaticPages/StaticPagesRouter.mjs @@ -8,10 +8,11 @@ * DS102: Remove unnecessary code created because of implicit returns * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -const HomeController = require('./HomeController') -const UniversityController = require('./UniversityController') +import HomeController from './HomeController.mjs' -module.exports = { +import UniversityController from './UniversityController.mjs' + +export default { apply(webRouter) { webRouter.get('/', HomeController.index) webRouter.get('/home', HomeController.home) diff --git a/services/web/app/src/Features/StaticPages/UniversityController.js b/services/web/app/src/Features/StaticPages/UniversityController.mjs similarity index 76% rename from services/web/app/src/Features/StaticPages/UniversityController.js rename to services/web/app/src/Features/StaticPages/UniversityController.mjs index 7d8f07cd56..35fec9f5de 100644 --- a/services/web/app/src/Features/StaticPages/UniversityController.js +++ b/services/web/app/src/Features/StaticPages/UniversityController.mjs @@ -10,11 +10,8 @@ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ let UniversityController -const settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') -const Settings = require('@overleaf/settings') -module.exports = UniversityController = { +export default UniversityController = { getPage(req, res, next) { const url = req.url != null ? req.url.toLowerCase().replace('.html', '') : undefined diff --git a/services/web/app/src/Features/Subscription/SubscriptionGroupController.js b/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs similarity index 84% rename from services/web/app/src/Features/Subscription/SubscriptionGroupController.js rename to services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs index f8e685af5d..ef8d48291d 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionGroupController.js +++ b/services/web/app/src/Features/Subscription/SubscriptionGroupController.mjs @@ -1,12 +1,13 @@ // ts-check -const SubscriptionGroupHandler = require('./SubscriptionGroupHandler') -const OError = require('@overleaf/o-error') -const logger = require('@overleaf/logger') -const SubscriptionLocator = require('./SubscriptionLocator') -const SessionManager = require('../Authentication/SessionManager') -const UserAuditLogHandler = require('../User/UserAuditLogHandler') -const { expressify } = require('@overleaf/promise-utils') -const Modules = require('../../infrastructure/Modules') +import SubscriptionGroupHandler from './SubscriptionGroupHandler.js' + +import OError from '@overleaf/o-error' +import logger from '@overleaf/logger' +import SubscriptionLocator from './SubscriptionLocator.js' +import SessionManager from '../Authentication/SessionManager.js' +import UserAuditLogHandler from '../User/UserAuditLogHandler.js' +import { expressify } from '@overleaf/promise-utils' +import Modules from '../../infrastructure/Modules.js' /** * @import { Subscription } from "../../../../types/subscription/dashboard/subscription" @@ -110,7 +111,7 @@ async function _removeUserFromGroup( res.sendStatus(200) } -module.exports = { +export default { removeUserFromGroup: expressify(removeUserFromGroup), removeSelfFromGroup: expressify(removeSelfFromGroup), } diff --git a/services/web/app/src/Features/Subscription/SubscriptionRouter.js b/services/web/app/src/Features/Subscription/SubscriptionRouter.mjs similarity index 89% rename from services/web/app/src/Features/Subscription/SubscriptionRouter.js rename to services/web/app/src/Features/Subscription/SubscriptionRouter.mjs index a386fe4944..fd58b69639 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionRouter.js +++ b/services/web/app/src/Features/Subscription/SubscriptionRouter.mjs @@ -1,12 +1,12 @@ -const AuthenticationController = require('../Authentication/AuthenticationController') -const PermissionsController = require('../Authorization/PermissionsController') -const SubscriptionController = require('./SubscriptionController') -const SubscriptionGroupController = require('./SubscriptionGroupController') -const TeamInvitesController = require('./TeamInvitesController') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const Settings = require('@overleaf/settings') -const { Joi, validate } = require('../../infrastructure/Validation') +import AuthenticationController from '../Authentication/AuthenticationController.js' +import PermissionsController from '../Authorization/PermissionsController.js' +import SubscriptionController from './SubscriptionController.js' +import SubscriptionGroupController from './SubscriptionGroupController.mjs' +import TeamInvitesController from './TeamInvitesController.mjs' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import Settings from '@overleaf/settings' +import { Joi, validate } from '../../infrastructure/Validation.js' const teamInviteRateLimiter = new RateLimiter('team-invite', { points: 10, @@ -18,7 +18,7 @@ const subscriptionRateLimiter = new RateLimiter('subscription', { duration: 60, }) -module.exports = { +export default { apply(webRouter, privateApiRouter, publicApiRouter) { if (!Settings.enableSubscriptions) { return diff --git a/services/web/app/src/Features/Subscription/TeamInvitesController.js b/services/web/app/src/Features/Subscription/TeamInvitesController.mjs similarity index 88% rename from services/web/app/src/Features/Subscription/TeamInvitesController.js rename to services/web/app/src/Features/Subscription/TeamInvitesController.mjs index 6af825d5e8..b575c94ff8 100644 --- a/services/web/app/src/Features/Subscription/TeamInvitesController.js +++ b/services/web/app/src/Features/Subscription/TeamInvitesController.mjs @@ -1,20 +1,20 @@ -const settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') -const OError = require('@overleaf/o-error') -const TeamInvitesHandler = require('./TeamInvitesHandler') -const SessionManager = require('../Authentication/SessionManager') -const SubscriptionLocator = require('./SubscriptionLocator') -const ErrorController = require('../Errors/ErrorController') -const EmailHelper = require('../Helpers/EmailHelper') -const UserGetter = require('../User/UserGetter') -const { expressify } = require('@overleaf/promise-utils') -const HttpErrorHandler = require('../Errors/HttpErrorHandler') -const PermissionsManager = require('../Authorization/PermissionsManager') -const EmailHandler = require('../Email/EmailHandler') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const Modules = require('../../infrastructure/Modules') -const UserAuditLogHandler = require('../User/UserAuditLogHandler') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') +import settings from '@overleaf/settings' +import logger from '@overleaf/logger' +import OError from '@overleaf/o-error' +import TeamInvitesHandler from './TeamInvitesHandler.js' +import SessionManager from '../Authentication/SessionManager.js' +import SubscriptionLocator from './SubscriptionLocator.js' +import ErrorController from '../Errors/ErrorController.js' +import EmailHelper from '../Helpers/EmailHelper.js' +import UserGetter from '../User/UserGetter.js' +import { expressify } from '@overleaf/promise-utils' +import HttpErrorHandler from '../Errors/HttpErrorHandler.js' +import PermissionsManager from '../Authorization/PermissionsManager.js' +import EmailHandler from '../Email/EmailHandler.js' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import Modules from '../../infrastructure/Modules.js' +import UserAuditLogHandler from '../User/UserAuditLogHandler.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' const rateLimiters = { resendGroupInvite: new RateLimiter('resend-group-invite', { @@ -306,7 +306,7 @@ async function resendInvite(req, res, next) { return res.status(200).json({ success: true }) } -module.exports = { +export default { createInvite: expressify(createInvite), viewInvite: expressify(viewInvite), viewInvites: expressify(viewInvites), diff --git a/services/web/app/src/Features/Survey/SurveyCache.js b/services/web/app/src/Features/Survey/SurveyCache.mjs similarity index 63% rename from services/web/app/src/Features/Survey/SurveyCache.js rename to services/web/app/src/Features/Survey/SurveyCache.mjs index 796a188ac0..28b43fed1f 100644 --- a/services/web/app/src/Features/Survey/SurveyCache.js +++ b/services/web/app/src/Features/Survey/SurveyCache.mjs @@ -1,6 +1,6 @@ -const SurveyManager = require('./SurveyManager') -const { Survey } = require('../../models/Survey') -const { CacheLoader } = require('cache-flow') +import SurveyManager from './SurveyManager.js' +import { Survey } from '../../models/Survey.js' +import { CacheLoader } from 'cache-flow' class SurveyCache extends CacheLoader { constructor() { @@ -22,4 +22,4 @@ class SurveyCache extends CacheLoader { } } -module.exports = new SurveyCache() +export default new SurveyCache() diff --git a/services/web/app/src/Features/Survey/SurveyHandler.js b/services/web/app/src/Features/Survey/SurveyHandler.mjs similarity index 87% rename from services/web/app/src/Features/Survey/SurveyHandler.js rename to services/web/app/src/Features/Survey/SurveyHandler.mjs index 8c35b095bd..6ff2ce2384 100644 --- a/services/web/app/src/Features/Survey/SurveyHandler.js +++ b/services/web/app/src/Features/Survey/SurveyHandler.mjs @@ -1,8 +1,9 @@ // ts-check -const crypto = require('crypto') -const SurveyCache = require('./SurveyCache') -const SubscriptionLocator = require('../Subscription/SubscriptionLocator') -const { callbackify } = require('@overleaf/promise-utils') +import crypto from 'crypto' + +import SurveyCache from './SurveyCache.mjs' +import SubscriptionLocator from '../Subscription/SubscriptionLocator.js' +import { callbackify } from '@overleaf/promise-utils' /** * @import { Survey } from '../../../../types/project/dashboard/survey' @@ -55,7 +56,7 @@ function _userInRolloutPercentile(userId, surveyName, rolloutPercentage) { return userPercentile < rolloutPercentage } -module.exports = { +export default { getSurvey: callbackify(getSurvey), promises: { getSurvey, diff --git a/services/web/app/src/Features/Tags/TagsController.js b/services/web/app/src/Features/Tags/TagsController.mjs similarity index 92% rename from services/web/app/src/Features/Tags/TagsController.js rename to services/web/app/src/Features/Tags/TagsController.mjs index 019cc74da9..807e48a9ab 100644 --- a/services/web/app/src/Features/Tags/TagsController.js +++ b/services/web/app/src/Features/Tags/TagsController.mjs @@ -1,7 +1,7 @@ -const TagsHandler = require('./TagsHandler') -const SessionManager = require('../Authentication/SessionManager') -const Errors = require('../Errors/Errors') -const { expressify } = require('@overleaf/promise-utils') +import TagsHandler from './TagsHandler.js' +import SessionManager from '../Authentication/SessionManager.js' +import Errors from '../Errors/Errors.js' +import { expressify } from '@overleaf/promise-utils' async function _getTags(userId, _req, res) { if (!userId) { @@ -88,7 +88,7 @@ async function editTag(req, res) { res.status(204).end() } -module.exports = { +export default { apiGetAllTags: expressify(apiGetAllTags), getAllTags: expressify(getAllTags), createTag: expressify(createTag), diff --git a/services/web/app/src/Features/ThirdPartyDataStore/TpdsController.js b/services/web/app/src/Features/ThirdPartyDataStore/TpdsController.mjs similarity index 88% rename from services/web/app/src/Features/ThirdPartyDataStore/TpdsController.js rename to services/web/app/src/Features/ThirdPartyDataStore/TpdsController.mjs index f63b6959bf..a8cc4ef4b8 100644 --- a/services/web/app/src/Features/ThirdPartyDataStore/TpdsController.js +++ b/services/web/app/src/Features/ThirdPartyDataStore/TpdsController.mjs @@ -1,16 +1,16 @@ -const { expressify } = require('@overleaf/promise-utils') -const TpdsUpdateHandler = require('./TpdsUpdateHandler') -const UpdateMerger = require('./UpdateMerger') -const Errors = require('../Errors/Errors') -const logger = require('@overleaf/logger') -const Path = require('path') -const metrics = require('@overleaf/metrics') -const NotificationsBuilder = require('../Notifications/NotificationsBuilder') -const SessionManager = require('../Authentication/SessionManager') -const ProjectCreationHandler = require('../Project/ProjectCreationHandler') -const ProjectDetailsHandler = require('../Project/ProjectDetailsHandler') -const HttpErrorHandler = require('../Errors/HttpErrorHandler') -const TpdsQueueManager = require('./TpdsQueueManager') +import { expressify } from '@overleaf/promise-utils' +import TpdsUpdateHandler from './TpdsUpdateHandler.mjs' +import UpdateMerger from './UpdateMerger.js' +import Errors from '../Errors/Errors.js' +import logger from '@overleaf/logger' +import Path from 'path' +import metrics from '@overleaf/metrics' +import NotificationsBuilder from '../Notifications/NotificationsBuilder.js' +import SessionManager from '../Authentication/SessionManager.js' +import ProjectCreationHandler from '../Project/ProjectCreationHandler.js' +import ProjectDetailsHandler from '../Project/ProjectDetailsHandler.js' +import HttpErrorHandler from '../Errors/HttpErrorHandler.js' +import TpdsQueueManager from './TpdsQueueManager.mjs' async function createProject(req, res) { const { user_id: userId } = req.params @@ -197,7 +197,7 @@ function splitPath(projectId, path) { return { filePath, projectName } } -module.exports = { +export default { createProject: expressify(createProject), mergeUpdate: expressify(mergeUpdate), deleteUpdate: expressify(deleteUpdate), diff --git a/services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.js b/services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.mjs similarity index 61% rename from services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.js rename to services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.mjs index 160198e1a8..253d0f0d98 100644 --- a/services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.js +++ b/services/web/app/src/Features/ThirdPartyDataStore/TpdsQueueManager.mjs @@ -1,6 +1,6 @@ -const Settings = require('@overleaf/settings') -const OError = require('@overleaf/o-error') -const { fetchJson } = require('@overleaf/fetch-utils') +import Settings from '@overleaf/settings' +import OError from '@overleaf/o-error' +import { fetchJson } from '@overleaf/fetch-utils' async function getQueues(userId) { try { @@ -10,7 +10,7 @@ async function getQueues(userId) { } } -module.exports = { +export default { promises: { getQueues, }, diff --git a/services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.js b/services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.mjs similarity index 86% rename from services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.js rename to services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.mjs index c303f81559..d3de27d0ba 100644 --- a/services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.js +++ b/services/web/app/src/Features/ThirdPartyDataStore/TpdsUpdateHandler.mjs @@ -1,16 +1,16 @@ -const { callbackify } = require('util') -const UpdateMerger = require('./UpdateMerger') -const logger = require('@overleaf/logger') -const NotificationsBuilder = require('../Notifications/NotificationsBuilder') -const ProjectCreationHandler = require('../Project/ProjectCreationHandler') -const ProjectDeleter = require('../Project/ProjectDeleter') -const ProjectGetter = require('../Project/ProjectGetter') -const ProjectHelper = require('../Project/ProjectHelper') -const ProjectRootDocManager = require('../Project/ProjectRootDocManager') -const FileTypeManager = require('../Uploads/FileTypeManager') -const CooldownManager = require('../Cooldown/CooldownManager') -const Errors = require('../Errors/Errors') -const Modules = require('../../infrastructure/Modules') +import { callbackify } from 'util' +import UpdateMerger from './UpdateMerger.js' +import logger from '@overleaf/logger' +import NotificationsBuilder from '../Notifications/NotificationsBuilder.js' +import ProjectCreationHandler from '../Project/ProjectCreationHandler.js' +import ProjectDeleter from '../Project/ProjectDeleter.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import ProjectHelper from '../Project/ProjectHelper.js' +import ProjectRootDocManager from '../Project/ProjectRootDocManager.js' +import FileTypeManager from '../Uploads/FileTypeManager.js' +import CooldownManager from '../Cooldown/CooldownManager.js' +import Errors from '../Errors/Errors.js' +import Modules from '../../infrastructure/Modules.js' async function newUpdate( userId, @@ -189,7 +189,7 @@ async function createFolder(userId, projectId, projectName, path) { } } -module.exports = { +export default { newUpdate: callbackify(newUpdate), deleteUpdate: callbackify(deleteUpdate), createFolder: callbackify(createFolder), diff --git a/services/web/app/src/Features/TokenAccess/TokenAccessController.js b/services/web/app/src/Features/TokenAccess/TokenAccessController.mjs similarity index 91% rename from services/web/app/src/Features/TokenAccess/TokenAccessController.js rename to services/web/app/src/Features/TokenAccess/TokenAccessController.mjs index 158aa20003..e95ff4c963 100644 --- a/services/web/app/src/Features/TokenAccess/TokenAccessController.js +++ b/services/web/app/src/Features/TokenAccess/TokenAccessController.mjs @@ -1,29 +1,26 @@ -const AuthenticationController = require('../Authentication/AuthenticationController') -const SessionManager = require('../Authentication/SessionManager') -const TokenAccessHandler = require('./TokenAccessHandler') -const Errors = require('../Errors/Errors') -const logger = require('@overleaf/logger') -const settings = require('@overleaf/settings') -const OError = require('@overleaf/o-error') -const { expressify } = require('@overleaf/promise-utils') -const AuthorizationManager = require('../Authorization/AuthorizationManager') -const PrivilegeLevels = require('../Authorization/PrivilegeLevels') -const ProjectAuditLogHandler = require('../Project/ProjectAuditLogHandler') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const CollaboratorsInviteHandler = require('../Collaborators/CollaboratorsInviteHandler') -const CollaboratorsHandler = require('../Collaborators/CollaboratorsHandler') -const EditorRealTimeController = require('../Editor/EditorRealTimeController') -const CollaboratorsGetter = require('../Collaborators/CollaboratorsGetter') -const ProjectGetter = require('../Project/ProjectGetter') -const AsyncFormHelper = require('../Helpers/AsyncFormHelper') -const AnalyticsManager = require('../Analytics/AnalyticsManager') -const { - canRedirectToAdminDomain, -} = require('../Helpers/AdminAuthorizationHelper') -const { getSafeAdminDomainRedirect } = require('../Helpers/UrlHelper') -const UserGetter = require('../User/UserGetter') -const Settings = require('@overleaf/settings') -const LimitationsManager = require('../Subscription/LimitationsManager') +import AuthenticationController from '../Authentication/AuthenticationController.js' +import SessionManager from '../Authentication/SessionManager.js' +import TokenAccessHandler from './TokenAccessHandler.js' +import Errors from '../Errors/Errors.js' +import logger from '@overleaf/logger' +import OError from '@overleaf/o-error' +import { expressify } from '@overleaf/promise-utils' +import AuthorizationManager from '../Authorization/AuthorizationManager.js' +import PrivilegeLevels from '../Authorization/PrivilegeLevels.js' +import ProjectAuditLogHandler from '../Project/ProjectAuditLogHandler.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import CollaboratorsInviteHandler from '../Collaborators/CollaboratorsInviteHandler.mjs' +import CollaboratorsHandler from '../Collaborators/CollaboratorsHandler.js' +import EditorRealTimeController from '../Editor/EditorRealTimeController.js' +import CollaboratorsGetter from '../Collaborators/CollaboratorsGetter.js' +import ProjectGetter from '../Project/ProjectGetter.js' +import AsyncFormHelper from '../Helpers/AsyncFormHelper.js' +import AnalyticsManager from '../Analytics/AnalyticsManager.js' +import { canRedirectToAdminDomain } from '../Helpers/AdminAuthorizationHelper.js' +import { getSafeAdminDomainRedirect } from '../Helpers/UrlHelper.js' +import UserGetter from '../User/UserGetter.js' +import Settings from '@overleaf/settings' +import LimitationsManager from '../Subscription/LimitationsManager.js' const orderedPrivilegeLevels = [ PrivilegeLevels.NONE, @@ -167,7 +164,7 @@ async function checkAndGetProjectOrResponseAction( token ) if (!project) { - if (settings.overleaf) { + if (Settings.overleaf) { const v1ImportData = await _handleV1Project(token, userId) return [ null, @@ -645,7 +642,7 @@ async function moveReadWriteToReadOnly(req, res, next) { res.sendStatus(204) } -module.exports = { +export default { READ_ONLY_TOKEN_PATTERN: TokenAccessHandler.READ_ONLY_TOKEN_PATTERN, READ_AND_WRITE_TOKEN_PATTERN: TokenAccessHandler.READ_AND_WRITE_TOKEN_PATTERN, diff --git a/services/web/app/src/Features/TokenAccess/TokenAccessRouter.js b/services/web/app/src/Features/TokenAccess/TokenAccessRouter.mjs similarity index 78% rename from services/web/app/src/Features/TokenAccess/TokenAccessRouter.js rename to services/web/app/src/Features/TokenAccess/TokenAccessRouter.mjs index 54dfa11e0f..3f156505b1 100644 --- a/services/web/app/src/Features/TokenAccess/TokenAccessRouter.js +++ b/services/web/app/src/Features/TokenAccess/TokenAccessRouter.mjs @@ -1,8 +1,8 @@ -const AuthenticationController = require('../Authentication/AuthenticationController') -const AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware') -const TokenAccessController = require('./TokenAccessController') +import AuthenticationController from '../Authentication/AuthenticationController.js' +import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.js' +import TokenAccessController from './TokenAccessController.mjs' -module.exports = { +export default { apply(webRouter) { webRouter.get( `/project/:Project_id/sharing-updates`, diff --git a/services/web/app/src/Features/Tutorial/TutorialController.js b/services/web/app/src/Features/Tutorial/TutorialController.mjs similarity index 85% rename from services/web/app/src/Features/Tutorial/TutorialController.js rename to services/web/app/src/Features/Tutorial/TutorialController.mjs index 41a20a6803..4aadb6b451 100644 --- a/services/web/app/src/Features/Tutorial/TutorialController.js +++ b/services/web/app/src/Features/Tutorial/TutorialController.mjs @@ -1,6 +1,6 @@ -const SessionManager = require('../Authentication/SessionManager') -const TutorialHandler = require('./TutorialHandler') -const { expressify } = require('@overleaf/promise-utils') +import SessionManager from '../Authentication/SessionManager.js' +import TutorialHandler from './TutorialHandler.js' +import { expressify } from '@overleaf/promise-utils' const VALID_KEYS = [ 'react-history-buttons-tutorial', @@ -46,7 +46,7 @@ async function postponeTutorial(req, res, next) { res.sendStatus(204) } -module.exports = { +export default { completeTutorial: expressify(completeTutorial), postponeTutorial: expressify(postponeTutorial), } diff --git a/services/web/app/src/Features/Uploads/ProjectUploadController.js b/services/web/app/src/Features/Uploads/ProjectUploadController.mjs similarity index 84% rename from services/web/app/src/Features/Uploads/ProjectUploadController.js rename to services/web/app/src/Features/Uploads/ProjectUploadController.mjs index 15f6f6004d..877d577da7 100644 --- a/services/web/app/src/Features/Uploads/ProjectUploadController.js +++ b/services/web/app/src/Features/Uploads/ProjectUploadController.mjs @@ -1,18 +1,20 @@ -const logger = require('@overleaf/logger') -const metrics = require('@overleaf/metrics') -const fs = require('fs') -const Path = require('path') -const FileSystemImportManager = require('./FileSystemImportManager') -const ProjectUploadManager = require('./ProjectUploadManager') -const SessionManager = require('../Authentication/SessionManager') -const EditorController = require('../Editor/EditorController') -const ProjectLocator = require('../Project/ProjectLocator') -const Settings = require('@overleaf/settings') -const { InvalidZipFileError } = require('./ArchiveErrors') -const multer = require('multer') -const { defaultsDeep } = require('lodash') -const { expressify } = require('@overleaf/promise-utils') -const { DuplicateNameError } = require('../Errors/Errors') +import logger from '@overleaf/logger' +import metrics from '@overleaf/metrics' +import fs from 'fs' +import Path from 'path' +import FileSystemImportManager from './FileSystemImportManager.js' +import ProjectUploadManager from './ProjectUploadManager.js' +import SessionManager from '../Authentication/SessionManager.js' +import EditorController from '../Editor/EditorController.js' +import ProjectLocator from '../Project/ProjectLocator.js' +import Settings from '@overleaf/settings' +import { InvalidZipFileError } from './ArchiveErrors.js' +import multer from 'multer' +import lodash from 'lodash' +import { expressify } from '@overleaf/promise-utils' +import { DuplicateNameError } from '../Errors/Errors.js' + +const defaultsDeep = lodash.defaultsDeep const upload = multer( defaultsDeep( @@ -164,7 +166,7 @@ function multerMiddleware(req, res, next) { }) } -module.exports = { +export default { uploadProject, uploadFile: expressify(uploadFile), multerMiddleware, diff --git a/services/web/app/src/Features/Uploads/UploadsRouter.js b/services/web/app/src/Features/Uploads/UploadsRouter.mjs similarity index 74% rename from services/web/app/src/Features/Uploads/UploadsRouter.js rename to services/web/app/src/Features/Uploads/UploadsRouter.mjs index c7c5073768..83df92d6f9 100644 --- a/services/web/app/src/Features/Uploads/UploadsRouter.js +++ b/services/web/app/src/Features/Uploads/UploadsRouter.mjs @@ -1,9 +1,9 @@ -const AuthorizationMiddleware = require('../Authorization/AuthorizationMiddleware') -const AuthenticationController = require('../Authentication/AuthenticationController') -const ProjectUploadController = require('./ProjectUploadController') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') -const Settings = require('@overleaf/settings') +import AuthorizationMiddleware from '../Authorization/AuthorizationMiddleware.js' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import ProjectUploadController from './ProjectUploadController.mjs' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' +import Settings from '@overleaf/settings' const rateLimiters = { projectUpload: new RateLimiter('project-upload', { @@ -16,7 +16,7 @@ const rateLimiters = { }), } -module.exports = { +export default { apply(webRouter) { webRouter.post( '/project/new/upload', diff --git a/services/web/app/src/Features/User/UserPagesController.js b/services/web/app/src/Features/User/UserPagesController.mjs similarity index 91% rename from services/web/app/src/Features/User/UserPagesController.js rename to services/web/app/src/Features/User/UserPagesController.mjs index 0f7564a166..31408c3880 100644 --- a/services/web/app/src/Features/User/UserPagesController.js +++ b/services/web/app/src/Features/User/UserPagesController.mjs @@ -1,17 +1,17 @@ -const UserGetter = require('./UserGetter') -const OError = require('@overleaf/o-error') -const UserSessionsManager = require('./UserSessionsManager') -const logger = require('@overleaf/logger') -const Settings = require('@overleaf/settings') -const AuthenticationController = require('../Authentication/AuthenticationController') -const SessionManager = require('../Authentication/SessionManager') -const NewsletterManager = require('../Newsletter/NewsletterManager') -const SubscriptionLocator = require('../Subscription/SubscriptionLocator') -const _ = require('lodash') -const { expressify } = require('@overleaf/promise-utils') -const Features = require('../../infrastructure/Features') -const SplitTestHandler = require('../SplitTests/SplitTestHandler') -const Modules = require('../../infrastructure/Modules') +import UserGetter from './UserGetter.js' +import OError from '@overleaf/o-error' +import UserSessionsManager from './UserSessionsManager.js' +import logger from '@overleaf/logger' +import Settings from '@overleaf/settings' +import AuthenticationController from '../Authentication/AuthenticationController.js' +import SessionManager from '../Authentication/SessionManager.js' +import NewsletterManager from '../Newsletter/NewsletterManager.js' +import SubscriptionLocator from '../Subscription/SubscriptionLocator.js' +import _ from 'lodash' +import { expressify } from '@overleaf/promise-utils' +import Features from '../../infrastructure/Features.js' +import SplitTestHandler from '../SplitTests/SplitTestHandler.js' +import Modules from '../../infrastructure/Modules.js' async function settingsPage(req, res) { const userId = SessionManager.getLoggedInUserId(req.session) @@ -324,4 +324,4 @@ const UserPagesController = { }, } -module.exports = UserPagesController +export default UserPagesController diff --git a/services/web/app/src/Features/UserMembership/UserMembershipController.js b/services/web/app/src/Features/UserMembership/UserMembershipController.mjs similarity index 91% rename from services/web/app/src/Features/UserMembership/UserMembershipController.js rename to services/web/app/src/Features/UserMembership/UserMembershipController.mjs index 3c406e6e19..307d21de3e 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipController.js +++ b/services/web/app/src/Features/UserMembership/UserMembershipController.mjs @@ -1,16 +1,16 @@ -const SessionManager = require('../Authentication/SessionManager') -const UserMembershipHandler = require('./UserMembershipHandler') -const Errors = require('../Errors/Errors') -const EmailHelper = require('../Helpers/EmailHelper') -const { csvAttachment } = require('../../infrastructure/Response') -const { +import SessionManager from '../Authentication/SessionManager.js' +import UserMembershipHandler from './UserMembershipHandler.js' +import Errors from '../Errors/Errors.js' +import EmailHelper from '../Helpers/EmailHelper.js' +import { csvAttachment } from '../../infrastructure/Response.js' +import { UserIsManagerError, UserAlreadyAddedError, UserNotFoundError, -} = require('./UserMembershipErrors') -const { SSOConfig } = require('../../models/SSOConfig') -const CSVParser = require('json2csv').Parser -const { expressify } = require('@overleaf/promise-utils') +} from './UserMembershipErrors.js' +import { SSOConfig } from '../../models/SSOConfig.js' +import { Parser as CSVParser } from 'json2csv' +import { expressify } from '@overleaf/promise-utils' async function manageGroupMembers(req, res, next) { const { entity: subscription, entityConfig } = req @@ -99,7 +99,7 @@ async function _renderManagersPage(req, res, next, template) { }) } -module.exports = { +export default { manageGroupMembers: expressify(manageGroupMembers), manageGroupManagers: expressify(manageGroupManagers), manageInstitutionManagers: expressify(manageInstitutionManagers), diff --git a/services/web/app/src/Features/UserMembership/UserMembershipRouter.js b/services/web/app/src/Features/UserMembership/UserMembershipRouter.mjs similarity index 89% rename from services/web/app/src/Features/UserMembership/UserMembershipRouter.js rename to services/web/app/src/Features/UserMembership/UserMembershipRouter.mjs index db2aef6a9b..7013b1c93f 100644 --- a/services/web/app/src/Features/UserMembership/UserMembershipRouter.js +++ b/services/web/app/src/Features/UserMembership/UserMembershipRouter.mjs @@ -1,9 +1,9 @@ -const UserMembershipMiddleware = require('./UserMembershipMiddleware') -const UserMembershipController = require('./UserMembershipController') -const SubscriptionGroupController = require('../Subscription/SubscriptionGroupController') -const TeamInvitesController = require('../Subscription/TeamInvitesController') -const { RateLimiter } = require('../../infrastructure/RateLimiter') -const RateLimiterMiddleware = require('../Security/RateLimiterMiddleware') +import UserMembershipMiddleware from './UserMembershipMiddleware.js' +import UserMembershipController from './UserMembershipController.mjs' +import SubscriptionGroupController from '../Subscription/SubscriptionGroupController.mjs' +import TeamInvitesController from '../Subscription/TeamInvitesController.mjs' +import { RateLimiter } from '../../infrastructure/RateLimiter.js' +import RateLimiterMiddleware from '../Security/RateLimiterMiddleware.js' const rateLimiters = { createTeamInvite: new RateLimiter('create-team-invite', { @@ -16,7 +16,7 @@ const rateLimiters = { }), } -module.exports = { +export default { apply(webRouter) { // group members routes webRouter.get( diff --git a/services/web/app/src/Features/V1/V1Handler.js b/services/web/app/src/Features/V1/V1Handler.mjs similarity index 92% rename from services/web/app/src/Features/V1/V1Handler.js rename to services/web/app/src/Features/V1/V1Handler.mjs index 447a2f4635..7c5f2d39ca 100644 --- a/services/web/app/src/Features/V1/V1Handler.js +++ b/services/web/app/src/Features/V1/V1Handler.mjs @@ -10,13 +10,13 @@ * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ -let V1Handler -const OError = require('@overleaf/o-error') -const V1Api = require('./V1Api') -const Settings = require('@overleaf/settings') -const logger = require('@overleaf/logger') +import OError from '@overleaf/o-error' +import V1Api from './V1Api.js' +import logger from '@overleaf/logger' -module.exports = V1Handler = { +let V1Handler + +export default V1Handler = { authWithV1(email, password, callback) { return V1Api.request( { diff --git a/services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.js b/services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.mjs similarity index 83% rename from services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.js rename to services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.mjs index 83dbd28b4b..78747b8880 100644 --- a/services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.js +++ b/services/web/test/unit/src/BetaProgram/BetaProgramControllerTests.mjs @@ -1,8 +1,11 @@ -const SandboxedModule = require('sandboxed-module') -const path = require('path') -const sinon = require('sinon') -const { expect } = require('chai') -const MockResponse = require('../helpers/MockResponse') +import esmock from 'esmock' +import path from 'node:path' +import sinon from 'sinon' +import { expect } from 'chai' +import MockResponse from '../helpers/MockResponse.js' +import { fileURLToPath } from 'node:url' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) const modulePath = path.join( __dirname, @@ -10,7 +13,7 @@ const modulePath = path.join( ) describe('BetaProgramController', function () { - beforeEach(function () { + beforeEach(async function () { this.user = { _id: (this.user_id = 'a_simple_id'), email: 'user@example.com', @@ -28,28 +31,28 @@ describe('BetaProgramController', function () { sessionMaintenance: sinon.stub(), }, } - this.BetaProgramController = SandboxedModule.require(modulePath, { - requires: { - '../SplitTests/SplitTestSessionHandler': this.SplitTestSessionHandler, - './BetaProgramHandler': (this.BetaProgramHandler = { + this.BetaProgramController = await esmock.strict(modulePath, { + '../../../../app/src/Features/SplitTests/SplitTestSessionHandler': + this.SplitTestSessionHandler, + '../../../../app/src/Features/BetaProgram/BetaProgramHandler': + (this.BetaProgramHandler = { promises: { optIn: sinon.stub().resolves(), optOut: sinon.stub().resolves(), }, }), - '../User/UserGetter': (this.UserGetter = { - promises: { - getUser: sinon.stub().resolves(), - }, + '../../../../app/src/Features/User/UserGetter': (this.UserGetter = { + promises: { + getUser: sinon.stub().resolves(), + }, + }), + '@overleaf/settings': (this.settings = { + languages: {}, + }), + '../../../../app/src/Features/Authentication/AuthenticationController': + (this.AuthenticationController = { + getLoggedInUserId: sinon.stub().returns(this.user._id), }), - '@overleaf/settings': (this.settings = { - languages: {}, - }), - '../Authentication/AuthenticationController': - (this.AuthenticationController = { - getLoggedInUserId: sinon.stub().returns(this.user._id), - }), - }, }) this.res = new MockResponse() this.next = sinon.stub() diff --git a/services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.js b/services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.mjs similarity index 82% rename from services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.js rename to services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.mjs index 5f8f9be3c9..2b72271fd5 100644 --- a/services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.js +++ b/services/web/test/unit/src/BetaProgram/BetaProgramHandlerTests.mjs @@ -1,14 +1,19 @@ -const SandboxedModule = require('sandboxed-module') -const path = require('path') +import esmock from 'esmock' +import path from 'node:path' + +import sinon from 'sinon' +import { expect } from 'chai' +import { fileURLToPath } from 'node:url' + +const __dirname = fileURLToPath(new URL('.', import.meta.url)) + const modulePath = path.join( __dirname, '../../../../app/src/Features/BetaProgram/BetaProgramHandler' ) -const sinon = require('sinon') -const { expect } = require('chai') describe('BetaProgramHandler', function () { - beforeEach(function () { + beforeEach(async function () { this.user_id = 'some_id' this.user = { _id: this.user_id, @@ -17,20 +22,19 @@ describe('BetaProgramHandler', function () { betaProgram: false, save: sinon.stub().callsArgWith(0, null), } - this.handler = SandboxedModule.require(modulePath, { - requires: { - '@overleaf/metrics': { - inc: sinon.stub(), + this.handler = await esmock.strict(modulePath, { + '@overleaf/metrics': { + inc: sinon.stub(), + }, + '../../../../app/src/Features/User/UserUpdater': (this.UserUpdater = { + promises: { + updateUser: sinon.stub().resolves(), }, - '../User/UserUpdater': (this.UserUpdater = { - promises: { - updateUser: sinon.stub().resolves(), - }, - }), - '../Analytics/AnalyticsManager': (this.AnalyticsManager = { + }), + '../../../../app/src/Features/Analytics/AnalyticsManager': + (this.AnalyticsManager = { setUserPropertyForUserInBackground: sinon.stub(), }), - }, }) })