Modules.coffee 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. fs = require "fs"
  2. Path = require "path"
  3. jade = require "jade"
  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, apiRouter) ->
  16. for module in @modules
  17. module.router?.apply(webRouter, apiRouter)
  18. viewIncludes: {}
  19. loadViewIncludes: (app) ->
  20. @viewIncludes = {}
  21. for module in @modules
  22. for view, partial of module.viewIncludes or {}
  23. @viewIncludes[view] ||= []
  24. @viewIncludes[view].push fs.readFileSync(Path.join(MODULE_BASE_PATH, module.name, "app/views", partial + ".jade"))
  25. moduleIncludes: (view, locals) ->
  26. partials = Modules.viewIncludes[view] or []
  27. html = ""
  28. for partial in partials
  29. compiler = jade.compile(partial, doctype: "html")
  30. html += compiler(locals)
  31. return html
  32. moduleIncludesAvailable: (view) ->
  33. return (Modules.viewIncludes[view] or []).length > 0
  34. attachHooks: () ->
  35. for module in @modules
  36. if module.hooks?
  37. for hook, method of module.hooks
  38. Modules.hooks.attach hook, method
  39. hooks:
  40. _hooks: {}
  41. attach: (name, method) ->
  42. @_hooks[name] ?= []
  43. @_hooks[name].push method
  44. fire: (name, args..., callback) ->
  45. methods = @_hooks[name] or []
  46. call_methods = methods.map (method) ->
  47. return (cb) -> method(args..., cb)
  48. async.series call_methods, (error, results) ->
  49. return callback(error) if error?
  50. return callback null, results
  51. Modules.loadModules()