diff --git a/lua/projects.lua b/lua/projects.lua index 417fb1c..b1ec823 100644 --- a/lua/projects.lua +++ b/lua/projects.lua @@ -41,12 +41,11 @@ local PROJECTS = { -- end, { desc = 'Open the dump-server window' }) map( - 'psl', + 'pl', ':cexpr system("cd server && vendor/bin/phpstan analyse --no-progress --error-format=raw --memory-limit=2G -vv") ', { desc = 'Run lint' } ) - map('pcl', ':cexpr system("cd client && tsc --allowJs --removeComments --noEmit") ', { desc = 'Run lint' }) - map('db', function() + map('pd', function() helpers.open_term { cmd = 'lazysql mysql://root@localhost:3306/runcats' } end, { desc = 'Open database manager' }) map('E', ':e .env', { desc = 'Edit .env file' }) @@ -58,7 +57,6 @@ local PROJECTS = { map('cmp ', '!cd server && composer ', { desc = 'Run composer script' }, 'c') map('yrn ', '!cd client && yarn ', { desc = 'Run yarn script' }, 'c') map('ts ', '!cd server && php artisan typescript:transform --format', { desc = 'Compile typescript' }, 'c') - map('pl', ':cexpr system("vendor/bin/phpstan analyse --no-progress --error-format=raw --memory-limit=2G -vv") ', { desc = 'Run lint' }) + map('pd', function() + helpers.open_term { cmd = 'lazysql pgsql://homestead:password@localhost:5432/homestead' } + end, { desc = 'Open database manager' }) + map('E', ':e .env', { desc = 'Edit .env file' }) + map('s ', '!vendor/bin/sail ', { desc = 'Run sail command' }, 'c') + map('art ', '!php artisan ', { desc = 'Run artisan command' }, 'c') + map('sart ', '!vendor/bin/sail artisan ', { desc = 'Run artisan command with sail' }, 'c') + map('cmp ', '!composer ', { desc = 'Run composer script' }, 'c') + map('yrn ', '!cd frontend && yarn ', { desc = 'Run yarn script' }, 'c') + end, + default = function() end, } diff --git a/lua/snippets/php.lua b/lua/snippets/php.lua index e98f5bd..346f496 100644 --- a/lua/snippets/php.lua +++ b/lua/snippets/php.lua @@ -4,34 +4,43 @@ local t = ls.text_node local i = ls.insert_node local f = ls.function_node -local function get_psr4_root(path) - -- local dir = vim.fs.dirname(path) - -- while dir ~= '/' and dir ~= nil do - -- local composer_json_path = dir .. '/composer.json' - -- if vim.fn.filereadable(composer_json_path) == 1 then - -- break - -- end - -- dir = vim.fs.dirname(dir) - -- end - local handle = io.popen [[php -r "echo array_keys(json_decode(file_get_contents('composer.json'), true)['autoload']['psr-4'])[0];"]] - local ns_root = handle and handle:read '*a' or '' - if handle then - handle:close() - end - ns_root = ns_root:gsub('\\$', '') -- Remove trailing backslash - return ns_root -end - -local function psr_namespace(args, snip) +local function psr_namespace(_, snip) local path = snip.env.TM_FILENAME_FULL or '' - local composer_root = get_psr4_root() - -- Find the directory mapped by composer.json - local root_dir = composer_root:gsub('\\', '/') - local ns = path:match(root_dir .. '/(.*)/[^/]+%.php$') - if ns then - return composer_root .. '\\' .. ns:gsub('/', '\\') - else - return composer_root ~= '' and composer_root or 'App' + -- Get the directory of the path + local dir = vim.fs.dirname(path) + -- Loop through parent directories to find composer.json + while dir ~= '/' and dir ~= nil do + local composer_json_path = dir .. '/composer.json' + if vim.fn.filereadable(composer_json_path) == 1 then + break + end + dir = vim.fs.dirname(dir) + end + -- If no composer.json found, return empty string + if dir == '/' or dir == nil then + return '' + end + + -- Decode composer.json and get PSR-4 autoload mappings + local composer = vim.json.decode(vim.iter(vim.fn.readfile(dir .. '/composer.json')):join '') + local psr4 = composer['autoload'] and composer['autoload']['psr-4'] + + -- If no PSR-4 mappings, return empty string + if not psr4 then + return '' + end + + -- Get the relative path from the composer.json directory + local relative_path = path:sub(#dir + 2) + -- Loop through PSR-4 mappings + for namespace, map in pairs(psr4) do + -- Check if the relative path matches the mapping + if relative_path:match('^' .. map:gsub('/', '%%/')) then + -- Extract the suffix of the path after the mapping, removing the filename + local suffix = relative_path:sub(#map + 2):match('^(.*)/[^/]+%.php$') or '' + local trimmed = namespace:gsub('\\$', '') + return trimmed .. (suffix ~= '' and ('\\' .. suffix:gsub('/', '\\')) or '') + end end end