Skip to content

Backend esm vitest#7879

Closed
deepshekhardas wants to merge 1 commit into
ether:developfrom
deepshekhardas:fix/pr-7605-esm-vitest
Closed

Backend esm vitest#7879
deepshekhardas wants to merge 1 commit into
ether:developfrom
deepshekhardas:fix/pr-7605-esm-vitest

Conversation

@deepshekhardas
Copy link
Copy Markdown

@deepshekhardas deepshekhardas commented Jun 2, 2026

Port of #7605

Converts backend tests from mocha to vitest and migrates to ESM.

Rebased onto latest develop (resolved conflicts: backend-tests.yml, DB.ts, server.ts, package.json, pnpm-lock.yaml).

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented Jun 2, 2026

Review Summary by Qodo

(Agentic_describe updated until commit ef58b53)

Port backend to ESM and Vitest with simplified business logic

✨ Enhancement 🧪 Tests

Grey Divider

Walkthroughs

Description
• **Comprehensive ESM migration**: Converts entire backend codebase from CommonJS
  (require/exports) to ES modules (import/export) with .js file extensions throughout
• **Vitest adoption**: Migrates backend tests from Mocha to Vitest with updated syntax (arrow
  functions, describe.skipIf()/it.skipIf() for conditional skipping, removal of this.timeout())
• **Simplified business logic**: Removes author attribution tracking, maintenance window scheduling,
  Node version checks, email notifications, and complex filtering pipelines across multiple modules
• **Enhanced type safety**: Adds TypeScript type annotations, improves function signatures with
  nullable/optional parameters, and adds type assertions for complex scenarios
• **Module bridging**: Implements createRequire bridges and dynamic imports for lazy-loading
  optional dependencies and handling circular dependencies
• **ESM polyfills**: Adds __filename and __dirname polyfills using import.meta.url for test
  utilities
• **Backward compatibility**: Maintains compatibility through default exports, re-export aliases,
  and namespace imports where needed
• **Updater refactoring**: Simplifies version checking to focus on vulnerability detection, removes
  maintenance window logic, and updates comparison functions (isMajorBehind, isVulnerable)
• **Test cleanup**: Removes obsolete test suites (CJS compatibility tests, email notification tests)
  and refactors remaining tests for Vitest patterns
Diagram
flowchart LR
  CJS["CommonJS<br/>require/exports"] -->|"ESM conversion<br/>with .js extensions"| ESM["ES Modules<br/>import/export"]
  Mocha["Mocha Tests<br/>function syntax"] -->|"Vitest migration<br/>arrow functions"| Vitest["Vitest Tests<br/>skipIf patterns"]
  Complex["Complex Logic<br/>authors, maintenance,<br/>email, filters"] -->|"Simplification<br/>removal"| Simple["Simplified Logic<br/>vulnerability focus"]
  ESM --> TypeScript["Enhanced<br/>Type Safety"]
  ESM --> Bridging["Module Bridging<br/>createRequire"]
  Vitest --> Polyfills["ESM Polyfills<br/>__filename/__dirname"]

Loading

Grey Divider

File Changes

1. src/node/db/API.ts ✨ Enhancement +78/-103

ESM migration and CommonJS to ES modules conversion

• Converted from CommonJS (require/exports) to ESM (import/export) with .js file
 extensions
• Changed all exports.functionName to export const functionName declarations
• Updated imports to use namespace imports (import * as) for modules that export multiple
 functions
• Simplified restoreRevision function by removing author attribution logic for historical ops
• Fixed type signatures for rev parameter to accept string|number and made optional where
 appropriate

src/node/db/API.ts


2. src/tests/backend/specs/export.ts 🧪 Tests +122/-114

ESM migration with vitest conditional skipping patterns

• Added ESM polyfills for __filename and __dirname using import.meta.url
• Converted from CommonJS to ESM imports with .js extensions
• Added module resolution probing for optional dependencies (html-to-docx, pdfkit,
 htmlparser2)
• Replaced this.skip() patterns with describe.skipIf() and it.skipIf() for conditional test
 skipping
• Changed all test callback functions from function() to arrow functions () =>

src/tests/backend/specs/export.ts


3. src/node/handler/PadMessageHandler.ts ✨ Enhancement +85/-68

ESM conversion with namespace imports and default export

