luapack/plug/lua.lua
2022-05-04 04:48:42 +03:00

108 lines
2.3 KiB
Lua

lp.insPath {
'?.lua',
'?/init.lua',
}
local env = {
name = lp.name,
ver = lp.version,
copy = lp.copyright,
cache = '_c_',
req = '_r_',
mreq = '_m_', -- require by map
mtemp = ' function($req) -- $file\n$src\n end, -- $file\n',
pre = '--[=[=]=]',
regex = '([^\n]-)' .. 'require%s*%(?["\'](.-)["\']%)?%s*',
}
env.require = lp.strf('$req(%d)', env)
local base = lp.strf([[
$pre -- $name $ver
$pre -- $copy
$pre (function(m)
$pre -- Module cache
$pre local $cache = {}
%s$pre
$pre -- Load main module
$pre $require
$pre
$pre end) {
%s
$pre }
]], env)
local main = lp.strf([[
$pre
$pre -- Require function
$pre local function $req(i)
$pre -- Check in cache
$pre local c = $cache[i]
$pre if not c then
$pre -- Execute module function
$pre c = m[i]($req)
$pre
$pre -- And put it to cache
$pre $cache[i] = c
$pre end
$pre
$pre -- Return cached returned value
$pre return c
$pre end
]], env)
local mreq = lp.strf([[
$pre
$pre -- Require by map
$pre local function $mreq(m, r)
$pre -- Check if module exists
$pre if not m[r]
$pre then error('Cannot find module "'..r..'"')
$pre end
$pre
$pre -- Using default require
$pre return $req(m[r])
$pre end
]], env)
return function(op)
return {
name = 'Base Lua plugin',
load = function(e, ext, oext)
if ext == 'lua'
then return true -- load every lua file
end
end,
deps = function(e, opts)
return e.src:gsub(env.regex, function(bef, name)
name = name:gsub('%.', '/') -- lua.lua => lua/lua
if bef:match '%-%-'
then return '' end -- under comment
local d = lp.get(name, e, opts)
if d then
return bef.. env.require:format(d.i)
end
end)
end,
transform = function(e, opts)
if not e.entry then return end -- change only entry files
if e.reqs > 0 then
local m = ''
for i = 1, #opts.ext do
local v = opts.ext[opts.ext[i]] -- [i] => [file] => object
m = m.. lp.strf(lp.strf(env.mtemp, env), v)
end
return base:format(main, opts.ext[e.file].i, m)
end
end,
postbuild = function(e, opts)
local f, err = load(e.src, 'lint')
if err then
print(e.src)
error(err)
end
end,
}
end