UNPKG

2.87 kBtext/coffeescriptView Raw
1fs = require 'fs'
2path = require 'path'
3{EventEmitter} = require 'events'
4_ = require 'lodash'
5handlebars = require 'handlebars'
6nodemailer = require "nodemailer"
7Promise = require 'bluebird'
8typeOf = require 'typeof'
9
10TestTransport = require './TestTransport'
11
12getViews = (viewRoot, name) ->
13 getView = (path) -> handlebars.compile fs.readFileSync path, 'utf8'
14 getPath = (ext) -> path.resolve viewRoot, "#{name}#{ext}.handlebars"
15 views = {}
16
17 views.text = if fs.existsSync p = getPath '' then getView p
18 else if fs.existsSync p = getPath '.text' then getView p
19
20 views.html = getView p if fs.existsSync p = getPath '.html'
21
22 views
23
24class Mailer
25 mainOnly: no
26
27 constructor: (mailer, @_config, @_transport) ->
28 if _.isFunction mailer
29 @mainOnly = yes
30 mailer = main : mailer
31
32 if mailer.defaults?
33 @defaults = mailer.defaults
34 delete mailer.defaults
35 else @defaults = {}
36
37 if @defaults.data and @_config.defaults.data?
38 _.defaults @defaults.data, @_config.defaults.data
39
40 _.defaults @defaults, @_config.defaults
41
42 @setMethod name, method for name, method of mailer
43 return @main if @mainOnly
44
45 setMethod: (name, method) ->
46 templateName = if @mainOnly then @_config.name else name
47 views = getViews @_config.views, templateName
48
49 @[name] = (args...) =>
50 cb = if _.isFunction _.last args then args.pop() else ->
51 that = mail: (message = {}) => @_mail views, message, cb
52 method.apply that, args
53
54 _mail: (views = {}, message = {}, cb) ->
55 if message.data? and @defaults.data?
56 _.defaults message.data, @defaults.data
57
58 _.defaults message, @defaults
59 message.text = views.text message.data if views.text?
60 message.html = views.html message.data if views.html?
61
62 sendMail = Promise.promisify @_transport.sendMail, @_transport
63
64 sendMail(message).nodeify cb
65
66module.exports = class Hermes extends EventEmitter
67 constructor: (@config, mailers) ->
68 @createTransport()
69 @addMailer name, mailer for name, mailer of mailers
70
71 createTransport: ->
72 @_transport = switch typeOf @config.transport
73 when 'object' then nodemailer.createTransport @config.transport.type, @config.transport
74 when 'string'
75 if @config.transport is 'test'
76 nodemailer.createTransport TestTransport, hermes: @
77 else
78 throw new Error "Bad Mail Transport"
79 when 'function' then nodemailer.createTransport @config.transport
80 else throw new Error "Bad Mail Transport"
81
82
83 addMailer: (name, mailer) ->
84 config = _.clone @config
85 config.name = name
86 config.views = if _.isFunction mailer
87 @config.views
88 else
89 path.resolve @config.views, name
90
91 @[name] = new Mailer mailer, config, @_transport
92
93 #send: ->
94 # if msg.view passed then create template then memorize(by path)
95 # body?
96 close: -> @_transport.close()
\No newline at end of file