• Converted from CommonJS to ESM with .js file extensions on all imports
• Changed exports.functionName to export const functionName declarations
• Renamed internal socketio variable to socketioServer for clarity
• Added default export object for backward compatibility with existing import patterns
• Updated imports to use namespace imports for modules exporting multiple functions

src/node/handler/PadMessageHandler.ts


View more (163)
4. src/node/updater/index.ts ✨ Enhancement +30/-205

ESM migration with simplified updater logic

• Converted all imports to ESM with .js extensions
• Removed email sending implementation (buildTransport, smtpTransportCache,
 notifyApplyFailure)
• Removed maintenance window and Node version checking logic from scheduler
• Simplified performCheck and scheduler decision logic by removing related parameters
• Updated imports to use correct function names (isMajorBehind, isVulnerable instead of
 isMinorOrMoreBehind)

src/node/updater/index.ts


5. src/node/db/Pad.ts ✨ Enhancement +39/-130

ESM migration with simplified author attribution

• Converted from CommonJS to ESM with .js file extensions
• Changed exports.cleanText to export const cleanText and exports.Pad to export { Pad }
• Removed _assertInsertOpsCarryAuthor validation method and related author attribution logic
• Changed private class members to public (db, atext, pool, head, chatHead, id)
• Simplified init and copyPadWithoutHistory by removing system author fallback logic

src/node/db/Pad.ts


6. src/node/hooks/express/adminsettings.ts ✨ Enhancement +125/-130

ESM migration with simplified pad loading logic

• Converted imports to ESM with .js extensions
• Removed PAD_FILTERS and PadFilter type imports (no longer used)
• Removed mapWithConcurrency helper function and PAD_HYDRATE_CONCURRENCY constant
• Simplified padLoad handler by removing complex filter/sort pipeline and reverting to simpler
 sequential logic
• Removed redactSettings call from settings emission

src/node/hooks/express/adminsettings.ts


7. src/tests/backend/specs/import.ts 🧪 Tests +62/-66

ESM migration with vitest conditional skipping

• Added ESM polyfills for __filename and __dirname using import.meta.url
• Converted from CommonJS to ESM imports with .js extensions
• Added module resolution probing for optional dependencies (mammoth, html-to-docx)
• Replaced this.skip() patterns with describe.skipIf() and it.skipIf() for conditional test
 skipping
• Changed all test callback functions from function() to arrow functions () =>

src/tests/backend/specs/import.ts


8. src/node/hooks/express/updateActions.ts ✨ Enhancement +17/-46

ESM migration for update actions module

• Converted all imports to ESM with .js extensions
• Updated import paths to use index.js for updater module exports
• Removed import of notifyApplyFailure function (no longer exported)

src/node/hooks/express/updateActions.ts


9. src/tests/backend/specs/clientvar_rev_consistency.ts 🧪 Tests +14/-9

ESM migration with polyfills for test utilities

• Added ESM polyfills for __filename and __dirname using import.meta.url
• Converted from CommonJS to ESM imports with .js extensions
• Changed require('assert').strict to import assert from 'assert'
• Updated pluginDefs import and assigned to plugins variable for compatibility

src/tests/backend/specs/clientvar_rev_consistency.ts


10. src/node/server.ts ✨ Enhancement +55/-36

Backend server module ESM migration with Vitest compatibility

• Migrated from CommonJS require() to ESM import statements with .js extensions
• Converted exports.start, exports.stop, and exports.exit to named export const functions
• Added forceExit() helper to handle process exit differently in Vitest environment
• Replaced require.main === module check with ESM-equivalent using import.meta.url and
 fileURLToPath()
• Changed dynamic require('wtfnode') to await import('wtfnode')

src/node/server.ts


11. src/node/db/AuthorManager.ts ✨ Enhancement +31/-24

AuthorManager module ESM conversion with improved type safety

• Converted all exports.X to export const X named exports
• Migrated require() calls to ESM import statements with .js extensions
• Added createRequire bridge for lazy-loading modules to avoid circular dependencies
• Updated function signatures with improved TypeScript types (e.g., nullable parameters)
• Added re-export alias for deprecated getAuthor4Token function

src/node/db/AuthorManager.ts


12. src/node/utils/ImportEtherpad.ts ✨ Enhancement +10/-189

ImportEtherpad ESM migration with sanitization logic removal

