aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2019-10-15 15:57:28 +0000
committers-ol <s-ol@users.noreply.github.com>2019-10-15 15:57:28 +0000
commit74e6bb948fa84590b2c0b921868fa9abca6d41d2 (patch)
tree704bfd3b3b9870164a1fae0bbaa1099c4649b795
parentadd xy-workshop (diff)
downloadmmm-74e6bb948fa84590b2c0b921868fa9abca6d41d2.tar.gz
mmm-74e6bb948fa84590b2c0b921868fa9abca6d41d2.zip
better error-handling / logging
-rw-r--r--build/server.moon11
-rw-r--r--mmm/component/init.client.moon3
-rw-r--r--mmm/component/init.server.moon3
-rw-r--r--mmm/init.client.moon2
-rw-r--r--mmm/init.server.moon2
-rw-r--r--mmm/mmmfs/browser.moon7
-rw-r--r--mmm/mmmfs/conversion.moon6
-rw-r--r--mmm/mmmfs/converts.moon3
-rw-r--r--mmm/mmmfs/stores/web.moon1
9 files changed, 26 insertions, 12 deletions
diff --git a/build/server.moon b/build/server.moon
index 72b5ffd..aa7bf50 100644
--- a/build/server.moon
+++ b/build/server.moon
@@ -73,7 +73,9 @@ class Server
local store = web.WebStore({ verbose = true })
local root = fileder.Fileder(store, store:get_index(nil, -1))
- BROWSER = browser.Browser(root, path, facet, true)
+ local err_and_trace = function (msg) return debug.traceback(msg, 2) end
+ ok, BROWSER = xpcall(browser.Browser, err_and_trace, root, path, facet, true)
+ if not ok then error(BROWSER) end
end)
</script>"
else if not fileder\has_facet facet.name
@@ -88,6 +90,7 @@ class Server
else
501, "not implemented"
+ err_and_trace = (msg) -> debug.traceback msg, 2
stream: (sv, stream) =>
req = stream\get_headers!
method = req\get ':method'
@@ -102,10 +105,10 @@ class Server
type = type\match '%s*(.*)'
facet = Key facet, type
- ok, status, body = pcall @.handle, @, method, path, facet
+ ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet
if not ok
- warn status, body
- body = "Internal Server Error: #{status}"
+ warn "Error handling request (#{method} #{path} #{facet}):\n#{status}"
+ body = "Internal Server Error:\n#{status}"
status = 500
res = headers.new!
diff --git a/mmm/component/init.client.moon b/mmm/component/init.client.moon
index c72644b..00e5e03 100644
--- a/mmm/component/init.client.moon
+++ b/mmm/component/init.client.moon
@@ -16,6 +16,8 @@ tohtml = (val) ->
else
error "not a Node: #{val}, #{type val}"
+fromhtml = (node) -> :node
+
-- shorthand to form a text node from a string
text = (str) -> document\createTextNode tostring str
@@ -146,6 +148,7 @@ elements = setmetatable {}, __index: (name) =>
:get_or_create,
-- :join,
:tohtml,
+ :fromhtml,
:text,
:elements,
}
diff --git a/mmm/component/init.server.moon b/mmm/component/init.server.moon
index 7c7fb7e..1cf2bd9 100644
--- a/mmm/component/init.server.moon
+++ b/mmm/component/init.server.moon
@@ -16,6 +16,8 @@ tohtml = (val) ->
else
error "not a Node: #{val}, #{type val}"
+fromhtml = (html) -> render: -> html
+
-- shorthand to form a text node from strings
escapes = {
'&': '&amp;'
@@ -128,6 +130,7 @@ get_or_create = (elem, id, ...) ->
:ReactiveElement,
:get_or_create,
:tohtml,
+ :fromhtml,
:text,
:elements,
}
diff --git a/mmm/init.client.moon b/mmm/init.client.moon
index e32f25d..955b8d8 100644
--- a/mmm/init.client.moon
+++ b/mmm/init.client.moon
@@ -10,7 +10,7 @@ deep_tostring = (tbl, space='') ->
return tbl if 'userdata' == type tbl
buf = space .. tostring tbl
- return buf unless 'table' == type tbl
+ return buf unless 'table' == (type tbl) or table.__tostring
buf = buf .. ' {\n'
for k,v in pairs tbl
diff --git a/mmm/init.server.moon b/mmm/init.server.moon
index 0fe36d5..c4d663d 100644
--- a/mmm/init.server.moon
+++ b/mmm/init.server.moon
@@ -4,7 +4,7 @@ MODE = 'SERVER'
deep_tostring = (tbl, space='') ->
buf = space .. tostring tbl
- return buf unless 'table' == type tbl
+ return buf unless 'table' == (type tbl) or tbl.__tostring
buf = buf .. ' {\n'
for k,v in pairs tbl
diff --git a/mmm/mmmfs/browser.moon b/mmm/mmmfs/browser.moon
index f872ed9..2287c4c 100644
--- a/mmm/mmmfs/browser.moon
+++ b/mmm/mmmfs/browser.moon
@@ -166,7 +166,7 @@ class Browser
@node = wrapper.node
@render = wrapper\render
- err_and_trace = (msg) -> { :msg, trace: debug.traceback! }
+ err_and_trace = (msg) -> debug.traceback msg, 2
default_convert = (key) => @get key.name, 'mmm/dom'
-- render #browser-content
@@ -177,7 +177,7 @@ class Browser
if MODE == 'CLIENT'
err\set pre msg
warn "ERROR rendering content: #{msg}"
- nil
+ div!
active = @active\get!
@@ -193,10 +193,9 @@ class Browser
res
elseif ok
div "[no conversion path to #{prop.type}]"
- elseif res and res.msg.match and res.msg\match '%[nossr%]$'
+ elseif res and res\match '%[nossr%]'
div "[this page could not be pre-rendered on the server]"
else
- res = "#{res.msg}\n#{res.trace}"
disp_error res
get_inspector: =>
diff --git a/mmm/mmmfs/conversion.moon b/mmm/mmmfs/conversion.moon
index 4b47bba..4700eea 100644
--- a/mmm/mmmfs/conversion.moon
+++ b/mmm/mmmfs/conversion.moon
@@ -77,10 +77,14 @@ print_conversions = (conversions) ->
-- * value - value
-- * ... - other transform parameters (fileder, key)
-- returns converted value
+err_and_trace = (msg) -> debug.traceback msg, 2
apply_conversions = (conversions, value, ...) ->
for i=#conversions,1,-1
step = conversions[i]
- value = step.convert.transform step, value, ...
+ ok, value = xpcall step.convert.transform, err_and_trace, step, value, ...
+ if not ok
+ f, k = ...
+ error "error while converting #{f} #{k} from '#{step.from}' to '#{step.to}':\n#{value}"
value
diff --git a/mmm/mmmfs/converts.moon b/mmm/mmmfs/converts.moon
index e4a6ddf..7a998e8 100644
--- a/mmm/mmmfs/converts.moon
+++ b/mmm/mmmfs/converts.moon
@@ -127,6 +127,7 @@ converts = {
nolink = js_fix element\getAttribute 'nolink'
inline = js_fix element\getAttribute 'inline'
desc = js_fix element.innerText
+ desc = nil if desc == ''
element\replaceWith embed path or '', facet or '', fileder, { :nolink, :inline, :desc }
@@ -239,7 +240,7 @@ converts = {
{
inp: '(.+)',
out: 'URL -> %1',
- cost: 10
+ cost: 5
transform: (_, fileder, key) => "#{fileder.path}/#{key.name}:#{@from}"
}
{
diff --git a/mmm/mmmfs/stores/web.moon b/mmm/mmmfs/stores/web.moon
index f3b60c7..ea17b5a 100644
--- a/mmm/mmmfs/stores/web.moon
+++ b/mmm/mmmfs/stores/web.moon
@@ -81,6 +81,7 @@ class WebStore extends Store
coroutine.yield facet.name, facet.type
load_facet: (path, name, type) =>
+ @log "loading facet #{path} #{name}: #{type}"
fetch "#{@host .. path}/#{name}: #{type}"
create_facet: (path, name, type, blob) =>