aboutsummaryrefslogtreecommitdiffstats
path: root/build/bundle_fileder.moon
blob: c9f8c3570a00de826ba4e3e092608257b43bf056 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
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!