• Removed large block of sanitization logic (200+ lines) for handling unattributed insert ops
• Converted require() calls to ESM import statements with .js extensions
• Changed exports.setPadRaw to export const setPadRaw
• Removed dynamic import of ueberdb2 Database class (now imported at top level)
• Simplified function by removing pre-pass sanitization and related helper functions

src/node/utils/ImportEtherpad.ts


13. src/node/hooks/express/updateStatus.ts ✨ Enhancement +39/-124

Version status endpoint simplified with global caching strategy

• Removed per-(padId, authorId) LRU cache and replaced with simple global badge cache
• Simplified computeOutdated() to return only vulnerability/severity status, not per-pad data
• Removed resolveRequestAuthor() and firstAuthorOf() helper functions
• Converted require() to ESM import statements with .js extensions
• Simplified /api/version-status endpoint to return only {outdated: value} object

src/node/hooks/express/updateStatus.ts


14. src/node/handler/ImportHandler.ts ✨ Enhancement +23/-25

ImportHandler ESM migration with simplified random generation

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.doImport to export const doImport
• Renamed internal doImport() function to performImport() to avoid naming conflict
• Replaced crypto.randomBytes() with Math.random() for temp file naming
• Added type annotations and improved error handling for form parsing

src/node/handler/ImportHandler.ts


15. src/static/js/pluginfw/plugins.ts ✨ Enhancement +119/-28

Plugin system ESM migration with server hook extraction

• Converted all require() calls to ESM import statements with .js extensions
• Changed all exports.X to export const X named exports
• Added new loadServerHook() and extractServerHooks() functions for dynamic hook loading
• Updated pathNormalization() to handle both relative and absolute module paths
• Added default export object containing all exported functions

src/static/js/pluginfw/plugins.ts


16. src/node/db/SessionManager.ts ✨ Enhancement +16/-16

SessionManager ESM migration with namespace imports

• Converted all require() calls to ESM import statements with .js extensions
• Changed all exports.X to export const X named exports
• Updated imports to use namespace imports (import * as) for manager modules
• Added type coercion for validUntil parameter parsing

src/node/db/SessionManager.ts


17. src/node/handler/ExportHandler.ts ✨ Enhancement +26/-24

ExportHandler ESM migration with lazy CJS bridge for optional modules

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.doExport to export const doExport
• Added createRequire bridge for lazy-loading optional native export modules
• Replaced crypto.randomBytes() with Math.random() for temp file naming
• Moved revision validation after Content-Disposition header setup

src/node/handler/ExportHandler.ts


18. src/tests/backend-new/specs/updater/Notifier.test.ts 🧪 Tests +37/-67

Notifier tests refactored for vulnerability-focused email logic

• Updated imports to use .js extensions for ESM compatibility
• Added isVulnerable field to test base object
• Removed decideOutcomeEmail test suite entirely
• Simplified test cases to focus on vulnerability detection and re-emission logic
• Updated test expectations for new email kinds (vulnerable, vulnerable-new-release)

src/tests/backend-new/specs/updater/Notifier.test.ts


19. src/node/utils/ExportHtml.ts ✨ Enhancement +26/-28

ExportHtml ESM migration with enhanced type safety

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.getPadHTMLDocument and exports.getPadHTML to named exports
• Updated function signatures with improved TypeScript types for optional/nullable parameters
• Added type assertions for complex type narrowing scenarios
• Improved type safety for authorColors and line object properties

src/node/utils/ExportHtml.ts


20. src/tests/backend/specs/api/api.ts 🧪 Tests +28/-27

API tests ESM migration with Vitest syntax updates

• Converted all require() calls to ESM import statements with .js extensions
• Added fileURLToPath import and __filename constant for ESM compatibility
• Changed test function syntax from function() {} to arrow functions () => {}
• Removed this.timeout() calls (Vitest uses different timeout mechanism)
• Updated common import to namespace import syntax

src/tests/backend/specs/api/api.ts


21. src/tests/backend/specs/settings.ts 🧪 Tests +25/-72

Settings tests ESM migration with CJS compat tests removed

• Converted all require() calls to ESM import statements with .js extensions
• Added fileURLToPath and dirname imports to define __filename and __dirname
• Removed entire "CJS compatibility for plugin consumers" test suite
• Updated test to use imported settings object directly instead of require()
• Added comment explaining ESM/CJS plugin contract migration

