From 5e145f9607a52d0911e1101f6f906d965499f909 Mon Sep 17 00:00:00 2001 From: s-ol Date: Mon, 7 Oct 2019 14:56:32 +0000 Subject: clean up a little --- build/bundle_fileder.moon | 155 ---------------------------------------------- build/import_all.moon | 55 ++++++++++++++++ build/render_all.moon | 114 ++++++++++++++++++++++++++++++++++ build/render_fileder.moon | 93 ---------------------------- 4 files changed, 169 insertions(+), 248 deletions(-) delete mode 100644 build/bundle_fileder.moon create mode 100644 build/import_all.moon create mode 100644 build/render_all.moon delete mode 100644 build/render_fileder.moon (limited to 'build') diff --git a/build/bundle_fileder.moon b/build/bundle_fileder.moon deleted file mode 100644 index c9f8c35..0000000 --- a/build/bundle_fileder.moon +++ /dev/null @@ -1,155 +0,0 @@ -require 'mmm' -import get_path from require 'build.util' -import Fileder, Key from require 'mmm.mmmfs.fileder' -import opairs from require 'mmm.ordered' -import to_lua from require 'moonscript.base' - --- usage: --- moon bundle_fileder.moon ... -- ... -{ path_to_root, dirname } = arg - -assert path_to_root, "please specify the relative root path" -assert dirname, "please specify the fileder dirname" -path = get_path path_to_root - -facets = {} -children_bundles = {} - -do - addto = facets - for file in *arg[3,] - continue if file == 'Tupdefault.lua' - - if file == '--' - addto = children_bundles - continue - table.insert addto, file - --- load a fs file as a fileder facet -load_facet = (filename) -> - key = (filename\match '(.*)%.%w+') or filename - key = Key key\gsub '%$', '/' - key.filename = filename - - file = assert (io.open filename, 'r'), "couldn't open facet file '#{filename}'" - value = file\read '*all' - file\close! - - key, value - --- escape a string for lua aparser -escape = (str) -> string.format '%q', tostring str - --- dump a fileder subtree as Lua source -dump_fileder = do - _dump = (fileder, root=false) -> - code = "Fileder {" - - for key, val in pairs fileder.facets - if key.original - key = "fromcache(#{escape key}, #{escape key.original})" - else - key = escape key - code ..= "\n[#{key}] = #{escape val}," - - for child in *fileder.children - code ..= "\n#{_dump child}," - - code ..= "\n}" - code - - - (fileder) -> " -local mmmfs = require 'mmm.mmmfs' -local Key, Fileder = mmmfs.Key, mmmfs.Fileder -local function fromcache(str, orig) - local key = Key(str) - key.original = Key(orig) - return key -end - -return #{_dump fileder, true} - " - -renders = { - { - inp: '^text/moonscript %-> (.*)' - out: 'text/lua -> %1' - render: (val, fileder, old, new) -> - lua, err = to_lua val - - if not lua - error "Error compiling #{old}: #{err}" - - "-- this moonscript facet has been transpiled to --- '#{new}' for execution in the browser. --- refer to the original facet as the source. -#{lua}" - }, - { - inp: '^image/' - out: 'URL -> %0' - render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]" - }, - { - inp: '^video/' - out: 'URL -> %0' - render: (val, fileder, old, new) -> "#{fileder.path}/#{old.filename}", "[binary removed]" - }, -} - -with io.open '$bundle.lua', 'w' - \write dump_fileder with fileder = Fileder 'name: alpha': dirname - \mount path, true - - order = nil - children = {} - - for facet in *facets - if facet == '$order' - order = [line for line in io.lines facet] - continue - key, value = load_facet facet - .facets[key] = value - - extra_facets = {} - for key, value in pairs .facets - for { :inp, :out, :render } in *renders - continue unless key.type\match inp - - built_key = Key key.name, key.type\gsub inp, out - built_key.original = key - - -- dont overwrite existing keys - continue if \has built_key - - rendered, replace = render value, fileder, key, built_key - - extra_facets[built_key] = rendered - .facets[key] = replace if replace - - break - - for k,v in pairs extra_facets - .facets[k] = v - - for child in *children_bundles - -- @BUG: child bundles are malformed due to Tup bug ($ symbol) - child = child\gsub '/%.lua$', '/$bundle.lua' - - dirname = assert child\match '^([%w-_%.]+)/%$bundle%.lua$' - children[dirname] = dofile child - - if order - -- order from order file - for i, name in pairs order - child = assert children[name], "child in $order but not fs: #{name}" - table.insert .children, child - children[name] = nil - - -- sort remainder alphabeticalally - for name, child in opairs children - table.insert .children, child - warn "child #{name} not in $order!" if order - - \close! diff --git a/build/import_all.moon b/build/import_all.moon new file mode 100644 index 0000000..3a2ac61 --- /dev/null +++ b/build/import_all.moon @@ -0,0 +1,55 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' +require 'lfs' +import Fileder, Key from require 'mmm.mmmfs.fileder' +import SQLStore from require 'mmm.mmmfs.drivers.sql' + +-- usage: +-- moon import_all.moon +{ root } = arg + +assert root, "please specify the root directory" + +-- load a fs file as a fileder facet +load_facet = (filename, filepath) -> + key = (filename\match '(.*)%.%w+') or filename + key = Key key\gsub '%$', '/' + key.filename = filename + + file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'" + value = file\read '*all' + file\close! + + key, value + + +with SQLStore verbose: true + import_fileder = (fileder, dirpath) -> + for file in lfs.dir dirpath + continue if '.' == file\sub 1, 1 + continue if file == 'Tupdefault.lua' + continue if file == 'index.html' + continue if file == '$order' + + filepath = "#{dirpath}/#{file}" + attr = lfs.attributes filepath + switch attr.mode + when 'file' + key, value = load_facet file, filepath + \create_facet fileder, key.name, key.type, value + when 'directory' + next_fileder = \create_fileder fileder, file + -- \create_facet next_fileder, 'name', 'alpha', file + import_fileder next_fileder, filepath + else + warn "unknown entry type '#{attr.mode}'" + + import_fileder '', root diff --git a/build/render_all.moon b/build/render_all.moon new file mode 100644 index 0000000..e2f171e --- /dev/null +++ b/build/render_all.moon @@ -0,0 +1,114 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' +import tohtml from require 'mmm.component' +import Browser from require 'mmm.mmmfs.browser' +import get_meta, header, footer from require 'build.layout' + +export BROWSER + +render = (fileder, output) -> + BROWSER = Browser fileder + + with io.open output, 'w' + \write [[ + + + + + + + + ]] + \write " + #{get_meta fileder} + + + #{header} + + #{assert (tohtml BROWSER), "couldn't render BROWSER"} + + #{footer} + " + \write [[ + + + + + + + + ]] + \write " + + + + " + \close! + +import SQLStore from require 'mmm.mmmfs.drivers.sql' +import Fileder, Key from require 'mmm.mmmfs.fileder' + +-- split filename into dirname + basename +dir_base = (path) -> + dir, base = path\match '(.-)([^/]-)$' + if dir and #dir > 0 + dir = dir\sub 1, #dir - 1 + + dir, base + +load_tree = (store, root='') -> + fileders = setmetatable {}, + __index: (path) => + with val = Fileder {} + .path = path + rawset @, path, val + + root = fileders[root] + root.facets['name: alpha'] = '' + for fn, ft in store\list_facets root.path + val = store\load_facet root.path, fn, ft + root.facets[Key fn, ft] = val + + for path in store\list_all_fileders root.path + fileder = fileders[path] + + parent, name = dir_base path + fileder.facets['name: alpha'] = name + table.insert fileders[parent].children, fileder + + for fn, ft in store\list_facets path + val = store\load_facet path, fn, ft + fileder.facets[Key fn, ft] = val + + root + +tree = load_tree SQLStore! + +for fileder in coroutine.wrap tree\iterate + print "rendering '#{fileder.path}'..." + os.execute "mkdir -p 'out/#{fileder.path}'" + render fileder, "out/#{fileder.path}/index.html" diff --git a/build/render_fileder.moon b/build/render_fileder.moon deleted file mode 100644 index 76c7856..0000000 --- a/build/render_fileder.moon +++ /dev/null @@ -1,93 +0,0 @@ -require 'mmm' -import get_path from require 'build.util' -import tohtml from require 'mmm.component' -import Browser from require 'mmm.mmmfs.browser' -import get_meta, header, footer from require 'build.layout' - -export BROWSER - --- usage: --- moon render.moon -{ path_to_root } = arg - -assert path_to_root, "please specify the relative root path" -path = get_path path_to_root - -do - seed = (str) -> - len = #str - rnd = -> math.ceil math.random! * len - - math.randomseed len - - return if len == 0 - - upper, lower = 0, 0 - for i=1,4 - upper += str\byte rnd! - upper *= 0x100 - - lower += str\byte rnd! - lower *= 0x100 - - math.randomseed upper, lower - - seed path - -root = dofile '$bundle.lua' -assert root, "couldn't load $bundle.lua" -root\mount path, true - -BROWSER = Browser root, path - -with io.open 'index.html', 'w' - \write [[ - - - - - - - - ]] - \write " - #{get_meta root} - - - #{header} - - #{assert (tohtml BROWSER), "couldn't render BROWSER"} - - #{footer} - " - \write [[ - - - - - - - - ]] - \write " - - - - " - \close! -- cgit v1.2.3 From 894bde0db758f2db03fd43d9fa2cd13a33d20643 Mon Sep 17 00:00:00 2001 From: s-ol Date: Mon, 7 Oct 2019 15:05:00 +0000 Subject: little meta-link updates --- build/import.moon | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ build/import_all.moon | 55 --------------------------------------------------- build/layout.moon | 9 +++++---- build/render_all.moon | 6 +++++- 4 files changed, 65 insertions(+), 60 deletions(-) create mode 100644 build/import.moon delete mode 100644 build/import_all.moon (limited to 'build') diff --git a/build/import.moon b/build/import.moon new file mode 100644 index 0000000..624b54a --- /dev/null +++ b/build/import.moon @@ -0,0 +1,55 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' +require 'lfs' +import Fileder, Key from require 'mmm.mmmfs.fileder' +import SQLStore from require 'mmm.mmmfs.drivers.sql' + +-- usage: +-- moon import.moon [output.sqlite3] +{ root, output } = arg + +assert root, "please specify the root directory" + +-- load a fs file as a fileder facet +load_facet = (filename, filepath) -> + key = (filename\match '(.*)%.%w+') or filename + key = Key key\gsub '%$', '/' + key.filename = filename + + file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'" + value = file\read '*all' + file\close! + + key, value + + +with SQLStore name: output, verbose: true + import_fileder = (fileder, dirpath) -> + for file in lfs.dir dirpath + continue if '.' == file\sub 1, 1 + continue if file == 'Tupdefault.lua' + continue if file == 'index.html' + continue if file == '$order' + + filepath = "#{dirpath}/#{file}" + attr = lfs.attributes filepath + switch attr.mode + when 'file' + key, value = load_facet file, filepath + \create_facet fileder, key.name, key.type, value + when 'directory' + next_fileder = \create_fileder fileder, file + -- \create_facet next_fileder, 'name', 'alpha', file + import_fileder next_fileder, filepath + else + warn "unknown entry type '#{attr.mode}'" + + import_fileder '', root diff --git a/build/import_all.moon b/build/import_all.moon deleted file mode 100644 index 3a2ac61..0000000 --- a/build/import_all.moon +++ /dev/null @@ -1,55 +0,0 @@ -add = (tmpl) -> - package.path ..= ";#{tmpl}.lua" - package.moonpath ..= ";#{tmpl}.moon" - -add '?' -add '?.server' -add '?/init' -add '?/init.server' - -require 'mmm' -require 'lfs' -import Fileder, Key from require 'mmm.mmmfs.fileder' -import SQLStore from require 'mmm.mmmfs.drivers.sql' - --- usage: --- moon import_all.moon -{ root } = arg - -assert root, "please specify the root directory" - --- load a fs file as a fileder facet -load_facet = (filename, filepath) -> - key = (filename\match '(.*)%.%w+') or filename - key = Key key\gsub '%$', '/' - key.filename = filename - - file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'" - value = file\read '*all' - file\close! - - key, value - - -with SQLStore verbose: true - import_fileder = (fileder, dirpath) -> - for file in lfs.dir dirpath - continue if '.' == file\sub 1, 1 - continue if file == 'Tupdefault.lua' - continue if file == 'index.html' - continue if file == '$order' - - filepath = "#{dirpath}/#{file}" - attr = lfs.attributes filepath - switch attr.mode - when 'file' - key, value = load_facet file, filepath - \create_facet fileder, key.name, key.type, value - when 'directory' - next_fileder = \create_fileder fileder, file - -- \create_facet next_fileder, 'name', 'alpha', file - import_fileder next_fileder, filepath - else - warn "unknown entry type '#{attr.mode}'" - - import_fileder '', root diff --git a/build/layout.moon b/build/layout.moon index 6d6e072..61f93cb 100644 --- a/build/layout.moon +++ b/build/layout.moon @@ -6,11 +6,11 @@ pick = (...) -> i = math.ceil math.random! * num select i, ... - iconlink = (href, src, alt, style) -> a { class: 'iconlink', - :href, target: '_blank', + rel: 'me', + :href, img :src, :alt, :style } @@ -69,8 +69,9 @@ logo = svg { } div { class: 'icons', - iconlink 'https://github.com/s-ol/mmm', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg', - iconlink 'https://twitter.com/S0lll0s', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/twitter.svg', + iconlink 'https://github.com/s-ol', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg', 'github' + iconlink 'https://merveilles.town/@s_ol', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/mastodon.svg', 'mastodon' + iconlink 'https://twitter.com/S0lll0s', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/twitter.svg', 'twitter' iconlink 'https://webring.xxiivv.com/#random', 'https://webring.xxiivv.com/icon.black.svg', 'webring', { height: '1.3em', 'margin-left': '.3em', 'margin-top': '-0.12em' } } diff --git a/build/render_all.moon b/build/render_all.moon index e2f171e..dfbed27 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -12,6 +12,10 @@ import tohtml from require 'mmm.component' import Browser from require 'mmm.mmmfs.browser' import get_meta, header, footer from require 'build.layout' +-- usage: +-- moon render_all.moon [db.sqlite3] +{ file } = arg + export BROWSER render = (fileder, output) -> @@ -106,7 +110,7 @@ load_tree = (store, root='') -> root -tree = load_tree SQLStore! +tree = load_tree SQLStore :name for fileder in coroutine.wrap tree\iterate print "rendering '#{fileder.path}'..." -- cgit v1.2.3 From 81e143fa8181a6adb58d7fba632bd31a13164410 Mon Sep 17 00:00:00 2001 From: s-ol Date: Mon, 7 Oct 2019 18:56:03 +0200 Subject: add simple HTTP server --- build/import.moon | 1 - build/render_all.moon | 36 --------------- build/server.moon | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++ build/util.moon | 37 ++++++++++++++++ 4 files changed, 156 insertions(+), 37 deletions(-) create mode 100644 build/server.moon (limited to 'build') diff --git a/build/import.moon b/build/import.moon index 624b54a..b5def43 100644 --- a/build/import.moon +++ b/build/import.moon @@ -30,7 +30,6 @@ load_facet = (filename, filepath) -> key, value - with SQLStore name: output, verbose: true import_fileder = (fileder, dirpath) -> for file in lfs.dir dirpath diff --git a/build/render_all.moon b/build/render_all.moon index dfbed27..14e4cce 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -73,42 +73,6 @@ render = (fileder, output) -> " \close! -import SQLStore from require 'mmm.mmmfs.drivers.sql' -import Fileder, Key from require 'mmm.mmmfs.fileder' - --- split filename into dirname + basename -dir_base = (path) -> - dir, base = path\match '(.-)([^/]-)$' - if dir and #dir > 0 - dir = dir\sub 1, #dir - 1 - - dir, base - -load_tree = (store, root='') -> - fileders = setmetatable {}, - __index: (path) => - with val = Fileder {} - .path = path - rawset @, path, val - - root = fileders[root] - root.facets['name: alpha'] = '' - for fn, ft in store\list_facets root.path - val = store\load_facet root.path, fn, ft - root.facets[Key fn, ft] = val - - for path in store\list_all_fileders root.path - fileder = fileders[path] - - parent, name = dir_base path - fileder.facets['name: alpha'] = name - table.insert fileders[parent].children, fileder - - for fn, ft in store\list_facets path - val = store\load_facet path, fn, ft - fileder.facets[Key fn, ft] = val - - root tree = load_tree SQLStore :name diff --git a/build/server.moon b/build/server.moon new file mode 100644 index 0000000..dd491d3 --- /dev/null +++ b/build/server.moon @@ -0,0 +1,119 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' +import dir_base, load_tree from require 'build.util' +import Key from require 'mmm.mmmfs.fileder' +import SQLStore from require 'mmm.mmmfs.drivers.sql' + +server = require 'http.server' +headers = require 'http.headers' + +tojson = (obj) -> + switch type obj + when 'string' + string.format '%q', obj + when 'table' + if obj[1] or not next obj + "[#{table.concat [tojson c for c in *obj], ','}]" + else + "{#{table.concat ["#{tojson k}: #{tojson v}" for k,v in pairs obj], ', '}}" + when 'number' + tostring obj + when 'boolean' + tostring obj + when nil + 'null' + +class Server + new: (@tree, opts={}) => + opts = {k,v for k,v in pairs opts} + opts.host = 'localhost' unless opts.host + opts.port = 8000 unless opts.port + opts.onstream = @\stream + opts.onerror = @\error + + @server = server.listen opts + + listen: => + assert @server\listen! + + _, ip, port = @server\localname! + print "SV", "running at #{ip}:#{port}" + assert @server\loop! + + handle: (method, path, facet) => + fileder = @tree\walk path + switch method + when 'GET', 'HEAD' + if fileder and facet + -- fileder and facet given + if not fileder\has_facet facet.name + return 404, "facet '#{facet.name}' not found in fileder '#{path}'" + + val = fileder\get facet + if val + 200, val + else + 406, 'cant convert facet' + elseif fileder + -- no facet given + facets = [{k.name, k.type} for k,v in pairs fileder.facets] + children = [f.path for f in *fileder.children] + print facets + print children + contents = tojson :facets, :children + 200, contents + else + -- fileder not found + 404, "fileder '#{path}' not found" + else + 501, 'not implemented' + + stream: (sv, stream) => + req = stream\get_headers! + method = req\get ':method' + path = req\get ':path' + + path, facet = dir_base path + print "'#{path}', '#{facet}'" + facet = if #facet > 0 + facet = '' if facet == ':' + accept = req\get 'mmm-accept' + Key facet, accept or 'text/html' + else + nil + + status, body = @handle method, path, facet + + res = headers.new! + response_type = if status > 299 then 'text/plain' + else if facet then facet.type + else 'text/plain' + res\append ':status', tostring status + res\append 'content-type', response_type + + if method == 'HEAD' + stream\write_headers res, true + else + stream\write_headers res, false + stream\write_chunk body, true + + error: (sv, ctx, op, err, errno) => + msg = "#{op} on #{tostring ctx} failed" + msg = "#{msg}: #{err}" if err + print msg + +-- usage: +-- moon server.moon [db.sqlite3] +{ file } = arg + +tree = load_tree SQLStore :file +server = Server tree +server\listen! diff --git a/build/util.moon b/build/util.moon index b9c9613..92450c7 100644 --- a/build/util.moon +++ b/build/util.moon @@ -1,4 +1,5 @@ require 'lfs' +import Fileder, Key from require 'mmm.mmmfs.fileder' get_path = (root) -> cwd = lfs.currentdir! @@ -11,6 +12,42 @@ get_path = (root) -> path +-- split filename into dirname + basename +dir_base = (path) -> + dir, base = path\match '(.-)([^/]-)$' + if dir and #dir > 0 + dir = dir\sub 1, #dir - 1 + + dir, base + +load_tree = (store, root='') -> + fileders = setmetatable {}, + __index: (path) => + with val = Fileder {} + .path = path + rawset @, path, val + + root = fileders[root] + root.facets['name: alpha'] = '' + for fn, ft in store\list_facets root.path + val = store\load_facet root.path, fn, ft + root.facets[Key fn, ft] = val + + for path in store\list_all_fileders root.path + fileder = fileders[path] + + parent, name = dir_base path + fileder.facets['name: alpha'] = name + table.insert fileders[parent].children, fileder + + for fn, ft in store\list_facets path + val = store\load_facet path, fn, ft + fileder.facets[Key fn, ft] = val + + root + { :get_path + :dir_base + :load_tree } -- cgit v1.2.3 From ad26c7c4e374f66a978f9946bbb083377f2224a6 Mon Sep 17 00:00:00 2001 From: s-ol Date: Mon, 7 Oct 2019 19:49:16 +0200 Subject: allow server to render with layout --- build/layout.moon | 108 -------------------------------------------------- build/render_all.moon | 71 +++++---------------------------- build/server.moon | 3 +- 3 files changed, 12 insertions(+), 170 deletions(-) delete mode 100644 build/layout.moon (limited to 'build') diff --git a/build/layout.moon b/build/layout.moon deleted file mode 100644 index 61f93cb..0000000 --- a/build/layout.moon +++ /dev/null @@ -1,108 +0,0 @@ -import header, aside, footer, div, svg, script, g, circle, h1, span, b, a, img from require 'mmm.dom' -import navigate_to from (require 'mmm.mmmfs.util') require 'mmm.dom' - -pick = (...) -> - num = select '#', ... - i = math.ceil math.random! * num - select i, ... - -iconlink = (href, src, alt, style) -> a { - class: 'iconlink', - target: '_blank', - rel: 'me', - :href, - img :src, :alt, :style -} - -logo = svg { - class: 'sun' - viewBox: '-0.75 -1 1.5 2' - xmlns: 'http://www.w3.org/2000/svg' - baseProfile: 'full' - version: '1.1' - - g { - transform: 'translate(0 .18)' - - g { class: 'circle out', circle r: '.6', fill: 'none', 'stroke-width': '.12' } - g { class: 'circle in', circle r: '.2', stroke: 'none' } - } -} - -{ - header: header { - div { - h1 { - logo - span { - span 'mmm', class: 'bold' - '​' - '.s‑ol.nu' - } - } - span "fun stuff with code and wires" - -- pick 'fun', 'cool', 'weird', 'interesting', 'new' - -- pick 'stuff', 'things', 'projects', 'experiments', 'news' - -- "with" - -- pick 'mostly code', 'code and wires', 'silicon', 'electronics' - } - aside { - navigate_to '/about', 'about me' - navigate_to '/games', 'games' - navigate_to '/projects', 'other' - a { - href: 'mailto:s%20[removethis]%20[at]%20s-ol.nu' - 'contact' - script " - var l = document.currentScript.parentElement; - l.href = l.href.replace('%20[at]%20', '@'); - l.href = l.href.replace('%20[removethis]', '') + '?subject=Hey there :)'; - " - } - } - } - footer: footer { - span { - 'made with \xe2\x98\xbd by ' - a 's-ol', href: 'https://twitter.com/S0lll0s' - ", #{os.date '%Y'}" - } - div { - class: 'icons', - iconlink 'https://github.com/s-ol', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/github.svg', 'github' - iconlink 'https://merveilles.town/@s_ol', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/mastodon.svg', 'mastodon' - iconlink 'https://twitter.com/S0lll0s', 'https://cdn.jsdelivr.net/npm/simple-icons@latest/icons/twitter.svg', 'twitter' - iconlink 'https://webring.xxiivv.com/#random', 'https://webring.xxiivv.com/icon.black.svg', 'webring', - { height: '1.3em', 'margin-left': '.3em', 'margin-top': '-0.12em' } - } - } - get_meta: => - title = (@get 'title: text/plain') or @gett 'name: alpha' - - l = (str) -> - str = str\gsub '[%s\\n]+$', '' - str\gsub '\\n', ' ' - e = (str) -> string.format '%q', l str - - meta = " - - #{l title} - " - - if page_meta = @get '_meta: mmm/dom' - meta ..= page_meta - else - meta ..= " - - - - - - " - - if desc = @get 'description: text/plain' - meta ..= " - " - - meta -} diff --git a/build/render_all.moon b/build/render_all.moon index 14e4cce..4fe827b 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -10,73 +10,24 @@ add '?/init.server' require 'mmm' import tohtml from require 'mmm.component' import Browser from require 'mmm.mmmfs.browser' -import get_meta, header, footer from require 'build.layout' +import render from require 'mmm.mmmfs.layout' +import SQLStore from require 'mmm.mmmfs.drivers.sql' +import load_tree from require 'build.util' -- usage: --- moon render_all.moon [db.sqlite3] -{ file } = arg +-- moon render_all.moon [db.sqlite3] [startpath] +{ file, startpath } = arg export BROWSER -render = (fileder, output) -> - BROWSER = Browser fileder - - with io.open output, 'w' - \write [[ - - - - - - - - ]] - \write " - #{get_meta fileder} - - - #{header} - - #{assert (tohtml BROWSER), "couldn't render BROWSER"} - - #{footer} - " - \write [[ - - - - - - - - ]] - \write " - - - - " - \close! - - tree = load_tree SQLStore :name +tree = tree\walk startpath if startpath for fileder in coroutine.wrap tree\iterate print "rendering '#{fileder.path}'..." os.execute "mkdir -p 'out/#{fileder.path}'" - render fileder, "out/#{fileder.path}/index.html" + + BROWSER = Browser fileder + with io.open "out/#{fileder.path}/index.html", 'w' + \write render (tohtml BROWSER), fileder + \close! diff --git a/build/server.moon b/build/server.moon index dd491d3..b178636 100644 --- a/build/server.moon +++ b/build/server.moon @@ -82,7 +82,6 @@ class Server path = req\get ':path' path, facet = dir_base path - print "'#{path}', '#{facet}'" facet = if #facet > 0 facet = '' if facet == ':' accept = req\get 'mmm-accept' @@ -95,7 +94,7 @@ class Server res = headers.new! response_type = if status > 299 then 'text/plain' else if facet then facet.type - else 'text/plain' + else 'text/json' res\append ':status', tostring status res\append 'content-type', response_type -- cgit v1.2.3 From d63e8f54a87076cfbd3cb458c3e2128f46a9038d Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 13:24:24 +0200 Subject: serve static assets from as ?... --- build/import.moon | 3 +-- build/render_all.moon | 3 ++- build/server.moon | 55 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 5 deletions(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index b5def43..e87f12d 100644 --- a/build/import.moon +++ b/build/import.moon @@ -39,8 +39,7 @@ with SQLStore name: output, verbose: true continue if file == '$order' filepath = "#{dirpath}/#{file}" - attr = lfs.attributes filepath - switch attr.mode + switch lfs.attributes filepath, 'mode' when 'file' key, value = load_facet file, filepath \create_facet fileder, key.name, key.type, value diff --git a/build/render_all.moon b/build/render_all.moon index 4fe827b..7797b7b 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -18,7 +18,8 @@ import load_tree from require 'build.util' -- moon render_all.moon [db.sqlite3] [startpath] { file, startpath } = arg -export BROWSER +export BROWSER, STATIC +STATIC = true tree = load_tree SQLStore :name tree = tree\walk startpath if startpath diff --git a/build/server.moon b/build/server.moon index b178636..a78f922 100644 --- a/build/server.moon +++ b/build/server.moon @@ -8,10 +8,12 @@ add '?/init' add '?/init.server' require 'mmm' + import dir_base, load_tree from require 'build.util' import Key from require 'mmm.mmmfs.fileder' import SQLStore from require 'mmm.mmmfs.drivers.sql' +lfs = require 'lfs' server = require 'http.server' headers = require 'http.headers' @@ -66,8 +68,6 @@ class Server -- no facet given facets = [{k.name, k.type} for k,v in pairs fileder.facets] children = [f.path for f in *fileder.children] - print facets - print children contents = tojson :facets, :children 200, contents else @@ -81,6 +81,57 @@ class Server method = req\get ':method' path = req\get ':path' + if path\match '^/%?' + -- serve static assets, cheap hack for now + + res = headers.new! + if method ~= 'GET' and method ~= 'HEAD' + res\append ':status', '405' + stream\write_headers res, true + return + + static_path = "static/#{path\sub 3}" + + if 'file' == lfs.attributes static_path, 'mode' + fd, err, errno = io.open static_path, 'rb' + + if not fd + code = switch errno + when ce.ENOENT then '404' + when ce.EACCES then '403' + else '503' + + res\upsert ':status', code + res\append 'content-type', 'text/plain' + + assert stream\write_headers res, method == 'HEAD' + if method ~= 'HEAD' + assert stream\write_body_from_string err + + else + suffix = static_path\match '%.([a-z]+)$' + type = switch suffix + when 'css' then 'text/css' + when 'lua' then 'application/lua' + when 'js' then 'application/javascript' + else 'application/octet-stream' + + res\upsert ':status', '200' + res\append 'content-type', type + + assert stream\write_headers res, method == 'HEAD' + if method ~= 'HEAD' + assert stream\write_body_from_file fd + else + res\upsert ':status', '404' + res\append 'content-type', 'text/plain' + + assert stream\write_headers res, method == 'HEAD' + if method ~= 'HEAD' + assert stream\write_body_from_string "not found" + + return + path, facet = dir_base path facet = if #facet > 0 facet = '' if facet == ':' -- cgit v1.2.3 From 906f68559479253f7035f42c953bf81dec5331b6 Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 14:35:41 +0200 Subject: change server path mapping --- build/server.moon | 114 +++++++++++++++++++++++++++--------------------------- 1 file changed, 58 insertions(+), 56 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index a78f922..4749736 100644 --- a/build/server.moon +++ b/build/server.moon @@ -63,7 +63,7 @@ class Server if val 200, val else - 406, 'cant convert facet' + 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" elseif fileder -- no facet given facets = [{k.name, k.type} for k,v in pairs fileder.facets] @@ -74,71 +74,75 @@ class Server -- fileder not found 404, "fileder '#{path}' not found" else - 501, 'not implemented' + 501, "not implemented" - stream: (sv, stream) => - req = stream\get_headers! - method = req\get ':method' - path = req\get ':path' - - if path\match '^/%?' - -- serve static assets, cheap hack for now + handle_static: (method, path, stream) => + path = path\match '^/%?static/(.*)' + return unless path + respond = (code, type, body) -> res = headers.new! - if method ~= 'GET' and method ~= 'HEAD' - res\append ':status', '405' - stream\write_headers res, true - return + res\upsert ':status', code + res\append 'content-type', type - static_path = "static/#{path\sub 3}" + assert stream\write_headers res, method == 'HEAD' + if body and method ~= 'HEAD' + assert stream\write_body_from_string body - if 'file' == lfs.attributes static_path, 'mode' - fd, err, errno = io.open static_path, 'rb' + if method ~= 'GET' and method ~= 'HEAD' + respond '405', 'text/plain', "can only GET/HEAD static resources" + return true - if not fd - code = switch errno - when ce.ENOENT then '404' - when ce.EACCES then '403' - else '503' + if path\match '^%.' or path\match '^%~' + respond '404', 'text/plain', "not found" + return - res\upsert ':status', code - res\append 'content-type', 'text/plain' + file_path = "static/#{path}" + if 'file' == lfs.attributes file_path, 'mode' + fd, err, errno = io.open file_path, 'rb' - assert stream\write_headers res, method == 'HEAD' - if method ~= 'HEAD' - assert stream\write_body_from_string err + if not fd + code = switch errno + when ce.ENOENT then '404' + when ce.EACCES then '403' + else '503' - else - suffix = static_path\match '%.([a-z]+)$' - type = switch suffix - when 'css' then 'text/css' - when 'lua' then 'application/lua' - when 'js' then 'application/javascript' - else 'application/octet-stream' - - res\upsert ':status', '200' - res\append 'content-type', type - - assert stream\write_headers res, method == 'HEAD' - if method ~= 'HEAD' - assert stream\write_body_from_file fd - else - res\upsert ':status', '404' - res\append 'content-type', 'text/plain' + respond code, 'text/plain', err or '' - assert stream\write_headers res, method == 'HEAD' + else + suffix = file_path\match '%.([a-z]+)$' + type = switch suffix + when 'css' then 'text/css' + when 'lua' then 'application/lua' + when 'js' then 'application/javascript' + else 'application/octet-stream' + + respond '200', type, nil if method ~= 'HEAD' - assert stream\write_body_from_string "not found" + assert stream\write_body_from_file fd + else + respond '404', 'text/plain', "not found" - return + true - path, facet = dir_base path - facet = if #facet > 0 - facet = '' if facet == ':' - accept = req\get 'mmm-accept' - Key facet, accept or 'text/html' + stream: (sv, stream) => + req = stream\get_headers! + method = req\get ':method' + path = req\get ':path' + + -- serve static assets, cheap hack for now + return if @handle_static method, path, stream + + path_facet, type = path\match '(.*):(.*)' + path_facet or= path + path, facet = path_facet\match '(.*)/([^/]*)' + + if facet ~= '?index' + type or= 'text/html' + type = type\match '%s*(.*)' + facet = Key facet, type else - nil + facet = nil status, body = @handle method, path, facet @@ -149,10 +153,8 @@ class Server res\append ':status', tostring status res\append 'content-type', response_type - if method == 'HEAD' - stream\write_headers res, true - else - stream\write_headers res, false + stream\write_headers res, method == 'HEAD' + if method ~= 'HEAD' stream\write_chunk body, true error: (sv, ctx, op, err, errno) => -- cgit v1.2.3 From 7f261ca5fe336d3d3a0ab9147fd7a5feecdaf36c Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 14:46:16 +0200 Subject: change static path to work with static content --- build/server.moon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 4749736..a9b8431 100644 --- a/build/server.moon +++ b/build/server.moon @@ -77,7 +77,7 @@ class Server 501, "not implemented" handle_static: (method, path, stream) => - path = path\match '^/%?static/(.*)' + path = path\match '^/%.static/(.*)' return unless path respond = (code, type, body) -> @@ -93,7 +93,7 @@ class Server respond '405', 'text/plain', "can only GET/HEAD static resources" return true - if path\match '^%.' or path\match '^%~' + if path\match '%.%.' or path\match '^%~' respond '404', 'text/plain', "not found" return -- cgit v1.2.3 From 92861ee9812b30b68f87f5c0f13125119e592473 Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 15:37:53 +0200 Subject: add anything -> URL cast --- build/import.moon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index e87f12d..aa8250e 100644 --- a/build/import.moon +++ b/build/import.moon @@ -24,7 +24,7 @@ load_facet = (filename, filepath) -> key = Key key\gsub '%$', '/' key.filename = filename - file = assert (io.open filepath, 'r'), "couldn't open facet file '#{filename}'" + file = assert (io.open filepath, 'rb'), "couldn't open facet file '#{filename}'" value = file\read '*all' file\close! -- cgit v1.2.3 From ca96a23197e3d1dcb11b68cc1d15aafa516d5ac9 Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 19:04:21 +0200 Subject: realtime server Dockerfile --- build/import.moon | 4 ++-- build/render_all.moon | 2 +- build/server.moon | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index aa8250e..ceb56ad 100644 --- a/build/import.moon +++ b/build/import.moon @@ -14,7 +14,7 @@ import SQLStore from require 'mmm.mmmfs.drivers.sql' -- usage: -- moon import.moon [output.sqlite3] -{ root, output } = arg +{ root, file } = arg assert root, "please specify the root directory" @@ -30,7 +30,7 @@ load_facet = (filename, filepath) -> key, value -with SQLStore name: output, verbose: true +with SQLStore :file, verbose: true import_fileder = (fileder, dirpath) -> for file in lfs.dir dirpath continue if '.' == file\sub 1, 1 diff --git a/build/render_all.moon b/build/render_all.moon index 7797b7b..259346b 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -21,7 +21,7 @@ import load_tree from require 'build.util' export BROWSER, STATIC STATIC = true -tree = load_tree SQLStore :name +tree = load_tree SQLStore :file tree = tree\walk startpath if startpath for fileder in coroutine.wrap tree\iterate diff --git a/build/server.moon b/build/server.moon index a9b8431..3731879 100644 --- a/build/server.moon +++ b/build/server.moon @@ -163,9 +163,9 @@ class Server print msg -- usage: --- moon server.moon [db.sqlite3] -{ file } = arg +-- moon server.moon [db.sqlite3] [host] [port] +{ file, host, port } = arg tree = load_tree SQLStore :file -server = Server tree +server = Server tree, :host, port: port and tonumber port server\listen! -- cgit v1.2.3 From 053624c2b71f894d71e9b782475679d1cef5a926 Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 8 Oct 2019 21:59:18 +0200 Subject: urlDecode incoming request paths --- build/server.moon | 2 ++ 1 file changed, 2 insertions(+) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 3731879..8fb0615 100644 --- a/build/server.moon +++ b/build/server.moon @@ -12,6 +12,7 @@ require 'mmm' import dir_base, load_tree from require 'build.util' import Key from require 'mmm.mmmfs.fileder' import SQLStore from require 'mmm.mmmfs.drivers.sql' +import decodeURI from require 'http.util' lfs = require 'lfs' server = require 'http.server' @@ -129,6 +130,7 @@ class Server req = stream\get_headers! method = req\get ':method' path = req\get ':path' + path = decodeURI path -- serve static assets, cheap hack for now return if @handle_static method, path, stream -- cgit v1.2.3 From 762d3a849bfc8b730a66ce0679d9190e578b96cc Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 9 Oct 2019 13:15:23 +0200 Subject: thin out build folder --- build/render_all.moon | 9 +++------ build/server.moon | 3 +-- build/util.moon | 53 --------------------------------------------------- 3 files changed, 4 insertions(+), 61 deletions(-) delete mode 100644 build/util.moon (limited to 'build') diff --git a/build/render_all.moon b/build/render_all.moon index 259346b..2a16a5f 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -8,17 +8,15 @@ add '?/init' add '?/init.server' require 'mmm' -import tohtml from require 'mmm.component' -import Browser from require 'mmm.mmmfs.browser' +import load_tree from require 'mmm.mmmfs.fileder' import render from require 'mmm.mmmfs.layout' import SQLStore from require 'mmm.mmmfs.drivers.sql' -import load_tree from require 'build.util' -- usage: -- moon render_all.moon [db.sqlite3] [startpath] { file, startpath } = arg -export BROWSER, STATIC +export STATIC STATIC = true tree = load_tree SQLStore :file @@ -28,7 +26,6 @@ for fileder in coroutine.wrap tree\iterate print "rendering '#{fileder.path}'..." os.execute "mkdir -p 'out/#{fileder.path}'" - BROWSER = Browser fileder with io.open "out/#{fileder.path}/index.html", 'w' - \write render (tohtml BROWSER), fileder + \write render (fileder\get 'text/html'), fileder \close! diff --git a/build/server.moon b/build/server.moon index 8fb0615..b28073e 100644 --- a/build/server.moon +++ b/build/server.moon @@ -9,8 +9,7 @@ add '?/init.server' require 'mmm' -import dir_base, load_tree from require 'build.util' -import Key from require 'mmm.mmmfs.fileder' +import Key, dir_base, load_tree from require 'mmm.mmmfs.fileder' import SQLStore from require 'mmm.mmmfs.drivers.sql' import decodeURI from require 'http.util' diff --git a/build/util.moon b/build/util.moon deleted file mode 100644 index 92450c7..0000000 --- a/build/util.moon +++ /dev/null @@ -1,53 +0,0 @@ -require 'lfs' -import Fileder, Key from require 'mmm.mmmfs.fileder' - -get_path = (root) -> - cwd = lfs.currentdir! - path = '' - - while root\find '^%.%./' - root = root\match '^%.%./(.*)' - cwd, trimmed = cwd\match '(.*)(/[^/]+)$' - path = trimmed .. path - - path - --- split filename into dirname + basename -dir_base = (path) -> - dir, base = path\match '(.-)([^/]-)$' - if dir and #dir > 0 - dir = dir\sub 1, #dir - 1 - - dir, base - -load_tree = (store, root='') -> - fileders = setmetatable {}, - __index: (path) => - with val = Fileder {} - .path = path - rawset @, path, val - - root = fileders[root] - root.facets['name: alpha'] = '' - for fn, ft in store\list_facets root.path - val = store\load_facet root.path, fn, ft - root.facets[Key fn, ft] = val - - for path in store\list_all_fileders root.path - fileder = fileders[path] - - parent, name = dir_base path - fileder.facets['name: alpha'] = name - table.insert fileders[parent].children, fileder - - for fn, ft in store\list_facets path - val = store\load_facet path, fn, ft - fileder.facets[Key fn, ft] = val - - root - -{ - :get_path - :dir_base - :load_tree -} -- cgit v1.2.3 From 342db785a82417c58ec54bd9779a8a7fca61bfaf Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 9 Oct 2019 13:47:39 +0200 Subject: rename drivers to stores, make server, render_all store-agnostic --- build/import.moon | 2 +- build/render_all.moon | 9 +++++---- build/server.moon | 9 +++++---- 3 files changed, 11 insertions(+), 9 deletions(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index ceb56ad..1e4df31 100644 --- a/build/import.moon +++ b/build/import.moon @@ -14,7 +14,7 @@ import SQLStore from require 'mmm.mmmfs.drivers.sql' -- usage: -- moon import.moon [output.sqlite3] -{ root, file } = arg +{ root, store } = arg assert root, "please specify the root directory" diff --git a/build/render_all.moon b/build/render_all.moon index 2a16a5f..02da12c 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -9,17 +9,18 @@ add '?/init.server' require 'mmm' import load_tree from require 'mmm.mmmfs.fileder' +import get_store from require 'mmm.mmmfs.stores' import render from require 'mmm.mmmfs.layout' -import SQLStore from require 'mmm.mmmfs.drivers.sql' -- usage: --- moon render_all.moon [db.sqlite3] [startpath] -{ file, startpath } = arg +-- moon render_all.moon [STORE] [startpath] +{ store, startpath } = arg export STATIC STATIC = true -tree = load_tree SQLStore :file +store = get_store store +tree = load_tree store tree = tree\walk startpath if startpath for fileder in coroutine.wrap tree\iterate diff --git a/build/server.moon b/build/server.moon index b28073e..2906d9b 100644 --- a/build/server.moon +++ b/build/server.moon @@ -10,7 +10,7 @@ add '?/init.server' require 'mmm' import Key, dir_base, load_tree from require 'mmm.mmmfs.fileder' -import SQLStore from require 'mmm.mmmfs.drivers.sql' +import get_store from require 'mmm.mmmfs.stores' import decodeURI from require 'http.util' lfs = require 'lfs' @@ -164,9 +164,10 @@ class Server print msg -- usage: --- moon server.moon [db.sqlite3] [host] [port] -{ file, host, port } = arg +-- moon server.moon [STORE] [host] [port] +{ store, host, port } = arg -tree = load_tree SQLStore :file +store = get_store store +tree = load_tree store server = Server tree, :host, port: port and tonumber port server\listen! -- cgit v1.2.3 From 97bc4a0d8d866026905eac6f0ba08b75f166219a Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 9 Oct 2019 14:08:41 +0200 Subject: make live server load subtree just-in-time (for live refreshing) --- build/server.moon | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 2906d9b..983b43b 100644 --- a/build/server.moon +++ b/build/server.moon @@ -34,7 +34,7 @@ tojson = (obj) -> 'null' class Server - new: (@tree, opts={}) => + new: (@store, opts={}) => opts = {k,v for k,v in pairs opts} opts.host = 'localhost' unless opts.host opts.port = 8000 unless opts.port @@ -51,7 +51,7 @@ class Server assert @server\loop! handle: (method, path, facet) => - fileder = @tree\walk path + fileder = load_tree @store, path -- @tree\walk path switch method when 'GET', 'HEAD' if fileder and facet @@ -168,6 +168,5 @@ class Server { store, host, port } = arg store = get_store store -tree = load_tree store -server = Server tree, :host, port: port and tonumber port +server = Server store, :host, port: port and tonumber port server\listen! -- cgit v1.2.3 From 005cc9b3914128267017620984aee921999e173f Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 10 Oct 2019 20:54:42 +0200 Subject: move static files into root/ --- build/server.moon | 52 ---------------------------------------------------- 1 file changed, 52 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 983b43b..ca08874 100644 --- a/build/server.moon +++ b/build/server.moon @@ -76,64 +76,12 @@ class Server else 501, "not implemented" - handle_static: (method, path, stream) => - path = path\match '^/%.static/(.*)' - return unless path - - respond = (code, type, body) -> - res = headers.new! - res\upsert ':status', code - res\append 'content-type', type - - assert stream\write_headers res, method == 'HEAD' - if body and method ~= 'HEAD' - assert stream\write_body_from_string body - - if method ~= 'GET' and method ~= 'HEAD' - respond '405', 'text/plain', "can only GET/HEAD static resources" - return true - - if path\match '%.%.' or path\match '^%~' - respond '404', 'text/plain', "not found" - return - - file_path = "static/#{path}" - if 'file' == lfs.attributes file_path, 'mode' - fd, err, errno = io.open file_path, 'rb' - - if not fd - code = switch errno - when ce.ENOENT then '404' - when ce.EACCES then '403' - else '503' - - respond code, 'text/plain', err or '' - - else - suffix = file_path\match '%.([a-z]+)$' - type = switch suffix - when 'css' then 'text/css' - when 'lua' then 'application/lua' - when 'js' then 'application/javascript' - else 'application/octet-stream' - - respond '200', type, nil - if method ~= 'HEAD' - assert stream\write_body_from_file fd - else - respond '404', 'text/plain', "not found" - - true - stream: (sv, stream) => req = stream\get_headers! method = req\get ':method' path = req\get ':path' path = decodeURI path - -- serve static assets, cheap hack for now - return if @handle_static method, path, stream - path_facet, type = path\match '(.*):(.*)' path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' -- cgit v1.2.3 From ffa343c41fca7a38dc00bb929d31fb7552578900 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 10 Oct 2019 21:01:37 +0200 Subject: serve from root/ in docker --- build/import.moon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index 1e4df31..ba99b03 100644 --- a/build/import.moon +++ b/build/import.moon @@ -10,7 +10,7 @@ add '?/init.server' require 'mmm' require 'lfs' import Fileder, Key from require 'mmm.mmmfs.fileder' -import SQLStore from require 'mmm.mmmfs.drivers.sql' +import SQLStore from require 'mmm.mmmfs.stores.sql' -- usage: -- moon import.moon [output.sqlite3] -- cgit v1.2.3 From b36a1a6c61a6e8bff156ce4e2dc66fe8ed8cd95e Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 10 Oct 2019 22:56:26 +0200 Subject: ?index and ?tree as real facets with typecasting to application/json --- build/server.moon | 71 +++++++++++++++++++++++-------------------------------- 1 file changed, 30 insertions(+), 41 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index ca08874..df18472 100644 --- a/build/server.moon +++ b/build/server.moon @@ -10,6 +10,7 @@ add '?/init.server' require 'mmm' import Key, dir_base, load_tree from require 'mmm.mmmfs.fileder' +import convert from require 'mmm.mmmfs.conversion' import get_store from require 'mmm.mmmfs.stores' import decodeURI from require 'http.util' @@ -17,22 +18,6 @@ lfs = require 'lfs' server = require 'http.server' headers = require 'http.headers' -tojson = (obj) -> - switch type obj - when 'string' - string.format '%q', obj - when 'table' - if obj[1] or not next obj - "[#{table.concat [tojson c for c in *obj], ','}]" - else - "{#{table.concat ["#{tojson k}: #{tojson v}" for k,v in pairs obj], ', '}}" - when 'number' - tostring obj - when 'boolean' - tostring obj - when nil - 'null' - class Server new: (@store, opts={}) => opts = {k,v for k,v in pairs opts} @@ -52,27 +37,31 @@ class Server handle: (method, path, facet) => fileder = load_tree @store, path -- @tree\walk path + + if not fileder + -- fileder not found + 404, "fileder '#{path}' not found" + switch method when 'GET', 'HEAD' - if fileder and facet - -- fileder and facet given - if not fileder\has_facet facet.name - return 404, "facet '#{facet.name}' not found in fileder '#{path}'" - - val = fileder\get facet - if val - 200, val + val = switch facet.name + when '?index', '?tree' + -- serve fileder index + -- '?index': one level deep + -- '?tree': recursively + index = fileder\get_index facet.name == '?tree' + convert 'table', facet.type, index else - 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" - elseif fileder - -- no facet given - facets = [{k.name, k.type} for k,v in pairs fileder.facets] - children = [f.path for f in *fileder.children] - contents = tojson :facets, :children - 200, contents + -- fileder and facet given + if not fileder\has_facet facet.name + return 404, "facet '#{facet.name}' not found in fileder '#{path}'" + + fileder\get facet + + if val + 200, val else - -- fileder not found - 404, "fileder '#{path}' not found" + 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" else 501, "not implemented" @@ -86,14 +75,15 @@ class Server path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' - if facet ~= '?index' - type or= 'text/html' - type = type\match '%s*(.*)' - facet = Key facet, type - else - facet = nil + type or= 'text/html' + type = type\match '%s*(.*)' + facet = Key facet, type - status, body = @handle method, path, facet + ok, status, body = pcall @.handle, @, method, path, facet + if not ok + warn status, body + body = "Internal Server Error: #{status}" + status = 500 res = headers.new! response_type = if status > 299 then 'text/plain' @@ -109,7 +99,6 @@ class Server error: (sv, ctx, op, err, errno) => msg = "#{op} on #{tostring ctx} failed" msg = "#{msg}: #{err}" if err - print msg -- usage: -- moon server.moon [STORE] [host] [port] -- cgit v1.2.3 From 9ab2f0fe3a1a043300536a057bafe5058d987d7f Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 10 Oct 2019 17:38:52 +0200 Subject: add $interactive facet with Browser --- build/server.moon | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index df18472..693f00c 100644 --- a/build/server.moon +++ b/build/server.moon @@ -12,6 +12,8 @@ require 'mmm' import Key, dir_base, load_tree from require 'mmm.mmmfs.fileder' import convert from require 'mmm.mmmfs.conversion' import get_store from require 'mmm.mmmfs.stores' +import render from require 'mmm.mmmfs.layout' +import Browser from require 'mmm.mmmfs.browser' import decodeURI from require 'http.util' lfs = require 'lfs' @@ -45,6 +47,24 @@ class Server switch method when 'GET', 'HEAD' val = switch facet.name + when '?interactive' + export BROWSER + + root = load_tree @store + BROWSER = Browser root, path + render BROWSER\todom!, fileder, noview: true, scripts: " + " + when '?index', '?tree' -- serve fileder index -- '?index': one level deep -- cgit v1.2.3 From 9632233c16a26f017c648faf36a6b26833e62f2e Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 10 Oct 2019 18:42:07 +0200 Subject: make fileders load just-in-time --- build/import.moon | 2 +- build/render_all.moon | 4 ++-- build/server.moon | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'build') diff --git a/build/import.moon b/build/import.moon index ba99b03..92d4397 100644 --- a/build/import.moon +++ b/build/import.moon @@ -9,7 +9,7 @@ add '?/init.server' require 'mmm' require 'lfs' -import Fileder, Key from require 'mmm.mmmfs.fileder' +import Key from require 'mmm.mmmfs.fileder' import SQLStore from require 'mmm.mmmfs.stores.sql' -- usage: diff --git a/build/render_all.moon b/build/render_all.moon index 02da12c..b09957e 100644 --- a/build/render_all.moon +++ b/build/render_all.moon @@ -8,7 +8,7 @@ add '?/init' add '?/init.server' require 'mmm' -import load_tree from require 'mmm.mmmfs.fileder' +import Fileder from require 'mmm.mmmfs.fileder' import get_store from require 'mmm.mmmfs.stores' import render from require 'mmm.mmmfs.layout' @@ -20,7 +20,7 @@ export STATIC STATIC = true store = get_store store -tree = load_tree store +tree = Fileder store tree = tree\walk startpath if startpath for fileder in coroutine.wrap tree\iterate diff --git a/build/server.moon b/build/server.moon index 693f00c..4e7ad3a 100644 --- a/build/server.moon +++ b/build/server.moon @@ -9,7 +9,7 @@ add '?/init.server' require 'mmm' -import Key, dir_base, load_tree from require 'mmm.mmmfs.fileder' +import dir_base, Key, Fileder from require 'mmm.mmmfs.fileder' import convert from require 'mmm.mmmfs.conversion' import get_store from require 'mmm.mmmfs.stores' import render from require 'mmm.mmmfs.layout' @@ -38,7 +38,7 @@ class Server assert @server\loop! handle: (method, path, facet) => - fileder = load_tree @store, path -- @tree\walk path + fileder = Fileder @store, path if not fileder -- fileder not found @@ -50,7 +50,7 @@ class Server when '?interactive' export BROWSER - root = load_tree @store + root = Fileder @store BROWSER = Browser root, path render BROWSER\todom!, fileder, noview: true, scripts: " " - when '?index', '?tree' -- serve fileder index -- '?index': one level deep @@ -81,7 +59,30 @@ class Server if not fileder\has_facet facet.name return 404, "facet '#{facet.name}' not found in fileder '#{path}'" - fileder\get facet + if facet.type == 'text/html+interactive' + export BROWSER + + root = Fileder @store + BROWSER = Browser root, path, facet.name + render BROWSER\todom!, fileder, noview: true, scripts: " + " + else + fileder\get facet if val 200, val @@ -100,7 +101,7 @@ class Server path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' - type or= 'text/html' + type or= 'text/html+interactive' type = type\match '%s*(.*)' facet = Key facet, type @@ -112,8 +113,8 @@ class Server res = headers.new! response_type = if status > 299 then 'text/plain' - else if facet then facet.type - else 'text/json' + else if facet.type == 'text/html+interactive' then 'text/html' + else facet.type res\append ':status', tostring status res\append 'content-type', response_type -- cgit v1.2.3 From a295985741955fcc8835bd3b9b58d6eb3b3cbf36 Mon Sep 17 00:00:00 2001 From: s-ol Date: Fri, 11 Oct 2019 15:22:20 +0200 Subject: allow ?interactive with no main facet --- build/server.moon | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index ff138ee..cb08131 100644 --- a/build/server.moon +++ b/build/server.moon @@ -55,10 +55,6 @@ class Server index = @store\get_index path, depth convert 'table', facet.type, index, fileder, facet.name else - -- fileder and facet given - if not fileder\has_facet facet.name - return 404, "facet '#{facet.name}' not found in fileder '#{path}'" - if facet.type == 'text/html+interactive' export BROWSER @@ -81,6 +77,8 @@ class Server BROWSER = browser.Browser(root, path, facet, true) end) " + else if not fileder\has_facet facet.name + 404, "facet '#{facet.name}' not found in fileder '#{path}'" else fileder\get facet -- cgit v1.2.3 From 6c3836ec3553819a0dda95efd0855910682fc518 Mon Sep 17 00:00:00 2001 From: s-ol Date: Fri, 11 Oct 2019 16:04:36 +0200 Subject: fix browser nav issues, fs default sorting --- build/server.moon | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index cb08131..72b5ffd 100644 --- a/build/server.moon +++ b/build/server.moon @@ -34,7 +34,7 @@ class Server assert @server\listen! _, ip, port = @server\localname! - print "SV", "running at #{ip}:#{port}" + print "[#{@@__name}]", "running at #{ip}:#{port}" assert @server\loop! handle: (method, path, facet) => @@ -61,7 +61,7 @@ class Server root = Fileder @store BROWSER = Browser root, path, facet.name render BROWSER\todom!, fileder, noview: true, scripts: " - " 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! -- cgit v1.2.3 From 6ce64806736e8a043ba639eccd51896d6d09023c Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 24 Oct 2019 19:51:37 +0200 Subject: clean up JS deps for static builds --- build/server.moon | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index aa7bf50..35cc82e 100644 --- a/build/server.moon +++ b/build/server.moon @@ -60,7 +60,16 @@ class Server root = Fileder @store BROWSER = Browser root, path, facet.name - render BROWSER\todom!, fileder, noview: true, scripts: " + + deps = [[ + + + + + + ]] + + render BROWSER\todom!, fileder, noview: true, scripts: deps .. " + -- cgit v1.2.3 From 8c4a3c747cb6d50e439c1819d6aecf299678c972 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 24 Oct 2019 20:14:58 +0200 Subject: fix absoute paths in link_to, embed --- build/server.moon | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 4438836..33a985f 100644 --- a/build/server.moon +++ b/build/server.moon @@ -56,10 +56,8 @@ class Server convert 'table', facet.type, index, fileder, facet.name else if facet.type == 'text/html+interactive' - export BROWSER - root = Fileder @store - BROWSER = Browser root, path, facet.name + browser = Browser root, path, facet.name deps = [[ @@ -70,7 +68,7 @@ class Server ]] - render BROWSER\todom!, fileder, noview: true, scripts: deps .. " + render browser\todom!, fileder, noview: true, scripts: deps .. " " else if not fileder\has_facet facet.name -- cgit v1.2.3 From abefbf82531021f5ca4149675932a7fe2ff37dde Mon Sep 17 00:00:00 2001 From: s-ol Date: Sun, 27 Oct 2019 17:35:35 +0100 Subject: move converts into plugins --- build/server.moon | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 33a985f..33853c9 100644 --- a/build/server.moon +++ b/build/server.moon @@ -8,6 +8,7 @@ add '?/init' add '?/init.server' require 'mmm' +require 'mmm.mmmfs' import dir_base, Key, Fileder from require 'mmm.mmmfs.fileder' import convert from require 'mmm.mmmfs.conversion' @@ -65,7 +66,7 @@ class Server - + ]] render browser\todom!, fileder, noview: true, scripts: deps .. " -- cgit v1.2.3 From 28653c9ae46b2b3e42c2c75879589138c731f37b Mon Sep 17 00:00:00 2001 From: s-ol Date: Sun, 27 Oct 2019 20:22:00 +0100 Subject: facet editing with CodeMirror! --- build/server.moon | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 33853c9..906f89a 100644 --- a/build/server.moon +++ b/build/server.moon @@ -64,6 +64,11 @@ class Server + + + + + -- cgit v1.2.3 From 4b8d9be10e4517114c0c216fa24aaaa310503d4a Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 29 Oct 2019 12:52:56 +0100 Subject: save edited changes --- build/server.moon | 86 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 37 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 906f89a..68cf4db 100644 --- a/build/server.moon +++ b/build/server.moon @@ -38,7 +38,43 @@ class Server print "[#{@@__name}]", "running at #{ip}:#{port}" assert @server\loop! - handle: (method, path, facet) => + handle_interactive: (fileder, facet) => + root = Fileder @store + browser = Browser root, fileder.path, facet.name + + deps = [[ + + + + + + + + + + + ]] + + render browser\todom!, fileder, noview: true, scripts: deps .. " + " + + handle: (method, path, facet, value) => fileder = Fileder @store, path if not fileder @@ -57,41 +93,7 @@ class Server convert 'table', facet.type, index, fileder, facet.name else if facet.type == 'text/html+interactive' - root = Fileder @store - browser = Browser root, path, facet.name - - deps = [[ - - - - - - - - - - - - ]] - - render browser\todom!, fileder, noview: true, scripts: deps .. " - " + @handle_interactive fileder, facet else if not fileder\has_facet facet.name 404, "facet '#{facet.name}' not found in fileder '#{path}'" else @@ -101,6 +103,15 @@ class Server 200, val else 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" + when 'POST' + @store\create_facet path, facet.name, facet.type, value + 200, 'ok' + when 'PUT' + @store\update_facet path, facet.name, facet.type, value + 200, 'ok' + when 'DELETE' + @store\remove_facet path, facet.name, facet.type + 200, 'ok' else 501, "not implemented" @@ -119,7 +130,8 @@ class Server type = type\match '%s*(.*)' facet = Key facet, type - ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet + value = stream\get_body_as_string! + ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet, value if not ok warn "Error handling request (#{method} #{path} #{facet}):\n#{status}" body = "Internal Server Error:\n#{status}" -- cgit v1.2.3 From d9eafa21ad1d6ad340b5744d69e9fc68ce2083cb Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 29 Oct 2019 14:18:16 +0100 Subject: add sandbox --- build/server.moon | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 68cf4db..d101d0b 100644 --- a/build/server.moon +++ b/build/server.moon @@ -29,6 +29,8 @@ class Server opts.onstream = @\stream opts.onerror = @\error + @editable_paths = opts.editable_paths + @server = server.listen opts listen: => @@ -81,6 +83,10 @@ class Server -- fileder not found 404, "fileder '#{path}' not found" + if method != 'GET' and method != 'HEAD' + if not @editable_paths or not path\match @editable_paths + return 403, 'editing not allowed' + switch method when 'GET', 'HEAD' val = switch facet.name @@ -153,9 +159,13 @@ class Server msg = "#{msg}: #{err}" if err -- usage: --- moon server.moon [STORE] [host] [port] -{ store, host, port } = arg +-- moon server.moon [STORE] [host] [port] [editable-paths] +-- * STORE: see mmm/mmmfs/stores/init.moon:get_store +-- * host: interface to bind to (default localhost, set to 0.0.0.0 for public hosting) +-- * port: port to serve from, default 8000 +-- * editable-paths: Lua pattern to match paths in which editing is allowed, default none +{ store, host, port, editable_paths } = arg store = get_store store -server = Server store, :host, port: port and tonumber port +server = Server store, :host, :editable_paths, port: port and tonumber port server\listen! -- cgit v1.2.3 From 16402fb6702f296d400bddb81561710d6cb37b6f Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 29 Oct 2019 14:33:18 +0100 Subject: fix the glaring security vulnerability i just implemented --- build/server.moon | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index d101d0b..b219c58 100644 --- a/build/server.moon +++ b/build/server.moon @@ -21,6 +21,8 @@ lfs = require 'lfs' server = require 'http.server' headers = require 'http.headers' +export UNSAFE + class Server new: (@store, opts={}) => opts = {k,v for k,v in pairs opts} @@ -29,6 +31,9 @@ class Server opts.onstream = @\stream opts.onerror = @\error + if opts.host == 'localhost' + UNSAFE = true + @editable_paths = opts.editable_paths @server = server.listen opts -- cgit v1.2.3 From 1e3b0a12060dce916b686921c94520202c4cb130 Mon Sep 17 00:00:00 2001 From: s-ol Date: Tue, 29 Oct 2019 15:18:25 +0100 Subject: make security vulnerabilities optional, remove sandbox --- build/server.moon | 56 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 18 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index b219c58..152e4e5 100644 --- a/build/server.moon +++ b/build/server.moon @@ -8,7 +8,6 @@ add '?/init' add '?/init.server' require 'mmm' -require 'mmm.mmmfs' import dir_base, Key, Fileder from require 'mmm.mmmfs.fileder' import convert from require 'mmm.mmmfs.conversion' @@ -21,8 +20,6 @@ lfs = require 'lfs' server = require 'http.server' headers = require 'http.headers' -export UNSAFE - class Server new: (@store, opts={}) => opts = {k,v for k,v in pairs opts} @@ -31,18 +28,28 @@ class Server opts.onstream = @\stream opts.onerror = @\error - if opts.host == 'localhost' - UNSAFE = true + @server = server.listen opts - @editable_paths = opts.editable_paths + @flags = opts.flags - @server = server.listen opts + if @flags.rw == nil + @flags.rw = opts.host == 'localhost' or opts.host == '127.0.0.1' + + if @flags.unsafe == nil + @flags.unsafe = opts.host == 'localhost' or opts.host == '127.0.0.1' + + export UNSAFE + UNSAFE = @flags.unsafe + require 'mmm.mmmfs' listen: => assert @server\listen! _, ip, port = @server\localname! - print "[#{@@__name}]", "running at #{ip}:#{port}" + print "[#{@@__name}]", + "running at #{ip}:#{port}", + "[#{table.concat [flag for flag,on in pairs @flags when on], ', '}]" + assert @server\loop! handle_interactive: (fileder, facet) => @@ -88,9 +95,8 @@ class Server -- fileder not found 404, "fileder '#{path}' not found" - if method != 'GET' and method != 'HEAD' - if not @editable_paths or not path\match @editable_paths - return 403, 'editing not allowed' + if not @flags.rw and method != 'GET' and method != 'HEAD' + return 403, 'editing not allowed' switch method when 'GET', 'HEAD' @@ -164,13 +170,27 @@ class Server msg = "#{msg}: #{err}" if err -- usage: --- moon server.moon [STORE] [host] [port] [editable-paths] --- * STORE: see mmm/mmmfs/stores/init.moon:get_store --- * host: interface to bind to (default localhost, set to 0.0.0.0 for public hosting) --- * port: port to serve from, default 8000 --- * editable-paths: Lua pattern to match paths in which editing is allowed, default none -{ store, host, port, editable_paths } = arg +-- moon server.moon [FLAGS] [STORE] [host] [port] +-- * FLAGS - any of the following: +-- --[no-]rw - enable/disable POST?PUT/DELETE operations (default: on if local) +-- --[no-]unsafe - enable/disable server-side code execution when writable is on (default: on if local) +-- * STORE - see mmm/mmmfs/stores/init.moon:get_store +-- * host - interface to bind to (default localhost, set to 0.0.0.0 for public hosting) +-- * port - port to serve from, default 8000 + +flags = {} +arguments = for a in *arg + if flag = a\match '^%-%-no%-(.*)$' + flags[flag] = false + continue + elseif flag = a\match '^%-%-(.*)$' + flags[flag] = true + continue + else + a + +{ store, host, port } = arguments store = get_store store -server = Server store, :host, :editable_paths, port: port and tonumber port +server = Server store, :flags, :host, port: port and tonumber port server\listen! -- cgit v1.2.3 From 2525b6c2f45397c80c5cb46dc0f9e1d68a615bea Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 31 Oct 2019 14:43:38 +0100 Subject: small fixes: * --unsafe by default if not --rw * fix inspector --- build/server.moon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 152e4e5..fb6dca4 100644 --- a/build/server.moon +++ b/build/server.moon @@ -36,7 +36,7 @@ class Server @flags.rw = opts.host == 'localhost' or opts.host == '127.0.0.1' if @flags.unsafe == nil - @flags.unsafe = opts.host == 'localhost' or opts.host == '127.0.0.1' + @flags.unsafe = not @flags.rw or opts.host == 'localhost' or opts.host == '127.0.0.1' export UNSAFE UNSAFE = @flags.unsafe @@ -173,7 +173,7 @@ class Server -- moon server.moon [FLAGS] [STORE] [host] [port] -- * FLAGS - any of the following: -- --[no-]rw - enable/disable POST?PUT/DELETE operations (default: on if local) --- --[no-]unsafe - enable/disable server-side code execution when writable is on (default: on if local) +-- --[no-]unsafe - enable/disable server-side code execution when writable is on (default: on if local or --no-rw) -- * STORE - see mmm/mmmfs/stores/init.moon:get_store -- * host - interface to bind to (default localhost, set to 0.0.0.0 for public hosting) -- * port - port to serve from, default 8000 -- cgit v1.2.3 From 938a524f623ba08430085fe6c33fcc77f94b3127 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 31 Oct 2019 17:15:23 +0100 Subject: add DEBUG pseudo-type for debugging conversion --- build/server.moon | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index fb6dca4..99076bf 100644 --- a/build/server.moon +++ b/build/server.moon @@ -10,7 +10,7 @@ add '?/init.server' require 'mmm' import dir_base, Key, Fileder from require 'mmm.mmmfs.fileder' -import convert from require 'mmm.mmmfs.conversion' +import convert, MermaidDebugger from require 'mmm.mmmfs.conversion' import get_store from require 'mmm.mmmfs.stores' import render from require 'mmm.mmmfs.layout' import Browser from require 'mmm.mmmfs.browser' @@ -88,6 +88,11 @@ class Server end) " + handle_debug: (fileder, facet) => + debugger = MermaidDebugger! + fileder\find facet, nil, nil, nil, debugger + convert 'text/mermaid-graph', 'text/html', debugger\render!, fileder, facet.name + handle: (method, path, facet, value) => fileder = Fileder @store, path @@ -111,6 +116,9 @@ class Server else if facet.type == 'text/html+interactive' @handle_interactive fileder, facet + else if base = facet.type\match '^DEBUG %-> (.*)' + facet.type = base + @handle_debug fileder, facet else if not fileder\has_facet facet.name 404, "facet '#{facet.name}' not found in fileder '#{path}'" else -- cgit v1.2.3 From ff9ee8e99cd5f5c420ba0501c335ac18f1b10769 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 31 Oct 2019 18:26:31 +0100 Subject: browsing, adding, removing fileders in inspector --- build/server.moon | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 99076bf..395b903 100644 --- a/build/server.moon +++ b/build/server.moon @@ -94,17 +94,16 @@ class Server convert 'text/mermaid-graph', 'text/html', debugger\render!, fileder, facet.name handle: (method, path, facet, value) => - fileder = Fileder @store, path - - if not fileder - -- fileder not found - 404, "fileder '#{path}' not found" - if not @flags.rw and method != 'GET' and method != 'HEAD' return 403, 'editing not allowed' switch method when 'GET', 'HEAD' + fileder = Fileder @store, path + if not fileder + -- fileder not found + return 404, "fileder '#{path}' not found" + val = switch facet.name when '?index', '?tree' -- serve fileder index @@ -129,13 +128,22 @@ class Server else 406, "cant convert facet '#{facet.name}' to '#{facet.type}'" when 'POST' - @store\create_facet path, facet.name, facet.type, value - 200, 'ok' + if facet + @store\create_facet path, facet.name, facet.type, value + 200, 'ok' + else + 200, @store\create_fileder dir_base path when 'PUT' - @store\update_facet path, facet.name, facet.type, value - 200, 'ok' + if facet + @store\update_facet path, facet.name, facet.type, value + 200, 'ok' + else + 501, "not implemented" when 'DELETE' - @store\remove_facet path, facet.name, facet.type + if facet + @store\remove_facet path, facet.name, facet.type + else + @store\remove_fileder path 200, 'ok' else 501, "not implemented" @@ -151,9 +159,12 @@ class Server path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' - type or= 'text/html+interactive' - type = type\match '%s*(.*)' - facet = Key facet, type + facet = if facet == '' and method ~= 'GET' and method ~= 'HEAD' + nil + else + type or= 'text/html+interactive' + type = type\match '%s*(.*)' + Key facet, type value = stream\get_body_as_string! ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet, value -- cgit v1.2.3 From 053e607a49989b2d4491c20ff14c839b7161d713 Mon Sep 17 00:00:00 2001 From: s-ol Date: Fri, 1 Nov 2019 13:47:09 +0100 Subject: add proper order handling, fsck for stores.fs --- build/fsck.moon | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 build/fsck.moon (limited to 'build') diff --git a/build/fsck.moon b/build/fsck.moon new file mode 100644 index 0000000..df882a9 --- /dev/null +++ b/build/fsck.moon @@ -0,0 +1,37 @@ +add = (tmpl) -> + package.path ..= ";#{tmpl}.lua" + package.moonpath ..= ";#{tmpl}.moon" + +add '?' +add '?.server' +add '?/init' +add '?/init.server' + +require 'mmm' + +import get_store from require 'mmm.mmmfs.stores' + +-- usage: +-- moon server.moon [FLAGS] [STORE] [host] [port] +-- * FLAGS - any of the following: +-- --[no-]rw - enable/disable POST?PUT/DELETE operations (default: on if local) +-- --[no-]unsafe - enable/disable server-side code execution when writable is on (default: on if local or --no-rw) +-- * STORE - see mmm/mmmfs/stores/init.moon:get_store +-- * host - interface to bind to (default localhost, set to 0.0.0.0 for public hosting) +-- * port - port to serve from, default 8000 + +flags = {} +arguments = for a in *arg + if flag = a\match '^%-%-no%-(.*)$' + flags[flag] = false + continue + elseif flag = a\match '^%-%-(.*)$' + flags[flag] = true + continue + else + a + +{ store, host, port } = arguments + +store = get_store store, verbose: true +store\fsck! -- cgit v1.2.3 From 16232a2509a87a900b69b2d0f826a2e3edec3f96 Mon Sep 17 00:00:00 2001 From: s-ol Date: Fri, 1 Nov 2019 13:48:24 +0100 Subject: add fileder ordering in stores.web, fileder, browser --- build/server.moon | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index 395b903..a2d6c71 100644 --- a/build/server.moon +++ b/build/server.moon @@ -138,7 +138,18 @@ class Server @store\update_facet path, facet.name, facet.type, value 200, 'ok' else - 501, "not implemented" + cmd, args = value\match '^([^\n]+)\n(.*)' + switch cmd + when 'swap' + child_a, child_b = args\match '^([^\n]+)\n([^\n]+)$' + assert child_a and child_b, "invalid arguments" + + @store\swap_fileders path, child_a, child_b + 200, 'ok' + when nil + 400, "invalid request" + else + 501, "unknown command #{cmd}" when 'DELETE' if facet @store\remove_facet path, facet.name, facet.type @@ -175,8 +186,9 @@ class Server res = headers.new! response_type = if status > 299 then 'text/plain' - else if facet.type == 'text/html+interactive' then 'text/html' - else facet.type + else if facet and facet.type == 'text/html+interactive' then 'text/html' + else if facet then facet.type + else 'text/plain' res\append ':status', tostring status res\append 'content-type', response_type -- cgit v1.2.3 From 50ac388d23d4f59013c4499912d1a34bbd86f92d Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 6 Nov 2019 14:52:56 +0100 Subject: fix PUT : --- build/server.moon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index a2d6c71..b95b396 100644 --- a/build/server.moon +++ b/build/server.moon @@ -170,7 +170,7 @@ class Server path_facet or= path path, facet = path_facet\match '(.*)/([^/]*)' - facet = if facet == '' and method ~= 'GET' and method ~= 'HEAD' + facet = if facet == '' and type == '' and method ~= 'GET' and method ~= 'HEAD' nil else type or= 'text/html+interactive' -- cgit v1.2.3 From a4038511560d408827cdea7e2e99751496687181 Mon Sep 17 00:00:00 2001 From: s-ol Date: Wed, 18 Dec 2019 00:46:04 +0100 Subject: cites plugin --- build/server.moon | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'build') diff --git a/build/server.moon b/build/server.moon index b95b396..7c0ff46 100644 --- a/build/server.moon +++ b/build/server.moon @@ -99,7 +99,11 @@ class Server switch method when 'GET', 'HEAD' - fileder = Fileder @store, path + root = Fileder @store + export BROWSER + BROWSER = :root + fileder = root\walk path -- Fileder @store, path + if not fileder -- fileder not found return 404, "fileder '#{path}' not found" -- cgit v1.2.3