Modules.coffee 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. fs = require "fs"
  2. Path = require "path"
  3. pug = require "pug"
  4. async = require "async"
  5. MODULE_BASE_PATH = Path.resolve(__dirname + "/../../../modules")
  6. module.exports = Modules =
  7. modules: []
  8. loadModules: () ->
  9. for moduleName in fs.readdirSync(MODULE_BASE_PATH)
  10. if fs.existsSync(Path.join(MODULE_BASE_PATH, moduleName, "index.js"))
  11. loadedModule = require(Path.join(MODULE_BASE_PATH, moduleName, "index"))
  12. loadedModule.name = moduleName
  13. @modules.push loadedModule
  14. Modules.attachHooks()
  15. applyRouter: (webRouter, privateApiRouter, publicApiRouter) ->
  16. for module in @modules
  17. module.router?.apply?(webRouter, privateApiRouter, publicApiRouter)
  18. applyNonCsrfRouter: (webRouter, privateApiRouter, publicApiRouter) ->
  19. for module in @modules
  20. module.nonCsrfRouter?.apply(webRouter, privateApiRouter, publicApiRouter)
  21. module.router?.applyNonCsrfRouter?(webRouter, privateApiRouter, publicApiRouter)
  22. viewIncludes: {}
  23. loadViewIncludes: (app) ->
  24. @viewIncludes = {}
  25. for module in @modules
  26. for view, partial of module.viewIncludes or {}
  27. @viewIncludes[view] ||= []
  28. filePath = Path.join(MODULE_BASE_PATH, module.name, "app/views", partial + ".pug")
  29. @viewIncludes[view].push pug.compileFile(filePath, doctype: "html")
  30. moduleIncludes: (view, locals) ->
  31. compiledPartials = Modules.viewIncludes[view] or []
  32. html = ""
  33. for compiledPartial in compiledPartials
  34. d = new Date()
  35. html += compiledPartial(locals)
  36. return html
  37. moduleIncludesAvailable: (view) ->
  38. return (Modules.viewIncludes[view] or []).length > 0
  39. moduleAssetFiles: (pathPrefix) ->
  40. assetFiles = []
  41. for module in @modules
  42. for assetFile in module.assetFiles or []
  43. assetFiles.push "#{pathPrefix}#{assetFile}"
  44. return assetFiles
  45. linkedFileAgentsIncludes: () ->
  46. agents = {}
  47. for module in @modules
  48. for name, agentFunction of module.linkedFileAgents
  49. agents[name] = agentFunction()
  50. return agents
  51. attachHooks: () ->
  52. for module in @modules
  53. if module.hooks?
  54. for hook, method of module.hooks
  55. Modules.hooks.attach hook, method
  56. hooks:
  57. _hooks: {}
  58. attach: (name, method) ->
  59. @_hooks[name] ?= []
  60. @_hooks[name].push method
  61. fire: (name, args..., callback) ->
  62. methods = @_hooks[name] or []
  63. call_methods = methods.map (method) ->
  64. return (cb) -> method(args..., cb)
  65. async.series call_methods, (error, results) ->
  66. return callback(error) if error?
  67. return callback null, results
  68. Modules.loadModules()