src/tests/backend/specs/settings.ts


22. src/node/db/GroupManager.ts ✨ Enhancement +17/-17

GroupManager ESM migration with namespace imports

• Converted all require() calls to ESM import statements with .js extensions
• Changed all exports.X to export const X named exports
• Updated imports to use namespace imports (import * as) for manager modules
• Maintained function signatures and logic without behavioral changes

src/node/db/GroupManager.ts


23. src/node/eejs/index.ts ✨ Enhancement +72/-45

EEJS template engine ESM migration with module bridging

• Converted all require() calls to ESM import statements with .js extensions
• Refactored exports object to named eejs object with proper TypeScript interface
• Added templateModules Map for bridging template requires to ESM modules
• Added createRequire bridge for lazy-loading template dependencies
• Added fileURLToPath and dirname imports for ESM __filename and __dirname

src/node/eejs/index.ts


24. src/node/hooks/express.ts ✨ Enhancement +26/-25

Express hooks ESM migration with explicit protocol imports

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.server and exports.sessionMiddleware to export let declarations
• Added explicit https and http imports instead of dynamic requires
• Updated all function exports to export const syntax
• Maintained all existing functionality and logic

src/node/hooks/express.ts


25. src/tests/backend-new/specs/updater/versionCompare.test.ts 🧪 Tests +47/-34

Version comparison tests refactored for vulnerability detection

• Updated imports to use .js extensions for ESM compatibility
• Removed several test cases for parseSemver and compareSemver functions
• Added new test suite for isMajorBehind() function
• Added new test suites for parseVulnerableBelow() and isVulnerable() functions
• Reorganized test structure to focus on vulnerability detection logic

src/tests/backend-new/specs/updater/versionCompare.test.ts


26. src/node/handler/APIHandler.ts ✨ Enhancement +25/-39

APIHandler ESM migration with simplified authentication logic

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.latestApiVersion, exports.version, and exports.handle to named exports
• Added jwtDecode import for JWT token decoding
• Simplified API key validation by removing constant-time comparison
• Simplified OAuth JWT verification logic with inline payload checking

src/node/handler/APIHandler.ts


27. src/node/hooks/express/apicalls.ts ✨ Enhancement +7/-6

API calls hook ESM migration with explicit imports

• Converted all require() calls to ESM import statements with .js extensions
• Changed exports.expressPreSession to export const expressPreSession
• Added explicit Formidable and util imports instead of dynamic requires
• Added type assertion for JSON parsing result

src/node/hooks/express/apicalls.ts


28. src/node/utils/customError.ts ✨ Enhancement +1/-1

CustomError class ESM default export conversion

• Changed module.exports = CustomError to export default CustomError
• Converted CommonJS export to ESM default export

src/node/utils/customError.ts


29. src/static/js/pluginfw/hooks.ts ✨ Enhancement +26/-16

Convert hooks module to ESM with TypeScript types

• Converted from CommonJS (require/exports) to ESM (import/export)
• Added TypeScript type annotations to function parameters
• Updated internal references from exports. to direct function names
• Added default export containing all public functions

src/static/js/pluginfw/hooks.ts


30. src/tests/backend/specs/admin/anonymizeAuthorSocket.ts ✨ Enhancement +7/-83

Simplify admin socket setup and modernize test syntax

• Removed complex adminSocketWithProbe function and timeout logic
• Simplified test setup by directly calling adminSocket() without probing
• Converted Mocha arrow functions from function() to () =>
• Removed setupCompleted flag and related conditional logic

src/tests/backend/specs/admin/anonymizeAuthorSocket.ts


31. src/tests/backend/specs/socketio.ts ✨ Enhancement +41/-21

Migrate socketio tests to ESM with improved component tracking

• Converted from CommonJS to ESM imports with .js extensions
• Added __filename and __dirname polyfills for ESM
• Replaced this.test!.fullTitle() with explicit moduleName variables to avoid test context
 dependency
• Introduced registerComponent helper and componentNames tracking for cleaner cleanup

src/tests/backend/specs/socketio.ts


32. src/node/hooks/express/webaccess.ts ✨ Enhancement +16/-14

Convert webaccess module to ESM with setter for mutable state

• Converted all imports from CommonJS to ESM with .js extensions
• Changed exports. to export const for all public functions
• Added setAuthnFailureDelayMs setter function for mutable authnFailureDelayMs
• Added re-export alias checkAccess for checkAccessMiddleware

