neovim

Personal neovim configuration files
git clone git://gtms.dev/neovim
Log | Files | Refs

package.lua (2579B)


      1 local M = {}
      2 
      3 local function readfile(path)
      4   local file = io.open(path, 'rb')
      5   if not file then
      6     return nil
      7   end
      8   local content = file:read('*a')
      9   file:close()
     10   return content
     11 end
     12 
     13 function M.config_path()
     14   return vim.fn.getcwd() .. '/.dart_tool/package_config.json'
     15 end
     16 
     17 function M.config()
     18   local config_path = M.config_path()
     19   if vim.fn.filereadable(config_path) == 1 then
     20     local content = readfile(config_path)
     21     local json = vim.fn.json_decode(content)
     22     if not json or not json.packages then
     23       return nil
     24     end
     25     return json
     26   end
     27   -- vim.notify('cannot find package_config.json file', vim.log.levels.ERROR)
     28   return nil
     29 end
     30 
     31 function M.packages()
     32   local config = M.config()
     33   if not config then
     34     return nil
     35   end
     36 
     37   if config.configVersion ~= 2 then
     38     -- vim.notify('unsupported version of package_config.json', vim.log.levels.ERROR)
     39     return nil
     40   end
     41 
     42   local dart_tool_dir = vim.fs.dirname(M.config_path())
     43 
     44   local packages_map = {}
     45   for _, package in pairs(config.packages) do
     46     local uri = package.rootUri
     47     local package_uri = package.packageUri
     48     local lib_dir, root_dir
     49     if string.find(uri, '^file:/') then
     50       uri = string.gsub(uri, '^file://', '', 1)
     51       root_dir = vim.fn.resolve(uri)
     52       lib_dir = vim.fn.resolve(root_dir .. '/' .. package_uri)
     53     else
     54       root_dir = vim.fn.resolve(dart_tool_dir .. '/' .. uri)
     55       lib_dir = vim.fn.resolve(root_dir .. '/' .. package_uri)
     56     end
     57 
     58     packages_map[package.name] = { root = root_dir, lib = lib_dir }
     59   end
     60 
     61   return packages_map
     62 end
     63 
     64 function M.package_name()
     65   local file = io.open('pubspec.yaml', 'r')
     66   if not file then
     67     return nil
     68   end
     69   local firstLine = file:read('*l')
     70   file:close()
     71   local name = string.match(firstLine, 'name: (.*)')
     72   if not name then
     73     return nil
     74   end
     75   return name
     76 end
     77 
     78 function M.package_path(uri)
     79   if not string.find(uri, 'package:') then
     80     return nil
     81   end
     82 
     83   local package_name = string.match(uri, '^package:([^/.]+)/.*')
     84   if not package_name then
     85     return nil
     86   end
     87 
     88   local packages = M.packages()
     89   if not packages then
     90     return nil
     91   end
     92 
     93   local package_paths = packages[package_name]
     94   if not package_paths then
     95     -- vim.print('no package mapping for ' .. package_name)
     96     return nil
     97   end
     98   local package_lib = package_paths.lib
     99 
    100   -- HACK localhost%25 - wtf?
    101   package_lib = string.gsub(package_lib, 'localhost%%25', 'localhost%%')
    102 
    103   local package_lib_escaped = string.gsub(package_lib, '%%', '%%%%')
    104   return string.gsub(uri, 'package:' .. package_name, package_lib_escaped)
    105 end
    106 
    107 return M;