Skip to content

Commit

Permalink
Adding errorface and refactoring api to not use util
Browse files Browse the repository at this point in the history
  • Loading branch information
jgable committed Oct 8, 2012
1 parent 0120738 commit 0182c69
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 44 deletions.
69 changes: 34 additions & 35 deletions lib/index.coffee
Expand Up @@ -2,72 +2,71 @@ fs = require "fs"
ErrorParser = require "./ErrorParser"
Mustache = require "mustache"

# TODO: I'm not crazy about how this is setup with the util,
# but the errorHandler is called with a different this context from express.
util =
settings:
log: console.log
logErrors: false
errorPageTemplate: null
errorPageTemplatePath: __dirname + "/views/errorPage.stache"
templateFunc: Mustache.render
preProcessTemplateData: (data) -> data
class ErrorFaceApi
constructor: (opts = {}) ->
@settings =
log: console.log
logErrors: false
errorPageTemplate: null
errorPageTemplatePath: __dirname + "/views/errorPage.stache"
templateFunc: Mustache.render
preProcessTemplateData: (data) -> data

for own key, val of opts
@settings[key] = val

errorHandler: ->

(err, req, resp, next) =>
@settings.log err if @settings.logErrors

@_getErrStack err, (stackErr, headLine, stack, lines) =>
throw stackErr if stackErr

method = @_renderErrorJson
method = @_renderErrorPage if req.accepts 'html'

method.apply @, [resp, headLine, stack, lines]

_getErrStack: (err, done) ->
parser = new ErrorParser()
parser.parseStackDetails err, done

_renderTemplateHtml: (headLine, stack, lines, done) ->
renderTemplate = (tplString) ->
renderTemplate = (tplString) =>
tplData =
headLine: headLine
stack: stack
lines: lines
projectDirectory: process.cwd()

# Offer the chance to pre process the template data.
tplData = util.settings.preProcessTemplateData tplData
tplData = @settings.preProcessTemplateData tplData

# process the template with the passed in template function.
errorHtml = util.settings.templateFunc tplString, tplData
errorHtml = @settings.templateFunc tplString, tplData

done errorHtml

if util.settings.errorPageTemplate
renderTemplate util.settings.errorPageTemplate
if @settings.errorPageTemplate
renderTemplate @settings.errorPageTemplate
else
fs.readFile util.settings.errorPageTemplatePath, (err, contents) ->
fs.readFile @settings.errorPageTemplatePath, (err, contents) ->
throw err if err

renderTemplate contents.toString()

_renderErrorPage: (resp, headLine, stack, lines) ->
util._renderTemplateHtml headLine, stack, lines, (html) ->
@_renderTemplateHtml headLine, stack, lines, (html) ->
resp.send html

_renderErrorJson: (resp, headLine, stack, lines) ->
util._renderTemplateHtml headLine, stack, lines, (html) ->
@_renderTemplateHtml headLine, stack, lines, (html) ->

resp.json
error: true
data: { headLine, stack, lines }
debug: html

class ErrorFaceApi
constructor: (opts = {}) ->
for own key, val of opts
util.settings[key] = val

errorHandler: (err, req, resp, next) ->
util.settings.log err if util.settings.logErrors

util._getErrStack err, (stackErr, headLine, stack, lines) =>
throw stackErr if stackErr

method = util._renderErrorJson
method = util._renderErrorPage if req.accepts 'html'

method resp, headLine, stack, lines

module.exports =
errorHandler: (opts) -> return new ErrorFaceApi(opts).errorHandler
errorHandler: (opts) -> return new ErrorFaceApi(opts).errorHandler()
21 changes: 14 additions & 7 deletions lib/views/errorPage.stache
@@ -1,6 +1,7 @@
<doctype !html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Error Face</title>

<style>
Expand All @@ -12,6 +13,12 @@
h3 { font-size: 1.4em }
h4 { font-size: 1.1em}

header { line-height: 4em; vertical-align: middle }
header figure { display: inline-block; vertical-align: middle; font-size: 4em; margin: 0 0.1em 0 0; padding: 0; }
header h3 { display: inline-block; vertical-align: middle; margin: 0; padding: 0; }

body > section { margin-top: -10px; }

#snoops {
margin: 0 50px;
}
Expand Down Expand Up @@ -50,11 +57,7 @@
#stack .slice .lineNum { text-align: right; width: 3%; }
#stack .slice .fileName pre { font-size: 1.1em;}
#stack .slice .fileFocus pre code { font-size: 1.1em;}
#stack .slice.muted {
opacity: 0.4;
}
#stack aside { padding: 5px; }
#stack aside h5 { margin: 0.8em 0 }
#stack .slice.muted { opacity: 0.4; }
</style>

<style>
Expand All @@ -64,7 +67,11 @@

</head>
<body>
<h4><pre>{{projectDirectory}}</pre></h4>
<header>
<figure>&#9785;</figure>
<h3>&raquo;&nbsp;<pre style="display: inline-block">{{projectDirectory}}</pre></h3>
</header>


<section>
<h2><strong>{{headLine.details.error}}</strong>: {{headLine.details.message}}</h2>
Expand Down
3 changes: 1 addition & 2 deletions test/util/testServer.coffee
Expand Up @@ -10,8 +10,7 @@ init = (configureThis) ->
app.get "/error", (req, res, next) ->
app.doesntExist()

app.get "/*", (req, res) ->
throw new Error("Not Found")
app.get "/*", (req, res) -> throw new Error("Not Found")

app.use errorface.errorHandler()

Expand Down

0 comments on commit 0182c69

Please sign in to comment.