src/node/hooks/express/webaccess.ts


33. src/node/db/PadManager.ts ✨ Enhancement +17/-17

Convert PadManager to ESM module format

• Converted all imports from CommonJS to ESM with .js extensions
• Changed exports. to export const for all public functions
• Updated internal function calls to use direct names instead of exports.
• Maintained backward compatibility alias doesPadExists

src/node/db/PadManager.ts


34. src/static/js/pad.ts ✨ Enhancement +41/-41

Migrate pad module to ESM with state management function

• Converted from CommonJS to ESM imports with .js extensions
• Added setBaseURL function to manage mutable baseURL state
• Replaced exports. assignments with export statements
• Removed import of maybeShowOutdatedNotice and related call
• Added import of pad_version_badge.js

src/static/js/pad.ts


35. src/tests/backend/common.ts ✨ Enhancement +28/-26

Migrate test common utilities to ESM and vitest

• Converted from CommonJS to ESM imports with .js extensions
• Replaced Mocha before/after with vitest beforeAll
• Removed after hook registration (server cleanup deferred to process exit)
• Added setAuthnFailureDelayMs function call instead of direct assignment
• Added null check for server.start() return value

src/tests/backend/common.ts


36. src/node/updater/Scheduler.ts ✨ Enhancement +7/-43

Remove maintenance window scheduling logic

• Removed maintenanceWindow parameter from DecideScheduleInput interface
• Removed maintenance window snapping logic from decideSchedule function
• Removed defer action and maintenance window checks from decideTriggerApply
• Simplified return logic by removing window-related reason codes

src/node/updater/Scheduler.ts


37. src/node/db/DB.ts ✨ Enhancement +39/-30

Convert DB module to ESM with improved shutdown safety

• Converted from CommonJS to ESM with dynamic import of ueberdb2
• Changed exports.db to module object pattern for re-bindable methods
• Added null checks during shutdown to prevent crashes from background timers
• Wrapped database methods with safety guards for closed database state

src/node/db/DB.ts


38. src/node/hooks/express/specialpages.ts ✨ Enhancement +16/-15

Convert specialpages hooks to ESM format

• Converted all imports from CommonJS to ESM with .js extensions
• Changed exports. to export const for hook functions
• Added import of stats module
• Updated require() call to stats.toJSON() direct call

src/node/hooks/express/specialpages.ts


39. src/static/js/timeslider.ts ✨ Enhancement +24/-23

Migrate timeslider to ESM with async module loading

• Converted from CommonJS to ESM imports with .js extensions
• Added setBaseURL function for mutable state management
• Changed exports.baseURL to local baseURL variable
• Converted handleClientVars to async and used dynamic imports
• Changed exports.socket and exports.BroadcastSlider to window. assignments

src/static/js/timeslider.ts


40. src/node/hooks/express/openapi.ts ✨ Enhancement +13/-14

Convert openapi hooks to ESM with corrected error class

• Converted imports to ESM with .js extensions and type modifiers
• Changed CommonJS requires to ESM imports for openapi-backend, formidable, etc.
• Updated exports. to export const for hook functions
• Fixed createHTTPError.InternalError to createHTTPError.InternalServerError
• Changed final exports to named export syntax

src/node/hooks/express/openapi.ts


41. src/tests/backend/specs/api/importexportGetPost.ts ✨ Enhancement +17/-21

Migrate import/export tests to ESM with conditional skipping

• Converted from CommonJS to ESM imports with .js extensions
• Added __filename and __dirname polyfills for ESM
• Removed this.timeout() calls from describe and before blocks
• Changed describe.skip pattern to use conditional describeSoffice variable

src/tests/backend/specs/api/importexportGetPost.ts


42. src/node/utils/ImportHtml.ts ✨ Enhancement +8/-35

Convert ImportHtml to ESM and remove author attribution

• Converted imports to ESM with .js extensions
• Removed AttributeMap import and related author attribution logic
• Removed SYSTEM_AUTHOR_ID constant and effective author ID calculation
• Simplified changeset building to use raw attributes without author merging

src/node/utils/ImportHtml.ts


43. src/tests/backend/specs/api/deletePad.ts ✨ Enhancement +10/-11

Migrate deletePad tests to ESM with modern syntax

