From e88d32f281ced3e92e4ac3f136d15af5f1b313c1 Mon Sep 17 00:00:00 2001 From: Hein Date: Sun, 28 Jun 2026 12:48:28 +0200 Subject: [PATCH] feat: add LSP server, VSCode + DataGrip extensions, release infra, autofix - pkg/lsp: JSON-RPC 2.0 LSP server (formatting, diagnostics, codeAction quick-fixes) - cmd/pgtidy: lsp and config subcommands - pkg/diagnostics: TextFix struct for byte-range autofixes - pkg/lint: MIG001/MIG003 autofixes, ApplyFixes helper, --fix flag on lint command - editors/vscode: TypeScript extension with LanguageClient, showVersion/showConfig/formatDocument commands, logo - editors/datagrip: Gradle JetBrains plugin via LSP4IJ, pluginIcon - .goreleaser.yaml, .github/workflows: CI + release pipeline - Makefile: snapshot, release, vscode-compile, vscode-package targets - go.mod + all imports: module path updated to git.warky.dev/wdevs/pgtidy - assets: logo files (256px, 128px, 1024px, ico) --- .github/workflows/ci.yml | 62 + .github/workflows/release.yml | 53 + .goreleaser.yaml | 54 + Makefile | 19 +- assets/logo_1024.png | Bin 0 -> 187830 bytes assets/logo_128.ico | Bin 0 -> 29102 bytes assets/logo_128.png | Bin 0 -> 7936 bytes assets/logo_256.png | Bin 0 -> 22220 bytes cmd/pgtidy/config.go | 34 + cmd/pgtidy/fmt.go | 6 +- cmd/pgtidy/lint.go | 30 +- cmd/pgtidy/lsp.go | 28 + cmd/pgtidy/main.go | 14 +- docs/todo.md | 34 +- editors/datagrip/.gitignore | 3 + editors/datagrip/README.md | 37 + editors/datagrip/build.gradle.kts | 48 + editors/datagrip/gradle.properties | 8 + editors/datagrip/settings.gradle.kts | 5 + .../pgtidy/datagrip/PgTidyServerConnection.kt | 9 + .../pgtidy/datagrip/PgTidyServerFactory.kt | 10 + .../src/main/resources/META-INF/plugin.xml | 27 + .../main/resources/META-INF/pluginIcon.png | Bin 0 -> 22220 bytes editors/vscode/.gitignore | 4 + editors/vscode/.vscodeignore | 10 + editors/vscode/LICENSE | 1 + editors/vscode/README.md | 75 + editors/vscode/package.json | 88 + editors/vscode/pnpm-lock.yaml | 1589 +++++++++++++++++ editors/vscode/pnpm-workspace.yaml | 3 + editors/vscode/src/extension.ts | 105 ++ editors/vscode/tsconfig.json | 13 + go.mod | 2 +- pkg/cst/cst.go | 2 +- pkg/diagnostics/diagnostics.go | 11 + pkg/format/body.go | 6 +- pkg/format/format.go | 6 +- pkg/format/format_test.go | 6 +- pkg/lint/fix.go | 39 + pkg/lint/fix_test.go | 104 ++ pkg/lint/lint.go | 4 +- pkg/lint/lint_test.go | 4 +- pkg/lint/rules_correctness.go | 4 +- pkg/lint/rules_migration.go | 81 +- pkg/lint/rules_naming.go | 4 +- pkg/lsp/server.go | 429 +++++ pkg/lsp/server_test.go | 200 +++ pkg/parser/parser.go | 4 +- pkg/parser/parser_test.go | 2 +- 49 files changed, 3228 insertions(+), 49 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .goreleaser.yaml create mode 100644 assets/logo_1024.png create mode 100644 assets/logo_128.ico create mode 100644 assets/logo_128.png create mode 100644 assets/logo_256.png create mode 100644 cmd/pgtidy/config.go create mode 100644 cmd/pgtidy/lsp.go create mode 100644 editors/datagrip/.gitignore create mode 100644 editors/datagrip/README.md create mode 100644 editors/datagrip/build.gradle.kts create mode 100644 editors/datagrip/gradle.properties create mode 100644 editors/datagrip/settings.gradle.kts create mode 100644 editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerConnection.kt create mode 100644 editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerFactory.kt create mode 100644 editors/datagrip/src/main/resources/META-INF/plugin.xml create mode 100644 editors/datagrip/src/main/resources/META-INF/pluginIcon.png create mode 100644 editors/vscode/.gitignore create mode 100644 editors/vscode/.vscodeignore create mode 120000 editors/vscode/LICENSE create mode 100644 editors/vscode/README.md create mode 100644 editors/vscode/package.json create mode 100644 editors/vscode/pnpm-lock.yaml create mode 100644 editors/vscode/pnpm-workspace.yaml create mode 100644 editors/vscode/src/extension.ts create mode 100644 editors/vscode/tsconfig.json create mode 100644 pkg/lint/fix.go create mode 100644 pkg/lint/fix_test.go create mode 100644 pkg/lsp/server.go create mode 100644 pkg/lsp/server_test.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4577459 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,62 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - name: Vet + run: go vet ./... + + - name: Test + run: go test ./... + + - name: Format check + run: | + unformatted=$(gofmt -l .) + if [ -n "$unformatted" ]; then + echo "Files need gofmt:" + echo "$unformatted" + exit 1 + fi + + build-snapshot: + name: Build snapshot + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - uses: goreleaser/goreleaser-action@v6 + with: + version: latest + args: release --snapshot --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: dist-snapshot + path: dist/ + retention-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d6d0909 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,53 @@ +name: Release + +on: + push: + tags: + - 'v*' + +jobs: + release: + name: Release + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + + - uses: goreleaser/goreleaser-action@v6 + with: + version: latest + args: release --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + vscode-package: + name: VSCode Extension + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + cache-dependency-path: editors/vscode/package-lock.json + + - name: Install and package + working-directory: editors/vscode + run: | + npm ci + npm run compile + npm run package + + - uses: actions/upload-artifact@v4 + with: + name: pgtidy-vscode + path: editors/vscode/*.vsix diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..bba790f --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,54 @@ +project_name: pgtidy + +before: + hooks: + - go mod tidy + - go vet ./... + +builds: + - id: pgtidy + main: ./cmd/pgtidy + binary: pgtidy + ldflags: + - -s -w -X main.version={{ .Version }} + env: + - CGO_ENABLED=0 + goos: + - linux + - darwin + - windows + goarch: + - amd64 + - arm64 + ignore: + - goos: windows + goarch: arm64 + +archives: + - id: pgtidy + name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" + format_overrides: + - goos: windows + formats: [zip] + files: + - LICENSE + - README.md + +checksum: + name_template: "checksums.txt" + +changelog: + sort: asc + use: github + filters: + exclude: + - "^docs:" + - "^test:" + - "^chore:" + - "^ci:" + +release: + github: + owner: hein + name: pgtidy + draft: true diff --git a/Makefile b/Makefile index 98eb0ae..8ebfd9c 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ APP := pgtidy CMD := ./cmd/pgtidy DIST := dist -.PHONY: build test lint vet fmt clean +.PHONY: build test lint vet fmt clean release snapshot vscode-compile vscode-package ## build: compile binary for the current platform build: @@ -27,3 +27,20 @@ lint: vet ## clean: remove build artifacts clean: rm -rf $(DIST) + +## snapshot: build multi-platform binaries without publishing (requires goreleaser) +snapshot: + goreleaser release --snapshot --clean + +## release: tag and publish a GitHub release (requires GITHUB_TOKEN + goreleaser) +release: + goreleaser release --clean + +## vscode-compile: compile the VSCode extension TypeScript +vscode-compile: + cp -r assets editors/vscode/assets + cd editors/vscode && pnpm install && pnpm run build + +## vscode-package: build the .vsix package +vscode-package: vscode-compile + cd editors/vscode && pnpm run package diff --git a/assets/logo_1024.png b/assets/logo_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4c05cbb354ce3537829b92f93843f2ef52a5744b GIT binary patch literal 187830 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

b9@07W-iNDZLF&CLMPZJ;`|Bu;(zE{>f2l&{>m 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

-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 literal 0 HcmV?d00001 diff --git a/assets/logo_128.png b/assets/logo_128.png new file mode 100644 index 0000000000000000000000000000000000000000..733196117544474ced4d5e3969fb89ec22a1dc35 GIT binary patch literal 7936 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 literal 0 HcmV?d00001 diff --git a/assets/logo_256.png b/assets/logo_256.png new file mode 100644 index 0000000000000000000000000000000000000000..031c505abb1a59bef937f5cdcb3b65d120015193 GIT binary patch literal 22220 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 a1MUEmCk?H8IPl-o3D8i{RjyXFiTEFT(4c_; literal 0 HcmV?d00001 diff --git a/cmd/pgtidy/config.go b/cmd/pgtidy/config.go new file mode 100644 index 0000000..231ac9e --- /dev/null +++ b/cmd/pgtidy/config.go @@ -0,0 +1,34 @@ +package main + +import ( + "fmt" + "io" + "os" + + "git.warky.dev/wdevs/pgtidy/pkg/config" +) + +func cmdConfig(args []string, stdin io.Reader, stdout, stderr io.Writer) int { + for _, a := range args { + if a == "-h" || a == "--help" { + fmt.Fprintln(stdout, "pgtidy config — print effective configuration resolved from .pgtidy.yaml") + return 0 + } + } + wd, err := os.Getwd() + if err != nil { + wd = "." + } + st, err := config.Load(wd) + if err != nil { + fmt.Fprintf(stderr, "pgtidy: %v\n", err) + return 2 + } + fmt.Fprintf(stdout, "indent: %q\n", st.Indent) + fmt.Fprintf(stdout, "newline: %q\n", st.Newline) + fmt.Fprintf(stdout, "keyword_case: %s\n", st.KeywordCase) + fmt.Fprintf(stdout, "ident_case: %s\n", st.IdentCase) + fmt.Fprintf(stdout, "type_case: %s\n", st.TypeCase) + fmt.Fprintf(stdout, "commas: %s\n", st.Commas) + return 0 +} diff --git a/cmd/pgtidy/fmt.go b/cmd/pgtidy/fmt.go index c01d560..66c4389 100644 --- a/cmd/pgtidy/fmt.go +++ b/cmd/pgtidy/fmt.go @@ -5,9 +5,9 @@ import ( "io" "os" - "github.com/hein/pgtidy/pkg/config" - "github.com/hein/pgtidy/pkg/format" - "github.com/hein/pgtidy/pkg/parser" + "git.warky.dev/wdevs/pgtidy/pkg/config" + "git.warky.dev/wdevs/pgtidy/pkg/format" + "git.warky.dev/wdevs/pgtidy/pkg/parser" ) // cmdFmt implements `pgtidy fmt`. It follows the gofmt model: with no flags it diff --git a/cmd/pgtidy/lint.go b/cmd/pgtidy/lint.go index b9a78ef..c2c0aa3 100644 --- a/cmd/pgtidy/lint.go +++ b/cmd/pgtidy/lint.go @@ -6,8 +6,8 @@ import ( "os" "strings" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/lint" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/lint" ) // cmdLint implements `pgtidy lint`. Reads one or more SQL files (or stdin) and @@ -19,6 +19,7 @@ import ( func cmdLint(args []string, stdin io.Reader, stdout, stderr io.Writer) int { var ( only []string // --only=ID,ID rule filter + fix bool files []string ) for _, a := range args { @@ -26,6 +27,8 @@ func cmdLint(args []string, stdin io.Reader, stdout, stderr io.Writer) int { case a == "-h" || a == "--help": lintUsage(stdout) return 0 + case a == "--fix": + fix = true case strings.HasPrefix(a, "--only="): ids := strings.Split(strings.TrimPrefix(a, "--only="), ",") for _, id := range ids { @@ -89,6 +92,13 @@ func cmdLint(args []string, stdin io.Reader, stdout, stderr io.Writer) int { fmt.Fprintf(stderr, "pgtidy: %v\n", err) return 2 } + if fix { + fixed := lint.ApplyFixes(string(src), diags) + if fixed != string(src) { + io.WriteString(stdout, fixed) + return 0 + } + } printDiags(diags) if len(diags) > 0 { found = true @@ -105,6 +115,21 @@ func cmdLint(args []string, stdin io.Reader, stdout, stderr io.Writer) int { fmt.Fprintf(stderr, "pgtidy: %v\n", err) return 2 } + if fix { + fixed := lint.ApplyFixes(string(src), diags) + if fixed != string(src) { + if err := os.WriteFile(path, []byte(fixed), 0o644); err != nil { + fmt.Fprintf(stderr, "pgtidy: writing %s: %v\n", path, err) + return 2 + } + // Re-check to report any remaining unfixed diagnostics. + diags, err = check(fixed, path) + if err != nil { + fmt.Fprintf(stderr, "pgtidy: %v\n", err) + return 2 + } + } + } printDiags(diags) if len(diags) > 0 { found = true @@ -124,6 +149,7 @@ func lintUsage(w io.Writer) { Read SQL from files (or stdin) and report lint findings. Flags: + --fix Apply autofixes for fixable rules (MIG001, MIG003) and rewrite files --only=ID,... comma-separated rule IDs to enable (default: all rules) -h, --help show this help diff --git a/cmd/pgtidy/lsp.go b/cmd/pgtidy/lsp.go new file mode 100644 index 0000000..936c07f --- /dev/null +++ b/cmd/pgtidy/lsp.go @@ -0,0 +1,28 @@ +package main + +import ( + "context" + "fmt" + "io" + "os" + + "git.warky.dev/wdevs/pgtidy/pkg/lsp" +) + +func cmdLsp(args []string, stdin io.Reader, stdout, stderr io.Writer) int { + for _, a := range args { + if a == "-h" || a == "--help" { + fmt.Fprintln(stdout, "pgtidy lsp — start the Language Server Protocol server (stdio transport)") + return 0 + } + } + wd, err := os.Getwd() + if err != nil { + wd = "." + } + if err := lsp.Serve(context.Background(), stdin, stdout, wd); err != nil { + fmt.Fprintf(stderr, "pgtidy lsp: %v\n", err) + return 1 + } + return 0 +} diff --git a/cmd/pgtidy/main.go b/cmd/pgtidy/main.go index f29ad1d..04cdae5 100644 --- a/cmd/pgtidy/main.go +++ b/cmd/pgtidy/main.go @@ -24,6 +24,10 @@ func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int { return cmdFmt(args[1:], stdin, stdout, stderr) case "lint": return cmdLint(args[1:], stdin, stdout, stderr) + case "lsp": + return cmdLsp(args[1:], stdin, stdout, stderr) + case "config": + return cmdConfig(args[1:], stdin, stdout, stderr) case "version", "--version", "-v": fmt.Fprintf(stdout, "pgtidy %s\n", version) return 0 @@ -41,10 +45,12 @@ func usage(w io.Writer) { fmt.Fprint(w, `pgtidy — PostgreSQL formatter and linter Usage: - pgtidy fmt [flags] [files...] Format SQL/PL-pgSQL (stdin if no files) - pgtidy lint [flags] [files...] Lint SQL (stdin if no files) - pgtidy version Print version - pgtidy help Show this help + pgtidy fmt [flags] [files...] Format SQL/PL-pgSQL (stdin if no files) + pgtidy lint [flags] [files...] Lint SQL (stdin if no files) + pgtidy config Print effective configuration + pgtidy lsp Start LSP server (stdio, for editors) + pgtidy version Print version + pgtidy help Show this help fmt flags: -w, --write Rewrite files in place diff --git a/docs/todo.md b/docs/todo.md index eb67906..7418576 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -9,7 +9,7 @@ Legend: ✅ done · 🚧 in progress · ⬜ not started ## V1 — Formatter + CLI (current milestone) ### ✅ Scaffold module + repo hygiene -- `go.mod` (`module github.com/hein/pgtidy`, go 1.26). +- `go.mod` (`module git.warky.dev/wdevs/pgtidy`, go 1.26). - Replaced WkMailSync boilerplate: `AGENTS.md` (PgTidy architecture + invariants), `CLAUDE.md`, `Makefile` (`build`/`test`/`vet`/`fmt`/`lint`/`clean`). - Directory layout created (`cmd/`, `pkg/...`, `testdata/`). @@ -108,21 +108,33 @@ Legend: ✅ done · 🚧 in progress · ⬜ not started - NAM001/2/3 table/column/function names not snake_case (quoted identifiers only) - `pgtidy lint [--only=ID,...] [files...]`; exits 1 on findings, 2 on error. - Fixture SQL in `testdata/lint/`; 6 tests covering violations + clean fixtures. -- _`--fix` for autofixable rules: future._ +- `--fix` rewrites files in place applying autofixes; for stdin, prints fixed SQL to stdout. +- Autofixable: **MIG001** (insert `CONCURRENTLY` after `INDEX`) and **MIG003** (insert `NOT VALID` before `;`). MIG002, COR*, NAM* are intentionally not autofixable. +- `pkg/diagnostics.TextFix{Offset, End, New, Title}` — byte-range replacement attached to `Diagnostic.Fix`. +- `pkg/lint.ApplyFixes` — applies all fixes in reverse-offset order; overlapping fixes skipped. +- Fix helpers (`mig001Fix`, `mig003Fix`) handle pg_query's convention of `StmtLen` excluding the trailing `;`. -## V3 — LSP + VSCode (later) -- `pkg/lsp`: formatting + range formatting, publishDiagnostics, codeAction quick-fixes. -- `editors/vscode`: TS extension (`vscode-languageclient`) launching bundled `pgtidy lsp`; - per-platform VSIX matrix in CI (rust-analyzer model) + target-less fallback. +## ✅ V3 — LSP + VSCode +- `pkg/lsp`: JSON-RPC 2.0 over stdio; `textDocument/formatting` (full document), `publishDiagnostics` on every open/change, `textDocument/codeAction` quick-fixes, lifecycle (initialize/shutdown/exit). No external deps. +- `cmd/pgtidy/lsp.go`: `pgtidy lsp` subcommand; config discovered from cwd. +- `editors/vscode/`: TS extension using `vscode-languageclient`; launches `pgtidy lsp` via stdio; `.pgsql` mapped to `sql` language; `pgtidy.path` / `pgtidy.enable` settings. +- _Range formatting: future._ -## V4 — DataGrip (later) -- `editors/datagrip`: integrate via free **LSP4IJ** plugin. +## ✅ V4 — DataGrip +- `editors/datagrip/`: Gradle-based JetBrains plugin targeting DataGrip 2024.3+ via LSP4IJ. + - `build.gradle.kts` / `settings.gradle.kts` / `gradle.properties` — IntelliJ Platform Gradle Plugin v2. + - `plugin.xml` — registers `PgTidyServerFactory` as an LSP4IJ `` extension and maps `*.sql`/`*.pgsql` to it. + - `PgTidyServerFactory.kt` + `PgTidyServerConnection.kt` — launches `pgtidy lsp` via `ProcessStreamConnectionProvider`. + - Requires LSP4IJ plugin installed in the IDE; `pgtidy` binary on PATH. --- -## Build / release (cross-cutting) -- ⬜ Add goreleaser for the multi-platform binary matrix (clean: no cgo). -- `make_release.sh` retained from boilerplate (generic version tagging). +## ✅ Build / release (cross-cutting) +- `.goreleaser.yaml`: multi-platform matrix — linux/darwin × amd64/arm64 + windows/amd64; no CGO; ldflags version injection; draft GitHub release. +- `Makefile` extended: `snapshot` (local multi-platform build), `release` (publish), `vscode-compile`, `vscode-package`. +- `.github/workflows/ci.yml`: test + vet + gofmt check + goreleaser snapshot on every push/PR. +- `.github/workflows/release.yml`: goreleaser publish + VSCode `.vsix` artifact on `v*` tag. +- `make_release.sh` retained from boilerplate. ## Core invariants (must always hold — tested) 1. ✅ Lossless lex: `emit(Lex(src)) == src` (corpus round-trip). diff --git a/editors/datagrip/.gitignore b/editors/datagrip/.gitignore new file mode 100644 index 0000000..5675024 --- /dev/null +++ b/editors/datagrip/.gitignore @@ -0,0 +1,3 @@ +.gradle/ +build/ +*.zip diff --git a/editors/datagrip/README.md b/editors/datagrip/README.md new file mode 100644 index 0000000..5aab621 --- /dev/null +++ b/editors/datagrip/README.md @@ -0,0 +1,37 @@ +# PgTidy — DataGrip / JetBrains Plugin + +Formats and lints SQL files in DataGrip (and any JetBrains IDE) via the LSP4IJ plugin. + +## Requirements + +- `pgtidy` binary on `PATH` — download from [releases](https://git.warky.dev/wdevs/PgTidy/releases) or build with `go install git.warky.dev/wdevs/pgtidy/cmd/pgtidy@latest` +- [LSP4IJ](https://plugins.jetbrains.com/plugin/23257-lsp4ij) plugin installed (free, by Red Hat) +- DataGrip 2024.3+ (or any JetBrains IDE 2024.3+) + +## Install the plugin + +### Option A — Install from disk (`.zip`) + +1. Build: `./gradlew buildPlugin` (output in `build/distributions/`) +2. In DataGrip: **Settings → Plugins → ⚙ → Install Plugin from Disk…** → select the `.zip` +3. Restart the IDE + +### Option B — Install LSP4IJ and configure manually (no plugin build needed) + +1. Install **LSP4IJ** from the marketplace (**Settings → Plugins → Marketplace → search "LSP4IJ"**) +2. Go to **Settings → Language Servers → + (Add)** +3. Fill in: + - **Name:** `PgTidy` + - **Command:** `pgtidy lsp` +4. Under **Mappings**, add file patterns: `*.sql`, `*.pgsql` +5. Click **OK** and restart the IDE + +## Features + +- **Formatting** — `Code → Reformat Code` (`Ctrl+Alt+L`) formats the current SQL file +- **Diagnostics** — lint findings shown as inspections (MIG001–MIG003, COR001–003, NAM001–003) +- **Quick fixes** — intention actions for MIG001 (add `CONCURRENTLY`) and MIG003 (add `NOT VALID`) + +## Troubleshooting + +**Server not starting:** Check **View → Tool Windows → LSP4IJ Consoles** for stderr output. Most common cause: `pgtidy` not found on `PATH` — update the command to the full path, e.g. `/usr/local/bin/pgtidy lsp`. diff --git a/editors/datagrip/build.gradle.kts b/editors/datagrip/build.gradle.kts new file mode 100644 index 0000000..474ca3a --- /dev/null +++ b/editors/datagrip/build.gradle.kts @@ -0,0 +1,48 @@ +plugins { + id("org.jetbrains.intellij.platform") version "2.3.0" + kotlin("jvm") version "2.0.0" +} + +group = providers.gradleProperty("pluginGroup").get() +version = providers.gradleProperty("pluginVersion").get() + +kotlin { + jvmToolchain(17) +} + +repositories { + mavenCentral() + intellijPlatform { + defaultRepositories() + } +} + +dependencies { + intellijPlatform { + val platformVersion = providers.gradleProperty("platformVersion") + val platformType = providers.gradleProperty("platformType") + create(platformType, platformVersion) + bundledPlugin("com.intellij.database") + plugin("com.redhat.devtools.lsp4ij:${providers.gradleProperty("lsp4ijVersion").get()}") + instrumentationTools() + } +} + +intellijPlatform { + pluginConfiguration { + name = providers.gradleProperty("pluginName") + version = providers.gradleProperty("pluginVersion") + ideaVersion { + sinceBuild = providers.gradleProperty("pluginSinceBuild") + } + } + signing { + // Set CERTIFICATE_CHAIN, PRIVATE_KEY, PRIVATE_KEY_PASSWORD env vars for release signing. + certificateChain = providers.environmentVariable("CERTIFICATE_CHAIN") + privateKey = providers.environmentVariable("PRIVATE_KEY") + privateKeyPassword = providers.environmentVariable("PRIVATE_KEY_PASSWORD") + } + publishing { + token = providers.environmentVariable("PUBLISH_TOKEN") + } +} diff --git a/editors/datagrip/gradle.properties b/editors/datagrip/gradle.properties new file mode 100644 index 0000000..6dfc5d5 --- /dev/null +++ b/editors/datagrip/gradle.properties @@ -0,0 +1,8 @@ +pluginGroup=com.pgtidy +pluginName=PgTidy +pluginVersion=0.1.0 +pluginSinceBuild=243 +# DataGrip 2024.3 +platformVersion=2024.3 +platformType=DB +lsp4ijVersion=0.8.0 diff --git a/editors/datagrip/settings.gradle.kts b/editors/datagrip/settings.gradle.kts new file mode 100644 index 0000000..4a2ccd3 --- /dev/null +++ b/editors/datagrip/settings.gradle.kts @@ -0,0 +1,5 @@ +rootProject.name = "pgtidy-datagrip" + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" +} diff --git a/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerConnection.kt b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerConnection.kt new file mode 100644 index 0000000..7cf955b --- /dev/null +++ b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerConnection.kt @@ -0,0 +1,9 @@ +package com.pgtidy.datagrip + +import com.intellij.openapi.project.Project +import com.redhat.devtools.lsp4ij.server.ProcessStreamConnectionProvider + +class PgTidyServerConnection(project: Project) : ProcessStreamConnectionProvider( + listOf("pgtidy", "lsp"), + project.basePath ?: System.getProperty("user.home"), +) diff --git a/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerFactory.kt b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerFactory.kt new file mode 100644 index 0000000..5c1a202 --- /dev/null +++ b/editors/datagrip/src/main/kotlin/com/pgtidy/datagrip/PgTidyServerFactory.kt @@ -0,0 +1,10 @@ +package com.pgtidy.datagrip + +import com.intellij.openapi.project.Project +import com.redhat.devtools.lsp4ij.LanguageServerFactory +import com.redhat.devtools.lsp4ij.server.StreamConnectionProvider + +class PgTidyServerFactory : LanguageServerFactory { + override fun createConnectionProvider(project: Project): StreamConnectionProvider = + PgTidyServerConnection(project) +} diff --git a/editors/datagrip/src/main/resources/META-INF/plugin.xml b/editors/datagrip/src/main/resources/META-INF/plugin.xml new file mode 100644 index 0000000..f9a56fb --- /dev/null +++ b/editors/datagrip/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,27 @@ + + com.pgtidy.datagrip + PgTidy + 0.1.0 + Warky Devs + pgtidy.
+ Requires the pgtidy binary on PATH and the + LSP4IJ plugin. + ]]> + + com.intellij.modules.platform + com.intellij.database + com.redhat.devtools.lsp4ij + + + + PostgreSQL formatter and linter (pgtidy lsp) + + + + + diff --git a/editors/datagrip/src/main/resources/META-INF/pluginIcon.png b/editors/datagrip/src/main/resources/META-INF/pluginIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..031c505abb1a59bef937f5cdcb3b65d120015193 GIT binary patch literal 22220 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 a1MUEmCk?H8IPl-o3D8i{RjyXFiTEFT(4c_; literal 0 HcmV?d00001 diff --git a/editors/vscode/.gitignore b/editors/vscode/.gitignore new file mode 100644 index 0000000..81b9b88 --- /dev/null +++ b/editors/vscode/.gitignore @@ -0,0 +1,4 @@ +out/ +node_modules/ +*.vsix +assets/ diff --git a/editors/vscode/.vscodeignore b/editors/vscode/.vscodeignore new file mode 100644 index 0000000..7524234 --- /dev/null +++ b/editors/vscode/.vscodeignore @@ -0,0 +1,10 @@ +.vscode/** +src/** +node_modules/** +.gitignore +.gitattributes +tsconfig.json +pnpm-lock.yaml +pnpm-workspace.yaml +**/*.ts +**/*.map diff --git a/editors/vscode/LICENSE b/editors/vscode/LICENSE new file mode 120000 index 0000000..30cff74 --- /dev/null +++ b/editors/vscode/LICENSE @@ -0,0 +1 @@ +../../LICENSE \ No newline at end of file diff --git a/editors/vscode/README.md b/editors/vscode/README.md new file mode 100644 index 0000000..988e1b3 --- /dev/null +++ b/editors/vscode/README.md @@ -0,0 +1,75 @@ +# PgTidy — VSCode Extension + +Formats and lints PostgreSQL/PL-pgSQL files using the `pgtidy` language server. + +## Requirements + +- `pgtidy` binary on `PATH` (see [Build the binary](#build-the-binary) below) +- Go 1.21+ (to build from source) +- VSCode 1.85+ + +## Build the binary + +**Option A — install directly with Go (recommended):** + +```sh +go install git.warky.dev/wdevs/pgtidy/cmd/pgtidy@latest +``` + +The binary lands in `$(go env GOPATH)/bin/`. Make sure that directory is on your `PATH`. + +**Option B — build from source and place manually:** + +```sh +git clone https://git.warky.dev/wdevs/PgTidy +cd PgTidy +go build -o pgtidy ./cmd/pgtidy + +# Linux / macOS — move to a directory on PATH +mv pgtidy /usr/local/bin/ + +# Windows — move to a directory on PATH, e.g. +# move pgtidy.exe C:\tools\ +``` + +Verify the binary is reachable: + +```sh +pgtidy version +``` + +If you place it somewhere not on `PATH`, set the full path in VSCode settings: + +```json +"pgtidy.path": "/path/to/pgtidy" +``` + +## Install from `.vsix` + +1. Build the package: `pnpm run build && pnpm run package` +2. In VSCode: **Extensions** → `···` menu → **Install from VSIX…** → select `pgtidy-*.vsix` + +Or via CLI: + +```sh +code --install-extension pgtidy-0.1.0.vsix +``` + +## Settings + +| Setting | Default | Description | +|---|---|---| +| `pgtidy.path` | `"pgtidy"` | Path to the binary if not on `PATH` | +| `pgtidy.enable` | `true` | Enable/disable the language server | + +## Features + +- **Format on save** — configure via VSCode's `editor.formatOnSave` +- **Diagnostics** — lint findings shown inline as you type (MIG001–MIG003, COR001–003, NAM001–003) +- **Quick fixes** — lightbulb actions for MIG001 (add `CONCURRENTLY`) and MIG003 (add `NOT VALID`) + +`.sql` and `.pgsql` files are both handled. + +## Troubleshooting + +**No formatting / diagnostics:** Open the Output panel → select **PgTidy** to see server errors. Most common cause: `pgtidy` not found — set `pgtidy.path` to the full binary path. diff --git a/editors/vscode/package.json b/editors/vscode/package.json new file mode 100644 index 0000000..aa19824 --- /dev/null +++ b/editors/vscode/package.json @@ -0,0 +1,88 @@ +{ + "name": "pgtidy", + "displayName": "PgTidy", + "description": "PostgreSQL formatter and linter powered by pgtidy", + "version": "0.1.0", + "publisher": "warky-devs", + "author": { + "name": "Hein Puth", + "email": "hein.puth@gmail.com" + }, + "icon": "assets/logo_256.png", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://git.warky.dev/wdevs/PgTidy" + }, + "engines": { + "vscode": "^1.85.0" + }, + "categories": [ + "Formatters", + "Linters" + ], + "activationEvents": [ + "onCommand:pgtidy.showVersion", + "onCommand:pgtidy.showConfig", + "onCommand:pgtidy.formatDocument" + ], + "main": "./out/extension", + "contributes": { + "commands": [ + { + "command": "pgtidy.showVersion", + "title": "Show Version", + "category": "PgTidy" + }, + { + "command": "pgtidy.showConfig", + "title": "Show Config", + "category": "PgTidy" + }, + { + "command": "pgtidy.formatDocument", + "title": "Format Document", + "category": "PgTidy" + } + ], + "languages": [ + { + "id": "sql", + "extensions": [ + ".pgsql" + ] + } + ], + "configuration": { + "title": "PgTidy", + "properties": { + "pgtidy.path": { + "type": "string", + "default": "pgtidy", + "description": "Path to the pgtidy binary. Defaults to 'pgtidy' (must be on PATH)." + }, + "pgtidy.enable": { + "type": "boolean", + "default": true, + "description": "Enable the PgTidy language server." + } + } + } + }, + "scripts": { + "build": "tsc -p ./", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "package": "vsce package --no-dependencies", + "lint": "eslint src --ext ts" + }, + "dependencies": { + "vscode-languageclient": "^9.0.1" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "@vscode/vsce": "^2.24.0", + "typescript": "^5.3.0" + } +} \ No newline at end of file diff --git a/editors/vscode/pnpm-lock.yaml b/editors/vscode/pnpm-lock.yaml new file mode 100644 index 0000000..382dc10 --- /dev/null +++ b/editors/vscode/pnpm-lock.yaml @@ -0,0 +1,1589 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + vscode-languageclient: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.43 + '@types/vscode': + specifier: ^1.85.0 + version: 1.125.0 + '@vscode/vsce': + specifier: ^2.24.0 + version: 2.32.0 + typescript: + specifier: ^5.3.0 + version: 5.9.3 + +packages: + + '@azure/abort-controller@2.1.2': + resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} + engines: {node: '>=18.0.0'} + + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} + engines: {node: '>=20.0.0'} + + '@azure/core-client@1.10.2': + resolution: {integrity: sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-rest-pipeline@1.24.0': + resolution: {integrity: sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==} + engines: {node: '>=20.0.0'} + + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} + engines: {node: '>=20.0.0'} + + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} + engines: {node: '>=20.0.0'} + + '@azure/identity@4.13.1': + resolution: {integrity: sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==} + engines: {node: '>=20.0.0'} + + '@azure/logger@1.3.0': + resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} + engines: {node: '>=20.0.0'} + + '@azure/msal-browser@5.15.0': + resolution: {integrity: sha512-2NYT6v+eeQn8kmNddr9LnbXSvXbVELpmFMmfFvtRxD7I/5+5GlkMlncApeuRFj+mY6C9syOwQip1a0Y+TIbyiA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@16.10.0': + resolution: {integrity: sha512-iYtjpanlv6963Jprs0MvzIap07V+QhultjQctfbEDQCflsDAEeO3R7XnVA5gk30fhoBFLdgJT7VqO0TGsEsN9w==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@5.3.0': + resolution: {integrity: sha512-fXtJX811pX8y8QlrQqBSH6+plvWyKZDI0IxkheAcyAw9OtcpXyFivmTC7eGUqutLWaDlKXuQ3yOESD4zAmkjHg==} + engines: {node: '>=20'} + + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + + '@types/vscode@1.125.0': + resolution: {integrity: sha512-0icm/ZQAaism87P0ekHqi4/Ju9du+Tm0RUW+y7vqRsxY2cY0FNRX1nAnaW7nT6npPt2tfHiheZ55Zm9UhqonFA==} + + '@typespec/ts-http-runtime@0.3.6': + resolution: {integrity: sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==} + engines: {node: '>=20.0.0'} + + '@vscode/vsce-sign-alpine-arm64@2.0.6': + resolution: {integrity: sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==} + cpu: [arm64] + os: [alpine] + + '@vscode/vsce-sign-alpine-x64@2.0.6': + resolution: {integrity: sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==} + cpu: [x64] + os: [alpine] + + '@vscode/vsce-sign-darwin-arm64@2.0.6': + resolution: {integrity: sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==} + cpu: [arm64] + os: [darwin] + + '@vscode/vsce-sign-darwin-x64@2.0.6': + resolution: {integrity: sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==} + cpu: [x64] + os: [darwin] + + '@vscode/vsce-sign-linux-arm64@2.0.6': + resolution: {integrity: sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==} + cpu: [arm64] + os: [linux] + + '@vscode/vsce-sign-linux-arm@2.0.6': + resolution: {integrity: sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==} + cpu: [arm] + os: [linux] + + '@vscode/vsce-sign-linux-x64@2.0.6': + resolution: {integrity: sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==} + cpu: [x64] + os: [linux] + + '@vscode/vsce-sign-win32-arm64@2.0.6': + resolution: {integrity: sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==} + cpu: [arm64] + os: [win32] + + '@vscode/vsce-sign-win32-x64@2.0.6': + resolution: {integrity: sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==} + cpu: [x64] + os: [win32] + + '@vscode/vsce-sign@2.0.9': + resolution: {integrity: sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==} + + '@vscode/vsce@2.32.0': + resolution: {integrity: sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==} + engines: {node: '>= 16'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + azure-devops-node-api@12.5.0: + resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.15: + resolution: {integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} + engines: {node: '>=20.18.1'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + cockatiel@3.2.1: + resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} + engines: {node: '>=16'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@2.1.0: + resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + keytar@7.9.0: + resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + linkify-it@3.0.3: + resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + markdown-it@12.3.2: + resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + node-abi@3.92.0: + resolution: {integrity: sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==} + engines: {node: '>=10'} + + node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + + parse-semver@1.1.1: + resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + deprecated: No longer maintained. Please contact the author of the relevant native addon; alternatives are available. + hasBin: true + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read@1.0.7: + resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} + engines: {node: '>=0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + tar-fs@2.1.4: + resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tmp@0.2.7: + resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} + engines: {node: '>=14.14'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tunnel@0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + + typed-rest-client@1.8.11: + resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + underscore@1.13.8: + resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageclient@9.0.1: + resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} + engines: {vscode: ^1.82.0} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + + xml2js@0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + yazl@2.5.1: + resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} + +snapshots: + + '@azure/abort-controller@2.1.2': + dependencies: + tslib: 2.8.1 + + '@azure/core-auth@1.10.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-util': 1.13.1 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-client@1.10.2': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-rest-pipeline@1.24.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/core-tracing@1.3.1': + dependencies: + tslib: 2.8.1 + + '@azure/core-util@1.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/identity@4.13.1': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.2 + '@azure/core-rest-pipeline': 1.24.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + '@azure/msal-browser': 5.15.0 + '@azure/msal-node': 5.3.0 + open: 10.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/logger@1.3.0': + dependencies: + '@typespec/ts-http-runtime': 0.3.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure/msal-browser@5.15.0': + dependencies: + '@azure/msal-common': 16.10.0 + + '@azure/msal-common@16.10.0': {} + + '@azure/msal-node@5.3.0': + dependencies: + '@azure/msal-common': 16.10.0 + jsonwebtoken: 9.0.3 + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@types/vscode@1.125.0': {} + + '@typespec/ts-http-runtime@0.3.6': + dependencies: + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@vscode/vsce-sign-alpine-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-alpine-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-darwin-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-darwin-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-arm@2.0.6': + optional: true + + '@vscode/vsce-sign-linux-x64@2.0.6': + optional: true + + '@vscode/vsce-sign-win32-arm64@2.0.6': + optional: true + + '@vscode/vsce-sign-win32-x64@2.0.6': + optional: true + + '@vscode/vsce-sign@2.0.9': + optionalDependencies: + '@vscode/vsce-sign-alpine-arm64': 2.0.6 + '@vscode/vsce-sign-alpine-x64': 2.0.6 + '@vscode/vsce-sign-darwin-arm64': 2.0.6 + '@vscode/vsce-sign-darwin-x64': 2.0.6 + '@vscode/vsce-sign-linux-arm': 2.0.6 + '@vscode/vsce-sign-linux-arm64': 2.0.6 + '@vscode/vsce-sign-linux-x64': 2.0.6 + '@vscode/vsce-sign-win32-arm64': 2.0.6 + '@vscode/vsce-sign-win32-x64': 2.0.6 + + '@vscode/vsce@2.32.0': + dependencies: + '@azure/identity': 4.13.1 + '@vscode/vsce-sign': 2.0.9 + azure-devops-node-api: 12.5.0 + chalk: 2.4.2 + cheerio: 1.2.0 + cockatiel: 3.2.1 + commander: 6.2.1 + form-data: 4.0.6 + glob: 7.2.3 + hosted-git-info: 4.1.0 + jsonc-parser: 3.3.1 + leven: 3.1.0 + markdown-it: 12.3.2 + mime: 1.6.0 + minimatch: 3.1.5 + parse-semver: 1.1.1 + read: 1.0.7 + semver: 7.8.5 + tmp: 0.2.7 + typed-rest-client: 1.8.11 + url-join: 4.0.1 + xml2js: 0.5.0 + yauzl: 2.10.0 + yazl: 2.5.1 + optionalDependencies: + keytar: 7.9.0 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + azure-devops-node-api@12.5.0: + dependencies: + tunnel: 0.0.6 + typed-rest-client: 1.8.11 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: + optional: true + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + boolbase@1.0.0: {} + + brace-expansion@1.1.15: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + optional: true + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.2.0: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.1.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.28.0 + whatwg-mimetype: 4.0.0 + + chownr@1.1.4: + optional: true + + cockatiel@3.2.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-name@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@6.2.1: {} + + concat-map@0.0.1: {} + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + optional: true + + deep-extend@0.6.0: + optional: true + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: + optional: true + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + optional: true + + entities@2.1.0: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + escape-string-regexp@1.0.5: {} + + expand-template@2.0.3: + optional: true + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + fs-constants@1.0.0: + optional: true + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + github-from-package@0.0.0: + optional: true + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + gopd@1.2.0: {} + + has-flag@3.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + htmlparser2@10.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 7.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: + optional: true + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: + optional: true + + is-docker@3.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + jsonc-parser@3.3.1: {} + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.8.5 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keytar@7.9.0: + dependencies: + node-addon-api: 4.3.0 + prebuild-install: 7.1.3 + optional: true + + leven@3.1.0: {} + + linkify-it@3.0.3: + dependencies: + uc.micro: 1.0.6 + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.once@4.1.1: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + markdown-it@12.3.2: + dependencies: + argparse: 2.0.1 + entities: 2.1.0 + linkify-it: 3.0.3 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + math-intrinsics@1.1.0: {} + + mdurl@1.0.1: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-response@3.1.0: + optional: true + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.15 + + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.1 + + minimist@1.2.8: + optional: true + + mkdirp-classic@0.5.3: + optional: true + + ms@2.1.3: {} + + mute-stream@0.0.8: {} + + napi-build-utils@2.0.0: + optional: true + + node-abi@3.92.0: + dependencies: + semver: 7.8.5 + optional: true + + node-addon-api@4.3.0: + optional: true + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-inspect@1.13.4: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open@10.2.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + + parse-semver@1.1.1: + dependencies: + semver: 5.7.2 + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + path-is-absolute@1.0.1: {} + + pend@1.2.0: {} + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.1.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.92.0 + pump: 3.0.4 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.4 + tunnel-agent: 0.6.0 + optional: true + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + optional: true + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + optional: true + + read@1.0.7: + dependencies: + mute-stream: 0.0.8 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + optional: true + + run-applescript@7.1.0: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.6.0: {} + + semver@5.7.2: {} + + semver@7.8.5: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + simple-concat@1.0.1: + optional: true + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + optional: true + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + + strip-json-comments@2.0.1: + optional: true + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + tar-fs@2.1.4: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.4 + tar-stream: 2.2.0 + optional: true + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.5 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + optional: true + + tmp@0.2.7: {} + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + + tunnel@0.0.6: {} + + typed-rest-client@1.8.11: + dependencies: + qs: 6.15.3 + tunnel: 0.0.6 + underscore: 1.13.8 + + typescript@5.9.3: {} + + uc.micro@1.0.6: {} + + underscore@1.13.8: {} + + undici-types@6.21.0: {} + + undici@7.28.0: {} + + url-join@4.0.1: {} + + util-deprecate@1.0.2: + optional: true + + vscode-jsonrpc@8.2.0: {} + + vscode-languageclient@9.0.1: + dependencies: + minimatch: 5.1.9 + semver: 7.8.5 + vscode-languageserver-protocol: 3.17.5 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-types@3.17.5: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + wrappy@1.0.2: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + + xml2js@0.5.0: + dependencies: + sax: 1.6.0 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + yallist@4.0.0: {} + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + yazl@2.5.1: + dependencies: + buffer-crc32: 0.2.13 diff --git a/editors/vscode/pnpm-workspace.yaml b/editors/vscode/pnpm-workspace.yaml new file mode 100644 index 0000000..02de15a --- /dev/null +++ b/editors/vscode/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + '@vscode/vsce-sign': true + keytar: true diff --git a/editors/vscode/src/extension.ts b/editors/vscode/src/extension.ts new file mode 100644 index 0000000..c8dc056 --- /dev/null +++ b/editors/vscode/src/extension.ts @@ -0,0 +1,105 @@ +import * as cp from 'child_process'; +import * as path from 'path'; +import * as vscode from 'vscode'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind, +} from 'vscode-languageclient/node'; + +let client: LanguageClient | undefined; +let outputChannel: vscode.OutputChannel; + +export function activate(context: vscode.ExtensionContext): void { + outputChannel = vscode.window.createOutputChannel('PgTidy'); + context.subscriptions.push(outputChannel); + + // Commands are always registered so they work even when the LSP is disabled. + context.subscriptions.push( + vscode.commands.registerCommand('pgtidy.showVersion', cmdShowVersion), + vscode.commands.registerCommand('pgtidy.showConfig', cmdShowConfig), + vscode.commands.registerCommand('pgtidy.formatDocument', cmdFormatDocument), + ); + + const cfg = vscode.workspace.getConfiguration('pgtidy'); + if (!cfg.get('enable', true)) { + return; + } + + const bin = cfg.get('path', 'pgtidy'); + + const serverOptions: ServerOptions = { + command: bin, + args: ['lsp'], + transport: TransportKind.stdio, + }; + + const clientOptions: LanguageClientOptions = { + documentSelector: [{ scheme: 'file', language: 'sql' }], + synchronize: { + fileEvents: vscode.workspace.createFileSystemWatcher('**/*.{sql,pgsql}'), + }, + }; + + client = new LanguageClient('pgtidy', 'PgTidy', serverOptions, clientOptions); + context.subscriptions.push(client); + client.start(); +} + +export function deactivate(): Thenable | undefined { + return client?.stop(); +} + +function binary(): string { + return vscode.workspace.getConfiguration('pgtidy').get('path', 'pgtidy'); +} + +function contextDir(): string | undefined { + const folders = vscode.workspace.workspaceFolders; + if (folders && folders.length > 0) { + return folders[0].uri.fsPath; + } + const doc = vscode.window.activeTextEditor?.document; + if (doc && !doc.isUntitled) { + return path.dirname(doc.uri.fsPath); + } + return undefined; +} + +function cmdShowVersion(): void { + cp.execFile(binary(), ['version'], (err, stdout, stderr) => { + if (err) { + vscode.window.showErrorMessage(`PgTidy: ${stderr.trim() || err.message}`); + return; + } + vscode.window.showInformationMessage(stdout.trim()); + }); +} + +function cmdShowConfig(): void { + const cwd = contextDir(); + cp.execFile(binary(), ['config'], { cwd }, (err, stdout, stderr) => { + if (err) { + vscode.window.showErrorMessage(`PgTidy: ${stderr.trim() || err.message}`); + return; + } + outputChannel.clear(); + outputChannel.appendLine('PgTidy — effective configuration'); + if (cwd) { + outputChannel.appendLine(`(resolved from: ${cwd})`); + } + outputChannel.appendLine(''); + outputChannel.append(stdout); + outputChannel.show(true); + }); +} + +async function cmdFormatDocument(): Promise { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showWarningMessage('PgTidy: no active editor'); + return; + } + await vscode.commands.executeCommand('editor.action.formatDocument'); +} diff --git a/editors/vscode/tsconfig.json b/editors/vscode/tsconfig.json new file mode 100644 index 0000000..fd42190 --- /dev/null +++ b/editors/vscode/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "outDir": "out", + "lib": ["ES2020"], + "sourceMap": true, + "rootDir": "src", + "strict": true, + "skipLibCheck": true + }, + "exclude": ["node_modules", ".vscode-test"] +} diff --git a/go.mod b/go.mod index 736454d..0db9f40 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/hein/pgtidy +module git.warky.dev/wdevs/pgtidy go 1.26 diff --git a/pkg/cst/cst.go b/pkg/cst/cst.go index 5355061..f2c9c51 100644 --- a/pkg/cst/cst.go +++ b/pkg/cst/cst.go @@ -11,7 +11,7 @@ package cst import ( "strings" - "github.com/hein/pgtidy/pkg/lexer" + "git.warky.dev/wdevs/pgtidy/pkg/lexer" ) // Trivia is a run of whitespace/comment tokens preceding a significant token. diff --git a/pkg/diagnostics/diagnostics.go b/pkg/diagnostics/diagnostics.go index ed35b00..e46a5ed 100644 --- a/pkg/diagnostics/diagnostics.go +++ b/pkg/diagnostics/diagnostics.go @@ -12,6 +12,15 @@ const ( SeverityHint Severity = "hint" ) +// TextFix is a byte-range replacement that can be applied to the source SQL. +// Replace src[Offset:End] with New. An insertion has Offset == End. +type TextFix struct { + Offset int // byte offset in source (inclusive) + End int // byte offset in source (exclusive) + New string // replacement text + Title string // short description shown in editor UI +} + // Diagnostic is a single lint finding. type Diagnostic struct { // RuleID is the stable identifier for the rule that produced this finding @@ -27,4 +36,6 @@ type Diagnostic struct { Line int // Col is the 1-based column number of the finding. Col int + // Fix is non-nil when an autofix is available for this diagnostic. + Fix *TextFix } diff --git a/pkg/format/body.go b/pkg/format/body.go index b8103c7..c7390f5 100644 --- a/pkg/format/body.go +++ b/pkg/format/body.go @@ -3,9 +3,9 @@ package format import ( "strings" - "github.com/hein/pgtidy/pkg/config" - "github.com/hein/pgtidy/pkg/cst" - "github.com/hein/pgtidy/pkg/lexer" + "git.warky.dev/wdevs/pgtidy/pkg/config" + "git.warky.dev/wdevs/pgtidy/pkg/cst" + "git.warky.dev/wdevs/pgtidy/pkg/lexer" ) // sqlClauseKw: col-0 lines at paren-depth 0 starting with these keywords stay diff --git a/pkg/format/format.go b/pkg/format/format.go index afe2153..cdb6223 100644 --- a/pkg/format/format.go +++ b/pkg/format/format.go @@ -14,9 +14,9 @@ package format import ( "strings" - "github.com/hein/pgtidy/pkg/config" - "github.com/hein/pgtidy/pkg/cst" - "github.com/hein/pgtidy/pkg/lexer" + "git.warky.dev/wdevs/pgtidy/pkg/config" + "git.warky.dev/wdevs/pgtidy/pkg/cst" + "git.warky.dev/wdevs/pgtidy/pkg/lexer" ) // File formats a parsed file with the given style. diff --git a/pkg/format/format_test.go b/pkg/format/format_test.go index 50f722e..a38f584 100644 --- a/pkg/format/format_test.go +++ b/pkg/format/format_test.go @@ -6,9 +6,9 @@ import ( "strings" "testing" - "github.com/hein/pgtidy/pkg/config" - "github.com/hein/pgtidy/pkg/lexer" - "github.com/hein/pgtidy/pkg/parser" + "git.warky.dev/wdevs/pgtidy/pkg/config" + "git.warky.dev/wdevs/pgtidy/pkg/lexer" + "git.warky.dev/wdevs/pgtidy/pkg/parser" ) func format(src string) string { diff --git a/pkg/lint/fix.go b/pkg/lint/fix.go new file mode 100644 index 0000000..24dfd18 --- /dev/null +++ b/pkg/lint/fix.go @@ -0,0 +1,39 @@ +package lint + +import ( + "sort" + + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" +) + +// ApplyFixes applies all autofixes from diags to src and returns the result. +// Fixes are applied in reverse-offset order so earlier edits do not shift the +// byte positions of later ones. Overlapping fixes are skipped. +func ApplyFixes(src string, diags []diagnostics.Diagnostic) string { + type fix struct { + offset, end int + new string + } + var fixes []fix + for _, d := range diags { + if d.Fix != nil { + fixes = append(fixes, fix{d.Fix.Offset, d.Fix.End, d.Fix.New}) + } + } + if len(fixes) == 0 { + return src + } + sort.Slice(fixes, func(i, j int) bool { + return fixes[i].offset > fixes[j].offset + }) + b := []byte(src) + last := len(b) + 1 // sentinel: no fix applied yet + for _, f := range fixes { + if f.end > last { + continue // overlaps a previously applied fix; skip + } + last = f.offset + b = append(b[:f.offset], append([]byte(f.new), b[f.end:]...)...) + } + return string(b) +} diff --git a/pkg/lint/fix_test.go b/pkg/lint/fix_test.go new file mode 100644 index 0000000..4d9f7ae --- /dev/null +++ b/pkg/lint/fix_test.go @@ -0,0 +1,104 @@ +package lint_test + +import ( + "strings" + "testing" + + "git.warky.dev/wdevs/pgtidy/pkg/lint" +) + +func TestMIG001Fix(t *testing.T) { + src := "CREATE INDEX idx_orders_user ON orders(user_id);" + eng := lint.New() + diags, _ := eng.Check(src, "test.sql") + + var hasFix bool + for _, d := range diags { + if d.RuleID == "MIG001" && d.Fix != nil { + hasFix = true + } + } + if !hasFix { + t.Fatal("MIG001 diagnostic missing Fix") + } + + fixed := lint.ApplyFixes(src, diags) + if !strings.Contains(fixed, "CONCURRENTLY") { + t.Errorf("fix did not insert CONCURRENTLY; got: %s", fixed) + } + // Re-check: MIG001 should be gone + diags2, _ := eng.Check(fixed, "test.sql") + for _, d := range diags2 { + if d.RuleID == "MIG001" { + t.Errorf("MIG001 still fires after fix: %s", fixed) + } + } +} + +func TestMIG003Fix(t *testing.T) { + cases := []struct { + name string + src string + }{ + { + "FK constraint", + "ALTER TABLE orders ADD CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id);", + }, + { + "CHECK constraint", + "ALTER TABLE orders ADD CONSTRAINT chk_positive CHECK (amount > 0);", + }, + } + eng := lint.New() + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + diags, _ := eng.Check(tc.src, "test.sql") + var hasFix bool + for _, d := range diags { + if d.RuleID == "MIG003" && d.Fix != nil { + hasFix = true + } + } + if !hasFix { + t.Fatal("MIG003 diagnostic missing Fix") + } + fixed := lint.ApplyFixes(tc.src, diags) + if !strings.Contains(fixed, "NOT VALID") { + t.Errorf("fix did not insert NOT VALID; got: %s", fixed) + } + // Re-check: MIG003 should be gone + diags2, _ := eng.Check(fixed, "test.sql") + for _, d := range diags2 { + if d.RuleID == "MIG003" { + t.Errorf("MIG003 still fires after fix: %s", fixed) + } + } + }) + } +} + +func TestApplyFixes_MultipleInOneFile(t *testing.T) { + src := `CREATE INDEX a ON t(x); +ALTER TABLE t ADD CONSTRAINT fk FOREIGN KEY (x) REFERENCES u(id);` + + eng := lint.New() + diags, _ := eng.Check(src, "test.sql") + fixed := lint.ApplyFixes(src, diags) + + if !strings.Contains(fixed, "CONCURRENTLY") { + t.Error("CONCURRENTLY missing after multi-fix") + } + if !strings.Contains(fixed, "NOT VALID") { + t.Error("NOT VALID missing after multi-fix") + } +} + +func TestApplyFixes_NoFixes(t *testing.T) { + src := "SELECT 1;" + eng := lint.New() + diags, _ := eng.Check(src, "test.sql") + fixed := lint.ApplyFixes(src, diags) + if fixed != src { + t.Errorf("ApplyFixes changed unfixable source: %q", fixed) + } +} diff --git a/pkg/lint/lint.go b/pkg/lint/lint.go index d844f8e..9589571 100644 --- a/pkg/lint/lint.go +++ b/pkg/lint/lint.go @@ -11,8 +11,8 @@ import ( pg_query "github.com/pganalyze/pg_query_go/v6" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/pgast" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/pgast" ) // Rule is implemented by each lint rule. diff --git a/pkg/lint/lint_test.go b/pkg/lint/lint_test.go index c68fad0..01b1258 100644 --- a/pkg/lint/lint_test.go +++ b/pkg/lint/lint_test.go @@ -5,8 +5,8 @@ import ( "path/filepath" "testing" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/lint" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/lint" ) func fixtureDir() string { diff --git a/pkg/lint/rules_correctness.go b/pkg/lint/rules_correctness.go index bc00d64..79a3737 100644 --- a/pkg/lint/rules_correctness.go +++ b/pkg/lint/rules_correctness.go @@ -5,8 +5,8 @@ import ( pg_query "github.com/pganalyze/pg_query_go/v6" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/pgast" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/pgast" ) // COR001 — SELECT *. diff --git a/pkg/lint/rules_migration.go b/pkg/lint/rules_migration.go index 2b57d0a..bfb214f 100644 --- a/pkg/lint/rules_migration.go +++ b/pkg/lint/rules_migration.go @@ -2,11 +2,12 @@ package lint import ( "fmt" + "strings" pg_query "github.com/pganalyze/pg_query_go/v6" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/pgast" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/pgast" ) // MIG001 — CREATE INDEX without CONCURRENT. @@ -30,13 +31,17 @@ func (ruleMIG001) Check(stmts []*pg_query.RawStmt, src string) []diagnostics.Dia continue } line, col := pgast.LocationToLineCol(src, pgast.FirstTokenOffset(src, int(raw.StmtLocation))) - out = append(out, diagnostics.Diagnostic{ + d := diagnostics.Diagnostic{ RuleID: "MIG001", Severity: diagnostics.SeverityWarning, Message: fmt.Sprintf("CREATE INDEX on %q without CONCURRENT blocks writes; use CREATE INDEX CONCURRENTLY", relName(s.Relation)), Line: line, Col: col, - }) + } + if fix := mig001Fix(src, int(raw.StmtLocation), int(raw.StmtLen)); fix != nil { + d.Fix = fix + } + out = append(out, d) } return out } @@ -127,13 +132,17 @@ func (ruleMIG003) Check(stmts []*pg_query.RawStmt, src string) []diagnostics.Dia kind = "CHECK" } line, col := pgast.LocationToLineCol(src, pgast.FirstTokenOffset(src, int(raw.StmtLocation))) - out = append(out, diagnostics.Diagnostic{ + d := diagnostics.Diagnostic{ RuleID: "MIG003", Severity: diagnostics.SeverityWarning, Message: fmt.Sprintf("ALTER TABLE %q ADD %s CONSTRAINT without NOT VALID validates all rows immediately; use NOT VALID + VALIDATE CONSTRAINT", relName(tbl.Relation), kind), Line: line, Col: col, - }) + } + if fix := mig003Fix(src, int(raw.StmtLocation), int(raw.StmtLen)); fix != nil { + d.Fix = fix + } + out = append(out, d) } } return out @@ -169,3 +178,63 @@ func relName(rv *pg_query.RangeVar) string { } return rv.Relname } + +// stmtText returns the text of a statement given its start offset and length. +// When stmtLen is 0 (last statement in file) it extends to EOF. +func stmtText(src string, stmtOffset, stmtLen int) string { + end := stmtOffset + stmtLen + if stmtLen == 0 || end > len(src) { + end = len(src) + } + return src[stmtOffset:end] +} + +// mig001Fix builds the TextFix for MIG001: insert CONCURRENTLY after INDEX. +func mig001Fix(src string, stmtOffset, stmtLen int) *diagnostics.TextFix { + text := stmtText(src, stmtOffset, stmtLen) + upper := strings.ToUpper(text) + pos := strings.Index(upper, "INDEX") + if pos < 0 { + return nil + } + insertAt := stmtOffset + pos + len("INDEX") + return &diagnostics.TextFix{ + Offset: insertAt, + End: insertAt, + New: " CONCURRENTLY", + Title: "Add CONCURRENTLY", + } +} + +// mig003Fix builds the TextFix for MIG003: insert NOT VALID before the trailing semicolon. +// pg_query's StmtLen excludes the ";", which sits at src[stmtOffset+stmtLen]. +func mig003Fix(src string, stmtOffset, stmtLen int) *diagnostics.TextFix { + end := stmtOffset + stmtLen + semiAt := -1 + if stmtLen > 0 && end < len(src) && src[end] == ';' { + semiAt = end + } else { + // Fallback for stmtLen=0 (last statement without terminator) or edge cases. + if stmtLen == 0 { + end = len(src) + } + idx := strings.LastIndex(src[stmtOffset:end], ";") + if idx >= 0 { + semiAt = stmtOffset + idx + } + } + if semiAt < 0 { + return nil + } + // Insert " NOT VALID" just before the ";", after any trailing whitespace. + insertAt := semiAt + for insertAt > stmtOffset && (src[insertAt-1] == ' ' || src[insertAt-1] == '\t' || src[insertAt-1] == '\n' || src[insertAt-1] == '\r') { + insertAt-- + } + return &diagnostics.TextFix{ + Offset: insertAt, + End: insertAt, + New: " NOT VALID", + Title: "Add NOT VALID", + } +} diff --git a/pkg/lint/rules_naming.go b/pkg/lint/rules_naming.go index e528d79..27f64c7 100644 --- a/pkg/lint/rules_naming.go +++ b/pkg/lint/rules_naming.go @@ -7,8 +7,8 @@ import ( pg_query "github.com/pganalyze/pg_query_go/v6" - "github.com/hein/pgtidy/pkg/diagnostics" - "github.com/hein/pgtidy/pkg/pgast" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/pgast" ) // reSnakeCase matches valid snake_case identifiers: lowercase letters, digits, diff --git a/pkg/lsp/server.go b/pkg/lsp/server.go new file mode 100644 index 0000000..ca14d2e --- /dev/null +++ b/pkg/lsp/server.go @@ -0,0 +1,429 @@ +// Package lsp implements a Language Server Protocol server for PgTidy. +// +// The server communicates over stdio using JSON-RPC 2.0 with Content-Length +// framing. It provides: +// - textDocument/formatting — full-document formatting via pkg/format +// - textDocument/publishDiagnostics — lint findings via pkg/lint, sent on +// every didOpen/didChange notification +package lsp + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "io" + "strconv" + "strings" + + "git.warky.dev/wdevs/pgtidy/pkg/config" + "git.warky.dev/wdevs/pgtidy/pkg/diagnostics" + "git.warky.dev/wdevs/pgtidy/pkg/format" + "git.warky.dev/wdevs/pgtidy/pkg/lint" + "git.warky.dev/wdevs/pgtidy/pkg/parser" +) + +// Serve runs the LSP server, reading JSON-RPC messages from r and writing to w. +// startDir is used for .pgtidy.yaml discovery. Returns when the client sends +// "exit" or r reaches EOF. +func Serve(ctx context.Context, r io.Reader, w io.Writer, startDir string) error { + cfg, _ := config.Load(startDir) + srv := &server{ + docs: make(map[string]string), + fixes: make(map[string][]diagnostics.Diagnostic), + cfg: cfg, + w: w, + } + return srv.loop(ctx, r) +} + +type server struct { + docs map[string]string // URI → current text + fixes map[string][]diagnostics.Diagnostic // URI → diagnostics that have fixes + cfg config.Style + w io.Writer +} + +func (s *server) loop(ctx context.Context, r io.Reader) error { + br := bufio.NewReader(r) + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + raw, err := readMsg(br) + if err != nil { + if err == io.EOF { + return nil + } + return err + } + if s.handle(raw) { + return nil + } + } +} + +// handle dispatches one JSON-RPC message. Returns true when the server should exit. +func (s *server) handle(raw []byte) bool { + var req rpcMsg + if err := json.Unmarshal(raw, &req); err != nil { + return false + } + + switch req.Method { + case "initialize": + s.reply(req.ID, initResult{ + Capabilities: serverCaps{ + TextDocumentSync: 1, // full sync + DocumentFormattingProvider: true, + CodeActionProvider: true, + }, + }) + case "initialized": // no-op notification + case "shutdown": + s.reply(req.ID, nil) + case "exit": + return true + case "textDocument/didOpen": + var p didOpenParams + json.Unmarshal(req.Params, &p) + s.docs[p.TextDocument.URI] = p.TextDocument.Text + s.pushDiagnostics(p.TextDocument.URI, p.TextDocument.Text) + case "textDocument/didChange": + var p didChangeParams + json.Unmarshal(req.Params, &p) + if len(p.ContentChanges) > 0 { + text := p.ContentChanges[len(p.ContentChanges)-1].Text + s.docs[p.TextDocument.URI] = text + s.pushDiagnostics(p.TextDocument.URI, text) + } + case "textDocument/didClose": + var p struct { + TextDocument textDocID `json:"textDocument"` + } + json.Unmarshal(req.Params, &p) + delete(s.docs, p.TextDocument.URI) + delete(s.fixes, p.TextDocument.URI) + s.notify("textDocument/publishDiagnostics", publishDiagnosticsParams{ + URI: p.TextDocument.URI, + Diagnostics: []lspDiagnostic{}, + }) + case "textDocument/formatting": + var p formattingParams + json.Unmarshal(req.Params, &p) + text, ok := s.docs[p.TextDocument.URI] + if !ok { + s.reply(req.ID, []textEdit{}) + return false + } + formatted := format.File(parser.Parse(text), s.cfg) + if formatted == text { + s.reply(req.ID, []textEdit{}) + return false + } + s.reply(req.ID, []textEdit{fullReplace(text, formatted)}) + case "textDocument/codeAction": + var p codeActionParams + json.Unmarshal(req.Params, &p) + s.handleCodeAction(req.ID, p) + case "$/cancelRequest": // ignore + default: + if req.ID != nil { + s.replyErr(req.ID, -32601, "method not found: "+req.Method) + } + } + return false +} + +func (s *server) pushDiagnostics(uri, text string) { + eng := lint.New() + diags, _ := eng.Check(text, uri) + + var fixable []diagnostics.Diagnostic + out := make([]lspDiagnostic, 0, len(diags)) + for _, d := range diags { + line := uint32(d.Line) + if line > 0 { + line-- + } + col := uint32(d.Col) + if col > 0 { + col-- + } + lspD := lspDiagnostic{ + Range: lspRange{Start: position{line, col}, End: position{line, col + 1}}, + Severity: severityCode(d.Severity), + Code: d.RuleID, + Source: "pgtidy", + Message: d.Message, + } + out = append(out, lspD) + if d.Fix != nil { + fixable = append(fixable, d) + } + } + s.fixes[uri] = fixable + s.notify("textDocument/publishDiagnostics", publishDiagnosticsParams{ + URI: uri, + Diagnostics: out, + }) +} + +func (s *server) handleCodeAction(id json.RawMessage, p codeActionParams) { + uri := p.TextDocument.URI + text, ok := s.docs[uri] + if !ok { + s.reply(id, []codeAction{}) + return + } + var actions []codeAction + for _, d := range s.fixes[uri] { + if d.Fix == nil { + continue + } + start := offsetToPosition(text, d.Fix.Offset) + end := offsetToPosition(text, d.Fix.End) + // Only include if the fix range overlaps the requested range. + if !rangesOverlap(start, end, p.Range.Start, p.Range.End) { + continue + } + actions = append(actions, codeAction{ + Title: d.Fix.Title, + Kind: "quickfix", + Edit: &workspaceEdit{ + Changes: map[string][]textEdit{ + uri: {{ + Range: lspRange{Start: start, End: end}, + NewText: d.Fix.New, + }}, + }, + }, + }) + } + s.reply(id, actions) +} + +// offsetToPosition converts a byte offset in text to an LSP position. +func offsetToPosition(text string, byteOff int) position { + if byteOff > len(text) { + byteOff = len(text) + } + line := uint32(0) + lastNL := -1 + for i := 0; i < byteOff; i++ { + if text[i] == '\n' { + line++ + lastNL = i + } + } + return position{line, uint32(byteOff - lastNL - 1)} +} + +// rangesOverlap returns true when [s1,e1) and [s2,e2) share any point. +// For insertions (s==e) we check if the point falls within the other range. +func rangesOverlap(s1, e1, s2, e2 position) bool { + cmp := func(a, b position) int { + if a.Line != b.Line { + if a.Line < b.Line { + return -1 + } + return 1 + } + if a.Character < b.Character { + return -1 + } + if a.Character > b.Character { + return 1 + } + return 0 + } + return cmp(s1, e2) <= 0 && cmp(s2, e1) <= 0 +} + +func severityCode(sev diagnostics.Severity) int { + switch sev { + case diagnostics.SeverityError: + return 1 + case diagnostics.SeverityWarning: + return 2 + case diagnostics.SeverityHint: + return 4 + } + return 3 // info +} + +// fullReplace builds a TextEdit that replaces the entire document. +func fullReplace(orig, formatted string) textEdit { + lines := strings.Split(orig, "\n") + lastLine := uint32(len(lines) - 1) + lastChar := uint32(len(lines[lastLine])) + return textEdit{ + Range: lspRange{Start: position{0, 0}, End: position{lastLine, lastChar}}, + NewText: formatted, + } +} + +// --- JSON-RPC 2.0 transport --- + +func readMsg(r *bufio.Reader) ([]byte, error) { + length := 0 + for { + line, err := r.ReadString('\n') + if err != nil { + return nil, err + } + line = strings.TrimRight(line, "\r\n") + if line == "" { + break + } + if after, ok := strings.CutPrefix(line, "Content-Length: "); ok { + length, _ = strconv.Atoi(after) + } + } + if length == 0 { + return nil, fmt.Errorf("lsp: missing Content-Length") + } + buf := make([]byte, length) + _, err := io.ReadFull(r, buf) + return buf, err +} + +func (s *server) send(v interface{}) { + data, err := json.Marshal(v) + if err != nil { + return + } + fmt.Fprintf(s.w, "Content-Length: %d\r\n\r\n", len(data)) + s.w.Write(data) //nolint:errcheck +} + +func (s *server) reply(id json.RawMessage, result interface{}) { + s.send(rpcResponse{JSONRPC: "2.0", ID: id, Result: result}) +} + +func (s *server) replyErr(id json.RawMessage, code int, msg string) { + s.send(rpcResponse{JSONRPC: "2.0", ID: id, Error: &rpcError{Code: code, Message: msg}}) +} + +func (s *server) notify(method string, params interface{}) { + s.send(rpcNotification{JSONRPC: "2.0", Method: method, Params: params}) +} + +// --- JSON-RPC 2.0 wire types --- + +type rpcMsg struct { + JSONRPC string `json:"jsonrpc"` + ID json.RawMessage `json:"id,omitempty"` + Method string `json:"method"` + Params json.RawMessage `json:"params,omitempty"` +} + +type rpcResponse struct { + JSONRPC string `json:"jsonrpc"` + ID json.RawMessage `json:"id"` + Result interface{} `json:"result"` + Error *rpcError `json:"error,omitempty"` +} + +type rpcNotification struct { + JSONRPC string `json:"jsonrpc"` + Method string `json:"method"` + Params interface{} `json:"params"` +} + +type rpcError struct { + Code int `json:"code"` + Message string `json:"message"` +} + +// --- LSP protocol types (minimal subset) --- + +type position struct { + Line uint32 `json:"line"` + Character uint32 `json:"character"` +} + +type lspRange struct { + Start position `json:"start"` + End position `json:"end"` +} + +type textEdit struct { + Range lspRange `json:"range"` + NewText string `json:"newText"` +} + +type initResult struct { + Capabilities serverCaps `json:"capabilities"` +} + +type serverCaps struct { + TextDocumentSync int `json:"textDocumentSync"` + DocumentFormattingProvider bool `json:"documentFormattingProvider"` + CodeActionProvider bool `json:"codeActionProvider"` +} + +type textDocItem struct { + URI string `json:"uri"` + LanguageID string `json:"languageId"` + Version int `json:"version"` + Text string `json:"text"` +} + +type textDocID struct { + URI string `json:"uri"` +} + +type contentChange struct { + Text string `json:"text"` +} + +type didOpenParams struct { + TextDocument textDocItem `json:"textDocument"` +} + +type didChangeParams struct { + TextDocument textDocID `json:"textDocument"` + ContentChanges []contentChange `json:"contentChanges"` +} + +type formattingParams struct { + TextDocument textDocID `json:"textDocument"` + Options struct { + TabSize int `json:"tabSize"` + InsertSpaces bool `json:"insertSpaces"` + } `json:"options"` +} + +type lspDiagnostic struct { + Range lspRange `json:"range"` + Severity int `json:"severity"` + Code string `json:"code,omitempty"` + Source string `json:"source,omitempty"` + Message string `json:"message"` +} + +type publishDiagnosticsParams struct { + URI string `json:"uri"` + Diagnostics []lspDiagnostic `json:"diagnostics"` +} + +type codeActionParams struct { + TextDocument textDocID `json:"textDocument"` + Range lspRange `json:"range"` + Context struct { + Diagnostics []lspDiagnostic `json:"diagnostics"` + } `json:"context"` +} + +type workspaceEdit struct { + Changes map[string][]textEdit `json:"changes"` +} + +type codeAction struct { + Title string `json:"title"` + Kind string `json:"kind,omitempty"` + Edit *workspaceEdit `json:"edit,omitempty"` +} diff --git a/pkg/lsp/server_test.go b/pkg/lsp/server_test.go new file mode 100644 index 0000000..911a4db --- /dev/null +++ b/pkg/lsp/server_test.go @@ -0,0 +1,200 @@ +package lsp + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "strings" + "testing" + "time" +) + +// rpc sends a JSON-RPC request frame and returns the raw body bytes. +func frame(id int, method string, params interface{}) []byte { + type req struct { + JSONRPC string `json:"jsonrpc"` + ID int `json:"id"` + Method string `json:"method"` + Params interface{} `json:"params"` + } + body, _ := json.Marshal(req{JSONRPC: "2.0", ID: id, Method: method, Params: params}) + return []byte(fmt.Sprintf("Content-Length: %d\r\n\r\n%s", len(body), body)) +} + +func notifFrame(method string, params interface{}) []byte { + type notif struct { + JSONRPC string `json:"jsonrpc"` + Method string `json:"method"` + Params interface{} `json:"params"` + } + body, _ := json.Marshal(notif{JSONRPC: "2.0", Method: method, Params: params}) + return []byte(fmt.Sprintf("Content-Length: %d\r\n\r\n%s", len(body), body)) +} + +// readResp reads one JSON-RPC response from a *bytes.Buffer (blocking until available). +func readResp(t *testing.T, buf *bytes.Buffer) map[string]interface{} { + t.Helper() + deadline := time.Now().Add(2 * time.Second) + for time.Now().Before(deadline) { + data := buf.Bytes() + // Find Content-Length header + idx := bytes.Index(data, []byte("Content-Length: ")) + if idx < 0 { + time.Sleep(5 * time.Millisecond) + continue + } + eol := bytes.Index(data[idx:], []byte("\r\n")) + if eol < 0 { + time.Sleep(5 * time.Millisecond) + continue + } + lenStr := string(data[idx+16 : idx+eol]) + var n int + fmt.Sscanf(lenStr, "%d", &n) + sep := bytes.Index(data, []byte("\r\n\r\n")) + if sep < 0 || len(data) < sep+4+n { + time.Sleep(5 * time.Millisecond) + continue + } + body := data[sep+4 : sep+4+n] + buf.Next(sep + 4 + n) + var result map[string]interface{} + json.Unmarshal(body, &result) + return result + } + t.Fatal("timeout waiting for response") + return nil +} + +func runServer(t *testing.T, input []byte) *bytes.Buffer { + t.Helper() + out := &bytes.Buffer{} + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + done := make(chan error, 1) + go func() { + done <- Serve(ctx, bytes.NewReader(input), out, t.TempDir()) + cancel() + }() + // Give the server time to process + select { + case <-done: + case <-time.After(3 * time.Second): + } + return out +} + +func TestInitialize(t *testing.T) { + input := append(frame(1, "initialize", map[string]interface{}{}), + notifFrame("initialized", map[string]interface{}{})...) + input = append(input, frame(2, "shutdown", nil)...) + input = append(input, notifFrame("exit", nil)...) + + out := runServer(t, input) + + resp := readResp(t, out) + if resp["id"].(float64) != 1 { + t.Fatalf("expected id=1, got %v", resp["id"]) + } + caps := resp["result"].(map[string]interface{})["capabilities"].(map[string]interface{}) + if caps["documentFormattingProvider"] != true { + t.Error("expected documentFormattingProvider=true") + } +} + +func TestFormatting(t *testing.T) { + unformatted := "create function foo() returns void language plpgsql as $$ begin end $$;" + uri := "file:///test.sql" + + var input []byte + input = append(input, frame(1, "initialize", map[string]interface{}{})...) + input = append(input, notifFrame("initialized", nil)...) + input = append(input, notifFrame("textDocument/didOpen", map[string]interface{}{ + "textDocument": map[string]interface{}{ + "uri": uri, + "languageId": "sql", + "version": 1, + "text": unformatted, + }, + })...) + input = append(input, frame(2, "textDocument/formatting", map[string]interface{}{ + "textDocument": map[string]interface{}{"uri": uri}, + "options": map[string]interface{}{"tabSize": 2, "insertSpaces": true}, + })...) + input = append(input, frame(3, "shutdown", nil)...) + input = append(input, notifFrame("exit", nil)...) + + out := runServer(t, input) + + // Skip initialize response and publishDiagnostics notification, find formatting response + var formattingResp map[string]interface{} + for i := 0; i < 10; i++ { + resp := readResp(t, out) + if resp == nil { + break + } + id, hasID := resp["id"] + if hasID && id.(float64) == 2 { + formattingResp = resp + break + } + } + if formattingResp == nil { + t.Fatal("did not receive formatting response") + } + result, ok := formattingResp["result"].([]interface{}) + if !ok { + t.Fatalf("expected array result, got %T: %v", formattingResp["result"], formattingResp["result"]) + } + if len(result) == 0 { + t.Fatal("expected at least one text edit") + } + edit := result[0].(map[string]interface{}) + newText := edit["newText"].(string) + if !strings.Contains(newText, "CREATE FUNCTION") { + t.Errorf("formatted output missing CREATE FUNCTION keyword; got:\n%s", newText) + } +} + +func TestDidClose_ClearsDiagnostics(t *testing.T) { + uri := "file:///test.sql" + // SQL with a lint violation (SELECT * triggers COR001) + sql := "SELECT * FROM users;" + + var input []byte + input = append(input, frame(1, "initialize", map[string]interface{}{})...) + input = append(input, notifFrame("initialized", nil)...) + input = append(input, notifFrame("textDocument/didOpen", map[string]interface{}{ + "textDocument": map[string]interface{}{ + "uri": uri, "languageId": "sql", "version": 1, "text": sql, + }, + })...) + input = append(input, notifFrame("textDocument/didClose", map[string]interface{}{ + "textDocument": map[string]interface{}{"uri": uri}, + })...) + input = append(input, frame(2, "shutdown", nil)...) + input = append(input, notifFrame("exit", nil)...) + + out := runServer(t, input) + + // Collect all publishDiagnostics notifications; the last one for this URI must be empty. + var lastDiags []interface{} + for i := 0; i < 20; i++ { + if out.Len() == 0 { + break + } + resp := readResp(t, out) + if resp == nil { + break + } + if resp["method"] == "textDocument/publishDiagnostics" { + p := resp["params"].(map[string]interface{}) + if p["uri"] == uri { + lastDiags = p["diagnostics"].([]interface{}) + } + } + } + if len(lastDiags) != 0 { + t.Errorf("expected empty diagnostics after didClose, got %d", len(lastDiags)) + } +} diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 33504fc..341adca 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -8,8 +8,8 @@ package parser import ( - "github.com/hein/pgtidy/pkg/cst" - "github.com/hein/pgtidy/pkg/lexer" + "git.warky.dev/wdevs/pgtidy/pkg/cst" + "git.warky.dev/wdevs/pgtidy/pkg/lexer" ) // Parse lexes and parses src into a lossless cst.File. diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go index b8bf7ba..505b654 100644 --- a/pkg/parser/parser_test.go +++ b/pkg/parser/parser_test.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "github.com/hein/pgtidy/pkg/cst" + "git.warky.dev/wdevs/pgtidy/pkg/cst" ) func TestParseRoundTripSmall(t *testing.T) {