   #
   #  * `preserve_newlines` - when `true`, all `\n` characters found in templates
   #       will be converted to `{~n}` prior to processing the template.
+  #
+  #
+  #  * `trim_trailing_newline` - when `true`, a true newline (`\n`, not `{~n}`)
+  #       at the end of a template file will be stripped off (to avoid adding
+  #       unintended whitespace due to a newline added to the end of a file
+  #       by a text editor).
   #
   #  * `use_cache` - when `true`, "compiled" templates will be cached (by name
   #       or filename); otherwise no caching will be applied, including dust's

    @template_root = @_get_template_root(options)
    @template_extension = @_get_template_extension(options)
    @preserve_newlines = @_get_preserve_newlines(options)
    @template_not_found = @_get_tempate_not_found(options)
    @use_cache = @_get_use_cache(options)
    if @use_cache
      @cache = {}

          callback(err)
        else
          data = data?.toString?()
          if @_get_trim_trailing_newline(options) and /\n$/.test(data)
            data = data.substring(0,data.length-1)
          if @_get_preserve_newlines(options)
            data = data.replace /\n/g, "\n{~n}"
          callback(null,data)