• Converted imports to ESM with .js extensions
• Changed Mocha function() syntax to arrow functions () =>
• Removed this.timeout() calls from test hooks

src/tests/backend/specs/api/deletePad.ts


44. src/tests/backend/specs/Stream.ts ✨ Enhancement +14/-11

Convert Stream tests to ESM with iterator type safety

• Converted imports to ESM with .js extensions
• Added __filename polyfill using fileURLToPath
• Added type annotations to DemoIterable class methods
• Added non-null assertion operators (!) for optional iterator methods

src/tests/backend/specs/Stream.ts


45. src/tests/backend/specs/chat.ts ✨ Enhancement +24/-15

Migrate chat tests to ESM with explicit test titles

• Converted imports to ESM with .js extensions
• Added __filename and __dirname polyfills for ESM
• Replaced this.test!.title with explicit testTitle variables in test cases
• Changed Mocha function() to arrow functions where applicable

src/tests/backend/specs/chat.ts


46. src/node/utils/Settings.ts ✨ Enhancement +21/-23

Convert Settings to ESM with CJS compatibility layer

• Converted imports to ESM with .js extensions
• Added createRequire for CJS compatibility in ESM context
• Removed CJS module.exports compatibility shim (dead code in ESM)
• Updated getEpVersion to use requireFromHere instead of direct require
• Updated reloadSettings to call getEpVersion() instead of requiring package.json

src/node/utils/Settings.ts


47. src/static/js/ace2_inner.ts ✨ Enhancement +27/-22

Convert ace2_inner to ESM with top-level imports

• Converted all imports to ESM with .js extensions
• Moved module-level requires inside Ace2Inner function to top-level imports
• Added default export with init function
• Updated internal references to use imported names directly

src/static/js/ace2_inner.ts


48. src/node/updater/UpdatePolicy.ts ✨ Enhancement +13/-37

Remove maintenance window policy validation

• Removed maintenanceWindow parameter from PolicyInput interface
• Removed maintenance window validation logic from evaluatePolicy
• Removed window-related reason codes from return value
• Simplified canAutonomous logic to depend only on tier and terminal status

src/node/updater/UpdatePolicy.ts


49. src/node/utils/LibreOffice.ts ✨ Enhancement +17/-17

Convert LibreOffice utilities to ESM format

• Converted all imports from CommonJS to ESM
• Changed require('fs').promises to import { promises as fs }
• Updated exports.convertFile to export const convertFile
• Added non-null assertions for p.child property access

src/node/utils/LibreOffice.ts


50. src/node/updater/preflight.ts ✨ Enhancement +4/-34

Remove Node engine version preflight checks

• Removed currentNodeVersion parameter from PreflightInput interface
• Removed readTargetEnginesNode function from PreflightDeps interface
• Removed node-engine-mismatch from PreflightReason type
• Removed detail field from PreflightResult type
• Removed Node engine version checking logic

src/node/updater/preflight.ts


51. src/tests/backend/specs/sessionIdCookie.ts ✨ Enhancement +11/-12

Migrate sessionIdCookie tests to ESM with modern syntax

• Converted imports to ESM with .js extensions
• Changed Mocha function() syntax to arrow functions () =>
• Removed this.timeout() calls from describe and test hooks

src/tests/backend/specs/sessionIdCookie.ts


52. src/tests/backend-new/specs/updater/updateLog.test.ts ✨ Enhancement +6/-6

Update import paths for ESM in updateLog tests

• Updated import paths to include .js extensions for ESM compatibility

src/tests/backend-new/specs/updater/updateLog.test.ts


53. src/node/utils/padDiff.ts ✨ Enhancement +17/-17

Convert padDiff to ESM with flexible revision types

• Converted imports to ESM with .js extensions
• Changed module.exports to export default for class export
• Updated type annotations for _fromRev and _toRev to accept string|number
• Added Number() conversions in loop conditions for type safety

src/node/utils/padDiff.ts


54. src/node/types/PadType.ts ✨ Enhancement +32/-8

Expand PadType interface with missing properties

• Converted imports to ESM with .js extensions
• Added many missing optional properties to PadType interface
• Updated method signatures to accept string|number for revision parameters
• Added optional parameters and return type annotations

src/node/types/PadType.ts


55. src/node/hooks/i18n.ts ✨ Enhancement +18/-14

Convert i18n hooks to ESM with exported state

