Эх сурвалжийг харах

Merge pull request #19562 from overleaf/ab-modules-dependencies

[web] Modules dependencies

GitOrigin-RevId: d8bbb25a754f2ed58b1b1e924aa760b87d3135c6
Alexandre Bourdin 2 жил өмнө
parent
commit
5bc5b1af2a

+ 11 - 2
services/web/app/src/infrastructure/Modules.js

@@ -41,6 +41,15 @@ function loadModules() {
         `${moduleName}: module.viewIncludes moved into Settings.viewIncludes`
       )
     }
+    if (loadedModule.dependencies) {
+      for (const dependency of loadedModule.dependencies) {
+        if (!Settings.moduleImportSequence.includes(dependency)) {
+          throw new Error(
+            `Module '${dependency}' listed as a dependency of '${moduleName}' is missing in the moduleImportSequence. Please also verify that it is available in the current environment.`
+          )
+        }
+      }
+    }
   }
   _modulesLoaded = true
   attachHooks()
@@ -74,7 +83,7 @@ function loadViewIncludes(app) {
   _viewIncludes = Views.compileViewIncludes(app)
 }
 
-function registerMiddleware(appOrRouter, middlewareName, options) {
+function applyMiddleware(appOrRouter, middlewareName, options) {
   if (!middlewareName) {
     throw new Error(
       'middleware name must be provided to register module middleware'
@@ -173,7 +182,7 @@ module.exports = {
   loadViewIncludes,
   moduleIncludes,
   moduleIncludesAvailable,
-  registerMiddleware,
+  applyMiddleware,
   hooks: {
     attach: attachHook,
     fire: fireHook,

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

@@ -144,7 +144,7 @@ if (Settings.enabledServices.includes('web')) {
 
 app.use(metrics.http.monitor(logger))
 
-Modules.registerMiddleware(app, 'appMiddleware')
+Modules.applyMiddleware(app, 'appMiddleware')
 app.use(bodyParser.urlencoded({ extended: true, limit: '2mb' }))
 app.use(bodyParser.json({ limit: Settings.max_json_request_size }))
 app.use(methodOverride())
@@ -179,7 +179,7 @@ const sessionSecrets = [
 webRouter.use(cookieParser(sessionSecrets))
 webRouter.use(CookieMetrics.middleware)
 SessionAutostartMiddleware.applyInitialMiddleware(webRouter)
-Modules.registerMiddleware(webRouter, 'sessionMiddleware', {
+Modules.applyMiddleware(webRouter, 'sessionMiddleware', {
   store: sessionStore,
 })
 webRouter.use(

+ 6 - 1
services/web/modules/history-v1/index.js

@@ -1 +1,6 @@
-module.exports = {}
+/** @typedef {import("../../types/web-module").WebModule} WebModule */
+
+/** @type {WebModule} */
+const HistoryModule = {}
+
+module.exports = HistoryModule

+ 8 - 1
services/web/modules/launchpad/index.js

@@ -1,3 +1,10 @@
 const LaunchpadRouter = require('./app/src/LaunchpadRouter')
 
-module.exports = { router: LaunchpadRouter }
+/** @typedef {import("../../types/web-module").WebModule} WebModule */
+
+/** @type {WebModule} */
+const LaunchpadModule = {
+  router: LaunchpadRouter,
+}
+
+module.exports = LaunchpadModule

+ 6 - 1
services/web/modules/server-ce-scripts/index.js

@@ -1 +1,6 @@
-module.exports = {}
+/** @typedef {import("../../types/web-module").WebModule} WebModule */
+
+/** @type {WebModule} */
+const ServerCeScriptsModule = {}
+
+module.exports = ServerCeScriptsModule

+ 9 - 1
services/web/modules/user-activate/index.js

@@ -1,2 +1,10 @@
 const UserActivateRouter = require('./app/src/UserActivateRouter')
-module.exports = { router: UserActivateRouter }
+
+/** @typedef {import("../../types/web-module").WebModule} WebModule */
+
+/** @type {WebModule} */
+const UserActivateModule = {
+  router: UserActivateRouter,
+}
+
+module.exports = UserActivateModule

+ 59 - 0
services/web/types/web-module.ts

@@ -0,0 +1,59 @@
+type LinkedFileAgent = {
+  createLinkedFile: (
+    projectId: string,
+    linkedFileData: object,
+    name: string,
+    parentFolderId: string,
+    userId: string,
+    callback: () => void
+  ) => void
+  refreshLinkedFile: (
+    projectId: string,
+    linkedFileData: object,
+    name: string,
+    parentFolderId: string,
+    userId: string,
+    callback: () => void
+  ) => void
+  promises: {
+    createLinkedFile: (
+      projectId: string,
+      linkedFileData: object,
+      name: string,
+      parentFolderId: string,
+      userId: string
+    ) => Promise<any>
+    refreshLinkedFile: (
+      projectId: string,
+      linkedFileData: object,
+      name: string,
+      parentFolderId: string,
+      userId: string
+    ) => Promise<any>
+  }
+}
+
+export type WebModule = {
+  dependencies?: string[]
+  router?: {
+    apply?: (
+      webRouter: any,
+      privateApiRouter?: any,
+      publicApiRouter?: any
+    ) => void
+  }
+  nonCsrfRouter?: {
+    apply: (webRouter: any, privateApiRouter: any, publicApiRouter: any) => void
+  }
+  hooks?: {
+    [name: string]: (args: any[]) => void
+  }
+  middleware?: {
+    [name: string]: (req: any, res: any, next: any) => void
+  }
+  sessionMiddleware?: (webRouter: any, options: any) => void
+  appMiddleware?: (app: any) => void
+  linkedFileAgents?: {
+    [name: string]: () => LinkedFileAgent
+  }
+}