From 7b0a926dfe33d09e6a9ee59e3e1affdcbf37514a Mon Sep 17 00:00:00 2001 From: s-ol Date: Sat, 4 Nov 2023 13:39:44 +0100 Subject: remove last CDN URLs, fengari, js --- static/mmm/text$lua.lua | 3768 ----------------------------------------------- 1 file changed, 3768 deletions(-) delete mode 100644 static/mmm/text$lua.lua (limited to 'static/mmm/text$lua.lua') diff --git a/static/mmm/text$lua.lua b/static/mmm/text$lua.lua deleted file mode 100644 index ef1829d..0000000 --- a/static/mmm/text$lua.lua +++ /dev/null @@ -1,3768 +0,0 @@ - -local p = {} -table.insert(package.searchers, 1, function (mod) - print('?',mod, not not p[mod]) - local mod = p[mod] - return mod and function () - return load(table.unpack(mod))() - end -end) -p["mmm.component"] = {"local tohtml\ -tohtml = function(val)\ - if 'string' == type(val) then\ - return document:createTextNode(val)\ - end\ - if 'table' == type(val) then\ - assert(val.node, \"Table doesn't have .node\")\ - val = val.node\ - end\ - if 'userdata' == type(val) then\ - assert((js.instanceof(val, js.global.Node)), \"userdata is not a Node\")\ - return val\ - else\ - return error(\"not a Node: \" .. tostring(val) .. \", \" .. tostring(type(val)))\ - end\ -end\ -local fromhtml\ -fromhtml = function(node)\ - return {\ - node = node\ - }\ -end\ -local text\ -text = function(str)\ - return document:createTextNode(tostring(str))\ -end\ -local ReactiveVar\ -do\ - local _class_0\ - local _base_0 = {\ - set = function(self, value)\ - local old = self.value\ - self.value = value\ - for k, callback in pairs(self.listeners) do\ - callback(self.value, old)\ - end\ - end,\ - get = function(self)\ - return self.value\ - end,\ - transform = function(self, transform)\ - return self:set(transform(self:get()))\ - end,\ - subscribe = function(self, callback)\ - do\ - local _with_0\ - _with_0 = function()\ - self.listeners[callback] = nil\ - end\ - self.listeners[callback] = callback\ - return _with_0\ - end\ - end,\ - map = function(self, transform)\ - do\ - local _with_0 = ReactiveVar(transform(self.value))\ - _with_0.upstream = self:subscribe(function(...)\ - return _with_0:set(transform(...))\ - end)\ - return _with_0\ - end\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, value)\ - self.value = value\ - self.listeners = setmetatable({ }, {\ - __mode = 'kv'\ - })\ - end,\ - __base = _base_0,\ - __name = \"ReactiveVar\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - local self = _class_0\ - self.isinstance = function(val)\ - return 'table' == (type(val)) and val.subscribe\ - end\ - ReactiveVar = _class_0\ -end\ -local ReactiveElement\ -do\ - local _class_0\ - local _base_0 = {\ - destroy = function(self)\ - local _list_0 = self._subscriptions\ - for _index_0 = 1, #_list_0 do\ - local unsub = _list_0[_index_0]\ - unsub()\ - end\ - end,\ - set = function(self, attr, value)\ - if attr == 'class' then\ - attr = 'className'\ - end\ - if 'table' == (type(value)) and ReactiveVar.isinstance(value) then\ - table.insert(self._subscriptions, value:subscribe(function(...)\ - return self:set(attr, ...)\ - end))\ - value = value:get()\ - end\ - if attr == 'style' and 'table' == type(value) then\ - for k, v in pairs(value) do\ - self.node.style[k] = v\ - end\ - return \ - end\ - self.node[attr] = value\ - end,\ - prepend = function(self, child, last)\ - return self:append(child, last, 'prepend')\ - end,\ - append = function(self, child, last, mode)\ - if mode == nil then\ - mode = 'append'\ - end\ - if ReactiveVar.isinstance(child) then\ - table.insert(self._subscriptions, child:subscribe(function(...)\ - return self:append(...)\ - end))\ - child = child:get()\ - end\ - if 'string' == type(last) then\ - error('cannot replace string node')\ - end\ - if child == nil then\ - if last then\ - self:remove(last)\ - end\ - return \ - end\ - child = tohtml(child)\ - if last then\ - return self.node:replaceChild(child, tohtml(last))\ - else\ - local _exp_0 = mode\ - if 'append' == _exp_0 then\ - return self.node:appendChild(child)\ - elseif 'prepend' == _exp_0 then\ - return self.node:insertBefore(child, self.node.firstChild)\ - end\ - end\ - end,\ - remove = function(self, child)\ - self.node:removeChild(tohtml(child))\ - if 'table' == (type(child)) and child.destroy then\ - return child:destroy()\ - end\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, element, ...)\ - if 'userdata' == type(element) then\ - self.node = element\ - else\ - self.node = document:createElement(element)\ - end\ - self._subscriptions = { }\ - local children = {\ - ...\ - }\ - local attributes = children[#children]\ - if 'table' == (type(attributes)) and (not ReactiveElement.isinstance(attributes)) and (not ReactiveVar.isinstance(attributes)) then\ - table.remove(children)\ - else\ - attributes = { }\ - end\ - for k, v in pairs(attributes) do\ - if 'string' == type(k) then\ - self:set(k, v)\ - end\ - end\ - if #children == 0 then\ - children = attributes\ - end\ - for _index_0 = 1, #children do\ - local child = children[_index_0]\ - self:append(child)\ - end\ - end,\ - __base = _base_0,\ - __name = \"ReactiveElement\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - local self = _class_0\ - self.isinstance = function(val)\ - return 'table' == (type(val)) and val.node\ - end\ - ReactiveElement = _class_0\ -end\ -local get_or_create\ -get_or_create = function(elem, id, ...)\ - elem = (document:getElementById(id)) or elem\ - do\ - local _with_0 = ReactiveElement(elem, ...)\ - _with_0:set('id', id)\ - return _with_0\ - end\ -end\ -local elements = setmetatable({ }, {\ - __index = function(self, name)\ - do\ - local val\ - val = function(...)\ - return ReactiveElement(name, ...)\ - end\ - self[name] = val\ - return val\ - end\ - end\ -})\ -return {\ - ReactiveVar = ReactiveVar,\ - ReactiveElement = ReactiveElement,\ - get_or_create = get_or_create,\ - tohtml = tohtml,\ - fromhtml = fromhtml,\ - text = text,\ - elements = elements\ -}", "mmm/component/init.client.moon"} -p["mmm.refs"] = {"return {\ - depth = 0,\ - count = 0,\ - push = function(self)\ - self.depth = self.depth + 1\ - end,\ - pop = function(self)\ - self.depth = self.depth - 1\ - if self.depth == 0 then\ - self.count = 0\ - end\ - end,\ - get = function(self)\ - self.count = self.count + 1\ - return self.count\ - end\ -}", "mmm/refs.moon"} -p["mmm.color"] = {"local rgb\ -rgb = function(r, g, b)\ - if 'table' == type(r) then\ - r, g, b = table.unpack(r)\ - end\ - return \"rgb(\" .. tostring(r * 255) .. \", \" .. tostring(g * 255) .. \", \" .. tostring(b * 255) .. \")\"\ -end\ -local rgba\ -rgba = function(r, g, b, a)\ - if 'table' == type(r) then\ - r, g, b, a = table.unpack(r)\ - end\ - return \"rgba(\" .. tostring(r * 255) .. \", \" .. tostring(g * 255) .. \", \" .. tostring(b * 255) .. \", \" .. tostring(a or 1) .. \")\"\ -end\ -local hsl\ -hsl = function(h, s, l)\ - if 'table' == type(h) then\ - h, s, l = table.unpack(h)\ - end\ - return \"hsl(\" .. tostring(h * 360) .. \", \" .. tostring(s * 100) .. \"%, \" .. tostring(l * 100) .. \"%)\"\ -end\ -local hsla\ -hsla = function(h, s, l, a)\ - if 'table' == type(h) then\ - h, s, l, a = table.unpack(h)\ - end\ - return \"hsla(\" .. tostring(h * 360) .. \", \" .. tostring(s * 100) .. \"%, \" .. tostring(l * 100) .. \"%, \" .. tostring(a or 1) .. \")\"\ -end\ -return {\ - rgb = rgb,\ - rgba = rgba,\ - hsl = hsl,\ - hsla = hsla\ -}", "mmm/color.moon"} -p["mmm.highlighting"] = {"local code\ -code = require('mmm.dom').code\ -local trim\ -trim = function(str)\ - return str:match('^ *(..-) *$')\ -end\ -local highlight\ -if MODE == 'SERVER' then\ - highlight = function(lang, str)\ - assert(str, 'no string to highlight')\ - return code((trim(str)), {\ - class = \"hljs lang-\" .. tostring(lang)\ - })\ - end\ -else\ - highlight = function(lang, str)\ - assert(str, 'no string to highlight')\ - if not window.hljs:getLanguage(lang) then\ - lang = 'markdown'\ - end\ - local result = window.hljs:highlight(lang, (trim(str)), true)\ - do\ - local _with_0 = code({\ - class = \"hljs lang-\" .. tostring(lang)\ - })\ - _with_0.innerHTML = result.value\ - return _with_0\ - end\ - end\ -end\ -local languages = setmetatable({ }, {\ - __index = function(self, name)\ - do\ - local val\ - val = function(str)\ - return highlight(name, str)\ - end\ - self[name] = val\ - return val\ - end\ - end\ -})\ -return {\ - highlight = highlight,\ - languages = languages\ -}", "mmm/highlighting.moon"} -p["mmm.dom"] = {"local element\ -element = function(element)\ - return function(...)\ - local children = {\ - ...\ - }\ - local attributes = children[#children]\ - if 'table' == (type(attributes)) and not attributes.node then\ - table.remove(children)\ - else\ - attributes = { }\ - end\ - local e\ - if element then\ - e = document:createElement(element)\ - else\ - e = document:createDocumentFragment()\ - end\ - for k, v in pairs(attributes) do\ - if k == 'class' then\ - k = 'className'\ - end\ - if k == 'style' and 'table' == type(v) then\ - for kk, vv in pairs(v) do\ - e.style[kk] = vv\ - end\ - elseif 'string' == type(k) then\ - e[k] = v\ - end\ - end\ - if #children == 0 then\ - children, attributes = attributes, { }\ - end\ - if not element then\ - assert(not (next(attributes)), \"_frag cannot take attributes\")\ - end\ - for _index_0 = 1, #children do\ - local child = children[_index_0]\ - if 'string' == type(child) then\ - child = document:createTextNode(child)\ - end\ - e:appendChild(child)\ - end\ - return e\ - end\ -end\ -return setmetatable({\ - _frag = element()\ -}, {\ - __index = function(self, name)\ - do\ - local val = element(name)\ - self[name] = val\ - return val\ - end\ - end\ -})", "mmm/dom/init.client.moon"} -p["mmm.canvasapp"] = {"local window = js.global\ -local js = require('js')\ -local a, canvas, div, button, script\ -do\ - local _obj_0 = require('mmm.dom')\ - a, canvas, div, button, script = _obj_0.a, _obj_0.canvas, _obj_0.div, _obj_0.button, _obj_0.script\ -end\ -local CanvasApp\ -do\ - local _class_0\ - local _base_0 = {\ - width = 500,\ - height = 400,\ - update = function(self, dt)\ - self.time = self.time + dt\ - if self.length and self.time > self.length then\ - self.time = self.time - self.length\ - return true\ - end\ - end,\ - render = function(self, fps)\ - if fps == nil then\ - fps = 60\ - end\ - assert(self.length, 'cannot render CanvasApp without length set')\ - self.paused = true\ - local actual_render\ - actual_render = function()\ - local writer = js.new(window.Whammy.Video, fps)\ - local doFrame\ - doFrame = function()\ - local done = self:update(1 / fps)\ - self.ctx:resetTransform()\ - self:draw()\ - writer:add(self.canvas)\ - if done or self.time >= self.length then\ - local blob = writer:compile()\ - local name = tostring(self.__class.__name) .. \"_\" .. tostring(fps) .. \"fps.webm\"\ - return self.node.lastChild:appendChild(a(name, {\ - download = name,\ - href = window.URL:createObjectURL(blob)\ - }))\ - else\ - return window:setTimeout(doFrame)\ - end\ - end\ - self.time = 0\ - return doFrame()\ - end\ - if window.Whammy then\ - return actual_render()\ - else\ - window.global = window.global or window\ - return document.body:appendChild(script({\ - onload = actual_render,\ - src = 'https://cdn.jsdelivr.net/npm/whammy@0.0.1/whammy.min.js'\ - }))\ - end\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, show_menu, paused)\ - if show_menu == nil then\ - show_menu = false\ - end\ - self.paused = paused\ - self.canvas = canvas({\ - width = self.width,\ - height = self.height\ - })\ - self.ctx = self.canvas:getContext('2d')\ - self.time = 0\ - self.canvas.tabIndex = 0\ - self.canvas:addEventListener('click', function(_, e)\ - return self.click and self:click(e.offsetX, e.offsetY, e.button)\ - end)\ - self.canvas:addEventListener('keydown', function(_, e)\ - return self.keydown and self:keydown(e.key, e.code)\ - end)\ - local lastMillis = window.performance:now()\ - local animationFrame\ - animationFrame = function(_, millis)\ - self:update((millis - lastMillis) / 1000)\ - self.ctx:resetTransform()\ - self:draw()\ - lastMillis = millis\ - if not self.paused then\ - return window:setTimeout((function()\ - return window:requestAnimationFrame(animationFrame)\ - end), 0)\ - end\ - end\ - window:requestAnimationFrame(animationFrame)\ - if show_menu then\ - self.node = div({\ - className = 'canvas_app',\ - self.canvas,\ - div({\ - className = 'overlay',\ - button('render 30fps', {\ - onclick = function()\ - return self:render(30)\ - end\ - }),\ - button('render 60fps', {\ - onclick = function()\ - return self:render(60)\ - end\ - })\ - })\ - })\ - else\ - self.node = self.canvas\ - end\ - end,\ - __base = _base_0,\ - __name = \"CanvasApp\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - CanvasApp = _class_0\ -end\ -return {\ - CanvasApp = CanvasApp\ -}", "mmm/canvasapp.client.moon"} -p["mmm.ordered"] = {"local sort\ -sort = function(t, order_fn, only_strings)\ - do\ - local index\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - for k, v in pairs(t) do\ - if (not only_strings) or 'string' == type(k) then\ - _accum_0[_len_0] = k\ - _len_0 = _len_0 + 1\ - end\ - end\ - index = _accum_0\ - end\ - table.sort(index, order_fn)\ - return index\ - end\ -end\ -local onext\ -onext = function(state, key)\ - state.i = state.i + state.step\ - local t, index, i\ - t, index, i = state.t, state.index, state.i\ - do\ - key = index[i]\ - if key then\ - return key, t[key]\ - end\ - end\ -end\ -local opairs\ -opairs = function(t, order_fn, only_strings)\ - if only_strings == nil then\ - only_strings = false\ - end\ - local state = {\ - t = t,\ - i = 0,\ - step = 1,\ - index = sort(t, order_fn, only_strings)\ - }\ - return onext, state, nil\ -end\ -local ropairs\ -ropairs = function(t, order_fn, only_strings)\ - if only_strings == nil then\ - only_strings = false\ - end\ - local index = sort(t, order_fn, only_strings)\ - local state = {\ - t = t,\ - index = index,\ - i = #index + 1,\ - step = -1\ - }\ - return onext, state, nil\ -end\ -return {\ - onext = onext,\ - opairs = opairs,\ - ropairs = ropairs\ -}", "mmm/ordered.moon"} -p["mmm.mmmfs.fileder"] = {"local get_conversions, apply_conversions\ -do\ - local _obj_0 = require('mmm.mmmfs.conversion')\ - get_conversions, apply_conversions = _obj_0.get_conversions, _obj_0.apply_conversions\ -end\ -local dir_base\ -dir_base = function(path)\ - local dir, base = path:match('(.-)([^/]-)$')\ - if dir and #dir > 0 then\ - dir = dir:sub(1, #dir - 1)\ - end\ - return dir, base\ -end\ -local Key\ -do\ - local _class_0\ - local _base_0 = {\ - tostring = function(self, strict)\ - if strict == nil then\ - strict = false\ - end\ - if not strict and self.name == '' then\ - return self.type\ - else\ - return tostring(self.name) .. \": \" .. tostring(self.type)\ - end\ - end,\ - __tostring = function(self)\ - return self:tostring()\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, opts, second)\ - if 'string' == type(second) then\ - self.name, self.type = (opts or ''), second\ - elseif 'string' == type(opts) then\ - self.name, self.type = opts:match('^([%w-_]*): *(.+)$')\ - if not self.name then\ - self.name = ''\ - self.type = opts:match('^ *(.+)$')\ - end\ - elseif 'table' == type(opts) then\ - self.name = opts.name or ''\ - self.type = opts.type\ - else\ - error(\"wrong argument type: \" .. tostring(type(opts)) .. \", \" .. tostring(type(second)))\ - end\ - assert(('string' == type(self.name)), \"name is not a string: '\" .. tostring(self.name) .. \"'\")\ - return assert(('string' == type(self.type)), \"type is not a string: '\" .. tostring(self.type) .. \"'\")\ - end,\ - __base = _base_0,\ - __name = \"Key\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - Key = _class_0\ -end\ -local inext\ -inext = function(tbl, i)\ - i = i + 1\ - do\ - local v = tbl[i]\ - if v then\ - return i, v\ - end\ - end\ -end\ -local Fileder\ -do\ - local _class_0\ - local _base_0 = {\ - load = function(self, index)\ - assert(not self.loaded, \"already loaded!\")\ - self.loaded = true\ - index = index or self.store:get_index(self.path)\ - local _list_0 = index.children\ - for _index_0 = 1, #_list_0 do\ - local path_or_index = _list_0[_index_0]\ - local child = Fileder(self.store, path_or_index, self.root)\ - local name = child:get('name: alpha')\ - if '$' ~= name:sub(1, 1) then\ - table.insert(self.children, child)\ - else\ - self.children[name] = child\ - end\ - end\ - local _list_1 = index.facets\ - for _index_0 = 1, #_list_1 do\ - local key = _list_1[_index_0]\ - key = Key(key)\ - self.facet_keys[key] = key\ - if MODE == 'CLIENT' and key.type:match('text/moonscript') then\ - local copy = Key(key.name, key.type:gsub('text/moonscript', 'text/lua'))\ - self.facet_keys[copy] = copy\ - end\ - end\ - local _, name = dir_base(self.path)\ - local name_key = Key('name: alpha')\ - self.facet_keys[name_key] = name_key\ - self.facets[name_key] = name\ - end,\ - walk = function(self, path)\ - if path == '' then\ - return self\ - end\ - if '/' ~= path:sub(1, 1) then\ - path = tostring(self.path) .. \"/\" .. tostring(path)\ - end\ - if not (self.path == path:sub(1, #self.path)) then\ - return \ - end\ - if #path == #self.path then\ - return self\ - end\ - if not (self.loaded) then\ - self:load()\ - end\ - do\ - local match = self.children['$mmm'] and self.children['$mmm']:walk(path)\ - if match then\ - return match\ - end\ - end\ - local _list_0 = self.children\ - for _index_0 = 1, #_list_0 do\ - local child = _list_0[_index_0]\ - do\ - local match = child:walk(path)\ - if match then\ - return match\ - end\ - end\ - end\ - end,\ - mount = function(self, path, mount_as)\ - if not mount_as then\ - path = path .. self:gett('name: alpha')\ - end\ - assert(not self.path or self.path == path, \"mounted twice: \" .. tostring(self.path) .. \" and now \" .. tostring(path))\ - self.path = path\ - local _list_0 = self.children\ - for _index_0 = 1, #_list_0 do\ - local child = _list_0[_index_0]\ - child:mount(self.path .. '/')\ - end\ - end,\ - iterate = function(self, depth)\ - if depth == nil then\ - depth = 0\ - end\ - coroutine.yield(self)\ - if depth == 1 then\ - return \ - end\ - local _list_0 = self.children\ - for _index_0 = 1, #_list_0 do\ - local child = _list_0[_index_0]\ - child:iterate(depth - 1)\ - end\ - end,\ - get_facets = function(self)\ - local names = { }\ - for str, key in pairs(self.facet_keys) do\ - names[key.name] = true\ - end\ - local _accum_0 = { }\ - local _len_0 = 1\ - for name in pairs(names) do\ - _accum_0[_len_0] = name\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end,\ - has = function(self, ...)\ - local want = Key(...)\ - return self.facet_keys[want]\ - end,\ - has_facet = function(self, want)\ - for str, key in pairs(self.facet_keys) do\ - local _continue_0 = false\ - repeat\ - if key.original then\ - _continue_0 = true\ - break\ - end\ - if key.name == want then\ - return key\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - end,\ - find = function(self, key, key2, ...)\ - local want = Key(key, key2)\ - local matching\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - for str, key in pairs(self.facet_keys) do\ - if key.name == want.name then\ - _accum_0[_len_0] = key\ - _len_0 = _len_0 + 1\ - end\ - end\ - matching = _accum_0\ - end\ - if not (#matching > 0) then\ - return \ - end\ - local shortest_path, start = get_conversions(self, want.type, (function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for _index_0 = 1, #matching do\ - local key = matching[_index_0]\ - _accum_0[_len_0] = key.type\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)(), ...)\ - if start then\ - for _index_0 = 1, #matching do\ - local key = matching[_index_0]\ - if key.type == start then\ - return key, shortest_path\ - end\ - end\ - return error(\"couldn't find key after resolution?\")\ - end\ - end,\ - get = function(self, ...)\ - local want = Key(...)\ - do\ - local val = self.facets[want]\ - if val then\ - return val, want\ - end\ - end\ - do\ - local val = CACHE and CACHE:get(self, want)\ - if val then\ - return val, want\ - end\ - end\ - local key, conversions = self:find(want)\ - if key then\ - local value = apply_conversions(self, conversions, self.facets[key], key)\ - if CACHE then\ - CACHE:set(self, want, value)\ - end\ - return value, key\ - end\ - end,\ - gett = function(self, ...)\ - local want = Key(...)\ - local value, key = self:get(want)\ - assert(value, tostring(self) .. \" doesn't have value for '\" .. tostring(want) .. \"'\")\ - return value, key\ - end,\ - set = function(self, key, key2, value)\ - if value then\ - key = Key(key, key2)\ - else\ - key = Key(key)\ - value = key2\ - end\ - if value == nil then\ - self.store:remove_facet(self.path, key.name, key.type)\ - elseif self.facet_keys[key] then\ - self.store:update_facet(self.path, key.name, key.type, value)\ - else\ - self.store:create_facet(self.path, key.name, key.type, value)\ - end\ - self.facets[key] = value\ - end,\ - add_child = function(self, name)\ - local new_path = self.store:create_fileder(self.path, name)\ - do\ - local new_child = Fileder(self.store, new_path, self.root)\ - table.insert(self.children, new_child)\ - return new_child\ - end\ - end,\ - remove_child = function(self, i)\ - local removed = table.remove(self.children, i)\ - assert(removed, \"no such child fileder\")\ - return self.store:remove_fileder(removed.path)\ - end,\ - swap_children = function(self, ia, ib)\ - local a, b = self.children[ia], self.children[ib]\ - self.store:swap_fileders(self.path, (a:gett('name: alpha')), (b:gett('name: alpha')))\ - self.children[ia], self.children[ib] = b, a\ - end,\ - __tostring = function(self)\ - return \"Fileder:\" .. tostring(self.path)\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, store, path, root)\ - if path == nil then\ - path = ''\ - end\ - if root == nil then\ - root = self\ - end\ - self.store, self.path, self.root = store, path, root\ - self.loaded = false\ - self.children = setmetatable({ }, {\ - __len = function(t)\ - if not (self.loaded) then\ - self:load()\ - end\ - return rawlen(t)\ - end,\ - __ipairs = function(t)\ - if not (self.loaded) then\ - self:load()\ - end\ - return inext, t, 0\ - end,\ - __index = function(t, k)\ - if not (self.loaded) then\ - self:load()\ - end\ - if 'string' == type(k) and '$' ~= k:sub(1, 1) then\ - return self:walk(tostring(self.path) .. \"/\" .. tostring(k))\ - end\ - end,\ - __newindex = function(t, k, child)\ - rawset(t, k, child)\ - if child.path then\ - return \ - end\ - return child:mount(self.path .. '/')\ - end\ - })\ - self.facet_keys = setmetatable({ }, {\ - __pairs = function(t)\ - if not (self.loaded) then\ - self:load()\ - end\ - return next, t\ - end,\ - __index = function(t, k)\ - local canonical = rawget(t, tostring(k))\ - return canonical\ - end,\ - __newindex = function(t, k, v)\ - k = Key(k)\ - return rawset(t, (tostring(k)), v)\ - end\ - })\ - self.facets = setmetatable({ }, {\ - __index = function(t, k)\ - if not (self.loaded) then\ - self:load()\ - end\ - k = self.facet_keys[k]\ - if not (k) then\ - return \ - end\ - do\ - local v = rawget(t, k)\ - if v then\ - return v\ - end\ - end\ - do\ - local v = self.store:load_facet(self.path, k.name, k.type)\ - rawset(t, k, v)\ - return v\ - end\ - end,\ - __pairs = function(t)\ - if not (self.loaded) then\ - self:load()\ - end\ - for k, v in pairs(self.facet_keys) do\ - local _ = t[v]\ - end\ - return next, t\ - end,\ - __newindex = function(t, k, v)\ - local key = self.facet_keys[k]\ - if not key then\ - key = Key(k)\ - self.facet_keys[key] = key\ - end\ - rawset(t, key, v)\ - if not v then\ - self.facet_keys[key] = nil\ - end\ - end\ - })\ - if 'table' == type(self.path) then\ - local index = self.path\ - self.path = index.path\ - self:load(index)\ - end\ - return assert(('string' == type(self.path)), \"invalid path: '\" .. tostring(self.path) .. \"'\")\ - end,\ - __base = _base_0,\ - __name = \"Fileder\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - Fileder = _class_0\ -end\ -return {\ - Key = Key,\ - Fileder = Fileder,\ - dir_base = dir_base\ -}", "mmm/mmmfs/fileder.moon"} -p["mmm.mmmfs.conversion"] = {"local refs = require('mmm.refs')\ -local Queue\ -Queue = require('mmm.mmmfs.queue').Queue\ -local get_plugins\ -get_plugins = require('mmm.mmmfs.meta').get_plugins\ -local builtins = require('mmm.mmmfs.builtins')\ -local count\ -count = function(base, pattern)\ - if pattern == nil then\ - pattern = '->'\ - end\ - return select(2, base:gsub(pattern, ''))\ -end\ -local escape_pattern\ -escape_pattern = function(inp)\ - if '*' == inp:sub(-1) then\ - inp = inp:sub(1, -2)\ - return \"^\" .. tostring(inp:gsub('([^%w])', '%%%1'))\ - else\ - return \"^\" .. tostring(inp:gsub('([^%w])', '%%%1')) .. \"$\"\ - end\ -end\ -local escape_inp\ -escape_inp = function(inp)\ - return \"^\" .. tostring(inp:gsub('([-/])', '%%%1')) .. \"$\"\ -end\ -local MermaidDebugger\ -do\ - local _class_0\ - local _base_0 = {\ - prepend = function(self, line)\ - self.buf = \" \" .. tostring(line) .. \"\\n\" .. self.buf\ - end,\ - append = function(self, line)\ - self.buf = self.buf .. \" \" .. tostring(line) .. \"\\n\"\ - end,\ - found_type = function(self, type)\ - local type_id = self.type_id[type]\ - end,\ - type_cost = function(self, type, cost)\ - do\ - local old_cost = self.cost[type]\ - if old_cost then\ - cost = math.min(old_cost, cost)\ - end\ - end\ - self.cost[type] = cost\ - end,\ - type_class = function(self, type, klass)\ - return self:append(\"class \" .. tostring(self.type_id[type]) .. \" \" .. tostring(klass))\ - end,\ - found_link = function(self, frm, to, cost)\ - return self:prepend(tostring(self.type_id[frm]) .. \" -- cost: \" .. tostring(cost) .. \" --> \" .. tostring(self.type_id[to]))\ - end,\ - render = function(self)\ - for type, id in pairs(self.type_id) do\ - local cost = self.cost[type] or -1\ - self:prepend(tostring(id) .. \"[\\\"\" .. tostring(type) .. \" [\" .. tostring(cost) .. \"]\\\"]\")\ - end\ - self:append(\"classDef have fill:#ada\")\ - self:append(\"classDef want fill:#add\")\ - self:append(\"classDef cant fill:#daa\")\ - return \"graph TD\\n\" .. self.buf\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self)\ - local nextid = 0\ - self.type_id = setmetatable({ }, {\ - __index = function(t, k)\ - nextid = nextid + 1\ - do\ - local val = \"type-\" .. tostring(nextid)\ - t[k] = val\ - return val\ - end\ - end\ - })\ - self.cost = { }\ - self.buf = \"\"\ - end,\ - __base = _base_0,\ - __name = \"MermaidDebugger\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - MermaidDebugger = _class_0\ -end\ -local get_converts\ -get_converts = function(fileder)\ - local converts\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - local _list_0 = builtins.converts\ - for _index_0 = 1, #_list_0 do\ - local c = _list_0[_index_0]\ - _accum_0[_len_0] = c\ - _len_0 = _len_0 + 1\ - end\ - converts = _accum_0\ - end\ - for plugin in get_plugins(fileder) do\ - local _list_0 = (plugin:get('converts: table') or { })\ - for _index_0 = 1, #_list_0 do\ - local c = _list_0[_index_0]\ - table.insert(converts, c)\ - end\ - end\ - return converts\ -end\ -local get_conversions\ -get_conversions = function(fileder, want, have, converts, limit, debug)\ - if limit == nil then\ - limit = 5\ - end\ - converts = converts or get_converts(fileder)\ - assert(have, 'need starting type(s)')\ - assert(converts, 'need to pass list of converts')\ - if 'string' == type(have) then\ - have = {\ - have\ - }\ - end\ - assert(#have > 0, 'need starting type(s) (list was empty)')\ - want = escape_pattern(want)\ - limit = limit + 3 * math.max(table.unpack((function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for _index_0 = 1, #have do\ - local type = have[_index_0]\ - _accum_0[_len_0] = count(type)\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)()))\ - if debug then\ - debug:found_type(want)\ - debug:type_cost(want, limit)\ - debug:type_class(want, 'want')\ - end\ - local had = { }\ - local queue = Queue()\ - for _index_0 = 1, #have do\ - local start = have[_index_0]\ - if start:match(want) then\ - return { }, start\ - end\ - queue:add({\ - start = start,\ - rest = start,\ - conversions = { }\ - }, 0, start)\ - if debug then\ - debug:found_type(start)\ - debug:type_cost(start, 0)\ - debug:type_class(start, 'have')\ - end\ - end\ - local best = Queue()\ - while true do\ - local entry, cost = queue:pop()\ - if not entry then\ - break\ - end\ - if cost > limit then\ - if debug then\ - debug:type_class(entry.rest, 'cant')\ - end\ - break\ - end\ - local start, rest, conversions\ - start, rest, conversions = entry.start, entry.rest, entry.conversions\ - had[rest] = true\ - for _index_0 = 1, #converts do\ - local _continue_0 = false\ - repeat\ - local convert = converts[_index_0]\ - local inp = escape_inp(convert.inp)\ - if not (rest:match(inp)) then\ - _continue_0 = true\ - break\ - end\ - local result = rest:gsub(inp, convert.out)\ - if not (result) then\ - _continue_0 = true\ - break\ - end\ - if had[result] then\ - _continue_0 = true\ - break\ - end\ - local next_entry = {\ - start = start,\ - rest = result,\ - cost = cost + convert.cost,\ - conversions = {\ - {\ - convert = convert,\ - from = rest,\ - to = result\ - },\ - table.unpack(conversions)\ - }\ - }\ - if debug then\ - debug:found_type(result)\ - debug:type_cost(result, next_entry.cost)\ - debug:found_link(rest, result, convert.cost)\ - end\ - if result:match(want) then\ - best:add(next_entry, next_entry.cost)\ - if debug then\ - debug:found_link(result, want, 0)\ - end\ - else\ - queue:add(next_entry, next_entry.cost, result)\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - end\ - do\ - local solution = best:pop()\ - if solution then\ - if solution then\ - return solution.conversions, solution.start\ - end\ - end\ - end\ -end\ -local print_conversions\ -print_conversions = function(conversions)\ - print(\"converting:\")\ - for i = #conversions, 1, -1 do\ - local step = conversions[i]\ - print(\"- \" .. tostring(step.from) .. \" -> \" .. tostring(step.to) .. \" (\" .. tostring(step.convert.cost) .. \")\")\ - end\ -end\ -local err_and_trace\ -err_and_trace = function(msg)\ - return debug.traceback(msg, 2)\ -end\ -local apply_conversions\ -apply_conversions = function(fileder, conversions, value, key)\ - for i = #conversions, 1, -1 do\ - refs:push()\ - local step = conversions[i]\ - local ok\ - ok, value = xpcall(step.convert.transform, err_and_trace, step, value, fileder, key)\ - refs:pop()\ - if not ok then\ - error(\"error while converting \" .. tostring(fileder) .. \" \" .. tostring(key) .. \" from '\" .. tostring(step.from) .. \"' to '\" .. tostring(step.to) .. \"':\\n\" .. tostring(value))\ - end\ - end\ - return value\ -end\ -local convert\ -convert = function(have, want, value, fileder, key)\ - local conversions, start = get_conversions(fileder, want, have)\ - if not conversions then\ - warn(\"couldn't convert from '\" .. tostring(have) .. \"' to '\" .. tostring(want) .. \"'\")\ - return \ - end\ - if 'string' ~= type(have) then\ - value = value[start]\ - end\ - return apply_conversions(fileder, conversions, value, key)\ -end\ -return {\ - MermaidDebugger = MermaidDebugger,\ - get_conversions = get_conversions,\ - apply_conversions = apply_conversions,\ - convert = convert\ -}", "mmm/mmmfs/conversion.moon"} -p["mmm.mmmfs.cache"] = {"local Cache\ -do\ - local _class_0\ - local _base_0 = {\ - get = function(self, fileder, key)\ - key = tostring(key)\ - local _update_0 = fileder.path\ - self.cache[_update_0] = self.cache[_update_0] or { }\ - return self.cache[fileder.path][key]\ - end,\ - set = function(self, fileder, key, val)\ - key = tostring(key)\ - local _update_0 = fileder.path\ - self.cache[_update_0] = self.cache[_update_0] or { }\ - self.cache[fileder.path][key] = val\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self)\ - self.cache = { }\ - end,\ - __base = _base_0,\ - __name = \"Cache\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - Cache = _class_0\ -end\ -local init_cache\ -init_cache = function()\ - CACHE = Cache()\ -end\ -return {\ - init_cache = init_cache\ -}", "mmm/mmmfs/cache.moon"} -p["mmm.mmmfs.queue"] = {"local Queue\ -do\ - local _class_0\ - local _base_0 = {\ - add = function(self, value, priority, key)\ - local entry = {\ - value = value,\ - key = key,\ - priority = priority\ - }\ - if key then\ - do\ - local old_entry = self.index[key]\ - if old_entry then\ - if old_entry.priority < priority then\ - return \ - end\ - local i\ - for ii, entry in ipairs(self.values) do\ - if entry == old_entry then\ - i = ii\ - break\ - end\ - end\ - table.remove(self.values, i)\ - end\ - end\ - self.index[key] = entry\ - end\ - for i, v in ipairs(self.values) do\ - if v.priority < priority then\ - table.insert(self.values, i, entry)\ - return \ - end\ - end\ - return table.insert(self.values, entry)\ - end,\ - peek = function(self)\ - local entry = self.values[#self.values]\ - if entry then\ - local value, priority, key\ - value, priority, key = entry.value, entry.priority, entry.key\ - if key then\ - self.index[key] = nil\ - end\ - return value, priority\ - end\ - end,\ - pop = function(self)\ - local entry = table.remove(self.values)\ - if entry then\ - local value, priority, key\ - value, priority, key = entry.value, entry.priority, entry.key\ - if key then\ - self.index[key] = nil\ - end\ - return value, priority\ - end\ - end,\ - poll = function(self)\ - return self.pop, self\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self)\ - self.values = { }\ - self.index = { }\ - end,\ - __base = _base_0,\ - __name = \"Queue\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - Queue = _class_0\ -end\ -return {\ - Queue = Queue\ -}", "mmm/mmmfs/queue.moon"} -p["mmm.mmmfs.stores"] = {"local Store\ -do\ - local _class_0\ - local _base_0 = {\ - list_fileders_in = function(self)\ - return error(\"not implemented\")\ - end,\ - list_all_fileders = function(self, path)\ - if path == nil then\ - path = ''\ - end\ - return coroutine.wrap(function()\ - for path in self:list_fileders_in(path) do\ - coroutine.yield(path)\ - for p in self:list_all_fileders(path) do\ - coroutine.yield(p)\ - end\ - end\ - end)\ - end,\ - get_index = function(self, path, depth)\ - if path == nil then\ - path = ''\ - end\ - if depth == nil then\ - depth = 1\ - end\ - if depth == 0 then\ - return path\ - end\ - return {\ - path = path,\ - facets = (function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for name, type in self:list_facets(path) do\ - _accum_0[_len_0] = {\ - name = name,\ - type = type\ - }\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)(),\ - children = (function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for child in self:list_fileders_in(path) do\ - _accum_0[_len_0] = self:get_index(child, depth - 1)\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)()\ - }\ - end,\ - create_fileder = function(self)\ - return error(\"not implemented\")\ - end,\ - remove_fileder = function(self)\ - return error(\"not implemented\")\ - end,\ - rename_fileder = function(self)\ - return error(\"not implemented\")\ - end,\ - move_fileder = function(self)\ - return error(\"not implemented\")\ - end,\ - list_facets = function(self)\ - return error(\"not implemented\")\ - end,\ - create_facet = function(self)\ - return error(\"not implemented\")\ - end,\ - remove_facet = function(self)\ - return error(\"not implemented\")\ - end,\ - load_facet = function(self)\ - return error(\"not implemented\")\ - end,\ - rename_facet = function(self, path, name, type, next_name)\ - self:log(\"renaming facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type) .. \" -> \" .. tostring(next_name))\ - local blob = assert(\"no such facet\", self:load_facet(path, name, type))\ - self:create_facet(path, next_name, type, blob)\ - return self:remove_facet(path, name, type({\ - update_facet = function(self)\ - return error(\"not implemented\")\ - end\ - }))\ - end,\ - close = function(self) end,\ - fsck = function(self) end,\ - log = function(self, ...)\ - return print(\"[\" .. tostring(self.__class.__name) .. \"]\", ...)\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, opts)\ - opts.verbose = opts.verbose or false\ - if not opts.verbose then\ - self.log = function() end\ - end\ - end,\ - __base = _base_0,\ - __name = \"Store\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - Store = _class_0\ -end\ -local get_store\ -get_store = function(args, opts)\ - if args == nil then\ - args = 'fs'\ - end\ - if opts == nil then\ - opts = { }\ - end\ - local type, arg = args:match('(%w+):(.*)')\ - if not (type) then\ - type = args\ - end\ - local _exp_0 = type:lower()\ - if 'sql' == _exp_0 then\ - local SQLStore\ - SQLStore = require('mmm.mmmfs.stores.sql').SQLStore\ - if arg == 'MEMORY' then\ - opts.memory = true\ - else\ - opts.file = arg\ - end\ - return SQLStore(opts)\ - elseif 'fs' == _exp_0 then\ - local FSStore\ - FSStore = require('mmm.mmmfs.stores.fs').FSStore\ - opts.root = arg\ - return FSStore(opts)\ - else\ - warn(\"unknown or missing value for STORE: valid types values are sql, fs\")\ - return os.exit(1)\ - end\ -end\ -return {\ - Store = Store,\ - get_store = get_store\ -}", "mmm/mmmfs/stores/init.moon"} -p["mmm.mmmfs.stores.web"] = {"local Store\ -Store = require('mmm.mmmfs.stores').Store\ -local location, XMLHttpRequest, JSON, Object, Array\ -do\ - local _obj_0 = js.global\ - location, XMLHttpRequest, JSON, Object, Array = _obj_0.location, _obj_0.XMLHttpRequest, _obj_0.JSON, _obj_0.Object, _obj_0.Array\ -end\ -local dir_base\ -dir_base = function(path)\ - local dir, base = path:match('(.-)([^/]-)$')\ - if dir and #dir > 0 then\ - dir = dir:sub(1, #dir - 1)\ - end\ - return dir, base\ -end\ -local req\ -req = function(method, url, content)\ - if content == nil then\ - content = js.null\ - end\ - if not url then\ - url = method\ - method = 'GET'\ - end\ - local request = js.new(XMLHttpRequest)\ - request:open(method, url, false)\ - request:send(content)\ - assert(request.status == 200, \"unexpected status code: \" .. tostring(request.status))\ - return request.responseText\ -end\ -local parse_json\ -do\ - local fix\ - fix = function(val)\ - local _exp_0 = type(val)\ - if 'userdata' == _exp_0 then\ - if Array:isArray(val) then\ - local _accum_0 = { }\ - local _len_0 = 1\ - for x in js.of(val) do\ - _accum_0[_len_0] = fix(x)\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - else\ - local _tbl_0 = { }\ - for e in js.of(Object:entries(val)) do\ - _tbl_0[(fix(e[0]))] = (fix(e[1]))\ - end\ - return _tbl_0\ - end\ - else\ - return val\ - end\ - end\ - parse_json = function(string)\ - return fix(JSON:parse(string))\ - end\ -end\ -local WebStore\ -do\ - local _class_0\ - local _parent_0 = Store\ - local _base_0 = {\ - get_index = function(self, path, depth)\ - if path == nil then\ - path = ''\ - end\ - if depth == nil then\ - depth = 1\ - end\ - local pseudo\ - if depth > 1 or depth < 0 then\ - pseudo = '?tree'\ - else\ - pseudo = '?index'\ - end\ - local json = req(tostring(self.host .. path) .. \"/\" .. tostring(pseudo) .. \": text/json\")\ - return parse_json(json)\ - end,\ - list_fileders_in = function(self, path)\ - if path == nil then\ - path = ''\ - end\ - return coroutine.wrap(function()\ - local json = req(tostring(self.host .. path) .. \"/?index: text/json\")\ - local index = parse_json(json)\ - for child in js.of(index.children) do\ - coroutine.yield(child.path)\ - end\ - end)\ - end,\ - create_fileder = function(self, parent, name)\ - local path = tostring(parent) .. \"/\" .. tostring(name)\ - self:log(\"creating fileder \" .. tostring(path))\ - return req('POST', tostring(self.host .. path) .. \"/\")\ - end,\ - remove_fileder = function(self, path)\ - self:log(\"removing fileder \" .. tostring(path))\ - return req('DELETE', tostring(self.host .. path) .. \"/\")\ - end,\ - rename_fileder = function(self, path, next_name)\ - self:log(\"renaming fileder \" .. tostring(path) .. \" -> '\" .. tostring(next_name) .. \"'\")\ - return error(\"not implemented\")\ - end,\ - move_fileder = function(self, path, next_parent)\ - self:log(\"moving fileder \" .. tostring(path) .. \" -> \" .. tostring(next_parent) .. \"/\")\ - return error(\"not implemented\")\ - end,\ - swap_fileders = function(self, parent, child_a, child_b)\ - return req('PUT', tostring(self.host .. parent) .. \"/\", \"swap\\n\" .. tostring(child_a) .. \"\\n\" .. tostring(child_b))\ - end,\ - list_facets = function(self, path)\ - return coroutine.wrap(function()\ - local json = req(tostring(self.host .. path) .. \"/?index: text/json\")\ - local index = JSON:parse(json)\ - for facet in js.of(index.facets) do\ - coroutine.yield(facet.name, facet.type)\ - end\ - end)\ - end,\ - load_facet = function(self, path, name, type)\ - self:log(\"loading facet \" .. tostring(path) .. \" \" .. tostring(name) .. \": \" .. tostring(type))\ - return req(tostring(self.host .. path) .. \"/\" .. tostring(name) .. \": \" .. tostring(type))\ - end,\ - create_facet = function(self, path, name, type, blob)\ - self:log(\"creating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - return req('POST', tostring(self.host .. path) .. \"/\" .. tostring(name) .. \": \" .. tostring(type), blob)\ - end,\ - remove_facet = function(self, path, name, type)\ - self:log(\"removing facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - return req('DELETE', tostring(self.host .. path) .. \"/\" .. tostring(name) .. \": \" .. tostring(type))\ - end,\ - rename_facet = function(self, path, name, type, next_name)\ - self:log(\"renaming facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type) .. \" -> \" .. tostring(next_name))\ - local blob = assert(\"no such facet\", self:load_facet(path, name, type))\ - self:create_facet(path, next_name, type, blob)\ - return self:remove_facet(path, name, type)\ - end,\ - update_facet = function(self, path, name, type, blob)\ - self:log(\"updating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - return req('PUT', tostring(self.host .. path) .. \"/\" .. tostring(name) .. \": \" .. tostring(type), blob)\ - end\ - }\ - _base_0.__index = _base_0\ - setmetatable(_base_0, _parent_0.__base)\ - _class_0 = setmetatable({\ - __init = function(self, opts)\ - if opts == nil then\ - opts = { }\ - end\ - _class_0.__parent.__init(self, opts)\ - if MODE == 'CLIENT' then\ - local origin = location.origin\ - opts.host = opts.host or origin\ - end\ - self.host = opts.host:match('^(.-)/?$')\ - return self:log(\"connecting to '\" .. tostring(self.host) .. \"'...\")\ - end,\ - __base = _base_0,\ - __name = \"WebStore\",\ - __parent = _parent_0\ - }, {\ - __index = function(cls, name)\ - local val = rawget(_base_0, name)\ - if val == nil then\ - local parent = rawget(cls, \"__parent\")\ - if parent then\ - return parent[name]\ - end\ - else\ - return val\ - end\ - end,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - if _parent_0.__inherited then\ - _parent_0.__inherited(_parent_0, _class_0)\ - end\ - WebStore = _class_0\ -end\ -return {\ - WebStore = WebStore\ -}", "mmm/mmmfs/stores/web.moon"} -p["mmm.mmmfs.stores.sql"] = {"local sqlite = require('sqlite3')\ -local Store\ -Store = require('mmm.mmmfs.stores').Store\ -local SQLStore\ -do\ - local _class_0\ - local _parent_0 = Store\ - local _base_0 = {\ - close = function(self)\ - return self.db:close()\ - end,\ - fetch = function(self, q, ...)\ - local stmt = assert(self.db:prepare(q))\ - if 0 < select('#', ...) then\ - stmt:bind(...)\ - end\ - return stmt:irows()\ - end,\ - fetch_one = function(self, q, ...)\ - local stmt = assert(self.db:prepare(q))\ - if 0 < select('#', ...) then\ - stmt:bind(...)\ - end\ - return stmt:first_irow()\ - end,\ - exec = function(self, q, ...)\ - local stmt = assert(self.db:prepare(q))\ - if 0 < select('#', ...) then\ - stmt:bind(...)\ - end\ - local res = assert(stmt:exec())\ - end,\ - list_fileders_in = function(self, path)\ - if path == nil then\ - path = ''\ - end\ - return coroutine.wrap(function()\ - for _des_0 in self:fetch('SELECT path\\n FROM fileder WHERE parent IS ?', path) do\ - path = _des_0[1]\ - coroutine.yield(path)\ - end\ - end)\ - end,\ - create_fileder = function(self, parent, name)\ - local path = tostring(parent) .. \"/\" .. tostring(name)\ - self:log(\"creating fileder \" .. tostring(path))\ - self:exec('INSERT INTO fileder (path, parent)\\n VALUES (:path, :parent)', {\ - path = path,\ - parent = parent\ - })\ - local changes = self:fetch_one('SELECT changes()')\ - assert(changes[1] == 1, \"couldn't create fileder - parent missing?\")\ - return path\ - end,\ - remove_fileder = function(self, path)\ - self:log(\"removing fileder \" .. tostring(path))\ - return self:exec('DELETE FROM fileder\\n WHERE path LIKE :path || \"/%\"\\n OR path = :path', path)\ - end,\ - rename_fileder = function(self, path, next_name)\ - self:log(\"renaming fileder \" .. tostring(path) .. \" -> '\" .. tostring(next_name) .. \"'\")\ - error('not implemented')\ - return self:exec('UPDATE fileder\\n SET path = parent || \"/\" || :next_name\\n WHERE path = :path', {\ - path = path,\ - next_name = next_name\ - })\ - end,\ - move_fileder = function(self, path, next_parent)\ - self:log(\"moving fileder \" .. tostring(path) .. \" -> \" .. tostring(next_parent) .. \"/\")\ - return error('not implemented')\ - end,\ - list_facets = function(self, path)\ - return coroutine.wrap(function()\ - for _des_0 in self:fetch('SELECT facet.name, facet.type\\n FROM facet\\n INNER JOIN fileder ON facet.fileder_id = fileder.id\\n WHERE fileder.path = ?', path) do\ - local name, type\ - name, type = _des_0[1], _des_0[2]\ - coroutine.yield(name, type)\ - end\ - end)\ - end,\ - load_facet = function(self, path, name, type)\ - local v = self:fetch_one('SELECT facet.value\\n FROM facet\\n INNER JOIN fileder ON facet.fileder_id = fileder.id\\n WHERE fileder.path = :path\\n AND facet.name = :name\\n AND facet.type = :type', {\ - path = path,\ - name = name,\ - type = type\ - })\ - return v and v[1]\ - end,\ - create_facet = function(self, path, name, type, blob)\ - self:log(\"creating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - self:exec('INSERT INTO facet (fileder_id, name, type, value)\\n SELECT id, :name, :type, :blob\\n FROM fileder\\n WHERE fileder.path = :path', {\ - path = path,\ - name = name,\ - type = type,\ - blob = blob\ - })\ - local changes = self:fetch_one('SELECT changes()')\ - return assert(changes[1] == 1, \"couldn't create facet - fileder missing?\")\ - end,\ - remove_facet = function(self, path, name, type)\ - self:log(\"removing facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - self:exec('DELETE FROM facet\\n WHERE name = :name\\n AND type = :type\\n AND fileder_id = (SELECT id FROM fileder WHERE path = :path)', {\ - path = path,\ - name = name,\ - type = type\ - })\ - local changes = self:fetch_one('SELECT changes()')\ - return assert(changes[1] == 1, \"no such facet\")\ - end,\ - rename_facet = function(self, path, name, type, next_name)\ - self:log(\"renaming facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type) .. \" -> \" .. tostring(next_name))\ - self:exec('UPDATE facet\\n SET name = :next_name\\n WHERE name = :name\\n AND type = :type\\n AND fileder_id = (SELECT id FROM fileder WHERE path = :path)', {\ - path = path,\ - name = name,\ - next_name = next_name,\ - type = type\ - })\ - local changes = self:fetch_one('SELECT changes()')\ - return assert(changes[1] == 1, \"no such facet\")\ - end,\ - update_facet = function(self, path, name, type, blob)\ - self:log(\"updating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - self:exec('UPDATE facet\\n SET value = :blob\\n WHERE facet.name = :name\\n AND facet.type = :type\\n AND facet.fileder_id = (SELECT id FROM fileder WHERE path = :path)', {\ - path = path,\ - name = name,\ - type = type,\ - blob = blob\ - })\ - local changes = self:fetch_one('SELECT changes()')\ - return assert(changes[1] == 1, \"no such facet\")\ - end\ - }\ - _base_0.__index = _base_0\ - setmetatable(_base_0, _parent_0.__base)\ - _class_0 = setmetatable({\ - __init = function(self, opts)\ - if opts == nil then\ - opts = { }\ - end\ - _class_0.__parent.__init(self, opts)\ - opts.file = opts.file or 'db.sqlite3'\ - opts.memory = opts.memory or false\ - if opts.memory then\ - self:log(\"opening in-memory DB...\")\ - self.db = sqlite.open_memory()\ - else\ - self:log(\"opening '\" .. tostring(opts.file) .. \"'...\")\ - self.db = sqlite.open(opts.file)\ - end\ - return assert(self.db:exec([[ PRAGMA foreign_keys = ON;\ - PRAGMA case_sensitive_like = ON;\ - CREATE TABLE IF NOT EXISTS fileder (\ - id INTEGER NOT NULL PRIMARY KEY,\ - path TEXT NOT NULL UNIQUE,\ - parent TEXT REFERENCES fileder(path)\ - ON DELETE CASCADE\ - ON UPDATE CASCADE\ - );\ - INSERT OR IGNORE INTO fileder (path, parent) VALUES (\"\", NULL);\ -\ - CREATE TABLE IF NOT EXISTS facet (\ - fileder_id INTEGER NOT NULL\ - REFERENCES fileder\ - ON UPDATE CASCADE\ - ON DELETE CASCADE,\ - name TEXT NOT NULL,\ - type TEXT NOT NULL,\ - value BLOB NOT NULL,\ - PRIMARY KEY (fileder_id, name, type)\ - );\ - CREATE INDEX IF NOT EXISTS facet_fileder_id ON facet(fileder_id);\ - CREATE INDEX IF NOT EXISTS facet_name ON facet(name);\ - ]]))\ - end,\ - __base = _base_0,\ - __name = \"SQLStore\",\ - __parent = _parent_0\ - }, {\ - __index = function(cls, name)\ - local val = rawget(_base_0, name)\ - if val == nil then\ - local parent = rawget(cls, \"__parent\")\ - if parent then\ - return parent[name]\ - end\ - else\ - return val\ - end\ - end,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - if _parent_0.__inherited then\ - _parent_0.__inherited(_parent_0, _class_0)\ - end\ - SQLStore = _class_0\ -end\ -return {\ - SQLStore = SQLStore\ -}", "mmm/mmmfs/stores/sql.moon"} -p["mmm.mmmfs.stores.fs"] = {"local lfs = require('lfs')\ -local Store\ -Store = require('mmm.mmmfs.stores').Store\ -local dir_base\ -dir_base = function(path)\ - local dir, base = path:match('(.-)([^/]-)$')\ - if dir and #dir > 0 then\ - dir = dir:sub(1, #dir - 1)\ - end\ - return dir, base\ -end\ -local FSStore\ -do\ - local _class_0\ - local _parent_0 = Store\ - local _base_0 = {\ - get_order = function(self, path, forgiving, include_meta)\ - if forgiving == nil then\ - forgiving = false\ - end\ - if include_meta == nil then\ - include_meta = false\ - end\ - local entries = { }\ - local sorted = { }\ - for name in lfs.dir(self.root .. path) do\ - local _continue_0 = false\ - repeat\ - if '.' == name:sub(1, 1) then\ - _continue_0 = true\ - break\ - end\ - if '$' == name:sub(1, 1) and not include_meta then\ - _continue_0 = true\ - break\ - end\ - local entry_path = tostring(self.root) .. tostring(path) .. \"/\" .. tostring(name)\ - if 'directory' ~= lfs.attributes(entry_path, 'mode') then\ - _continue_0 = true\ - break\ - end\ - local entry = {\ - name = name,\ - path = tostring(path) .. \"/\" .. tostring(name)\ - }\ - entries[name] = entry\ - if '$' == name:sub(1, 1) then\ - table.insert(sorted, entry)\ - sorted[name] = true\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - local order_file = tostring(self.root) .. tostring(path) .. \"/$order\"\ - if 'file' == lfs.attributes(order_file, 'mode') then\ - for line in io.lines(order_file) do\ - local _continue_0 = false\ - repeat\ - local entry = entries[line]\ - if not entry then\ - if forgiving then\ - self:log(\"removed stale entry '\" .. tostring(line) .. \"' from \" .. tostring(path) .. \"/$order\")\ - _continue_0 = true\ - break\ - end\ - error(\"entry in $order but not on disk: \" .. tostring(line) .. \" (at \" .. tostring(path) .. \")\")\ - end\ - table.insert(sorted, entry)\ - sorted[line] = true\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - else\ - forgiving = true\ - end\ - local unsorted\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - for name, entry in pairs(entries) do\ - if not sorted[entry.name] then\ - _accum_0[_len_0] = entry\ - _len_0 = _len_0 + 1\ - end\ - end\ - unsorted = _accum_0\ - end\ - if forgiving then\ - for _index_0 = 1, #unsorted do\ - local entry = unsorted[_index_0]\ - self:log(\"adding new entry '\" .. tostring(entry.name) .. \"' in \" .. tostring(path) .. \"/$order\")\ - table.insert(sorted, entry)\ - end\ - else\ - assert(#unsorted == 0, unsorted[1] and \"entry on disk but not in $order: \" .. tostring(unsorted[1].path) .. \" (at \" .. tostring(path) .. \")\")\ - end\ - return sorted\ - end,\ - write_order = function(self, path, order)\ - if order == nil then\ - order = self:get_order(path, true)\ - end\ - local order_file = tostring(self.root) .. tostring(path) .. \"/$order\"\ - if #order == 0 then\ - os.remove(order_file)\ - return \ - end\ - local file = assert(io.open(order_file, 'w'))\ - for _index_0 = 1, #order do\ - local _des_0 = order[_index_0]\ - local name\ - name = _des_0.name\ - file:write(tostring(name) .. \"\\n\")\ - end\ - return file:close()\ - end,\ - list_fileders_in = function(self, path)\ - if path == nil then\ - path = ''\ - end\ - local sorted = self:get_order(path, nil, true)\ - return coroutine.wrap(function()\ - for _index_0 = 1, #sorted do\ - local _des_0 = sorted[_index_0]\ - path = _des_0.path\ - coroutine.yield(path)\ - end\ - end)\ - end,\ - create_fileder = function(self, parent, name)\ - local path = tostring(parent) .. \"/\" .. tostring(name)\ - self:log(\"creating fileder \" .. tostring(path))\ - assert(lfs.mkdir(self.root .. path))\ - self:write_order(parent)\ - return path\ - end,\ - remove_fileder = function(self, path)\ - self:log(\"removing fileder \" .. tostring(path))\ - local rmdir\ - rmdir = function(path)\ - for file in lfs.dir(path) do\ - local _continue_0 = false\ - repeat\ - if '.' == file:sub(1, 1) then\ - _continue_0 = true\ - break\ - end\ - local file_path = tostring(path) .. \"/\" .. tostring(file)\ - local _exp_0 = lfs.attributes(file_path, 'mode')\ - if 'file' == _exp_0 then\ - assert(os.remove(file_path))\ - elseif 'directory' == _exp_0 then\ - assert(rmdir(file_path))\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - return lfs.rmdir(path)\ - end\ - rmdir(self.root .. path)\ - local parent = dir_base(path)\ - return self:write_order(parent)\ - end,\ - rename_fileder = function(self, path, next_name)\ - self:log(\"renaming fileder \" .. tostring(path) .. \" -> '\" .. tostring(next_name) .. \"'\")\ - local parent, name = dir_base(path)\ - return assert(os.rename(path, tostring(self.root) .. tostring(parent) .. \"/\" .. tostring(next_name)))\ - end,\ - move_fileder = function(self, path, next_parent)\ - self:log(\"moving fileder \" .. tostring(path) .. \" -> \" .. tostring(next_parent) .. \"/\")\ - local parent, name = dir_base(path)\ - return assert(os.rename(self.root .. path, tostring(self.root) .. tostring(next_parent) .. \"/\" .. tostring(name)))\ - end,\ - swap_fileders = function(self, parent, name_a, name_b)\ - self:log(\"swapping \" .. tostring(name_a) .. \" and \" .. tostring(name_b) .. \" in \" .. tostring(parent))\ - local order = self:get_order(parent)\ - local a, b\ - for i, entry in ipairs(order) do\ - if entry.name == name_a then\ - a = i\ - end\ - if entry.name == name_b then\ - b = i\ - end\ - if a and b then\ - break\ - end\ - end\ - assert(a, \"couldn't find \" .. tostring(parent) .. \"/\" .. tostring(name_a) .. \" in $order\")\ - assert(b, \"couldn't find \" .. tostring(parent) .. \"/\" .. tostring(name_b) .. \" in $order\")\ - order[a], order[b] = order[b], order[a]\ - return self:write_order(parent, order)\ - end,\ - list_facets = function(self, path)\ - return coroutine.wrap(function()\ - for entry_name in lfs.dir(self.root .. path) do\ - local _continue_0 = false\ - repeat\ - if '.' == entry_name:sub(1, 1) then\ - _continue_0 = true\ - break\ - end\ - if entry_name == '$order' then\ - _continue_0 = true\ - break\ - end\ - local entry_path = tostring(self.root .. path) .. \"/\" .. tostring(entry_name)\ - if 'file' == lfs.attributes(entry_path, 'mode') then\ - entry_name = (entry_name:match('(.*)%.%w+')) or entry_name\ - entry_name = entry_name:gsub('%$', '/')\ - local name, type = entry_name:match('([%w-_]+): *(.+)')\ - if not name then\ - name = ''\ - type = entry_name\ - end\ - coroutine.yield(name, type)\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - end)\ - end,\ - tofp = function(self, path, name, type)\ - if #name > 0 then\ - type = tostring(name) .. \": \" .. tostring(type)\ - end\ - type = type:gsub('%/', '$')\ - return self.root .. tostring(path) .. \"/\" .. tostring(type)\ - end,\ - locate = function(self, path, name, type)\ - if not (lfs.attributes(self.root .. path, 'mode')) then\ - return \ - end\ - type = type:gsub('%/', '$')\ - if #name > 0 then\ - name = tostring(name) .. \": \"\ - end\ - name = name .. type\ - name = name:gsub('([^%w])', '%%%1')\ - local file_name\ - for entry_name in lfs.dir(self.root .. path) do\ - local _continue_0 = false\ - repeat\ - if '.' == entry_name:sub(1, 1) then\ - _continue_0 = true\ - break\ - end\ - if (entry_name:match(\"^\" .. tostring(name) .. \"$\")) or entry_name:match(\"^\" .. tostring(name) .. \"%.%w+$\") then\ - if file_name then\ - error(\"two files match \" .. tostring(name) .. \": \" .. tostring(file_name) .. \" and \" .. tostring(entry_name) .. \"!\")\ - end\ - file_name = entry_name\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - return file_name and self.root .. tostring(path) .. \"/\" .. tostring(file_name)\ - end,\ - load_facet = function(self, path, name, type)\ - local filepath = self:locate(path, name, type)\ - if not (filepath) then\ - return \ - end\ - local file = assert((io.open(filepath, 'rb')), \"couldn't open facet file '\" .. tostring(filepath) .. \"'\")\ - do\ - local _with_0 = file:read('*all')\ - file:close()\ - return _with_0\ - end\ - end,\ - create_facet = function(self, path, name, type, blob)\ - self:log(\"creating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - assert(blob, \"cant create facet without value!\")\ - local filepath = self:locate(path, name, type)\ - assert(not filepath, \"facet file already exists!\")\ - filepath = self:tofp(path, name, type)\ - local file = assert((io.open(filepath, 'wb')), \"couldn't open facet file '\" .. tostring(filepath) .. \"'\")\ - file:write(blob)\ - return file:close()\ - end,\ - remove_facet = function(self, path, name, type)\ - self:log(\"removing facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - local filepath = self:locate(path, name, type)\ - assert(filepath, \"couldn't locate facet!\")\ - return assert(os.remove(filepath))\ - end,\ - rename_facet = function(self, path, name, type, next_name)\ - self:log(\"renaming facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type) .. \" -> \" .. tostring(next_name))\ - local filepath = self:locate(path, name, type)\ - assert(filepath, \"couldn't locate facet!\")\ - return assert(os.rename(filepath, self:tofp(path, next_name, type)))\ - end,\ - update_facet = function(self, path, name, type, blob)\ - self:log(\"updating facet \" .. tostring(path) .. \" | \" .. tostring(name) .. \": \" .. tostring(type))\ - local filepath = self:locate(path, name, type)\ - assert(filepath, \"couldn't locate facet!\")\ - local file = assert((io.open(filepath, 'wb')), \"couldn't open facet file '\" .. tostring(filepath) .. \"'\")\ - file:write(blob)\ - return file:close()\ - end,\ - fsck = function(self, path)\ - if path == nil then\ - path = ''\ - end\ - local order = self:get_order(path, true)\ - self:write_order(path, order)\ - for _index_0 = 1, #order do\ - local _des_0 = order[_index_0]\ - path = _des_0.path\ - self:fsck(path)\ - end\ - end\ - }\ - _base_0.__index = _base_0\ - setmetatable(_base_0, _parent_0.__base)\ - _class_0 = setmetatable({\ - __init = function(self, opts)\ - if opts == nil then\ - opts = { }\ - end\ - _class_0.__parent.__init(self, opts)\ - opts.root = opts.root or 'root'\ - self.root = opts.root:match('^(.-)/?$')\ - return self:log(\"opening '\" .. tostring(opts.root) .. \"'...\")\ - end,\ - __base = _base_0,\ - __name = \"FSStore\",\ - __parent = _parent_0\ - }, {\ - __index = function(cls, name)\ - local val = rawget(_base_0, name)\ - if val == nil then\ - local parent = rawget(cls, \"__parent\")\ - if parent then\ - return parent[name]\ - end\ - else\ - return val\ - end\ - end,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - if _parent_0.__inherited then\ - _parent_0.__inherited(_parent_0, _class_0)\ - end\ - FSStore = _class_0\ -end\ -return {\ - FSStore = FSStore\ -}", "mmm/mmmfs/stores/fs.moon"} -p["mmm.mmmfs.browser"] = {"local Key\ -Key = require('mmm.mmmfs.fileder').Key\ -local converts\ -converts = require('mmm.mmmfs.builtins').converts\ -local get_conversions, apply_conversions\ -do\ - local _obj_0 = require('mmm.mmmfs.conversion')\ - get_conversions, apply_conversions = _obj_0.get_conversions, _obj_0.apply_conversions\ -end\ -local ReactiveVar, get_or_create, text, elements, tohtml\ -do\ - local _obj_0 = require('mmm.component')\ - ReactiveVar, get_or_create, text, elements, tohtml = _obj_0.ReactiveVar, _obj_0.get_or_create, _obj_0.text, _obj_0.elements, _obj_0.tohtml\ -end\ -local pre, div, nav, span, button, a, code, select, option\ -pre, div, nav, span, button, a, code, select, option = elements.pre, elements.div, elements.nav, elements.span, elements.button, elements.a, elements.code, elements.select, elements.option\ -local link_to\ -link_to = (require('mmm.mmmfs.util'))(elements).link_to\ -local languages\ -languages = require('mmm.highlighting').languages\ -local keep\ -keep = function(var)\ - local last = var:get()\ - return var:map(function(val)\ - last = val or last\ - return last\ - end)\ -end\ -local combine\ -combine = function(...)\ - local res = { }\ - local lists = {\ - ...\ - }\ - for _index_0 = 1, #lists do\ - local list = lists[_index_0]\ - for _index_1 = 1, #list do\ - local val = list[_index_1]\ - table.insert(res, val)\ - end\ - end\ - return res\ -end\ -local casts = {\ - {\ - inp = 'URL.*',\ - out = 'mmm/dom',\ - cost = 0,\ - transform = function(self, href)\ - return span(a((code(href)), {\ - href = href\ - }))\ - end\ - }\ -}\ -local get_casts\ -get_casts = function()\ - return combine(casts, converts)\ -end\ -local Browser\ -do\ - local _class_0\ - local err_and_trace, default_convert\ - local _base_0 = {\ - refresh = function(self, facet)\ - if facet == nil then\ - facet = self.facet:get()\ - end\ - if facet == true then\ - return self.fileder:transform(function(i)\ - return i\ - end)\ - else\ - return self.content:set(self:get_content(facet))\ - end\ - end,\ - get_content = function(self, prop, err, convert)\ - if err == nil then\ - err = self.error\ - end\ - if convert == nil then\ - convert = default_convert\ - end\ - local clear_error\ - clear_error = function()\ - if MODE == 'CLIENT' then\ - return err:set()\ - end\ - end\ - local disp_error\ - disp_error = function(msg)\ - if MODE == 'CLIENT' then\ - err:set(pre(msg))\ - end\ - warn(\"ERROR rendering content: \" .. tostring(msg))\ - return div()\ - end\ - local active = self.fileder:get()\ - if not (active) then\ - return disp_error(\"fileder not found!\")\ - end\ - if not (prop) then\ - return disp_error(\"facet not found!\")\ - end\ - local ok, res = xpcall(convert, err_and_trace, active, prop)\ - if MODE == 'CLIENT' then\ - document.body.classList:remove('loading')\ - end\ - if ok and res then\ - clear_error()\ - return res\ - elseif ok then\ - return div(\"[no conversion path to \" .. tostring(prop.type) .. \"]\")\ - elseif res and res:match('%[nossr%]') then\ - return div(\"[this page could not be pre-rendered on the server]\")\ - else\ - return disp_error(res)\ - end\ - end,\ - get_inspector = function(self)\ - self.inspect_prop = self.facet:map(function(prop)\ - local active = self.fileder:get()\ - local key = active and active:find(prop)\ - if key and key.original then\ - key = key.original\ - end\ - return key\ - end)\ - self.inspect_err = ReactiveVar()\ - do\ - local _with_0 = div({\ - class = 'view inspector'\ - })\ - _with_0:append(nav({\ - span('inspector'),\ - button('close', {\ - onclick = function(_, e)\ - return self.inspect:set(false)\ - end\ - })\ - }))\ - _with_0:append(div({\ - class = 'subnav',\ - self.inspect_prop:map(function(current)\ - current = current and current:tostring()\ - local fileder = self.fileder:get()\ - local onchange\ - onchange = function(_, e)\ - local facet = e.target.value\ - if facet == '' then\ - return \ - end\ - return self.inspect_prop:set(Key(facet))\ - end\ - do\ - local _with_1 = select({\ - onchange = onchange\ - })\ - _with_1:append(option('(none)', {\ - value = '',\ - disabled = true,\ - selected = not value\ - }))\ - if fileder then\ - for value in pairs(fileder.facet_keys) do\ - _with_1:append(option(value, {\ - value = value,\ - selected = value == current\ - }))\ - end\ - end\ - return _with_1\ - end\ - end),\ - div({\ - style = {\ - flex = '1'\ - }\ - })\ - }))\ - _with_0:append((function()\ - do\ - local _with_1 = div({\ - class = self.inspect_err:map(function(e)\ - if e then\ - return 'error-wrap'\ - else\ - return 'error-wrap empty'\ - end\ - end)\ - })\ - _with_1:append(span(\"an error occured while rendering this view:\"))\ - _with_1:append(self.inspect_err)\ - return _with_1\ - end\ - end)())\ - _with_0:append((function()\ - do\ - local _with_1 = pre({\ - class = 'content'\ - })\ - _with_1:append(keep(self.inspect_prop:map(function(prop, old)\ - return self:get_content(prop, self.inspect_err, function(fileder, facet)\ - local value, key = fileder:get(facet)\ - assert(key, \"couldn't @get \" .. tostring(facet))\ - local conversions = get_conversions(fileder, 'mmm/dom', key.type, get_casts())\ - assert(conversions, \"cannot cast '\" .. tostring(key.type) .. \"'\")\ - return apply_conversions(fileder, conversions, value, facet)\ - end)\ - end)))\ - return _with_1\ - end\ - end)())\ - _with_0:append(nav({\ - class = 'thing',\ - span('children'),\ - button('add', {\ - onclick = function(_, e)\ - local name = window:prompt(\"please enter the name of the child fileder:\", 'unnamed_fileder')\ - if not name or name == '' or name == js.null then\ - return \ - end\ - local child = self.fileder:get():add_child(name)\ - return self:refresh(true)\ - end\ - })\ - }))\ - _with_0:append(self.fileder:map(function(fileder)\ - do\ - local _with_1 = div({\ - class = 'children'\ - })\ - local num = #fileder.children\ - for i, child in ipairs(fileder.children) do\ - local name = child:gett('name: alpha')\ - _with_1:append(div({\ - style = {\ - display = 'flex',\ - ['justify-content'] = 'space-between'\ - },\ - span('- ', (link_to(child, code(name))), {\ - style = {\ - flex = 1\ - }\ - })\ - }))\ - end\ - return _with_1\ - end\ - end))\ - return _with_0\ - end\ - end,\ - navigate = function(self, new)\ - return self.path:set(new)\ - end,\ - todom = function(self)\ - return tohtml(self)\ - end\ - }\ - _base_0.__index = _base_0\ - _class_0 = setmetatable({\ - __init = function(self, root, path, facet, rehydrate)\ - if rehydrate == nil then\ - rehydrate = false\ - end\ - self.root = root\ - BROWSER = self\ - assert(self.root, 'root fileder is nil')\ - self.path = ReactiveVar(path or '')\ - self.fileder = self.path:map((function()\ - local _base_1 = self.root\ - local _fn_0 = _base_1.walk\ - return function(...)\ - return _fn_0(_base_1, ...)\ - end\ - end)())\ - self.facet = ReactiveVar(Key(facet, 'mmm/dom'))\ - if MODE == 'CLIENT' then\ - self.fileder:subscribe(function(fileder)\ - if not (fileder) then\ - return \ - end\ - local last = self.facet and self.facet:get()\ - return self.facet:set(Key((function()\ - if last then\ - return last.type\ - else\ - return 'mmm/dom'\ - end\ - end)()))\ - end)\ - end\ - if MODE == 'CLIENT' then\ - local logo = document:querySelector('header h1 > a > svg')\ - local spin\ - spin = function()\ - logo.classList:add('spin')\ - local _ = logo.parentElement.offsetWidth\ - return logo.classList:remove('spin')\ - end\ - self.facet:subscribe(function(facet)\ - document.body.classList:add('loading')\ - spin()\ - if self.skip then\ - return \ - end\ - path = self.path:get()\ - local state = js.global:eval('new Object()')\ - state.path = path\ - state.name = facet.name\ - state.type = facet.type\ - return window.history:pushState(state, '', tostring(path) .. \"/\" .. tostring((Key(facet.name, 'text/html+interactive')):tostring(true)))\ - end)\ - window.onpopstate = function(_, event)\ - local state = event.state\ - if state ~= js.null then\ - self.skip = true\ - self.path:set(state.path)\ - self.facet:set(Key(state.name, state.type))\ - self.skip = nil\ - end\ - end\ - end\ - self.inspect = ReactiveVar((MODE == 'CLIENT' and window.location.hash == '#inspect'))\ - local main = get_or_create('div', 'browser-root', {\ - class = 'main view'\ - })\ - if MODE == 'SERVER' then\ - main:append(nav({\ - id = 'browser-navbar',\ - span('please stand by... interactivity loading :)')\ - }))\ - else\ - main:prepend((function()\ - do\ - local _with_0 = get_or_create('nav', 'browser-navbar')\ - _with_0.node.innerHTML = ''\ - _with_0:append(span('path: ', self.path:map(function(path)\ - do\ - local _with_1 = div({\ - class = 'path',\ - style = {\ - display = 'inline-block'\ - }\ - })\ - local path_segment\ - path_segment = function(name, href)\ - return a(name, {\ - href = tostring(href) .. \"/\",\ - onclick = function(_, e)\ - e:preventDefault()\ - return self:navigate(href)\ - end\ - })\ - end\ - local href = ''\ - path = path:match('^/(.*)')\ - _with_1:append(path_segment('root', ''))\ - while path do\ - local name, rest = path:match('^([%w%-_%.]+)/(.*)')\ - if not name then\ - name = path\ - end\ - path = rest\ - href = tostring(href) .. \"/\" .. tostring(name)\ - _with_1:append('/')\ - _with_1:append(path_segment(name, href))\ - end\ - return _with_1\ - end\ - end)))\ - _with_0:append(span('view facet:', {\ - style = {\ - ['margin-right'] = '0'\ - }\ - }))\ - _with_0:append(self.fileder:map(function(fileder)\ - local onchange\ - onchange = function(_, e)\ - local type\ - type = self.facet:get().type\ - return self.facet:set(Key({\ - name = e.target.value,\ - type = type\ - }))\ - end\ - local current = self.facet:get()\ - current = current and current.name\ - do\ - local _with_1 = elements.select({\ - onchange = onchange,\ - disabled = not fileder,\ - value = self.facet:map(function(f)\ - return f and f.name\ - end)\ - })\ - local has_main = fileder and fileder:has_facet('')\ - _with_1:append(option('(main)', {\ - value = '',\ - disabled = not has_main,\ - selected = current == ''\ - }))\ - if fileder then\ - for i, value in ipairs(fileder:get_facets()) do\ - local _continue_0 = false\ - repeat\ - if value == '' then\ - _continue_0 = true\ - break\ - end\ - _with_1:append(option(value, {\ - value = value,\ - selected = value == current\ - }))\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - end\ - return _with_1\ - end\ - end))\ - _with_0:append(self.inspect:map(function(enabled)\ - if not enabled then\ - return button('inspect', {\ - onclick = function(_, e)\ - return self.inspect:set(true)\ - end\ - })\ - end\ - end))\ - return _with_0\ - end\ - end)())\ - end\ - self.error = ReactiveVar()\ - main:append((function()\ - do\ - local _with_0 = get_or_create('div', 'browser-error', {\ - class = self.error:map(function(e)\ - if e then\ - return 'error-wrap'\ - else\ - return 'error-wrap empty'\ - end\ - end)\ - })\ - _with_0:append((span(\"an error occured while rendering this view:\")), (rehydrate and _with_0.node.firstChild))\ - _with_0:append(self.error)\ - return _with_0\ - end\ - end)())\ - main:append((function()\ - do\ - local _with_0 = get_or_create('div', 'browser-content', {\ - class = 'content'\ - })\ - self.content = ReactiveVar((function()\ - if rehydrate then\ - return _with_0.node.lastChild\ - else\ - return self:get_content(self.facet:get())\ - end\ - end)())\ - _with_0:append(keep(self.content))\ - if MODE == 'CLIENT' then\ - self.facet:subscribe(function(p)\ - return window:setTimeout((function()\ - return self:refresh(p)\ - end), 150)\ - end)\ - end\ - return _with_0\ - end\ - end)())\ - if rehydrate then\ - self.facet:set(self.facet:get())\ - end\ - local inspector = self.inspect:map(function(enabled)\ - if enabled then\ - return self:get_inspector()\ - end\ - end)\ - local wrapper = get_or_create('div', 'browser-wrapper', main, inspector, {\ - class = 'browser'\ - })\ - self.node = wrapper.node\ - do\ - local _base_1 = wrapper\ - local _fn_0 = _base_1.render\ - self.render = function(...)\ - return _fn_0(_base_1, ...)\ - end\ - end\ - end,\ - __base = _base_0,\ - __name = \"Browser\"\ - }, {\ - __index = _base_0,\ - __call = function(cls, ...)\ - local _self_0 = setmetatable({}, _base_0)\ - cls.__init(_self_0, ...)\ - return _self_0\ - end\ - })\ - _base_0.__class = _class_0\ - local self = _class_0\ - err_and_trace = function(msg)\ - return debug.traceback(msg, 2)\ - end\ - default_convert = function(self, key)\ - return self:get(key.name, 'mmm/dom')\ - end\ - default_convert = function(self, key)\ - return self:get(key.name, 'mmm/dom')\ - end\ - Browser = _class_0\ -end\ -return {\ - Browser = Browser\ -}", "mmm/mmmfs/browser.moon"} -p["mmm.mmmfs.meta"] = {"local yield_ancestors\ -do\ - local step\ - step = function(self, path)\ - if '/' ~= path:sub(1, 1) then\ - path = tostring(self.path) .. \"/\" .. tostring(path)\ - end\ - if not (self.path == path:sub(1, #self.path)) then\ - return \ - end\ - if #path == #self.path then\ - return \ - end\ - coroutine.yield(self)\ - local _list_0 = self.children\ - for _index_0 = 1, #_list_0 do\ - local child = _list_0[_index_0]\ - step(child, path)\ - end\ - end\ - yield_ancestors = function(self, path)\ - return coroutine.wrap(function()\ - return step(self, path)\ - end)\ - end\ -end\ -local get_meta\ -get_meta = function(fileder, path)\ - if path then\ - path = \"$mmm/\" .. tostring(path)\ - else\ - path = '$mmm'\ - end\ - local guard_self\ - local max_path = fileder.path\ - do\ - local closest = max_path:match('(.-)/$mmm')\ - if closest then\ - max_path = closest\ - guard_self = true\ - end\ - end\ - assert(fileder.root, \"'\" .. tostring(fileder) .. \"' has no root!\")\ - return coroutine.wrap(function()\ - for ancestor in yield_ancestors(fileder.root, max_path) do\ - local _continue_0 = false\ - repeat\ - if guard_self and ancestor.path == max_path then\ - break\ - end\ - if ancestor == fileder then\ - _continue_0 = true\ - break\ - end\ - do\ - local result = ancestor:walk(path)\ - if result then\ - coroutine.yield(result)\ - end\ - end\ - _continue_0 = true\ - until true\ - if not _continue_0 then\ - break\ - end\ - end\ - do\ - local result = not guard_self and fileder:walk(path)\ - if result then\ - return coroutine.yield(result)\ - end\ - end\ - end)\ -end\ -local get_plugins\ -get_plugins = function(fileder)\ - return coroutine.wrap(function()\ - for plugins in get_meta(fileder, 'plugins') do\ - local _list_0 = plugins.children\ - for _index_0 = 1, #_list_0 do\ - local plugin = _list_0[_index_0]\ - coroutine.yield(plugin)\ - end\ - end\ - end)\ -end\ -return {\ - get_meta = get_meta,\ - get_plugins = get_plugins\ -}", "mmm/mmmfs/meta.moon"} -p["mmm.mmmfs.util"] = {"local refs = require('mmm.refs')\ -local merge\ -merge = function(orig, extra)\ - if orig == nil then\ - orig = { }\ - end\ - if extra == nil then\ - extra = { }\ - end\ - do\ - local attr\ - do\ - local _tbl_0 = { }\ - for k, v in pairs(orig) do\ - _tbl_0[k] = v\ - end\ - attr = _tbl_0\ - end\ - for k, v in pairs(extra) do\ - attr[k] = v\ - end\ - return attr\ - end\ -end\ -local tourl\ -tourl = function(path, facet)\ - path = path .. '/'\ - if STATIC and STATIC.root then\ - path = STATIC.root .. path\ - end\ - if facet then\ - path = path .. facet\ - end\ - return path\ -end\ -return function(elements)\ - local a, div, span, sup, b, pre\ - a, div, span, sup, b, pre = elements.a, elements.div, elements.span, elements.sup, elements.b, elements.pre\ - local find_fileder\ - find_fileder = function(path, origin)\ - if 'string' == type(path) then\ - if path == '' then\ - assert(origin, \"cannot resolve empty path without origin!\")\ - return origin\ - end\ - if '/' ~= path:sub(1, 1) then\ - assert(origin, \"cannot resolve relative path '\" .. tostring(path) .. \"' without origin!\")\ - path = tostring(origin.path) .. \"/\" .. tostring(path)\ - end\ - while path:match('/([^/]-)/%.%./') do\ - path = path:gsub('/([^/]-)/%.%./', '/')\ - end\ - if origin.path == path:sub(1, #origin.path) then\ - return assert((origin:walk(path)), \"couldn't resolve path '\" .. tostring(path) .. \"' from \" .. tostring(origin))\ - else\ - return assert((origin.root:walk(path)), \"couldn't resolve path '\" .. tostring(path) .. \"'\")\ - end\ - else\ - return assert(path, \"no path passed.\")\ - end\ - end\ - local navigate_to\ - navigate_to = function(path, name, opts)\ - if opts == nil then\ - opts = { }\ - end\ - opts.href = tourl(path)\ - if MODE == 'CLIENT' then\ - opts.onclick = function(self, e)\ - e:preventDefault()\ - return BROWSER:navigate(path)\ - end\ - end\ - return a(name, opts)\ - end\ - local link_to\ - link_to = function(fileder, name, origin, attr, facet)\ - fileder = find_fileder(fileder, origin)\ - name = name or fileder:get('title: mmm/dom')\ - name = name or fileder:gett('name: alpha')\ - do\ - local href = fileder:get('link: URL*')\ - if href then\ - return a(name, merge(attr, {\ - href = href,\ - target = '_blank'\ - }))\ - else\ - return a(name, merge(attr, {\ - href = tourl(fileder.path, facet),\ - onclick = (function()\ - if MODE == 'CLIENT' then\ - return function(self, e)\ - e:preventDefault()\ - return BROWSER:navigate(fileder.path)\ - end\ - end\ - end)()\ - }))\ - end\ - end\ - end\ - local interactive_link\ - interactive_link = function(text, view)\ - if view == nil then\ - view = ':text/html+interactive'\ - end\ - assert(MODE == 'SERVER')\ - local path = BROWSER.path\ - if 'table' == type(BROWSER.path) then\ - path = table.concat(path, '/')\ - end\ - return a(text, {\ - href = tourl(path, view)\ - })\ - end\ - local embed\ - embed = function(fileder, facet, origin, opts)\ - if facet == nil then\ - facet = ''\ - end\ - if opts == nil then\ - opts = { }\ - end\ - if opts.raw then\ - warn(\"deprecated option 'raw' set on embed\")\ - assert(not opts.wrap, \"raw and wrap cannot both be set on embed\")\ - opts.wrap = 'raw'\ - end\ - opts.wrap = opts.wrap or 'well'\ - fileder = find_fileder(fileder, origin)\ - local ok, node = pcall(fileder.gett, fileder, facet, 'mmm/dom')\ - if not ok then\ - warn(\"couldn't embed \" .. tostring(fileder) .. \" \" .. tostring(facet) .. \": \" .. tostring(node))\ - return span({\ - class = 'embed',\ - style = {\ - background = 'var(--gray-fail)',\ - padding = '1em'\ - },\ - \"couldn't embed \" .. tostring(fileder) .. \" \" .. tostring(facet),\ - (pre(node))\ - })\ - end\ - local klass = 'embed'\ - if opts.desc then\ - klass = klass .. ' desc'\ - end\ - if opts.inline then\ - klass = klass .. ' inline'\ - end\ - local _exp_0 = opts.wrap\ - if 'raw' == _exp_0 then\ - return node\ - elseif 'well' == _exp_0 then\ - node = span({\ - class = klass,\ - style = opts.style,\ - node,\ - (function()\ - if opts.desc then\ - return div(opts.desc, {\ - class = 'description'\ - })\ - end\ - end)()\ - })\ - if opts.nolink then\ - return node\ - else\ - return link_to(fileder, node, nil, opts.attr, facet)\ - end\ - elseif 'sidenote' == _exp_0 then\ - local key = tostring(refs:get())\ - local id = \"sideref-\" .. tostring(key)\ - local intext = sup(a(key, {\ - href = \"#\" .. tostring(id)\ - }))\ - return span(intext, div({\ - class = 'sidenote',\ - style = opts.style or 'margin-top: -1.25rem;',\ - div({\ - id = id,\ - class = 'hook'\ - }),\ - b(key, {\ - class = 'ref'\ - }),\ - ' ',\ - opts.desc or '',\ - node\ - }))\ - elseif 'marginnote' == _exp_0 then\ - return div({\ - class = 'sidenote',\ - style = opts.style,\ - opts.desc or '',\ - node\ - })\ - else\ - return error(\"unknown embed 'wrap': '\" .. tostring(opts.wrap) .. \"'\")\ - end\ - end\ - return {\ - tourl = tourl,\ - find_fileder = find_fileder,\ - link_to = link_to,\ - interactive_link = interactive_link,\ - navigate_to = navigate_to,\ - embed = embed\ - }\ -end", "mmm/mmmfs/util.moon"} -p["mmm.mmmfs.builtins"] = {"local div, pre, code, img, video, span, source\ -do\ - local _obj_0 = require('mmm.dom')\ - div, pre, code, img, video, span, source = _obj_0.div, _obj_0.pre, _obj_0.code, _obj_0.img, _obj_0.video, _obj_0.span, _obj_0.source\ -end\ -local find_fileder, link_to, embed\ -do\ - local _obj_0 = (require('mmm.mmmfs.util'))(require('mmm.dom'))\ - find_fileder, link_to, embed = _obj_0.find_fileder, _obj_0.link_to, _obj_0.embed\ -end\ -local tohtml\ -tohtml = require('mmm.component').tohtml\ -local js_fix\ -if MODE == 'CLIENT' then\ - js_fix = function(arg)\ - if arg == js.null then\ - return \ - end\ - if arg == '' then\ - return \ - end\ - return arg\ - end\ -end\ -local js_bool\ -if MODE == 'CLIENT' then\ - js_bool = function(arg)\ - if arg == js.null then\ - return nil\ - end\ - if arg == 'false' then\ - return false\ - end\ - return true\ - end\ -end\ -local single\ -single = function(func)\ - return function(self, val)\ - return func(val)\ - end\ -end\ -local loadwith\ -loadwith = function(_load)\ - return function(self, val, fileder, key)\ - local func = assert(_load(val, tostring(fileder) .. \"#\" .. tostring(key)))\ - return func()\ - end\ -end\ -string.yieldable_gsub = function(str, pat, f)\ - str = str:gsub('%%', '%%|')\ - local matches = { }\ - local cnt\ - str, cnt = str:gsub(pat, function(...)\ - table.insert(matches, {\ - ...\ - })\ - return \"%\" .. tostring(#matches)\ - end)\ - for _index_0 = 1, #matches do\ - local match = matches[_index_0]\ - match.replacement = f(table.unpack(match))\ - end\ - str = str:gsub('%%(%d+)', function(i)\ - i = tonumber(i)\ - return matches[i].replacement\ - end)\ - str = str:gsub('%%|', '%%')\ - return str, cnt\ -end\ -local converts = {\ - {\ - inp = 'fn -> (.+)',\ - out = '%1',\ - cost = 1,\ - transform = function(self, val, fileder)\ - return val(fileder)\ - end\ - },\ - {\ - inp = 'mmm/component',\ - out = 'mmm/dom',\ - cost = 3,\ - transform = single(tohtml)\ - },\ - {\ - inp = 'mmm/dom',\ - out = 'text/html+frag',\ - cost = 3,\ - transform = function(self, node)\ - if MODE == 'SERVER' then\ - return node\ - else\ - return node.outerHTML\ - end\ - end\ - },\ - {\ - inp = 'text/html%+frag',\ - out = 'mmm/dom',\ - cost = 0.1,\ - transform = (function()\ - if MODE == 'SERVER' then\ - return function(self, html, fileder)\ - html = html:yieldable_gsub('(.-)', function(attrs, text)\ - if #text == 0 then\ - text = nil\ - end\ - local path, facet = '', ''\ - while attrs and attrs ~= '' do\ - local key, val, _attrs = attrs:match('^(%w+)=\"([^\"]-)\"%s*(.*)')\ - if not key then\ - key, _attrs = attrs:match('^(%w+)%s*(.*)$')\ - val = true\ - end\ - attrs = _attrs\ - local _exp_0 = key\ - if 'path' == _exp_0 then\ - path = val\ - elseif 'facet' == _exp_0 then\ - facet = val\ - else\ - warn(\"unkown attribute '\" .. tostring(key) .. \"=\\\"\" .. tostring(val) .. \"\\\"' in \")\ - end\ - end\ - return link_to(path, text, fileder)\ - end)\ - html = html:yieldable_gsub('(.-)', function(attrs, desc)\ - local path, facet = '', ''\ - local opts = { }\ - if #desc ~= 0 then\ - opts.desc = desc\ - end\ - while attrs and attrs ~= '' do\ - local key, val, _attrs = attrs:match('^(%w+)=\"([^\"]-)\"%s*(.*)')\ - if not key then\ - key, _attrs = attrs:match('^(%w+)%s*(.*)$')\ - val = true\ - end\ - attrs = _attrs\ - local _exp_0 = key\ - if 'path' == _exp_0 then\ - path = val\ - elseif 'facet' == _exp_0 then\ - facet = val\ - elseif 'wrap' == _exp_0 then\ - opts.wrap = val\ - elseif 'style' == _exp_0 then\ - opts.style = val\ - elseif 'nolink' == _exp_0 then\ - opts.nolink = true\ - elseif 'inline' == _exp_0 then\ - opts.inline = true\ - elseif 'raw' == _exp_0 then\ - opts.raw = true\ - else\ - warn(\"unkown attribute '\" .. tostring(key) .. \"=\\\"\" .. tostring(val) .. \"\\\"' in \")\ - end\ - end\ - return embed(path, facet, fileder, opts)\ - end)\ - return html\ - end\ - else\ - return function(self, html, fileder)\ - local parent\ - do\ - local _with_0 = document:createElement('div')\ - _with_0.innerHTML = html\ - local embeds = _with_0:getElementsByTagName('mmm-embed')\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - for i = 0, embeds.length - 1 do\ - _accum_0[_len_0] = embeds[i]\ - _len_0 = _len_0 + 1\ - end\ - embeds = _accum_0\ - end\ - for _index_0 = 1, #embeds do\ - local element = embeds[_index_0]\ - local path = js_fix(element:getAttribute('path'))\ - local facet = js_fix(element:getAttribute('facet'))\ - local wrap = js_fix(element:getAttribute('wrap'))\ - local style = js_fix(element:getAttribute('style'))\ - local nolink = js_bool(element:getAttribute('nolink'))\ - local inline = js_bool(element:getAttribute('inline'))\ - local desc = js_fix(element.innerText)\ - if desc == '' then\ - desc = nil\ - end\ - local raw = js_bool(element:getAttribute('raw'))\ - local opts = {\ - wrap = wrap,\ - style = style,\ - nolink = nolink,\ - inline = inline,\ - desc = desc,\ - raw = raw\ - }\ - element:replaceWith(embed(path or '', facet or '', fileder, opts))\ - end\ - embeds = _with_0:getElementsByTagName('mmm-link')\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - for i = 0, embeds.length - 1 do\ - _accum_0[_len_0] = embeds[i]\ - _len_0 = _len_0 + 1\ - end\ - embeds = _accum_0\ - end\ - for _index_0 = 1, #embeds do\ - local element = embeds[_index_0]\ - local text = js_fix(element.innerText)\ - local path = js_fix(element:getAttribute('path'))\ - element:replaceWith(link_to(path or '', text, fileder))\ - end\ - parent = _with_0\ - end\ - assert(1 == parent.childElementCount, \"text/html with more than one child!\")\ - return parent.firstElementChild\ - end\ - end\ - end)()\ - },\ - {\ - inp = 'mmm/tpl -> (.+)',\ - out = '%1',\ - cost = 1,\ - transform = function(self, source, fileder)\ - return source:yieldable_gsub('{{(.-)}}', function(expr)\ - local path, facet = expr:match('^([%w%-_%./]*)%+(.*)')\ - assert(path, \"couldn't match TPL expression '\" .. tostring(expr) .. \"'\")\ - return (find_fileder(path, fileder)):gett(facet)\ - end)\ - end\ - },\ - {\ - inp = 'time/iso8601-date',\ - out = 'time/unix',\ - cost = 0.5,\ - transform = function(self, val)\ - local year, _, month, day = val:match('^%s*(%d%d%d%d)(%-?)([01]%d)%2([0-3]%d)%s*$')\ - assert(year, \"failed to parse ISO 8601 date: '\" .. tostring(val) .. \"'\")\ - return os.time({\ - year = year,\ - month = month,\ - day = day\ - })\ - end\ - },\ - {\ - inp = 'URL -> image/.+',\ - out = 'mmm/dom',\ - cost = -4,\ - transform = function(self, src, fileder)\ - return img({\ - src = src\ - })\ - end\ - },\ - {\ - inp = 'URL -> video/.+%+gif',\ - out = 'mmm/dom',\ - cost = -4.01,\ - transform = function(self, src)\ - return video((source({\ - src = src\ - })), {\ - controls = 'auto',\ - loop = true,\ - autoplay = true,\ - muted = true\ - })\ - end\ - },\ - {\ - inp = 'URL -> video/.+',\ - out = 'mmm/dom',\ - cost = -4,\ - transform = function(self, src)\ - return video((source({\ - src = src\ - })), {\ - controls = true,\ - loop = true\ - })\ - end\ - },\ - {\ - inp = 'text/plain',\ - out = 'mmm/dom',\ - cost = 2,\ - transform = function(self, val)\ - return span(val)\ - end\ - },\ - {\ - inp = 'alpha',\ - out = 'mmm/dom',\ - cost = 2,\ - transform = single(code)\ - },\ - {\ - inp = 'URL -> (.+)',\ - out = '%1',\ - cost = 4,\ - transform = (function()\ - if MODE == 'CLIENT' then\ - return function(self, uri)\ - local request = js.new(js.global.XMLHttpRequest)\ - request:open('GET', uri, false)\ - request:send(js.null)\ - assert(request.status == 200, \"unexpected status code: \" .. tostring(request.status))\ - return request.responseText\ - end\ - else\ - return function(self, uri)\ - local request = require('http.request')\ - local req = request.new_from_uri(uri)\ - req.headers:upsert('origin', 'null')\ - local headers, stream = assert(req:go(8))\ - return assert(stream:get_body_as_string())\ - end\ - end\ - end)()\ - },\ - {\ - inp = 'table',\ - out = 'mmm/dom',\ - cost = 5,\ - transform = (function()\ - local deep_tostring\ - deep_tostring = function(tbl, space)\ - if space == nil then\ - space = ''\ - end\ - local buf = space .. tostring(tbl)\ - if not ('table' == type(tbl)) then\ - return buf\ - end\ - buf = buf .. ' {\\n'\ - for k, v in pairs(tbl) do\ - buf = buf .. tostring(space) .. \" [\" .. tostring(k) .. \"]: \" .. tostring(deep_tostring(v, space .. ' ')) .. \"\\n\"\ - end\ - buf = buf .. tostring(space) .. \"}\"\ - return buf\ - end\ - return function(self, tbl)\ - return pre(code(deep_tostring(tbl)))\ - end\ - end)()\ - }\ -}\ -if STATIC then\ - local extensions = {\ - ['image/jpeg'] = 'jpg',\ - ['image/png'] = 'png',\ - ['image/svg+xml'] = 'svg',\ - ['video/webm'] = 'webm',\ - ['video/mp4'] = 'mp4',\ - ['text/javascript'] = 'js',\ - ['text/css'] = 'css',\ - ['model/gltf-binary'] = 'glb'\ - }\ - table.insert(converts, {\ - inp = '(.+)',\ - out = 'URL -> %1',\ - cost = 5,\ - transform = function(self, val, fileder, key)\ - local escaped_from = self.from:gsub('/', '_')\ - do\ - local ext = extensions[self.from]\ - if ext then\ - escaped_from = escaped_from .. \".\" .. tostring(ext)\ - end\ - end\ - local prefix = STATIC.root or ''\ - return prefix .. (function()\ - do\ - local url = tostring(fileder.path) .. \"/\" .. tostring(key.name) .. \":\" .. tostring(escaped_from)\ - print(\" rendering asset \" .. tostring(url))\ - STATIC.spit(url, val)\ - return url\ - end\ - end)()\ - end\ - })\ -else\ - table.insert(converts, {\ - inp = '(.+)',\ - out = 'URL -> %1',\ - cost = 5,\ - transform = function(self, _, fileder, key)\ - return tostring(fileder.path) .. \"/\" .. tostring(key.name) .. \":\" .. tostring(self.from)\ - end\ - })\ -end\ -if MODE == 'CLIENT' or UNSAFE then\ - table.insert(converts, {\ - inp = 'text/lua -> (.+)',\ - out = '%1',\ - cost = 0.5,\ - transform = loadwith(load or loadstring)\ - })\ -end\ -if MODE == 'CLIENT' then\ - table.insert(converts, {\ - inp = 'text/javascript -> (.+)',\ - out = '%1',\ - cost = 1,\ - transform = function(self, source)\ - local f = js.new(window.Function, source)\ - return f()\ - end\ - })\ -end\ -local json_encode\ -json_encode = function(obj)\ - local _exp_0 = type(obj)\ - if 'string' == _exp_0 then\ - return string.format('%q', obj)\ - elseif 'table' == _exp_0 then\ - if obj[1] or not next(obj) then\ - return \"[\" .. tostring(table.concat((function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for _index_0 = 1, #obj do\ - local c = obj[_index_0]\ - _accum_0[_len_0] = json_encode(c)\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)(), ',')) .. \"]\"\ - else\ - return \"{\" .. tostring(table.concat((function()\ - local _accum_0 = { }\ - local _len_0 = 1\ - for k, v in pairs(obj) do\ - _accum_0[_len_0] = tostring(json_encode(k)) .. \": \" .. tostring(json_encode(v))\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - end)(), ', ')) .. \"}\"\ - end\ - elseif 'number' == _exp_0 then\ - return tostring(obj)\ - elseif 'boolean' == _exp_0 then\ - return tostring(obj)\ - elseif 'nil' == _exp_0 then\ - return 'null'\ - else\ - return error(\"unknown type '\" .. tostring(type(obj)) .. \"'\")\ - end\ -end\ -local json_decode\ -if MODE == 'CLIENT' then\ - local Array, Object, JSON\ - do\ - local _obj_0 = js.global\ - Array, Object, JSON = _obj_0.Array, _obj_0.Object, _obj_0.JSON\ - end\ - local fix\ - fix = function(val)\ - local _exp_0 = type(val)\ - if 'userdata' == _exp_0 then\ - if Array:isArray(val) then\ - local _accum_0 = { }\ - local _len_0 = 1\ - for x in js.of(val) do\ - _accum_0[_len_0] = fix(x)\ - _len_0 = _len_0 + 1\ - end\ - return _accum_0\ - else\ - local _tbl_0 = { }\ - for e in js.of(Object:entries(val)) do\ - _tbl_0[(fix(e[0]))] = (fix(e[1]))\ - end\ - return _tbl_0\ - end\ - else\ - return val\ - end\ - end\ - json_decode = function(str)\ - return fix(JSON:parse(str))\ - end\ -else\ - do\ - local cjson = require('cjson')\ - if cjson then\ - json_decode = cjson.decode\ - else\ - warn('only partial JSON support, please install cjson')\ - json_decode = nil\ - end\ - end\ -end\ -table.insert(converts, {\ - inp = 'table',\ - out = 'text/json',\ - cost = 2,\ - transform = function(self, val)\ - return json_encode(val)\ - end\ -})\ -if json_decode then\ - table.insert(converts, {\ - inp = 'text/json',\ - out = 'table',\ - cost = 1,\ - transform = function(self, val)\ - return json_decode(val)\ - end\ - })\ -end\ -return {\ - converts = converts\ -}", "mmm/mmmfs/builtins.moon"} -p["mmm"] = {"window = js.global\ -local console\ -document, console = window.document, window.console\ -MODE = 'CLIENT'\ -UNSAFE = true\ -local deep_tostring\ -deep_tostring = function(tbl, space, recur)\ - if space == nil then\ - space = ''\ - end\ - if recur == nil then\ - recur = { }\ - end\ - local buf = space .. tostring(tbl)\ - if not ('table' == (type(tbl)) and not tbl.__tostring and not recur[tbl]) then\ - return buf\ - end\ - recur[tbl] = true\ - buf = buf .. ' {\\n'\ - for k, v in pairs(tbl) do\ - buf = buf .. tostring(space) .. \" [\" .. tostring(k) .. \"]: \" .. tostring(deep_tostring(v, space .. ' ', recur)) .. \"\\n\"\ - end\ - buf = buf .. tostring(space) .. \"}\"\ - return buf\ -end\ -print = function(...)\ - local contents\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - local _list_0 = {\ - ...\ - }\ - for _index_0 = 1, #_list_0 do\ - local v = _list_0[_index_0]\ - _accum_0[_len_0] = deep_tostring(v)\ - _len_0 = _len_0 + 1\ - end\ - contents = _accum_0\ - end\ - return console:log(table.unpack(contents))\ -end\ -warn = function(...)\ - local contents\ - do\ - local _accum_0 = { }\ - local _len_0 = 1\ - local _list_0 = {\ - ...\ - }\ - for _index_0 = 1, #_list_0 do\ - local v = _list_0[_index_0]\ - _accum_0[_len_0] = deep_tostring(v)\ - _len_0 = _len_0 + 1\ - end\ - contents = _accum_0\ - end\ - return console:warn(table.unpack(contents))\ -end\ -package.path = '/?.lua;/?/init.lua'\ -if on_load then\ - for _index_0 = 1, #on_load do\ - local f = on_load[_index_0]\ - f()\ - end\ -end\ -on_load = setmetatable({ }, {\ - __newindex = function(t, k, v)\ - rawset(t, k, v)\ - return v()\ - end\ -})", "mmm/init.client.moon"} -- cgit v1.2.3