• Converted imports to ESM with .js extensions
• Changed exports. to export const for hook functions
• Added export let declarations for availableLangs and locales
• Updated internal references to use direct variable names

src/node/hooks/i18n.ts


56. src/static/js/pluginfw/shared.ts ✨ Enhancement +32/-16

Convert plugin shared utilities to ESM with helpers

• Converted imports to ESM with .js extensions
• Added loadModule and getHookFunction helper functions
• Refactored loadFn to use new helpers for better namespace handling
• Changed exports. to export const for public functions
• Added default export with public functions

src/static/js/pluginfw/shared.ts


57. src/node/db/PadDeletionManager.ts ✨ Enhancement +5/-5

Convert PadDeletionManager to ESM format

• Converted imports to ESM with .js extensions
• Changed exports. to export const for all public functions

src/node/db/PadDeletionManager.ts


58. src/node/hooks/express/admin.ts ✨ Enhancement +7/-16

Convert admin hooks to ESM and simplify proxy handling

• Converted imports to ESM with type modifiers for types
• Changed import path from ep_etherpad-lite/node/utils/Settings to relative path
• Removed sanitizeProxyPath import and usage
• Simplified proxy path handling to use direct header access
• Removed Vary and Cache-Control header assignments

src/node/hooks/express/admin.ts


59. src/node/db/SecurityManager.ts ✨ Enhancement +13/-13

Convert SecurityManager to ESM format

• Converted imports to ESM with .js extensions
• Changed exports.checkAccess to export const checkAccess
• Updated DENY constant to include type assertion for authorID

src/node/db/SecurityManager.ts


60. src/tests/backend/specs/api/pad.ts ✨ Enhancement +24/-5

Migrate pad API tests to ESM with skipped tests

• Converted imports to ESM with .js extensions
• Added __filename and __dirname polyfills for ESM
• Marked two tests as skipped with detailed TODO comments about expected HTML mismatches
• Updated test syntax to use arrow functions

src/tests/backend/specs/api/pad.ts


61. src/tests/backend/specs/admin/authorSearch.ts ✨ Enhancement +7/-9

Modernize authorSearch tests with arrow functions

• Changed Mocha function() syntax to arrow functions () =>
• Removed this.timeout() calls from test hooks

src/tests/backend/specs/admin/authorSearch.ts


62. src/node/handler/SocketIORouter.ts ✨ Enhancement +9/-9

Convert SocketIORouter to ESM format

• Converted imports to ESM with .js extensions
• Changed exports. to export const for all public functions
• Updated internal function calls to use direct names instead of exports.

src/node/handler/SocketIORouter.ts


63. src/node/utils/Cleanup.ts ✨ Enhancement +11/-11

Convert Cleanup utilities to ESM with type fixes

• Converted imports to ESM with .js extensions
• Added type assertions for Changeset.applyToAText calls
• Updated padMessageHandler.padUsersCount() call to access .padUsersCount property

src/node/utils/Cleanup.ts


64. src/node/hooks/express/static.ts ✨ Enhancement +8/-8

Convert static hooks to ESM format

• Converted imports to ESM with .js extensions
• Changed require('fs').promises to import { promises as fs }
• Updated exports.expressPreSession to export const expressPreSession

src/node/hooks/express/static.ts


65. src/node/hooks/express/openapi-admin.ts ✨ Enhancement +2/-5

Convert openapi-admin hooks to ESM

• Converted imports to ESM with .js extensions
• Added type modifier for ArgsExpressType import

src/node/hooks/express/openapi-admin.ts


66. .github/workflows/backend-tests.yml Additional files +2/-22

...

.github/workflows/backend-tests.yml


67. CHANGELOG.md Additional files +6/-1

...

CHANGELOG.md


68. doc/plugins.md Additional files +12/-0

...

doc/plugins.md


69. pnpm-lock.yaml Additional files +525/-978

...

pnpm-lock.yaml


70. src/node/db/ReadOnlyManager.ts Additional files +2/-2

...

src/node/db/ReadOnlyManager.ts


71. src/node/db/SessionStore.ts Additional files +5/-5

...

src/node/db/SessionStore.ts


72. src/node/handler/APIKeyHandler.ts Additional files +4/-4

...

src/node/handler/APIKeyHandler.ts


73. src/node/handler/RestAPI.ts Additional files +5/-5

