aboutsummaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-11-22 11:07:24 +0000
committers-ol <s-ol@users.noreply.github.com>2018-11-22 11:07:24 +0000
commite98c5becba67d642b5fd5c6e4a206d79749e8953 (patch)
tree34965a21413107e089a77da8886dd85022c9e651 /build
parentmove glitch cube, torus4d to experiments (diff)
downloadmmm-e98c5becba67d642b5fd5c6e4a206d79749e8953.tar.gz
mmm-e98c5becba67d642b5fd5c6e4a206d79749e8953.zip
bundle binary files as URLs
Diffstat (limited to 'build')
-rw-r--r--build/bundle_fileder.moon155
-rw-r--r--build/bundle_module.moon51
-rw-r--r--build/render_fileder.moon47
-rw-r--r--build/util.moon16
4 files changed, 269 insertions, 0 deletions
diff --git a/build/bundle_fileder.moon b/build/bundle_fileder.moon
new file mode 100644
index 0000000..c9f8c35
--- /dev/null
+++ b/build/bundle_fileder.moon
@@ -0,0 +1,155 @@
+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> <facets>... -- <children>...
+{ 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/bundle_module.moon b/build/bundle_module.moon
new file mode 100644
index 0000000..1c6b5f6
--- /dev/null
+++ b/build/bundle_module.moon
@@ -0,0 +1,51 @@
+output_name = assert arg[1], "please specify the output directory"
+
+escape = (str) -> string.format '%q', str
+
+readfile = (name) ->
+ file = io.open name, 'r'
+ with file\read '*all'
+ file\close
+
+with io.open output_name, 'w'
+ -- final wrap mode
+ if arg[2] == '--wrap'
+ assert #arg == 3, "too many arguments for 'wrap' mode"
+ bundle = arg[3]
+
+ bundle = dofile bundle
+ \write "local p = package.preload\n"
+ for { :module, :file, :source } in *bundle
+ module = escape module
+ \write "if not p[#{module}] then p[#{module}] = load(#{escape source}, #{escape file}) end\n"
+
+ -- iterative bundling mode
+ else
+ \write "return {\n"
+
+ this = assert arg[2]
+ addmod = (module, file, source) ->
+ modname = "#{this}.#{module}"
+ modname = this if module == 'init'
+ \write "
+{
+ module = #{escape modname},
+ file = #{escape "#{this}/#{file}"},
+ source = #{escape source},
+},"
+
+ for file in *arg[3,]
+ if dirname = file\match '^([%w-_]+)/%.bundle%.lua$'
+ bundle = dofile file
+ for { :module, :file, :source } in *bundle
+ addmod module, file, source
+ else
+ module = file\gsub '%.lua$', ''
+ continue if module\match '%.server'
+ module = module\gsub '%.client$', ''
+ module = module\gsub '%.init$', ''
+ addmod module, file, readfile file
+
+ \write "}"
+
+ \close!
diff --git a/build/render_fileder.moon b/build/render_fileder.moon
new file mode 100644
index 0000000..d76d162
--- /dev/null
+++ b/build/render_fileder.moon
@@ -0,0 +1,47 @@
+require 'mmm'
+import render from require 'mmm.mmmfs'
+import get_path from require 'build.util'
+
+-- usage:
+-- moon render.moon <path_to_root>
+{ path_to_root } = arg
+
+assert path_to_root, "please specify the relative root path"
+path = get_path path_to_root
+
+root = dofile '$bundle.lua'
+assert root, "couldn't load $bundle.lua"
+root\mount path, true
+
+content, rehydrate = render root, path
+assert content, "no content"
+
+with io.open 'index.html', 'w'
+ \write "<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset=\"UTF-8\">
+ <title>MMM: lunar low-gravity scripting playground</title>
+ <link rel=\"stylesheet\" type=\"text/css\" href=\"/main.css\" />
+ <!--
+ <link rel=\"preload\" as=\"fetch\" href=\"/mmm/dom/init.lua\" />
+ <link rel=\"preload\" as=\"fetch\" href=\"/mmm/component/init.lua\" />
+ <link rel=\"preload\" as=\"fetch\" href=\"/mmm/mmmfs/init.lua\" />
+ <link rel=\"preload\" as=\"fetch\" href=\"/mmm/mmmfs/fileder.lua\" />
+ <link rel=\"preload\" as=\"fetch\" href=\"/mmm/mmmfs/browser.lua\" />
+ -->
+ </head>
+ <body>
+ #{content}
+
+ <script src=\"/highlight.pack.js\"></script>
+ <script src=\"//cdnjs.cloudflare.com/ajax/libs/marked/0.5.1/marked.min.js\"></script>
+ <script src=\"//cdnjs.cloudflare.com/ajax/libs/svg.js/2.6.6/svg.min.js\"></script>
+ <script src=\"/fengari-web.js\"></script>
+ <script type=\"application/lua\" src=\"/mmm.bundle.lua\"></script>
+ <script type=\"application/lua\">require 'mmm'</script>
+
+ #{rehydrate}
+ </body>
+</html>"
+ \close!
diff --git a/build/util.moon b/build/util.moon
new file mode 100644
index 0000000..b9c9613
--- /dev/null
+++ b/build/util.moon
@@ -0,0 +1,16 @@
+require 'lfs'
+
+get_path = (root) ->
+ cwd = lfs.currentdir!
+ path = ''
+
+ while root\find '^%.%./'
+ root = root\match '^%.%./(.*)'
+ cwd, trimmed = cwd\match '(.*)(/[^/]+)$'
+ path = trimmed .. path
+
+ path
+
+{
+ :get_path
+}