From 28569b422ae3206209384b09dc5d60155e9f670e Mon Sep 17 00:00:00 2001 From: s-ol Date: Fri, 19 Oct 2018 15:58:14 +1100 Subject: stable serverside rendering --- app/index.moon | 3 ++- client.moon | 24 ------------------------ dist | 2 +- lib/component.client.moon | 2 -- lib/component.server.moon | 8 +++++--- lib/html.server.moon | 7 ++++--- lib/init.client.moon | 23 +++++++++++++++++++++++ lib/init.server.moon | 40 ++++++++++++++++++++++++++++++++++++++++ lib/ordered.shared.moon | 27 +++++++++++++++++++++++++++ render.moon | 8 ++++---- server.moon | 42 ------------------------------------------ 11 files changed, 106 insertions(+), 80 deletions(-) delete mode 100644 client.moon create mode 100644 lib/init.client.moon create mode 100644 lib/init.server.moon create mode 100644 lib/ordered.shared.moon delete mode 100644 server.moon diff --git a/app/index.moon b/app/index.moon index 59f7a4f..44df8bc 100644 --- a/app/index.moon +++ b/app/index.moon @@ -1,4 +1,5 @@ import h1, p, a, br, ul, tt, li from require 'lib.html' +import opairs from require 'lib.ordered' moon = '\xe2\x98\xbd' demos = @@ -34,7 +35,7 @@ append p { '.' } append p 'current demos:' -append ul for name, desc in pairs demos +append ul for name, desc in opairs demos li (a name, href: "/#{name}.html"), ': ', desc append p { diff --git a/client.moon b/client.moon deleted file mode 100644 index 884d96b..0000000 --- a/client.moon +++ /dev/null @@ -1,24 +0,0 @@ -export MODE, print, warn, relative, append, on_client -export window, document - -window = js.global -document = window.document - -MODE = 'CLIENT' -print = window.console\log -warn = window.console\warn - --- package.path = './?.shared.lua;./?.client.lua;' .. package.path -print package.path -package.path = './?.shared.moon.lua;./?.client.moon.lua;./?.moon.lua;./?/init.moon.lua;./?.lua;./?/init.lua' - --- relative imports -relative = (...) -> - path = ... - - (name) -> - name = path .. name if '.' == name\sub 1, 1 - require name - -append = document.body\appendChild -on_client = (f, ...) -> f ... diff --git a/dist b/dist index 19c3c05..2338531 160000 --- a/dist +++ b/dist @@ -1 +1 @@ -Subproject commit 19c3c05a3427978d76af70c4656ba082f20af250 +Subproject commit 23385318986b083adfb1c2b6d5c25f2848515b9c diff --git a/lib/component.client.moon b/lib/component.client.moon index c012427..ee0f9ca 100644 --- a/lib/component.client.moon +++ b/lib/component.client.moon @@ -1,5 +1,3 @@ -{ :document } = js.global - -- convert anything to a DOM Node -- val must be one of: -- * DOM Node (instanceof window.Node) diff --git a/lib/component.server.moon b/lib/component.server.moon index 456ca71..54bb15c 100644 --- a/lib/component.server.moon +++ b/lib/component.server.moon @@ -1,3 +1,5 @@ +import opairs from require 'lib.ordered' + -- convert anything to HTML string -- val must be one of: -- * MMMElement (have a .render method that returns a string) @@ -69,7 +71,7 @@ class ReactiveElement set: (attr, value) => if attr == 'style' and 'table' == type value - for k,v in pairs value + for k,v in opairs value @attrs.style[k] = v return @@ -88,10 +90,10 @@ class ReactiveElement render: => b = "<#{@element}" - for k,v in pairs @attrs + for k,v in opairs @attrs if 'table' == type v tmp = '' - for kk, vv in pairs v + for kk, vv in opairs v tmp ..= "#{kk}: #{vv}; " v = tmp b ..= " #{k}=\"#{v}\"" diff --git a/lib/html.server.moon b/lib/html.server.moon index cc68fc7..565867c 100644 --- a/lib/html.server.moon +++ b/lib/html.server.moon @@ -1,3 +1,5 @@ +import opairs from require 'lib.ordered' + element = (element) -> (...) -> children = { ... } @@ -9,11 +11,10 @@ element = (element) -> (...) -> attributes = {} b = "<#{element}" - for k,v in pairs attributes - continue unless 'string' == type k + for k,v in opairs attributes if 'table' == type v tmp = '' - for kk, vv in pairs v + for kk, vv in opairs v tmp ..= "#{kk}: #{vv}; " v = tmp b ..= " #{k}=\"#{v}\"" diff --git a/lib/init.client.moon b/lib/init.client.moon new file mode 100644 index 0000000..509f225 --- /dev/null +++ b/lib/init.client.moon @@ -0,0 +1,23 @@ +export MODE, print, warn, relative, append, on_client +export window, document + +window = js.global +document = window.document + +MODE = 'CLIENT' +print = window.console\log +warn = window.console\warn + +-- package.path = './?.shared.lua;./?.client.lua;' .. package.path +package.path = './?.shared.moon.lua;./?.client.moon.lua;./?.moon.lua;./?/init.moon.lua;./?.lua;./?/init.lua' + +-- relative imports +relative = (...) -> + path = ... + + (name) -> + name = path .. name if '.' == name\sub 1, 1 + require name + +append = document.body\appendChild +on_client = (f, ...) -> f ... diff --git a/lib/init.server.moon b/lib/init.server.moon new file mode 100644 index 0000000..912bbb4 --- /dev/null +++ b/lib/init.server.moon @@ -0,0 +1,40 @@ +export MODE, warn, relative, append, on_client +MODE = 'SERVER' + +-- warning messages +warn = (...) -> + io.stderr\write table.concat { ... }, '\t' + io.stderr\write '\n' + +-- relative imports +relative = (...) -> + _require = require + path = ... + + (name) -> + name = path .. name if '.' == name\sub 1, 1 + require name + +-- shorthand to append elements to body +buffer = '' +append = (val) -> + buffer ..= val + +import compile, insert_loader from require 'duct_tape' +insert_loader! + +on_client = (fn, ...) -> + args = {...} + -- warn code + append "" + +{ + -- access / flush the appended data + flush: -> + with x = buffer + buffer = '' +} diff --git a/lib/ordered.shared.moon b/lib/ordered.shared.moon new file mode 100644 index 0000000..59c07bf --- /dev/null +++ b/lib/ordered.shared.moon @@ -0,0 +1,27 @@ +-- ordered table iterator, for stable(r) renderers + +sort = (t, order_fn) -> + with index = [k for k,v in pairs t when 'string' == type k] + table.sort index, order_fn + +-- ordered next(t) +onext = (state, key) -> + state.i += 1 + { :t, :index, :i } = state + + if key = index[i] + key, t[key] + +-- ordered pairs(t). order_fn is optional; see table.sort +opairs = (t, order_fn) -> + state = { + :t, + i: 0, + index: sort t, order_fn + } + onext, state, nil + +{ + :onext + :opairs +} diff --git a/render.moon b/render.moon index f56e8b8..af6b60b 100644 --- a/render.moon +++ b/render.moon @@ -1,5 +1,7 @@ +package.moonpath = './?.shared.moon;./?.server.moon;' .. package.moonpath + import to_lua from require 'moonscript.base' -import flush from require 'server' +import flush from require 'lib.init' error "please specify the module to build as an argumnet" unless arg[1] @@ -18,9 +20,7 @@ print " - + #{flush!} " diff --git a/server.moon b/server.moon deleted file mode 100644 index add40ef..0000000 --- a/server.moon +++ /dev/null @@ -1,42 +0,0 @@ -package.moonpath = './?.shared.moon;./?.server.moon;' .. package.moonpath - -export MODE, warn, relative, append, on_client -MODE = 'SERVER' - --- warning messages -warn = (...) -> - io.stderr\write table.concat { ... }, '\t' - io.stderr\write '\n' - --- relative imports -relative = (...) -> - _require = require - path = ... - - (name) -> - name = path .. name if '.' == name\sub 1, 1 - require name - --- shorthand to append elements to body -buffer = '' -append = (val) -> - buffer ..= val - -import compile, insert_loader from require 'duct_tape' -insert_loader! - -on_client = (fn, ...) -> - args = {...} - -- warn code - append "" - -{ - -- access / flush the appended data - flush: -> - with x = buffer - buffer = '' -} -- cgit v1.2.3