...

src/node/handler/RestAPI.ts


74. src/node/hooks/express/adminplugins.ts Additional files +11/-10

...

src/node/hooks/express/adminplugins.ts


75. src/node/hooks/express/errorhandling.ts Additional files +19/-9

...

src/node/hooks/express/errorhandling.ts


76. src/node/hooks/express/importexport.ts Additional files +12/-12

...

src/node/hooks/express/importexport.ts


77. src/node/hooks/express/padurlsanitize.ts Additional files +3/-3

...

src/node/hooks/express/padurlsanitize.ts


78. src/node/hooks/express/pwa.ts Additional files +14/-20

...

src/node/hooks/express/pwa.ts


79. src/node/hooks/express/socketio.ts Additional files +7/-7

...

src/node/hooks/express/socketio.ts


80. src/node/hooks/express/tokenTransfer.ts Additional files +3/-3

...

src/node/hooks/express/tokenTransfer.ts


81. src/node/padaccess.ts Additional files +8/-3

...

src/node/padaccess.ts


82. src/node/prom-instruments.ts Additional files +1/-1

...

src/node/prom-instruments.ts


83. src/node/prometheus.ts Additional files +4/-4

...

src/node/prometheus.ts


84. src/node/security/OAuth2Provider.ts Additional files +4/-4

...

src/node/security/OAuth2Provider.ts


85. src/node/security/SecretRotator.ts Additional files +7/-7

...

src/node/security/SecretRotator.ts


86. src/node/security/crypto.ts Additional files +4/-4

...

src/node/security/crypto.ts


87. src/node/stats.ts Additional files +7/-6

...

src/node/stats.ts


88. src/node/types/ArgsExpressType.ts Additional files +2/-2

...

src/node/types/ArgsExpressType.ts


89. src/node/types/PadSearchQuery.ts Additional files +1/-1

...

src/node/types/PadSearchQuery.ts


90. src/node/types/Revision.ts Additional files +1/-1

...

src/node/types/Revision.ts


91. src/node/types/WebAccessTypes.ts Additional files +1/-1

...

src/node/types/WebAccessTypes.ts


92. src/node/updater/InstallMethodDetector.ts Additional files +1/-1

...

src/node/updater/InstallMethodDetector.ts


93. src/node/updater/Notifier.ts Additional files +1/-1

...

src/node/updater/Notifier.ts


94. src/node/updater/RollbackHandler.ts Additional files +3/-3

...

src/node/updater/RollbackHandler.ts


95. src/node/updater/UpdateExecutor.ts Additional files +3/-3

...

src/node/updater/UpdateExecutor.ts


96. src/node/updater/VersionChecker.ts Additional files +10/-4

...

src/node/updater/VersionChecker.ts


97. src/node/updater/applyPipeline.ts Additional files +9/-13

...

src/node/updater/applyPipeline.ts


98. src/node/updater/state.ts Additional files +1/-1

...

src/node/updater/state.ts


99. src/node/updater/trustedKeys.ts Additional files +1/-1

...

src/node/updater/trustedKeys.ts


100. src/node/updater/versionCompare.ts Additional files +23/-7

...

src/node/updater/versionCompare.ts


101. src/node/utils/AbsolutePaths.ts Additional files +6/-1

...

src/node/utils/AbsolutePaths.ts


102. src/node/utils/ExportEtherpad.ts Additional files +6/-6

...

src/node/utils/ExportEtherpad.ts


103. src/node/utils/ExportHelper.ts Additional files +8/-9

...

src/node/utils/ExportHel...

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented Jun 2, 2026

Code Review by Qodo

Grey Divider

New Review Started

This review has been superseded by a new analysis

Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

Code Review by Qodo

Grey Divider

Looking for bugs?

Check back in a few minutes. An AI review agent is analyzing this pull request.

Grey Divider

Qodo Logo

Port of upstream ether#7605

Converts backend tests from mocha to vitest and migrates to ESM.
@deepshekhardas deepshekhardas force-pushed the fix/pr-7605-esm-vitest branch from ef58b53 to d5732a8 Compare June 2, 2026 02:36
@JohnMcLear
Copy link
Copy Markdown
Member

You read 328 files?

@JohnMcLear JohnMcLear marked this pull request as draft June 2, 2026 09:39
@JohnMcLear JohnMcLear closed this Jun 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants