mirror of
https://github.com/Myzel394/config-lsp.git
synced 2025-06-18 23:15:26 +02:00
merge main
This commit is contained in:
commit
1f6ecaff90
58
.github/workflows/release-nightly.yaml
vendored
58
.github/workflows/release-nightly.yaml
vendored
@ -1,58 +0,0 @@
|
|||||||
name: Build nightly release
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [ published ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Check git version matches flake version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if ! [ $(echo '${{ github.ref }}' | cut -d'v' -f 2) = $(grep '# CI:CD-VERSION$' flake.nix | cut -d'"' -f 2) ];
|
|
||||||
then
|
|
||||||
echo "Version mismatch between Git and flake"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Check version in code matches flake version
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if ! [ $(grep '// CI:CD-VERSION$' server/root-handler/handler.go | cut -d'"' -f 2) = $(grep '# CI:CD-VERSION$' flake.nix | cut -d'"' -f 2) ];
|
|
||||||
then
|
|
||||||
echo "Version mismatch between code and flake"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- uses: cachix/install-nix-action@v27
|
|
||||||
with:
|
|
||||||
github_access_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: Check Flake
|
|
||||||
run: nix flake check
|
|
||||||
|
|
||||||
- name: Set up Go
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: stable
|
|
||||||
|
|
||||||
- name: Run GoReleaser
|
|
||||||
uses: goreleaser/goreleaser-action@v6
|
|
||||||
with:
|
|
||||||
distribution: goreleaser
|
|
||||||
version: "~> v2"
|
|
||||||
args: release --clean
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_CONFIGLSP_TOKEN }}
|
|
||||||
|
|
135
.github/workflows/release.yaml
vendored
Normal file
135
.github/workflows/release.yaml
vendored
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
name: build and release
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [ published ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-server:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Check git version matches flake version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if ! [ $(echo '${{ github.ref }}' | cut -d'v' -f 2) = $(grep '# CI:CD-VERSION$' flake.nix | cut -d'"' -f 2) ];
|
||||||
|
then
|
||||||
|
echo "Version mismatch between Git and flake"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check version in code matches flake version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if ! [ $(grep '// CI:CD-VERSION$' server/root-handler/common.go | cut -d'"' -f 2) = $(grep '# CI:CD-VERSION$' flake.nix | cut -d'"' -f 2) ];
|
||||||
|
then
|
||||||
|
echo "Version mismatch between code and flake"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Check vs code package.json version matches flake version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if ! [ $(grep '"version": "' vs-code-extension/package.json | cut -d'"' -f 4) = $(grep '# CI:CD-VERSION$' flake.nix | cut -d'"' -f 2) ];
|
||||||
|
then
|
||||||
|
echo "Version mismatch between vs code package.json and flake"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: stable
|
||||||
|
|
||||||
|
- name: Run GoReleaser
|
||||||
|
uses: goreleaser/goreleaser-action@v6
|
||||||
|
with:
|
||||||
|
distribution: goreleaser
|
||||||
|
version: "~> v2"
|
||||||
|
args: release --clean
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GH_CONFIGLSP_TOKEN }}
|
||||||
|
|
||||||
|
build-extension:
|
||||||
|
name: Build extension for ${{ matrix.target }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
# Wait for server to build so that we know the checks have passed
|
||||||
|
- build-server
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- goos: linux
|
||||||
|
goarch: amd64
|
||||||
|
vscode_target: linux-x64
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm64
|
||||||
|
vscode_target: linux-arm64
|
||||||
|
|
||||||
|
- goos: darwin
|
||||||
|
goarch: amd64
|
||||||
|
vscode_target: darwin-x64
|
||||||
|
- goos: darwin
|
||||||
|
goarch: arm64
|
||||||
|
vscode_target: darwin-arm64
|
||||||
|
|
||||||
|
- goos: windows
|
||||||
|
goarch: amd64
|
||||||
|
vscode_target: win32-x64
|
||||||
|
- goos: windows
|
||||||
|
goarch: arm64
|
||||||
|
vscode_target: win32-arm64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- uses: cachix/install-nix-action@v27
|
||||||
|
with:
|
||||||
|
github_access_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: stable
|
||||||
|
|
||||||
|
- name: Create bare extension
|
||||||
|
run: nix build .#"vs-code-extension-bare"
|
||||||
|
|
||||||
|
- name: Build extension
|
||||||
|
run: cd server && GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -a -gcflags=all="-l -B" -ldflags="-s -w" -o config-lsp
|
||||||
|
|
||||||
|
- name: Prepare folder
|
||||||
|
run: cp -rL result dist && chmod -R 777 dist
|
||||||
|
|
||||||
|
- name: Move binary to extension
|
||||||
|
run: mv server/config-lsp dist/out/
|
||||||
|
|
||||||
|
- name: Shrink binary
|
||||||
|
if: ${{ matrix.goos == 'linux' }}
|
||||||
|
run: nix develop .#"vs-code-extension" --command bash -c "upx dist/out/config-lsp"
|
||||||
|
|
||||||
|
- name: Package extension
|
||||||
|
run: nix develop .#"vs-code-extension" --command bash -c "cd dist && vsce package --target ${{ matrix.vscode_target }}"
|
||||||
|
|
||||||
|
- name: Move vsix to root
|
||||||
|
run: mv dist/*.vsix .
|
||||||
|
|
||||||
|
- uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
files: '*.vsix'
|
||||||
|
|
||||||
|
- name: Upload extension to VS Code Marketplace
|
||||||
|
run: nix develop .#"vs-code-extension" --command bash -c "vsce publish --packagePath *.vsix -p ${{ secrets.VSCE_PAT }}"
|
||||||
|
|
0
LICENSE.md
Normal file
0
LICENSE.md
Normal file
55
README.md
55
README.md
@ -8,7 +8,7 @@ A language server for configuration files. The goal is to make editing config fi
|
|||||||
|-------------|-------------|--------------|---------|---------------|--------------|----------|------------------|
|
|-------------|-------------|--------------|---------|---------------|--------------|----------|------------------|
|
||||||
| aliases | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| aliases | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| fstab | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | 🟡 |
|
| fstab | ✅ | ✅ | ✅ | ❓ | ❓ | ❓ | 🟡 |
|
||||||
| hosts | ✅ | ✅ | ✅ | ✅ | ❓ | ❓ | 🟡 |
|
| hosts | ✅ | ✅ | ✅ | ✅ | ❓ | ❓ | ✅ |
|
||||||
| ssh_config | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| ssh_config | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| sshd_config | ✅ | ✅ | ✅ | ❓ | ✅ | ❓ | ✅ |
|
| sshd_config | ✅ | ✅ | ✅ | ❓ | ✅ | ❓ | ✅ |
|
||||||
| wireguard | ✅ | ✅ | ✅ | ✅ | ❓ | ❓ | 🟡 |
|
| wireguard | ✅ | ✅ | ✅ | ✅ | ❓ | ❓ | 🟡 |
|
||||||
@ -28,11 +28,52 @@ You are welcome to request any config file, as far as it's fairly well known.
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
|
### VS Code Extension
|
||||||
|
|
||||||
|
[Install the extension from the marketplace](https://marketplace.visualstudio.com/items?itemName=myzel394.config-lsp)
|
||||||
|
|
||||||
|
Alternatively, you can also manually install the extension:
|
||||||
|
|
||||||
|
1. Download the latest extension version from the [release page](https://github.com/Myzel394/config-lsp/releases) - You can find the extension under the "assets" section. The filename ends with `.vsix`
|
||||||
|
2. Open VS Code
|
||||||
|
3. Open the extensions sidebar
|
||||||
|
4. In the top bar, click on the three dots and select "Install from VSIX..."
|
||||||
|
5. Select the just downloaded `.vsix` file
|
||||||
|
6. You may need to restart VS Code
|
||||||
|
7. Enjoy!
|
||||||
|
|
||||||
|
### Manual installation
|
||||||
|
|
||||||
|
To use `config-lsp` in any other editor, you'll need to install it manually.
|
||||||
|
Don't worry, it's easy!
|
||||||
|
|
||||||
|
#### Installing the latest Binary
|
||||||
|
|
||||||
|
##### Brew
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install myzel394/formulae/config-lsp
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Manual Binary
|
||||||
|
|
||||||
Download the latest binary from the [releases page](https://github.com/Myzel394/config-lsp/releases) and put it in your PATH.
|
Download the latest binary from the [releases page](https://github.com/Myzel394/config-lsp/releases) and put it in your PATH.
|
||||||
|
|
||||||
Follow the instructions for your editor below.
|
##### Compiling
|
||||||
|
|
||||||
### Neovim installation
|
You can either compile the binary using go:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
go build -o config-lsp
|
||||||
|
```
|
||||||
|
|
||||||
|
or build it using Nix:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
nix flake build
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Neovim installation
|
||||||
|
|
||||||
Using [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) you can add `config-lsp` by adding the following to your `lsp.lua` (filename might differ):
|
Using [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig) you can add `config-lsp` by adding the following to your `lsp.lua` (filename might differ):
|
||||||
|
|
||||||
@ -57,14 +98,6 @@ end
|
|||||||
lspconfig.config_lsp.setup {}
|
lspconfig.config_lsp.setup {}
|
||||||
`````
|
`````
|
||||||
|
|
||||||
### VS Code installation
|
|
||||||
|
|
||||||
The VS Code extension is currently in development. An official extension will be released soon.
|
|
||||||
|
|
||||||
However, at the moment you can also compile the extension yourself and run it in development mode.
|
|
||||||
|
|
||||||
**Do not create an extension and publish it yourself. Contribute to the official extension instead.**
|
|
||||||
|
|
||||||
## Supporting config-lsp
|
## Supporting config-lsp
|
||||||
|
|
||||||
You can either contribute to the project, [see CONTRIBUTING.md](CONTRIBUTING.md), or you can sponsor me via [GitHub Sponsors](https://github.com/sponsors/Myzel394) or via [crypto currencies](https://github.com/Myzel394/contact-me?tab=readme-ov-file#donations).
|
You can either contribute to the project, [see CONTRIBUTING.md](CONTRIBUTING.md), or you can sponsor me via [GitHub Sponsors](https://github.com/sponsors/Myzel394) or via [crypto currencies](https://github.com/Myzel394/contact-me?tab=readme-ov-file#donations).
|
||||||
|
79
flake.nix
79
flake.nix
@ -23,7 +23,7 @@
|
|||||||
"aarch64-windows"
|
"aarch64-windows"
|
||||||
] (system:
|
] (system:
|
||||||
let
|
let
|
||||||
version = "0.1.0"; # CI:CD-VERSION
|
version = "0.1.2"; # CI:CD-VERSION
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
overlays = [
|
overlays = [
|
||||||
@ -37,21 +37,39 @@
|
|||||||
inputs = [
|
inputs = [
|
||||||
pkgs.go_1_22
|
pkgs.go_1_22
|
||||||
];
|
];
|
||||||
server = pkgs.buildGoModule {
|
serverUncompressed = pkgs.buildGoModule {
|
||||||
nativeBuildInputs = inputs;
|
nativeBuildInputs = inputs;
|
||||||
pname = "github.com/Myzel394/config-lsp";
|
pname = "github.com/Myzel394/config-lsp";
|
||||||
version = version;
|
version = version;
|
||||||
src = ./server;
|
src = ./server;
|
||||||
vendorHash = "sha256-s+sjOVvqU20+mbEFKg+RCD+dhScqSatk9eseX2IioPI";
|
vendorHash = "sha256-eO1eY+2XuOCd/dKwgFtu05+bnn/Cv8ZbUIwRjCwJF+U=";
|
||||||
|
ldflags = [ "-s" "-w" ];
|
||||||
checkPhase = ''
|
checkPhase = ''
|
||||||
go test -v $(pwd)/...
|
go test -v $(pwd)/...
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
server = pkgs.stdenv.mkDerivation {
|
||||||
|
name = "config-lsp-${version}";
|
||||||
|
src = serverUncompressed;
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.upx
|
||||||
|
];
|
||||||
|
buildPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp $src/bin/config-lsp $out/bin/
|
||||||
|
chmod +rw $out/bin/config-lsp
|
||||||
|
|
||||||
|
# upx is currently not supported for darwin
|
||||||
|
if [ "${system}" != "x86_64-darwin" ] && [ "${system}" != "aarch64-darwin" ]; then
|
||||||
|
upx --ultra-brute $out/bin/config-lsp
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
packages = {
|
packages = {
|
||||||
default = server;
|
default = server;
|
||||||
"vs-code-extension" = let
|
"vs-code-extension-bare" = let
|
||||||
name = "config-lsp-vs-code-extension";
|
name = "config-lsp";
|
||||||
node-modules = pkgs.mkYarnPackage {
|
node-modules = pkgs.mkYarnPackage {
|
||||||
src = ./vs-code-extension;
|
src = ./vs-code-extension;
|
||||||
name = name;
|
name = name;
|
||||||
@ -60,13 +78,56 @@
|
|||||||
yarnNix = ./vs-code-extension/yarn.nix;
|
yarnNix = ./vs-code-extension/yarn.nix;
|
||||||
|
|
||||||
buildPhase = ''
|
buildPhase = ''
|
||||||
yarn --offline run compile
|
yarn --offline run compile:prod
|
||||||
'';
|
'';
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mv deps/${name}/out $out
|
mkdir -p extension
|
||||||
cp ${server}/bin/config-lsp $out/
|
|
||||||
|
# No idea why this is being created
|
||||||
|
rm deps/${name}/config-lsp
|
||||||
|
|
||||||
|
cp -rL deps/${name}/. extension
|
||||||
|
|
||||||
|
mkdir -p $out
|
||||||
|
cp -r extension/. $out
|
||||||
'';
|
'';
|
||||||
distPhase = "true";
|
distPhase = "true";
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.vsce
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in node-modules;
|
||||||
|
"vs-code-extension" = let
|
||||||
|
name = "config-lsp";
|
||||||
|
node-modules = pkgs.mkYarnPackage {
|
||||||
|
src = ./vs-code-extension;
|
||||||
|
name = name;
|
||||||
|
packageJSON = ./vs-code-extension/package.json;
|
||||||
|
yarnLock = ./vs-code-extension/yarn.lock;
|
||||||
|
yarnNix = ./vs-code-extension/yarn.nix;
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
yarn --offline run compile:prod
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p extension
|
||||||
|
|
||||||
|
# No idea why this is being created
|
||||||
|
rm deps/${name}/config-lsp
|
||||||
|
|
||||||
|
cp -rL deps/${name}/. extension
|
||||||
|
cp ${server}/bin/config-lsp extension/out/config-lsp
|
||||||
|
|
||||||
|
cd extension && ${pkgs.vsce}/bin/vsce package
|
||||||
|
mkdir -p $out
|
||||||
|
cp *.vsix $out
|
||||||
|
'';
|
||||||
|
distPhase = "true";
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
pkgs.vsce
|
||||||
|
];
|
||||||
};
|
};
|
||||||
in node-modules;
|
in node-modules;
|
||||||
};
|
};
|
||||||
@ -82,6 +143,8 @@
|
|||||||
devShells."vs-code-extension" = pkgs.mkShell {
|
devShells."vs-code-extension" = pkgs.mkShell {
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
pkgs.nodejs
|
pkgs.nodejs
|
||||||
|
pkgs.vsce
|
||||||
|
pkgs.yarn2nix
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
roothandler "config-lsp/root-handler"
|
roothandler "config-lsp/root-handler"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/tliron/commonlog"
|
"github.com/tliron/commonlog"
|
||||||
|
|
||||||
@ -11,6 +13,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
if len(os.Args) > 1 && (os.Args[1] == "--version" || os.Args[1] == "version") {
|
||||||
|
fmt.Println(roothandler.Version)
|
||||||
|
|
||||||
|
os.Exit(0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// This increases logging verbosity (optional)
|
// This increases logging verbosity (optional)
|
||||||
commonlog.Configure(1, nil)
|
commonlog.Configure(1, nil)
|
||||||
|
|
||||||
|
5
server/root-handler/common.go
Normal file
5
server/root-handler/common.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package roothandler
|
||||||
|
|
||||||
|
// The comment below at the end of the line is required for the CI:CD to work.
|
||||||
|
// Do not remove it
|
||||||
|
var Version = "0.1.2" // CI:CD-VERSION
|
@ -1,6 +1,8 @@
|
|||||||
package roothandler
|
package roothandler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"config-lsp/root-handler/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
|
||||||
@ -9,32 +11,29 @@ import (
|
|||||||
|
|
||||||
const lsName = "config-lsp"
|
const lsName = "config-lsp"
|
||||||
|
|
||||||
// The comment below at the end of the line is required for the CI:CD to work.
|
|
||||||
// Do not remove it
|
|
||||||
var version = "0.1.0" // CI:CD-VERSION
|
|
||||||
|
|
||||||
var lspHandler protocol.Handler
|
var lspHandler protocol.Handler
|
||||||
|
|
||||||
// The root handler which handles all the LSP requests and then forwards them to the appropriate handler
|
// The root handler which handles all the LSP requests and then forwards them to the appropriate handler
|
||||||
func SetUpRootHandler() {
|
func SetUpRootHandler() {
|
||||||
rootHandler = NewRootHandler()
|
shared.Handler = shared.NewRootHandler()
|
||||||
|
|
||||||
lspHandler = protocol.Handler{
|
lspHandler = protocol.Handler{
|
||||||
Initialize: initialize,
|
Initialize: initialize,
|
||||||
Initialized: initialized,
|
Initialized: initialized,
|
||||||
Shutdown: shutdown,
|
Shutdown: shutdown,
|
||||||
SetTrace: setTrace,
|
SetTrace: setTrace,
|
||||||
TextDocumentDidOpen: TextDocumentDidOpen,
|
TextDocumentDidOpen: lsp.TextDocumentDidOpen,
|
||||||
TextDocumentDidChange: TextDocumentDidChange,
|
TextDocumentDidChange: lsp.TextDocumentDidChange,
|
||||||
TextDocumentCompletion: TextDocumentCompletion,
|
TextDocumentCompletion: lsp.TextDocumentCompletion,
|
||||||
TextDocumentHover: TextDocumentHover,
|
TextDocumentHover: lsp.TextDocumentHover,
|
||||||
TextDocumentDidClose: TextDocumentDidClose,
|
TextDocumentDidClose: lsp.TextDocumentDidClose,
|
||||||
TextDocumentCodeAction: TextDocumentCodeAction,
|
TextDocumentCodeAction: lsp.TextDocumentCodeAction,
|
||||||
TextDocumentDefinition: TextDocumentDefinition,
|
TextDocumentDefinition: lsp.TextDocumentDefinition,
|
||||||
WorkspaceExecuteCommand: WorkspaceExecuteCommand,
|
WorkspaceExecuteCommand: lsp.WorkspaceExecuteCommand,
|
||||||
TextDocumentRename: TextDocumentRename,
|
TextDocumentRename: lsp.TextDocumentRename,
|
||||||
TextDocumentPrepareRename: TextDocumentPrepareRename,
|
TextDocumentPrepareRename: lsp.TextDocumentPrepareRename,
|
||||||
TextDocumentSignatureHelp: TextDocumentSignatureHelp,
|
TextDocumentSignatureHelp: lsp.TextDocumentSignatureHelp,
|
||||||
TextDocumentRangeFormatting: TextDocumentRangeFormattingFunc,
|
TextDocumentRangeFormatting: lsp.TextDocumentRangeFormattingFunc,
|
||||||
}
|
}
|
||||||
|
|
||||||
server := server.NewServer(&lspHandler, lsName, false)
|
server := server.NewServer(&lspHandler, lsName, false)
|
||||||
@ -72,7 +71,7 @@ func initialize(context *glsp.Context, params *protocol.InitializeParams) (any,
|
|||||||
Capabilities: capabilities,
|
Capabilities: capabilities,
|
||||||
ServerInfo: &protocol.InitializeResultServerInfo{
|
ServerInfo: &protocol.InitializeResultServerInfo{
|
||||||
Name: lsName,
|
Name: lsName,
|
||||||
Version: &version,
|
Version: &Version,
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -1,149 +0,0 @@
|
|||||||
package roothandler
|
|
||||||
|
|
||||||
import (
|
|
||||||
"config-lsp/common"
|
|
||||||
"config-lsp/utils"
|
|
||||||
"fmt"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SupportedLanguage string
|
|
||||||
|
|
||||||
const (
|
|
||||||
LanguageSSHConfig SupportedLanguage = "ssh_config"
|
|
||||||
LanguageSSHDConfig SupportedLanguage = "sshd_config"
|
|
||||||
LanguageFstab SupportedLanguage = "fstab"
|
|
||||||
LanguageWireguard SupportedLanguage = "languagewireguard"
|
|
||||||
LanguageHosts SupportedLanguage = "hosts"
|
|
||||||
LanguageAliases SupportedLanguage = "aliases"
|
|
||||||
)
|
|
||||||
|
|
||||||
var AllSupportedLanguages = []string{
|
|
||||||
string(LanguageSSHConfig),
|
|
||||||
string(LanguageSSHDConfig),
|
|
||||||
string(LanguageFstab),
|
|
||||||
string(LanguageWireguard),
|
|
||||||
string(LanguageHosts),
|
|
||||||
string(LanguageAliases),
|
|
||||||
}
|
|
||||||
|
|
||||||
type FatalFileNotReadableError struct {
|
|
||||||
FileURI protocol.DocumentUri
|
|
||||||
Err error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e FatalFileNotReadableError) Error() string {
|
|
||||||
return fmt.Sprintf("Fatal error! config-lsp was unable to read the file (%s); error: %s", e.FileURI, e.Err.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
type UnsupportedLanguageError struct {
|
|
||||||
SuggestedLanguage string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e UnsupportedLanguageError) Error() string {
|
|
||||||
return fmt.Sprintf("Language '%s' is not supported. Choose one of: %s", e.SuggestedLanguage, strings.Join(AllSupportedLanguages, ", "))
|
|
||||||
}
|
|
||||||
|
|
||||||
type LanguageUndetectableError struct{}
|
|
||||||
|
|
||||||
func (e LanguageUndetectableError) Error() string {
|
|
||||||
return "Please add: '#?lsp.language=<language>' to the top of the file. config-lsp was unable to detect the appropriate language for this file."
|
|
||||||
}
|
|
||||||
|
|
||||||
var valueToLanguageMap = map[string]SupportedLanguage{
|
|
||||||
"sshd_config": LanguageSSHDConfig,
|
|
||||||
"sshdconfig": LanguageSSHDConfig,
|
|
||||||
|
|
||||||
"ssh_config": LanguageSSHConfig,
|
|
||||||
"sshconfig": LanguageSSHConfig,
|
|
||||||
|
|
||||||
".ssh/config": LanguageSSHConfig,
|
|
||||||
"~/.ssh/config": LanguageSSHConfig,
|
|
||||||
|
|
||||||
"fstab": LanguageFstab,
|
|
||||||
"etc/fstab": LanguageFstab,
|
|
||||||
|
|
||||||
"wireguard": LanguageWireguard,
|
|
||||||
"wg": LanguageWireguard,
|
|
||||||
"languagewireguard": LanguageWireguard,
|
|
||||||
"host": LanguageHosts,
|
|
||||||
"hosts": LanguageHosts,
|
|
||||||
"etc/hosts": LanguageHosts,
|
|
||||||
|
|
||||||
"aliases": LanguageAliases,
|
|
||||||
"mailaliases": LanguageAliases,
|
|
||||||
"etc/aliases": LanguageAliases,
|
|
||||||
}
|
|
||||||
|
|
||||||
var typeOverwriteRegex = regexp.MustCompile(`#\?\s*lsp\.language\s*=\s*(\w+)\s*`)
|
|
||||||
var wireguardPattern = regexp.MustCompile(`/wg\d+\.conf$`)
|
|
||||||
|
|
||||||
var undetectableError = common.ParseError{
|
|
||||||
Line: 0,
|
|
||||||
Err: LanguageUndetectableError{},
|
|
||||||
}
|
|
||||||
|
|
||||||
func DetectLanguage(
|
|
||||||
content string,
|
|
||||||
advertisedLanguage string,
|
|
||||||
uri protocol.DocumentUri,
|
|
||||||
) (SupportedLanguage, error) {
|
|
||||||
if match := typeOverwriteRegex.FindStringSubmatch(content); match != nil {
|
|
||||||
suggestedLanguage := strings.ToLower(match[1])
|
|
||||||
|
|
||||||
foundLanguage, ok := valueToLanguageMap[suggestedLanguage]
|
|
||||||
|
|
||||||
if ok {
|
|
||||||
return foundLanguage, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
matchIndex := strings.Index(content, match[0])
|
|
||||||
contentUntilMatch := content[:matchIndex]
|
|
||||||
|
|
||||||
return "", common.ParseError{
|
|
||||||
Line: uint32(utils.CountCharacterOccurrences(contentUntilMatch, '\n')),
|
|
||||||
Err: UnsupportedLanguageError{
|
|
||||||
SuggestedLanguage: suggestedLanguage,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if language, ok := valueToLanguageMap[advertisedLanguage]; ok {
|
|
||||||
return language, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
switch uri {
|
|
||||||
case "file:///etc/ssh/sshd_config":
|
|
||||||
fallthrough
|
|
||||||
case "file:///etc/ssh/ssh_config":
|
|
||||||
return LanguageSSHDConfig, nil
|
|
||||||
|
|
||||||
case "file:///etc/fstab":
|
|
||||||
return LanguageFstab, nil
|
|
||||||
|
|
||||||
// Darwin
|
|
||||||
case "file:///private/etc/hosts":
|
|
||||||
fallthrough
|
|
||||||
case "file:///etc/hosts":
|
|
||||||
return LanguageHosts, nil
|
|
||||||
|
|
||||||
// Darwin
|
|
||||||
case "file:///private/etc/aliases":
|
|
||||||
fallthrough
|
|
||||||
case "file:///etc/aliases":
|
|
||||||
return LanguageAliases, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(uri, "file:///etc/wireguard/") || wireguardPattern.MatchString(uri) {
|
|
||||||
return LanguageWireguard, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasSuffix(uri, ".ssh/config") {
|
|
||||||
return LanguageSSHConfig, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return "", undetectableError
|
|
||||||
}
|
|
@ -1,40 +1,36 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
hosts "config-lsp/handlers/hosts/lsp"
|
hosts "config-lsp/handlers/hosts/lsp"
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
wireguard "config-lsp/handlers/wireguard/lsp"
|
wireguard "config-lsp/handlers/wireguard/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
utils "config-lsp/root-handler/utils"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionParams) (any, error) {
|
func TextDocumentCodeAction(context *glsp.Context, params *protocol.CodeActionParams) (any, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return utils.FetchAddLanguageActions(params.TextDocument.URI)
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentCodeAction(context, params)
|
return hosts.TextDocumentCodeAction(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentCodeAction(context, params)
|
return sshconfig.TextDocumentCodeAction(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentCodeAction(context, params)
|
return wireguard.TextDocumentCodeAction(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentCodeAction(context, params)
|
return aliases.TextDocumentCodeAction(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -7,36 +7,30 @@ import (
|
|||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
wireguard "config-lsp/handlers/wireguard/lsp"
|
wireguard "config-lsp/handlers/wireguard/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionParams) (any, error) {
|
func TextDocumentCompletion(context *glsp.Context, params *protocol.CompletionParams) (any, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, nil
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentCompletion(context, params)
|
return fstab.TextDocumentCompletion(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentCompletion(context, params)
|
return sshdconfig.TextDocumentCompletion(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentCompletion(context, params)
|
return sshconfig.TextDocumentCompletion(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentCompletion(context, params)
|
return wireguard.TextDocumentCompletion(context, params)
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentCompletion(context, params)
|
return hosts.TextDocumentCompletion(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentCompletion(context, params)
|
return aliases.TextDocumentCompletion(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,39 +1,35 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/root-handler/utils"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentDefinition(context *glsp.Context, params *protocol.DefinitionParams) (any, error) {
|
func TextDocumentDefinition(context *glsp.Context, params *protocol.DefinitionParams) (any, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, utils.LanguageUndetectableError{}
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentDefinition(context, params)
|
return sshdconfig.TextDocumentDefinition(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentDefinition(context, params)
|
return sshconfig.TextDocumentDefinition(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentDefinition(context, params)
|
return aliases.TextDocumentDefinition(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -7,27 +7,27 @@ import (
|
|||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
wireguard "config-lsp/handlers/wireguard/lsp"
|
wireguard "config-lsp/handlers/wireguard/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeTextDocumentParams) error {
|
func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeTextDocumentParams) error {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
content := params.ContentChanges[0].(protocol.TextDocumentContentChangeEventWhole).Text
|
||||||
content := params.ContentChanges[0].(protocol.TextDocumentContentChangeEventWhole).Text
|
newLanguage, err := initFile(
|
||||||
newLanguage, err := initFile(
|
context,
|
||||||
context,
|
content,
|
||||||
content,
|
params.TextDocument.URI,
|
||||||
params.TextDocument.URI,
|
"",
|
||||||
"",
|
)
|
||||||
)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if newLanguage != language {
|
||||||
language = newLanguage
|
language = newLanguage
|
||||||
|
|
||||||
params := &protocol.DidOpenTextDocumentParams{
|
params := &protocol.DidOpenTextDocumentParams{
|
||||||
@ -40,33 +40,33 @@ func TextDocumentDidChange(context *glsp.Context, params *protocol.DidChangeText
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentDidOpen(context, params)
|
return fstab.TextDocumentDidOpen(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentDidOpen(context, params)
|
return sshdconfig.TextDocumentDidOpen(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentDidOpen(context, params)
|
return sshconfig.TextDocumentDidOpen(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentDidOpen(context, params)
|
return wireguard.TextDocumentDidOpen(context, params)
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentDidOpen(context, params)
|
return hosts.TextDocumentDidOpen(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentDidOpen(context, params)
|
return aliases.TextDocumentDidOpen(context, params)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentDidChange(context, params)
|
return fstab.TextDocumentDidChange(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentDidChange(context, params)
|
return sshdconfig.TextDocumentDidChange(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentDidChange(context, params)
|
return sshconfig.TextDocumentDidChange(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentDidChange(context, params)
|
return wireguard.TextDocumentDidChange(context, params)
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentDidChange(context, params)
|
return hosts.TextDocumentDidChange(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentDidChange(context, params)
|
return aliases.TextDocumentDidChange(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -7,39 +7,34 @@ import (
|
|||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
wireguard "config-lsp/handlers/wireguard/lsp"
|
wireguard "config-lsp/handlers/wireguard/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error {
|
func TextDocumentDidClose(context *glsp.Context, params *protocol.DidCloseTextDocumentParams) error {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(openedFiles, params.TextDocument.URI)
|
delete(shared.OpenedFiles, params.TextDocument.URI)
|
||||||
rootHandler.RemoveDocument(params.TextDocument.URI)
|
delete(shared.LanguagesOverwrites, params.TextDocument.URI)
|
||||||
|
shared.Handler.RemoveDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentDidClose(context, params)
|
return sshdconfig.TextDocumentDidClose(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentDidClose(context, params)
|
return sshconfig.TextDocumentDidClose(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentDidClose(context, params)
|
return fstab.TextDocumentDidClose(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentDidClose(context, params)
|
return wireguard.TextDocumentDidClose(context, params)
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentDidClose(context, params)
|
return hosts.TextDocumentDidClose(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentDidClose(context, params)
|
return aliases.TextDocumentDidClose(context, params)
|
||||||
default:
|
default:
|
||||||
}
|
}
|
@ -1,7 +1,9 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"config-lsp/common"
|
"config-lsp/common"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/root-handler/utils"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -32,60 +34,43 @@ func TextDocumentDidOpen(context *glsp.Context, params *protocol.DidOpenTextDocu
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentDidOpen(context, params)
|
return fstab.TextDocumentDidOpen(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentDidOpen(context, params)
|
return sshdconfig.TextDocumentDidOpen(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentDidOpen(context, params)
|
return sshconfig.TextDocumentDidOpen(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentDidOpen(context, params)
|
return wireguard.TextDocumentDidOpen(context, params)
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentDidOpen(context, params)
|
return hosts.TextDocumentDidOpen(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentDidOpen(context, params)
|
return aliases.TextDocumentDidOpen(context, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
panic(fmt.Sprintf("unexpected roothandler.SupportedLanguage: %#v", language))
|
panic(fmt.Sprintf("unexpected roothandler.SupportedLanguage: %#v", language))
|
||||||
}
|
}
|
||||||
|
|
||||||
func showParseError(
|
|
||||||
context *glsp.Context,
|
|
||||||
uri protocol.DocumentUri,
|
|
||||||
err common.ParseError,
|
|
||||||
) {
|
|
||||||
context.Notify(
|
|
||||||
"window/showMessage",
|
|
||||||
protocol.ShowMessageParams{
|
|
||||||
Type: protocol.MessageTypeError,
|
|
||||||
Message: err.Err.Error(),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func initFile(
|
func initFile(
|
||||||
context *glsp.Context,
|
context *glsp.Context,
|
||||||
content string,
|
content string,
|
||||||
uri protocol.DocumentUri,
|
uri protocol.DocumentUri,
|
||||||
advertisedLanguage string,
|
advertisedLanguage string,
|
||||||
) (*SupportedLanguage, error) {
|
) (*shared.SupportedLanguage, error) {
|
||||||
language, err := DetectLanguage(content, advertisedLanguage, uri)
|
language, err := utils.DetectLanguage(content, advertisedLanguage, uri)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
parseError := err.(common.ParseError)
|
utils.NotifyLanguageUndetectable(context, uri)
|
||||||
showParseError(
|
|
||||||
context,
|
|
||||||
uri,
|
|
||||||
parseError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, parseError.Err
|
return nil, utils.LanguageUndetectableError{}
|
||||||
|
} else {
|
||||||
|
utils.NotifyDetectedLanguage(context, uri, language)
|
||||||
}
|
}
|
||||||
|
|
||||||
openedFiles[uri] = struct{}{}
|
shared.OpenedFiles[uri] = struct{}{}
|
||||||
|
|
||||||
// Everything okay, now we can handle the file
|
// Everything okay, now we can handle the file
|
||||||
rootHandler.AddDocument(uri, language)
|
shared.Handler.AddDocument(uri, language)
|
||||||
|
|
||||||
return &language, nil
|
return &language, nil
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -7,36 +7,30 @@ import (
|
|||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
wireguard "config-lsp/handlers/wireguard/lsp"
|
wireguard "config-lsp/handlers/wireguard/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*protocol.Hover, error) {
|
func TextDocumentHover(context *glsp.Context, params *protocol.HoverParams) (*protocol.Hover, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, nil
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentHover(context, params)
|
return hosts.TextDocumentHover(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentHover(context, params)
|
return sshdconfig.TextDocumentHover(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentHover(context, params)
|
return sshconfig.TextDocumentHover(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentHover(context, params)
|
return fstab.TextDocumentHover(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return wireguard.TextDocumentHover(context, params)
|
return wireguard.TextDocumentHover(context, params)
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentHover(context, params)
|
return aliases.TextDocumentHover(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,10 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/root-handler/utils"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
|
|
||||||
@ -10,30 +12,24 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentPrepareRename(context *glsp.Context, params *protocol.PrepareRenameParams) (any, error) {
|
func TextDocumentPrepareRename(context *glsp.Context, params *protocol.PrepareRenameParams) (any, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, utils.LanguageUndetectableError{}
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentPrepareRename(context, params)
|
return sshconfig.TextDocumentPrepareRename(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentPrepareRename(context, params)
|
return aliases.TextDocumentPrepareRename(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,8 +1,10 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/root-handler/utils"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
@ -12,30 +14,24 @@ func TextDocumentRangeFormattingFunc(
|
|||||||
context *glsp.Context,
|
context *glsp.Context,
|
||||||
params *protocol.DocumentRangeFormattingParams,
|
params *protocol.DocumentRangeFormattingParams,
|
||||||
) ([]protocol.TextEdit, error) {
|
) ([]protocol.TextEdit, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, utils.LanguageUndetectableError{}
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentRangeFormatting(context, params)
|
return sshdconfig.TextDocumentRangeFormatting(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentRangeFormatting(context, params)
|
return sshconfig.TextDocumentRangeFormatting(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
@ -1,38 +1,34 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/root-handler/utils"
|
||||||
|
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentRename(context *glsp.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {
|
func TextDocumentRename(context *glsp.Context, params *protocol.RenameParams) (*protocol.WorkspaceEdit, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, utils.LanguageUndetectableError{}
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentRename(context, params)
|
return sshconfig.TextDocumentRename(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentRename(context, params)
|
return aliases.TextDocumentRename(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
||||||
@ -6,36 +6,30 @@ import (
|
|||||||
hosts "config-lsp/handlers/hosts/lsp"
|
hosts "config-lsp/handlers/hosts/lsp"
|
||||||
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
sshconfig "config-lsp/handlers/ssh_config/lsp"
|
||||||
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
sshdconfig "config-lsp/handlers/sshd_config/lsp"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
"github.com/tliron/glsp"
|
"github.com/tliron/glsp"
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TextDocumentSignatureHelp(context *glsp.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) {
|
func TextDocumentSignatureHelp(context *glsp.Context, params *protocol.SignatureHelpParams) (*protocol.SignatureHelp, error) {
|
||||||
language := rootHandler.GetLanguageForDocument(params.TextDocument.URI)
|
language := shared.Handler.GetLanguageForDocument(params.TextDocument.URI)
|
||||||
|
|
||||||
if language == nil {
|
if language == nil {
|
||||||
showParseError(
|
return nil, nil
|
||||||
context,
|
|
||||||
params.TextDocument.URI,
|
|
||||||
undetectableError,
|
|
||||||
)
|
|
||||||
|
|
||||||
return nil, undetectableError.Err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch *language {
|
switch *language {
|
||||||
case LanguageHosts:
|
case shared.LanguageHosts:
|
||||||
return hosts.TextDocumentSignatureHelp(context, params)
|
return hosts.TextDocumentSignatureHelp(context, params)
|
||||||
case LanguageSSHDConfig:
|
case shared.LanguageSSHDConfig:
|
||||||
return sshdconfig.TextDocumentSignatureHelp(context, params)
|
return sshdconfig.TextDocumentSignatureHelp(context, params)
|
||||||
case LanguageSSHConfig:
|
case shared.LanguageSSHConfig:
|
||||||
return sshconfig.TextDocumentSignatureHelp(context, params)
|
return sshconfig.TextDocumentSignatureHelp(context, params)
|
||||||
case LanguageFstab:
|
case shared.LanguageFstab:
|
||||||
return fstab.TextDocumentSignatureHelp(context, params)
|
return fstab.TextDocumentSignatureHelp(context, params)
|
||||||
case LanguageWireguard:
|
case shared.LanguageWireguard:
|
||||||
return nil, nil
|
return nil, nil
|
||||||
case LanguageAliases:
|
case shared.LanguageAliases:
|
||||||
return aliases.TextDocumentSignatureHelp(context, params)
|
return aliases.TextDocumentSignatureHelp(context, params)
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package roothandler
|
package lsp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
aliases "config-lsp/handlers/aliases/lsp"
|
aliases "config-lsp/handlers/aliases/lsp"
|
@ -1,5 +0,0 @@
|
|||||||
package roothandler
|
|
||||||
|
|
||||||
import protocol "github.com/tliron/glsp/protocol_3_16"
|
|
||||||
|
|
||||||
var openedFiles = make(map[protocol.DocumentUri]struct{})
|
|
21
server/root-handler/shared/constants.go
Normal file
21
server/root-handler/shared/constants.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package shared
|
||||||
|
|
||||||
|
type SupportedLanguage string
|
||||||
|
|
||||||
|
const (
|
||||||
|
LanguageSSHConfig SupportedLanguage = "ssh_config"
|
||||||
|
LanguageSSHDConfig SupportedLanguage = "sshd_config"
|
||||||
|
LanguageFstab SupportedLanguage = "fstab"
|
||||||
|
LanguageWireguard SupportedLanguage = "languagewireguard"
|
||||||
|
LanguageHosts SupportedLanguage = "hosts"
|
||||||
|
LanguageAliases SupportedLanguage = "aliases"
|
||||||
|
)
|
||||||
|
|
||||||
|
var AllSupportedLanguages = []string{
|
||||||
|
string(LanguageSSHConfig),
|
||||||
|
string(LanguageSSHDConfig),
|
||||||
|
string(LanguageFstab),
|
||||||
|
string(LanguageWireguard),
|
||||||
|
string(LanguageHosts),
|
||||||
|
string(LanguageAliases),
|
||||||
|
}
|
16
server/root-handler/shared/indexes.go
Normal file
16
server/root-handler/shared/indexes.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package shared
|
||||||
|
|
||||||
|
import (
|
||||||
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LanguageOverwrite struct {
|
||||||
|
Language SupportedLanguage
|
||||||
|
|
||||||
|
// The start of the overwrite
|
||||||
|
Raw string
|
||||||
|
Line uint32
|
||||||
|
Character uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
var LanguagesOverwrites = map[protocol.DocumentUri]LanguageOverwrite{}
|
@ -1,10 +1,12 @@
|
|||||||
package roothandler
|
package shared
|
||||||
|
|
||||||
import (
|
import (
|
||||||
protocol "github.com/tliron/glsp/protocol_3_16"
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
)
|
)
|
||||||
|
|
||||||
var rootHandler RootHandler
|
var Handler RootHandler
|
||||||
|
|
||||||
|
var OpenedFiles = make(map[protocol.DocumentUri]struct{})
|
||||||
|
|
||||||
type RootHandler struct {
|
type RootHandler struct {
|
||||||
languageMap map[protocol.DocumentUri]SupportedLanguage
|
languageMap map[protocol.DocumentUri]SupportedLanguage
|
44
server/root-handler/utils/code-actions.go
Normal file
44
server/root-handler/utils/code-actions.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FetchAddLanguageActions(uri protocol.DocumentUri) ([]protocol.CodeAction, error) {
|
||||||
|
actions := make([]protocol.CodeAction, 0, len(shared.AllSupportedLanguages))
|
||||||
|
|
||||||
|
kind := protocol.CodeActionKindQuickFix
|
||||||
|
isPreferred := true
|
||||||
|
|
||||||
|
for _, language := range shared.AllSupportedLanguages {
|
||||||
|
actions = append(actions, protocol.CodeAction{
|
||||||
|
Title: fmt.Sprintf("Use %s for this file", language),
|
||||||
|
Kind: &kind,
|
||||||
|
IsPreferred: &isPreferred,
|
||||||
|
Edit: &protocol.WorkspaceEdit{
|
||||||
|
Changes: map[protocol.DocumentUri][]protocol.TextEdit{
|
||||||
|
uri: {
|
||||||
|
{
|
||||||
|
Range: protocol.Range{
|
||||||
|
Start: protocol.Position{
|
||||||
|
Line: 0,
|
||||||
|
Character: 0,
|
||||||
|
},
|
||||||
|
End: protocol.Position{
|
||||||
|
Line: 0,
|
||||||
|
Character: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
NewText: fmt.Sprintf("#?lsp.language=%s\n", language),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return actions, nil
|
||||||
|
}
|
158
server/root-handler/utils/language-detection.go
Normal file
158
server/root-handler/utils/language-detection.go
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"config-lsp/common"
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"config-lsp/utils"
|
||||||
|
"fmt"
|
||||||
|
"path"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UnsupportedLanguageError struct {
|
||||||
|
SuggestedLanguage string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e UnsupportedLanguageError) Error() string {
|
||||||
|
return fmt.Sprintf("Language '%s' is not supported. Choose one of: %s", e.SuggestedLanguage, strings.Join(shared.AllSupportedLanguages, ", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
type LanguageUndetectableError struct{}
|
||||||
|
|
||||||
|
func (e LanguageUndetectableError) Error() string {
|
||||||
|
return "Please add: '#?lsp.language=<language>' to the top of the file. config-lsp was unable to detect the appropriate language for this file."
|
||||||
|
}
|
||||||
|
|
||||||
|
var valueToLanguageMap = map[string]shared.SupportedLanguage{
|
||||||
|
"sshd_config": shared.LanguageSSHDConfig,
|
||||||
|
"sshdconfig": shared.LanguageSSHDConfig,
|
||||||
|
|
||||||
|
"ssh_config": shared.LanguageSSHConfig,
|
||||||
|
"sshconfig": shared.LanguageSSHConfig,
|
||||||
|
|
||||||
|
".ssh/config": shared.LanguageSSHConfig,
|
||||||
|
"~/.ssh/config": shared.LanguageSSHConfig,
|
||||||
|
|
||||||
|
"fstab": shared.LanguageFstab,
|
||||||
|
"etc/fstab": shared.LanguageFstab,
|
||||||
|
|
||||||
|
"wireguard": shared.LanguageWireguard,
|
||||||
|
"wg": shared.LanguageWireguard,
|
||||||
|
"languagewireguard": shared.LanguageWireguard,
|
||||||
|
"host": shared.LanguageHosts,
|
||||||
|
"hosts": shared.LanguageHosts,
|
||||||
|
"etc/hosts": shared.LanguageHosts,
|
||||||
|
|
||||||
|
"aliases": shared.LanguageAliases,
|
||||||
|
"mailaliases": shared.LanguageAliases,
|
||||||
|
"etc/aliases": shared.LanguageAliases,
|
||||||
|
}
|
||||||
|
|
||||||
|
var filenameToLanguageMap = map[string]shared.SupportedLanguage{
|
||||||
|
"sshd_config": shared.LanguageSSHDConfig,
|
||||||
|
"sshdconfig": shared.LanguageSSHDConfig,
|
||||||
|
"sshd": shared.LanguageSSHDConfig,
|
||||||
|
"sshd_conf": shared.LanguageSSHDConfig,
|
||||||
|
"sshdconf": shared.LanguageSSHDConfig,
|
||||||
|
|
||||||
|
"ssh_config": shared.LanguageSSHConfig,
|
||||||
|
"sshconfig": shared.LanguageSSHConfig,
|
||||||
|
"ssh": shared.LanguageSSHConfig,
|
||||||
|
"ssh_conf": shared.LanguageSSHConfig,
|
||||||
|
"sshconf": shared.LanguageSSHConfig,
|
||||||
|
|
||||||
|
"fstab": shared.LanguageFstab,
|
||||||
|
|
||||||
|
"hosts": shared.LanguageHosts,
|
||||||
|
|
||||||
|
"aliases": shared.LanguageAliases,
|
||||||
|
"mailaliases": shared.LanguageAliases,
|
||||||
|
}
|
||||||
|
|
||||||
|
var typeOverwriteRegex = regexp.MustCompile(`#\?\s*lsp\.language\s*=\s*(\w+)\s*`)
|
||||||
|
var wireguardPattern = regexp.MustCompile(`wg(\d+)?(\.conf)?$`)
|
||||||
|
|
||||||
|
var undetectableError = common.ParseError{
|
||||||
|
Line: 0,
|
||||||
|
Err: LanguageUndetectableError{},
|
||||||
|
}
|
||||||
|
|
||||||
|
func DetectLanguage(
|
||||||
|
content string,
|
||||||
|
advertisedLanguage string,
|
||||||
|
uri protocol.DocumentUri,
|
||||||
|
) (shared.SupportedLanguage, error) {
|
||||||
|
if match := typeOverwriteRegex.FindStringSubmatchIndex(content); match != nil {
|
||||||
|
text := content[match[0]:match[1]]
|
||||||
|
language := content[match[2]:match[3]]
|
||||||
|
suggestedLanguage := strings.ToLower(language)
|
||||||
|
|
||||||
|
foundLanguage, ok := valueToLanguageMap[suggestedLanguage]
|
||||||
|
|
||||||
|
contentUntilMatch := content[:match[0]]
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
line := uint32(utils.CountCharacterOccurrences(contentUntilMatch, '\n'))
|
||||||
|
shared.LanguagesOverwrites[uri] = shared.LanguageOverwrite{
|
||||||
|
Language: foundLanguage,
|
||||||
|
Raw: text,
|
||||||
|
Line: line,
|
||||||
|
Character: uint32(match[0]),
|
||||||
|
}
|
||||||
|
|
||||||
|
return foundLanguage, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", common.ParseError{
|
||||||
|
Line: uint32(utils.CountCharacterOccurrences(contentUntilMatch, '\n')),
|
||||||
|
Err: UnsupportedLanguageError{
|
||||||
|
SuggestedLanguage: suggestedLanguage,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if language, ok := valueToLanguageMap[advertisedLanguage]; ok {
|
||||||
|
return language, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch uri {
|
||||||
|
case "file:///etc/ssh/sshd_config":
|
||||||
|
fallthrough
|
||||||
|
case "file:///etc/ssh/ssh_config":
|
||||||
|
return shared.LanguageSSHDConfig, nil
|
||||||
|
|
||||||
|
case "file:///etc/fstab":
|
||||||
|
return shared.LanguageFstab, nil
|
||||||
|
|
||||||
|
// Darwin
|
||||||
|
case "file:///private/etc/hosts":
|
||||||
|
fallthrough
|
||||||
|
case "file:///etc/hosts":
|
||||||
|
return shared.LanguageHosts, nil
|
||||||
|
|
||||||
|
// Darwin
|
||||||
|
case "file:///private/etc/aliases":
|
||||||
|
fallthrough
|
||||||
|
case "file:///etc/aliases":
|
||||||
|
return shared.LanguageAliases, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
filename := path.Base(string(uri))
|
||||||
|
|
||||||
|
if language, found := filenameToLanguageMap[filename]; found {
|
||||||
|
return language, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(uri, "file:///etc/wireguard/") || wireguardPattern.MatchString(uri) {
|
||||||
|
return shared.LanguageWireguard, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasSuffix(uri, ".ssh/config") {
|
||||||
|
return shared.LanguageSSHConfig, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", undetectableError
|
||||||
|
}
|
46
server/root-handler/utils/notification.go
Normal file
46
server/root-handler/utils/notification.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"config-lsp/root-handler/shared"
|
||||||
|
"github.com/tliron/glsp"
|
||||||
|
protocol "github.com/tliron/glsp/protocol_3_16"
|
||||||
|
)
|
||||||
|
|
||||||
|
type lspNotification struct {
|
||||||
|
Uri string
|
||||||
|
}
|
||||||
|
|
||||||
|
type lspDetectedLanguage struct {
|
||||||
|
lspNotification
|
||||||
|
|
||||||
|
Language string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyLanguageUndetectable(context *glsp.Context, uri protocol.DocumentUri) {
|
||||||
|
go context.Notify(
|
||||||
|
"$/config-lsp/languageUndetectable",
|
||||||
|
lspNotification{
|
||||||
|
Uri: string(uri),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
go context.Notify(
|
||||||
|
"window/showMessage",
|
||||||
|
protocol.ShowMessageParams{
|
||||||
|
Type: protocol.MessageTypeError,
|
||||||
|
Message: "config-lsp was unable to detect the appropriate language for this file. Please add: '#?lsp.language=<language>'.",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyDetectedLanguage(context *glsp.Context, uri protocol.DocumentUri, language shared.SupportedLanguage) {
|
||||||
|
go context.Notify(
|
||||||
|
"$/config-lsp/detectedLanguage",
|
||||||
|
lspDetectedLanguage{
|
||||||
|
lspNotification: lspNotification{
|
||||||
|
Uri: string(uri),
|
||||||
|
},
|
||||||
|
Language: string(language),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
@ -1,14 +0,0 @@
|
|||||||
.vscode/**
|
|
||||||
**/*.ts
|
|
||||||
**/*.map
|
|
||||||
.gitignore
|
|
||||||
**/tsconfig.json
|
|
||||||
**/tsconfig.base.json
|
|
||||||
contributing.md
|
|
||||||
.travis.yml
|
|
||||||
client/node_modules/**
|
|
||||||
!client/node_modules/vscode-jsonrpc/**
|
|
||||||
!client/node_modules/vscode-languageclient/**
|
|
||||||
!client/node_modules/vscode-languageserver-protocol/**
|
|
||||||
!client/node_modules/vscode-languageserver-types/**
|
|
||||||
!client/node_modules/semver/**
|
|
0
vs-code-extension/LICENSE.md
Normal file
0
vs-code-extension/LICENSE.md
Normal file
@ -1,27 +1,21 @@
|
|||||||
# LSP Example for Embedded Language using Language Service
|
# config-lsp for VS Code
|
||||||
|
|
||||||
Heavily documented sample code for https://code.visualstudio.com/api/language-extensions/embedded-languages#language-services
|
`config-lsp` provides language support for various config files.
|
||||||
|
Currently it supports completions, diagnostics, hints, formatting, hover information,
|
||||||
|
and definition requests.
|
||||||
|
|
||||||
## Functionality
|
Install this extension and load your config files in VS Code to get started.
|
||||||
|
|
||||||
This extension contributes a new language, `html1`. The new language is for illustration purpose and has basic syntax highlighting.
|
If `config-lsp` is unable to detect the language of your config file, you can manually
|
||||||
|
specify it by adding a line in the form of:
|
||||||
|
|
||||||
This Language Server works for `html1` file. HTML1 is like HTML file but has file extension `.html1`. You can create a `test.html1` file to play with below functionalities:
|
```plaintext
|
||||||
|
#?lsp.language=<language>
|
||||||
|
|
||||||
- Completions for HTML tags
|
# For example
|
||||||
- Completions for CSS in `<style>` tag
|
|
||||||
- Diagnostics for CSS
|
|
||||||
|
|
||||||
## Running the Sample
|
#?lsp.language=sshconfig
|
||||||
|
#?lsp.language=fstab
|
||||||
|
#?lsp.language=aliases
|
||||||
|
```
|
||||||
|
|
||||||
- Run `npm install` in this folder. This installs all necessary npm modules in both the client and server folder
|
|
||||||
- Open VS Code on this folder.
|
|
||||||
- Press Ctrl+Shift+B to compile the client and server.
|
|
||||||
- Switch to the Debug viewlet.
|
|
||||||
- Select `Launch Client` from the drop down.
|
|
||||||
- Run the launch config.
|
|
||||||
- If you want to debug the server as well use the launch configuration `Attach to Server`
|
|
||||||
- In the [Extension Development Host] instance of VSCode, open a HTML document
|
|
||||||
- Type `<d|` to try HTML completion
|
|
||||||
- Type `<style>.foo { c| }</style>` to try CSS completion
|
|
||||||
- Have `<style>.foo { }</style>` to see CSS Diagnostics
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
rm -rf ./result
|
|
||||||
rm -rf ./vs-code-extension/out
|
|
||||||
|
|
||||||
nix build .#"vs-code-extension"
|
|
||||||
mkdir ./vs-code-extension/out
|
|
||||||
cp ./result/* ./vs-code-extension/out
|
|
||||||
chmod 777 ./vs-code-extension/out -R
|
|
||||||
|
|
57
vs-code-extension/esbuild.js
Normal file
57
vs-code-extension/esbuild.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
const esbuild = require('esbuild');
|
||||||
|
|
||||||
|
const production = process.argv.includes('--production');
|
||||||
|
const watch = process.argv.includes('--watch');
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const ctx = await esbuild.context({
|
||||||
|
entryPoints: ['src/extension.ts'],
|
||||||
|
bundle: true,
|
||||||
|
format: 'cjs',
|
||||||
|
minify: production,
|
||||||
|
sourcemap: !production,
|
||||||
|
sourcesContent: false,
|
||||||
|
platform: 'node',
|
||||||
|
outfile: 'out/extension.js',
|
||||||
|
external: ['vscode'],
|
||||||
|
logLevel: 'silent',
|
||||||
|
// According to https://github.com/ewanharris/vscode-versions, VS Code ships with NodeJS version 16.14.2
|
||||||
|
// and according to https://node.green/ this version supports ES2022.
|
||||||
|
target: "es2022",
|
||||||
|
plugins: [
|
||||||
|
/* add to the end of plugins array */
|
||||||
|
esbuildProblemMatcherPlugin
|
||||||
|
]
|
||||||
|
});
|
||||||
|
if (watch) {
|
||||||
|
await ctx.watch();
|
||||||
|
} else {
|
||||||
|
await ctx.rebuild();
|
||||||
|
await ctx.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {import('esbuild').Plugin}
|
||||||
|
*/
|
||||||
|
const esbuildProblemMatcherPlugin = {
|
||||||
|
name: 'esbuild-problem-matcher',
|
||||||
|
|
||||||
|
setup(build) {
|
||||||
|
build.onStart(() => {
|
||||||
|
console.log('[watch] build started');
|
||||||
|
});
|
||||||
|
build.onEnd(result => {
|
||||||
|
result.errors.forEach(({ text, location }) => {
|
||||||
|
console.error(`✘ [ERROR] ${text}`);
|
||||||
|
console.error(` ${location.file}:${location.line}:${location.column}:`);
|
||||||
|
});
|
||||||
|
console.log('[watch] build finished');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
main().catch(e => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
BIN
vs-code-extension/icon.png
Normal file
BIN
vs-code-extension/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 70 KiB |
@ -1,39 +1,129 @@
|
|||||||
{
|
{
|
||||||
"name": "config-lsp-vs-code-extension",
|
"name": "config-lsp",
|
||||||
"description": "A language server example using language services to support embedded languages",
|
"description": "Language Features (completions, diagnostics, etc.) for your config files: gitconfig, fstab, aliases, hosts, wireguard, ssh_config, sshd_config, and more to come!",
|
||||||
"author": "Microsoft Corporation",
|
"author": "Myzel394",
|
||||||
"license": "MIT",
|
"version": "0.1.2",
|
||||||
"version": "0.1.0",
|
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Microsoft/vscode-extension-samples"
|
"url": "https://github.com/Myzel394/config-lsp"
|
||||||
},
|
},
|
||||||
"publisher": "vscode-samples",
|
"publisher": "myzel394",
|
||||||
"categories": [],
|
"categories": [
|
||||||
"keywords": [],
|
"Programming Languages",
|
||||||
"engines": {
|
"Formatters"
|
||||||
"vscode": "^1.74.0"
|
],
|
||||||
|
"preview": true,
|
||||||
|
"contributes": {
|
||||||
|
"languages": [
|
||||||
|
{
|
||||||
|
"id": "sshconfig",
|
||||||
|
"extensions": ["sshconfig", "ssh_config"],
|
||||||
|
"aliases": ["SSH Config", "sshconfig"],
|
||||||
|
"filenames": ["sshconfig", "ssh_config"],
|
||||||
|
"filenamePatterns": ["~/.ssh/config", "**/sshconfig", "**/ssh_config"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sshdconfig",
|
||||||
|
"extensions": ["sshdconfig", "sshd_config"],
|
||||||
|
"aliases": ["SSH Daemon Config", "sshdconfig"],
|
||||||
|
"filenames": ["sshdconfig", "sshd_config"],
|
||||||
|
"filenamePatterns": ["/etc/ssh/sshd_config", "**/sshdconfig", "**/sshd_config"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "aliases",
|
||||||
|
"extensions": ["aliases", "mailaliases"],
|
||||||
|
"aliases": ["Mail Aliases", "aliases", "mailaliases"],
|
||||||
|
"filenames": ["aliases", "mailaliases"],
|
||||||
|
"filenamePatterns": ["/etc/aliases", "**/aliases", "**/mailaliases"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "fstab",
|
||||||
|
"extensions": ["fstab"],
|
||||||
|
"aliases": ["fstab"],
|
||||||
|
"filenames": ["fstab"],
|
||||||
|
"filenamePatterns": ["/etc/fstab", "**/fstab", "**/etc/fstab"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "hosts",
|
||||||
|
"extensions": ["hosts"],
|
||||||
|
"aliases": ["hosts"],
|
||||||
|
"filenames": ["hosts"],
|
||||||
|
"filenamePatterns": ["/etc/hosts", "**/hosts", "**/etc/hosts"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "wireguard",
|
||||||
|
"extensions": ["wireguard", "wg"],
|
||||||
|
"aliases": ["WireGuard", "wireguard", "wg"],
|
||||||
|
"filenames": ["wireguard", "wg0.conf", "wg1.conf", "wg0", "wg1"],
|
||||||
|
"filenamePatterns": ["/etc/wireguard/*.conf", "**/wireguard", "**/wireguard.conf"]
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"activationEvents": [
|
"activationEvents": [
|
||||||
"onLanguage:plaintext",
|
"onLanguage:plaintext",
|
||||||
"onLanguage:yaml"
|
"onLanguage:yaml",
|
||||||
|
"onLanguage:sshconfig",
|
||||||
|
"onLanguage:sshdconfig",
|
||||||
|
"onLanguage:aliases",
|
||||||
|
"onLanguage:fstab",
|
||||||
|
"onLanguage:hosts",
|
||||||
|
"onLanguage:wireguard"
|
||||||
],
|
],
|
||||||
"main": "./out/extension",
|
"sponsor": {
|
||||||
|
"url": "https://github.com/Myzel394/contact-me"
|
||||||
|
},
|
||||||
|
"icon": "icon.png",
|
||||||
|
"galleryBanner": {
|
||||||
|
"color": "#373435",
|
||||||
|
"theme": "dark"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"out",
|
||||||
|
"package.json",
|
||||||
|
"LICENSE.md",
|
||||||
|
"icon.png"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"config",
|
||||||
|
"lsp",
|
||||||
|
"language",
|
||||||
|
"configuration",
|
||||||
|
"help",
|
||||||
|
"autocomplete",
|
||||||
|
"completions",
|
||||||
|
"diagnostics",
|
||||||
|
"hints",
|
||||||
|
"format",
|
||||||
|
|
||||||
|
"ssh",
|
||||||
|
"ssh_config",
|
||||||
|
"sshd_config",
|
||||||
|
"wireguard",
|
||||||
|
"fstab",
|
||||||
|
"hosts",
|
||||||
|
"aliases"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"vscode": "^1.74.0"
|
||||||
|
},
|
||||||
|
"main": "./out/extension.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"compile": "tsc -b",
|
"compile": "node esbuild.js",
|
||||||
|
"compile:prod": "node esbuild.js --production",
|
||||||
"watch": "tsc -b -w",
|
"watch": "tsc -b -w",
|
||||||
"lint": "eslint ./src --ext .ts,.tsx"
|
"lint": "eslint ./src"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"vscode-languageclient": "^9.0.1"
|
"vscode-languageclient": "^9.0.1",
|
||||||
|
"esbuild": "^0.24.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/mocha": "^5.2.7",
|
"@types/mocha": "^5.2.7",
|
||||||
"@types/node": "^22.7.4",
|
"@types/node": "^22.7.4",
|
||||||
|
"@types/vscode": "^1.74.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.14.0",
|
"@typescript-eslint/eslint-plugin": "^7.14.0",
|
||||||
"@typescript-eslint/parser": "^7.14.0",
|
"@typescript-eslint/parser": "^7.14.0",
|
||||||
"eslint": "^9.11.1",
|
"eslint": "^9.11.1",
|
||||||
"typescript": "^5.5.2",
|
"typescript": "^5.5.2"
|
||||||
"@types/vscode": "^1.93.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
34
vs-code-extension/src/events/on-undetectable.ts
Normal file
34
vs-code-extension/src/events/on-undetectable.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { GenericNotificationHandler } from "vscode-languageclient";
|
||||||
|
import * as vscode from "vscode";
|
||||||
|
|
||||||
|
const ACTION_SELECT_LANGUAGE = "Select Language";
|
||||||
|
const ACTION_DISABLE = "Ignore for this file";
|
||||||
|
|
||||||
|
const ignoredFiled = new Set<string>();
|
||||||
|
|
||||||
|
export const onUndetectable: GenericNotificationHandler = async (params: LSPLanguageUndetectable) => {
|
||||||
|
if (ignoredFiled.has(params.Uri)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await vscode.window.showWarningMessage(
|
||||||
|
"config-lsp was unable to detect the appropriate language for this file",
|
||||||
|
{
|
||||||
|
detail: "Either select a language or add '#?lsp.language=<language>' to the top of the file",
|
||||||
|
},
|
||||||
|
ACTION_SELECT_LANGUAGE,
|
||||||
|
ACTION_DISABLE,
|
||||||
|
)
|
||||||
|
|
||||||
|
switch (result) {
|
||||||
|
case ACTION_SELECT_LANGUAGE:
|
||||||
|
vscode.commands.executeCommand("workbench.action.editor.changeLanguageMode");
|
||||||
|
break;
|
||||||
|
case ACTION_DISABLE:
|
||||||
|
ignoredFiled.add(params.Uri);
|
||||||
|
break;
|
||||||
|
undefined:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
6
vs-code-extension/src/events/types.ts
Normal file
6
vs-code-extension/src/events/types.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
interface LSPNotification {
|
||||||
|
Uri: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LSPLanguageUndetectable extends LSPNotification {}
|
||||||
|
|
@ -1,32 +1,30 @@
|
|||||||
import * as path from "path"
|
import * as path from "path";
|
||||||
import { ExtensionContext, workspace } from 'vscode';
|
import { ExtensionContext, workspace } from "vscode";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Executable,
|
Executable,
|
||||||
LanguageClient,
|
LanguageClient,
|
||||||
type LanguageClientOptions,
|
type LanguageClientOptions,
|
||||||
type ServerOptions,
|
type ServerOptions,
|
||||||
} from 'vscode-languageclient/node';
|
} from "vscode-languageclient/node";
|
||||||
|
import { onUndetectable } from "./events/on-undetectable";
|
||||||
|
|
||||||
const IS_DEBUG = process.env.VSCODE_DEBUG_MODE === 'true' || process.env.NODE_ENV === 'development';
|
const IS_DEBUG =
|
||||||
|
process.env.VSCODE_DEBUG_MODE === "true" ||
|
||||||
|
process.env.NODE_ENV === "development";
|
||||||
let client: LanguageClient;
|
let client: LanguageClient;
|
||||||
|
|
||||||
export function activate(context: ExtensionContext) {
|
export async function activate({subscriptions}: ExtensionContext) {
|
||||||
console.info("config-lsp activated");
|
console.info("config-lsp activated");
|
||||||
const initOptions = workspace.getConfiguration('config-lsp');
|
const initOptions = workspace.getConfiguration("config-lsp");
|
||||||
const clientOptions: LanguageClientOptions = {
|
const clientOptions: LanguageClientOptions = {
|
||||||
documentSelector: [
|
documentSelector: [
|
||||||
{
|
{language: "sshconfig"},
|
||||||
scheme: 'file',
|
{language: "sshdconfig"},
|
||||||
language: 'plaintext',
|
{language: "aliases"},
|
||||||
pattern: "**/{config,sshconfig,sshd_config,sshdconfig,fstab,hosts,aliases}",
|
{language: "fstab"},
|
||||||
},
|
{language: "hosts"},
|
||||||
// Some configs seem to be incorrectly detected as yaml
|
{language: "wireguard"},
|
||||||
{
|
|
||||||
scheme: 'file',
|
|
||||||
language: 'yaml',
|
|
||||||
pattern: "**/{config,sshconfig,sshd_config,sshdconfig,fstab,hosts,aliases}",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
initializationOptions: initOptions,
|
initializationOptions: initOptions,
|
||||||
};
|
};
|
||||||
@ -34,39 +32,29 @@ export function activate(context: ExtensionContext) {
|
|||||||
const path = getBundledPath();
|
const path = getBundledPath();
|
||||||
console.info(`Found config-lsp path at ${path}`);
|
console.info(`Found config-lsp path at ${path}`);
|
||||||
const run: Executable = {
|
const run: Executable = {
|
||||||
command: getBundledPath(),
|
command: getBundledPath() ,
|
||||||
}
|
};
|
||||||
const serverOptions: ServerOptions = {
|
const serverOptions: ServerOptions = {
|
||||||
run,
|
run,
|
||||||
debug: run,
|
debug: run,
|
||||||
}
|
};
|
||||||
|
|
||||||
client = new LanguageClient(
|
client = new LanguageClient(
|
||||||
'config-lsp',
|
"config-lsp",
|
||||||
serverOptions,
|
serverOptions,
|
||||||
clientOptions,
|
clientOptions,
|
||||||
IS_DEBUG,
|
IS_DEBUG
|
||||||
);
|
);
|
||||||
|
|
||||||
|
console.info("Starting config-lsp...");
|
||||||
|
await client.start();
|
||||||
|
console.info("Started config-lsp");
|
||||||
|
|
||||||
client.start();
|
subscriptions.push(client.onNotification("$/config-lsp/languageUndetectable", onUndetectable))
|
||||||
console.info("config-lsp started");
|
|
||||||
|
|
||||||
// const serverOptions: ServerOptions = {
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Create the language client and start the client.
|
|
||||||
// client = new LanguageClient(
|
|
||||||
// 'languageServerExample',
|
|
||||||
// clientOptions
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// // Start the client. This will also launch the server
|
|
||||||
// client.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getBundledPath(): string {
|
function getBundledPath(): string {
|
||||||
const filePath = path.resolve(__dirname, "config-lsp")
|
const filePath = path.resolve(__dirname, "config-lsp");
|
||||||
|
|
||||||
return filePath;
|
return filePath;
|
||||||
}
|
}
|
||||||
|
@ -1 +0,0 @@
|
|||||||
{"root":["./src/extension.ts"],"version":"5.6.2"}
|
|
4
vs-code-extension/update-yarn.sh
Executable file
4
vs-code-extension/update-yarn.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
cd vs-code-extension && yarn install --no-frozen-lockfile && yarn2nix > yarn.nix
|
||||||
|
|
@ -2,6 +2,126 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@esbuild/aix-ppc64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c"
|
||||||
|
integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==
|
||||||
|
|
||||||
|
"@esbuild/android-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0"
|
||||||
|
integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==
|
||||||
|
|
||||||
|
"@esbuild/android-arm@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810"
|
||||||
|
integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==
|
||||||
|
|
||||||
|
"@esbuild/android-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705"
|
||||||
|
integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==
|
||||||
|
|
||||||
|
"@esbuild/darwin-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd"
|
||||||
|
integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==
|
||||||
|
|
||||||
|
"@esbuild/darwin-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107"
|
||||||
|
integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==
|
||||||
|
|
||||||
|
"@esbuild/freebsd-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7"
|
||||||
|
integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==
|
||||||
|
|
||||||
|
"@esbuild/freebsd-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93"
|
||||||
|
integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==
|
||||||
|
|
||||||
|
"@esbuild/linux-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75"
|
||||||
|
integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==
|
||||||
|
|
||||||
|
"@esbuild/linux-arm@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d"
|
||||||
|
integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==
|
||||||
|
|
||||||
|
"@esbuild/linux-ia32@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb"
|
||||||
|
integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c"
|
||||||
|
integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==
|
||||||
|
|
||||||
|
"@esbuild/linux-mips64el@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3"
|
||||||
|
integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==
|
||||||
|
|
||||||
|
"@esbuild/linux-ppc64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e"
|
||||||
|
integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==
|
||||||
|
|
||||||
|
"@esbuild/linux-riscv64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25"
|
||||||
|
integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==
|
||||||
|
|
||||||
|
"@esbuild/linux-s390x@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319"
|
||||||
|
integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==
|
||||||
|
|
||||||
|
"@esbuild/linux-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef"
|
||||||
|
integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==
|
||||||
|
|
||||||
|
"@esbuild/netbsd-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c"
|
||||||
|
integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==
|
||||||
|
|
||||||
|
"@esbuild/openbsd-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2"
|
||||||
|
integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==
|
||||||
|
|
||||||
|
"@esbuild/openbsd-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf"
|
||||||
|
integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==
|
||||||
|
|
||||||
|
"@esbuild/sunos-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4"
|
||||||
|
integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==
|
||||||
|
|
||||||
|
"@esbuild/win32-arm64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b"
|
||||||
|
integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==
|
||||||
|
|
||||||
|
"@esbuild/win32-ia32@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103"
|
||||||
|
integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==
|
||||||
|
|
||||||
|
"@esbuild/win32-x64@0.24.0":
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244"
|
||||||
|
integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
|
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
|
||||||
version "4.4.0"
|
version "4.4.0"
|
||||||
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
|
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
|
||||||
@ -113,7 +233,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
undici-types "~6.19.2"
|
undici-types "~6.19.2"
|
||||||
|
|
||||||
"@types/vscode@^1.93.0":
|
"@types/vscode@^1.74.0":
|
||||||
version "1.94.0"
|
version "1.94.0"
|
||||||
resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz#ccd2111b6ecaba6ad4da19c2d524828fa73ae250"
|
resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz#ccd2111b6ecaba6ad4da19c2d524828fa73ae250"
|
||||||
integrity sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==
|
integrity sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==
|
||||||
@ -326,6 +446,36 @@ dir-glob@^3.0.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
path-type "^4.0.0"
|
path-type "^4.0.0"
|
||||||
|
|
||||||
|
esbuild@^0.24.0:
|
||||||
|
version "0.24.0"
|
||||||
|
resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7"
|
||||||
|
integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==
|
||||||
|
optionalDependencies:
|
||||||
|
"@esbuild/aix-ppc64" "0.24.0"
|
||||||
|
"@esbuild/android-arm" "0.24.0"
|
||||||
|
"@esbuild/android-arm64" "0.24.0"
|
||||||
|
"@esbuild/android-x64" "0.24.0"
|
||||||
|
"@esbuild/darwin-arm64" "0.24.0"
|
||||||
|
"@esbuild/darwin-x64" "0.24.0"
|
||||||
|
"@esbuild/freebsd-arm64" "0.24.0"
|
||||||
|
"@esbuild/freebsd-x64" "0.24.0"
|
||||||
|
"@esbuild/linux-arm" "0.24.0"
|
||||||
|
"@esbuild/linux-arm64" "0.24.0"
|
||||||
|
"@esbuild/linux-ia32" "0.24.0"
|
||||||
|
"@esbuild/linux-loong64" "0.24.0"
|
||||||
|
"@esbuild/linux-mips64el" "0.24.0"
|
||||||
|
"@esbuild/linux-ppc64" "0.24.0"
|
||||||
|
"@esbuild/linux-riscv64" "0.24.0"
|
||||||
|
"@esbuild/linux-s390x" "0.24.0"
|
||||||
|
"@esbuild/linux-x64" "0.24.0"
|
||||||
|
"@esbuild/netbsd-x64" "0.24.0"
|
||||||
|
"@esbuild/openbsd-arm64" "0.24.0"
|
||||||
|
"@esbuild/openbsd-x64" "0.24.0"
|
||||||
|
"@esbuild/sunos-x64" "0.24.0"
|
||||||
|
"@esbuild/win32-arm64" "0.24.0"
|
||||||
|
"@esbuild/win32-ia32" "0.24.0"
|
||||||
|
"@esbuild/win32-x64" "0.24.0"
|
||||||
|
|
||||||
escape-string-regexp@^4.0.0:
|
escape-string-regexp@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
|
||||||
|
@ -1,6 +1,198 @@
|
|||||||
{ fetchurl, fetchgit, linkFarm, runCommand, gnutar }: rec {
|
{ fetchurl, fetchgit, linkFarm, runCommand, gnutar }: rec {
|
||||||
offline_cache = linkFarm "offline" packages;
|
offline_cache = linkFarm "offline" packages;
|
||||||
packages = [
|
packages = [
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_aix_ppc64___aix_ppc64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_aix_ppc64___aix_ppc64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz";
|
||||||
|
sha512 = "WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_arm64___android_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_arm64___android_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_arm___android_arm_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_arm___android_arm_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz";
|
||||||
|
sha512 = "arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_x64___android_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_android_x64___android_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz";
|
||||||
|
sha512 = "t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_darwin_arm64___darwin_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_darwin_arm64___darwin_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_darwin_x64___darwin_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_darwin_x64___darwin_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz";
|
||||||
|
sha512 = "rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_freebsd_arm64___freebsd_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_freebsd_arm64___freebsd_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_freebsd_x64___freebsd_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_freebsd_x64___freebsd_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz";
|
||||||
|
sha512 = "D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_arm64___linux_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_arm64___linux_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_arm___linux_arm_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_arm___linux_arm_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz";
|
||||||
|
sha512 = "gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_ia32___linux_ia32_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_ia32___linux_ia32_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz";
|
||||||
|
sha512 = "K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_loong64___linux_loong64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_loong64___linux_loong64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz";
|
||||||
|
sha512 = "0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_mips64el___linux_mips64el_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_mips64el___linux_mips64el_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz";
|
||||||
|
sha512 = "hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_ppc64___linux_ppc64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_ppc64___linux_ppc64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz";
|
||||||
|
sha512 = "HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_riscv64___linux_riscv64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_riscv64___linux_riscv64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz";
|
||||||
|
sha512 = "bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_s390x___linux_s390x_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_s390x___linux_s390x_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz";
|
||||||
|
sha512 = "ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_x64___linux_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_linux_x64___linux_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz";
|
||||||
|
sha512 = "vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_netbsd_x64___netbsd_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_netbsd_x64___netbsd_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz";
|
||||||
|
sha512 = "hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_openbsd_arm64___openbsd_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_openbsd_arm64___openbsd_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_openbsd_x64___openbsd_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_openbsd_x64___openbsd_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz";
|
||||||
|
sha512 = "4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_sunos_x64___sunos_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_sunos_x64___sunos_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz";
|
||||||
|
sha512 = "jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_arm64___win32_arm64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_arm64___win32_arm64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz";
|
||||||
|
sha512 = "iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_ia32___win32_ia32_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_ia32___win32_ia32_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz";
|
||||||
|
sha512 = "vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_x64___win32_x64_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org__esbuild_win32_x64___win32_x64_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz";
|
||||||
|
sha512 = "7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==";
|
||||||
|
};
|
||||||
|
}
|
||||||
{
|
{
|
||||||
name = "https___registry.npmjs.org__eslint_community_eslint_utils___eslint_utils_4.4.0.tgz";
|
name = "https___registry.npmjs.org__eslint_community_eslint_utils___eslint_utils_4.4.0.tgz";
|
||||||
path = fetchurl {
|
path = fetchurl {
|
||||||
@ -369,6 +561,14 @@
|
|||||||
sha512 = "WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==";
|
sha512 = "WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
name = "https___registry.npmjs.org_esbuild___esbuild_0.24.0.tgz";
|
||||||
|
path = fetchurl {
|
||||||
|
name = "https___registry.npmjs.org_esbuild___esbuild_0.24.0.tgz";
|
||||||
|
url = "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz";
|
||||||
|
sha512 = "FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==";
|
||||||
|
};
|
||||||
|
}
|
||||||
{
|
{
|
||||||
name = "https___registry.npmjs.org_escape_string_regexp___escape_string_regexp_4.0.0.tgz";
|
name = "https___registry.npmjs.org_escape_string_regexp___escape_string_regexp_4.0.0.tgz";
|
||||||
path = fetchurl {
|
path = fetchurl {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user