aboutsummaryrefslogtreecommitdiffstats
path: root/build/bundle_module.moon
diff options
context:
space:
mode:
Diffstat (limited to 'build/bundle_module.moon')
-rw-r--r--build/bundle_module.moon51
1 files changed, 51 insertions, 0 deletions
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!