diff options
| author | awy <awy@awy.one> | 2025-10-20 20:55:26 +0300 | 
|---|---|---|
| committer | awy <awy@awy.one> | 2025-10-20 20:55:26 +0300 | 
| commit | 662dafc52b2c8a9426bb2197ab9246a8cda318e4 (patch) | |
| tree | f9d1f20e3864360bf941fd6bc02848ed77b037a8 /.config/nvim/lsp/angularls.lua | |
| parent | 8131d9f2898b991a2d2c7a2ac601ce9e07cc9c9f (diff) | |
| download | hyprdots-662dafc52b2c8a9426bb2197ab9246a8cda318e4.tar.gz | |
nvqw
Diffstat (limited to '.config/nvim/lsp/angularls.lua')
| -rw-r--r-- | .config/nvim/lsp/angularls.lua | 85 | 
1 files changed, 85 insertions, 0 deletions
diff --git a/.config/nvim/lsp/angularls.lua b/.config/nvim/lsp/angularls.lua new file mode 100644 index 0000000..80b9d11 --- /dev/null +++ b/.config/nvim/lsp/angularls.lua @@ -0,0 +1,85 @@ +---@brief +--- +--- https://github.com/angular/vscode-ng-language-service +--- `angular-language-server` can be installed via npm `npm install -g @angular/language-server`. +--- +--- ```lua +--- local project_library_path = "/path/to/project/lib" +--- local cmd = {"ngserver", "--stdio", "--tsProbeLocations", project_library_path , "--ngProbeLocations", project_library_path} +--- +--- vim.lsp.config('angularls', { +---   cmd = cmd, +--- }) +--- ``` + +-- Angular requires a node_modules directory to probe for @angular/language-service and typescript +-- in order to use your projects configured versions. +local root_dir = vim.fn.getcwd() +local node_modules_dir = vim.fs.find('node_modules', { path = root_dir, upward = true })[1] +local project_root = node_modules_dir and vim.fs.dirname(node_modules_dir) or '?' + +local function get_probe_dir() +  return project_root and (project_root .. '/node_modules') or '' +end + +local function get_angular_core_version() +  if not project_root then +    return '' +  end + +  local package_json = project_root .. '/package.json' +  if not vim.uv.fs_stat(package_json) then +    return '' +  end + +  local contents = io.open(package_json):read '*a' +  local json = vim.json.decode(contents) +  if not json.dependencies then +    return '' +  end + +  local angular_core_version = json.dependencies['@angular/core'] + +  angular_core_version = angular_core_version and angular_core_version:match('%d+%.%d+%.%d+') + +  return angular_core_version +end + +local default_probe_dir = get_probe_dir() +local default_angular_core_version = get_angular_core_version() + +-- structure should be like +-- - $EXTENSION_PATH +--   - @angular +--     - language-server +--       - bin +--         - ngserver +--   - typescript +local ngserver_exe = vim.fn.exepath('ngserver') +local ngserver_path = #(ngserver_exe or '') > 0 and vim.fs.dirname(vim.uv.fs_realpath(ngserver_exe)) or '?' +local extension_path = vim.fs.normalize(vim.fs.joinpath(ngserver_path, '../../../')) + +-- angularls will get module by `require.resolve(PROBE_PATH, MODULE_NAME)` of nodejs +local ts_probe_dirs = vim.iter({ extension_path, default_probe_dir }):join(',') +local ng_probe_dirs = vim +  .iter({ extension_path, default_probe_dir }) +  :map(function(p) +    return vim.fs.joinpath(p, '/@angular/language-server/node_modules') +  end) +  :join(',') + +---@type vim.lsp.Config +return { +  cmd = { +    'ngserver', +    '--stdio', +    '--tsProbeLocations', +    ts_probe_dirs, +    '--ngProbeLocations', +    ng_probe_dirs, +    '--angularCoreVersion', +    default_angular_core_version, +  }, +  filetypes = { 'typescript', 'html', 'typescriptreact', 'typescript.tsx', 'htmlangular' }, +  root_markers = { 'angular.json', 'nx.json' }, +}  |